Skip to main content
Use this endpoint to push any engagement event into Stairoids from your tools or automation platform. A signal represents a meaningful interaction — a page visit, form submission, email open, or any custom event you define — and immediately contributes to account and contact scoring within your workspace.

Endpoint

POST https://api.stairoids.com/v1/signals

Authentication

Include your API key as a Bearer token in the Authorization header of every request.
Authorization: Bearer <api-key>
Content-Type: application/json

Request Body

type
string
required
The signal type. Can be any non-empty string. Use consistent, descriptive values across your integration — for example page_visit, email_open, or form_submit.
account
object
Account identification. Required if contact is omitted. At least one of account or contact must be present on every request.
contact
object
Contact identification. Required if account is omitted. At least one of account or contact must be present on every request.
source
string
The name of the originating tool or system that generated this signal, e.g. activecampaign, my-website, or zapier. Helps you filter and attribute signals by integration.
properties
object
An arbitrary set of key-value pairs you want to attach to this signal. Values can be strings, numbers, or booleans. For example: { "page": "/pricing", "duration_seconds": 45 }.
occurred_at
string
An ISO 8601 timestamp representing when the event actually occurred, e.g. 2024-06-15T14:23:00Z. If omitted, Stairoids records the current server time.
If account.domain or contact.email matches an existing record in your workspace, the signal is attributed to that record. Otherwise, Stairoids automatically creates a new account or contact.

Code Examples

curl --request POST \
  --url https://api.stairoids.com/v1/signals \
  --header 'Authorization: Bearer <api-key>' \
  --header 'Content-Type: application/json' \
  --data '{
    "type": "page_visit",
    "account": {
      "domain": "acme.com",
      "name": "Acme Corp"
    },
    "contact": {
      "email": "alice@acme.com",
      "first_name": "Alice",
      "last_name": "Chen"
    },
    "source": "my-website",
    "properties": {
      "page": "/pricing",
      "duration_seconds": 45
    },
    "occurred_at": "2024-06-15T14:23:00Z"
  }'

Response

All successful responses return HTTP 201 Created and a JSON envelope containing data and meta objects.

Response Fields

data
object
The created signal object.
meta
object
Request metadata.

Example Response

{
  "data": {
    "id": "sig_abc123",
    "type": "page_visit",
    "account": {
      "id": "acc_xyz789",
      "domain": "acme.com",
      "name": "Acme Corp",
      "score": 84
    },
    "contact": {
      "id": "con_def456",
      "email": "alice@acme.com",
      "score": 42
    },
    "score": 12,
    "source": "my-website",
    "properties": {
      "page": "/pricing",
      "duration_seconds": 45
    },
    "created_at": "2024-06-15T14:23:01Z"
  },
  "meta": {
    "request_id": "req_11aabb22ccdd",
    "timestamp": "2024-06-15T14:23:01Z"
  }
}

Error Responses

Returned when the Authorization header is missing or your API key is invalid.
{
  "error": {
    "code": "unauthorized",
    "message": "Invalid or missing API key.",
    "request_id": "req_99qqrr00sstt"
  }
}