- Docs
- API
- Signal APIs
Signal APIs
Pipe buying intent, news, and product events into Oflo from agents, n8n, MCP, or a few lines of curl.
What a signal is
A marketing signal is a named intent event in the current organization (from your API key or session). Use them for buyer-intent pings, engagement spikes, conversion events, news updates, or any custom measurement you want visible at /dashboard/signals.
Organization is derived from auth. Do not send organizationId, organizationSlug, or organizationDomain in the body.
Authentication
Send Authorization: Bearer sk_… (or x-api-key). Create a key at API Keys. Browser sessions work for same-origin dashboard calls.
Endpoints
| Method | Path | Use |
|---|---|---|
| GET | /api/v1/marketing/signals | List with search, type, status, pagination |
| POST | /api/v1/marketing/signals | Create a signal |
| GET | /api/v1/marketing/signals/:id | Get by Mongo id or signalKey |
| PUT | /api/v1/marketing/signals/:id | Update fields or append a signalValue |
| DELETE | /api/v1/marketing/signals/:id | Soft-delete |
| GET | /api/v1/marketing/signals/stats | Totals, type mix, strength mix |
Interactive Try-it-out: API Reference (tag Signals) or the request playground.
Create a signal
name is required. Defaults: type=behavioral, status=active, strength=50, value=Medium.
curl -X POST "https://www.oflo.ai/api/v1/marketing/signals" \
-H "Authorization: Bearer sk_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"name": "Acme viewed pricing 3x this week",
"description": "Repeat pricing-page visits from acme.com — high intent.",
"type": "engagement",
"status": "active",
"strength": 82,
"value": "High",
"signalKey": "acme-pricing-intent"
}'| Field | Notes |
|---|---|
| name | Required non-empty string |
| type | behavioral, engagement, conversion, retention, news-update, measurement |
| status | active, inactive, draft |
| strength | 0–100 |
| value | Low, Medium, High |
| signalKey | Optional unique key per organization — also usable as :id on GET/PUT/DELETE |
| description | String, object, or array (stored as a string) |
| signalValues | Optional time-series [{ value, description?, createdAt?, metadata? }] |
| content / actionTriggers | Optional string arrays |
| metadata | Optional free-form object |
| screenshot | Optional { contentType: "image/png"|"image/jpeg", data: "<raw base64>" }; max 5 MB, 4096px |
Append a value over time
PUT the same signal (by id or signalKey) and send signalValue to append one entry to signalValues — useful for recurring news or a rolling intent score.
curl -X PUT "https://www.oflo.ai/api/v1/marketing/signals/acme-pricing-intent" \
-H "Authorization: Bearer sk_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"signalValue": {
"value": "visited-pricing",
"description": "Fourth pricing view in 7 days"
}
}'MCP
From Claude Desktop or Cursor, call create_signal after connecting MCP with your API key. Tool args: name, description, type, status, strength, value. Setup: MCP installation · Tools catalog.
n8n, Slack, and agents
- POST each news item or intent event to
/api/v1/marketing/signalswith Bearersk_. - Duplicate
namevalues are allowed on create (recurring updates).signalKeymust stay unique per org if you set it — then PUT to that key to append values. - There is no native lead/account field. Link a signal with
POST /api/v1/linksusing model typeSIGNAL.
Revenue intelligence signals
GET /api/v1/revenue-intelligence/signals is a different surface: it detects pipeline risk/opportunity signals (optional pipelineId, severity, type). Use marketing signals to ingest events; use revenue-intelligence to read detected deal health.
