>unstuck engine
>Engine
>SignalsForty signal types, one pipeline>Waterfall enrichmentMulti-provider, ranked by reply rate>AudiencesSaved filters that update themselves
>Plays
>PLG AssistTurn free signups into enterprise pipeline>Inbound enrichmentEvery form fill, enriched and routed in seconds>ABMSurround the account, grade the buying committee
>Partners
>AgenciesPipeline as a service. With your name on top.>AdvocatesSix ways to advocate. Pick yours.
>Pricing
Book a Demo

> help

> Help index
  • 01Connecting a destination
  • 02Destination routing and send rules
  • 03Using the Signals API
  • 04Using the Enrichment API
  • 05Using the MCP server and CLI
Contents

Help / 03 · Destinations & API

> Using the Signals API

Push intent signals from your own systems into Unstuck Engine. POST a signal payload with identity + event + source; Unstuck routes it through qualification and into Records.

2 min read·Never reviewed

TL;DR: Send intent events from your stack into Unstuck. The API normalizes them into the same signal model as the built-in sources, runs qualification, and lands records in Leads.

When to use it

Three patterns:

  • Custom intent capture. Your product has a high-intent moment (e.g. "user invited a teammate", "user enabled SSO") that Unstuck's built-in signal types don't cover. Send it as a custom signal.
  • Legacy systems. Your existing intent-data vendor doesn't have a direct Unstuck connector. Pipe their output through the Signals API.
  • AI agents. Your LLM agent discovered a buyer signal somewhere. POST it as a signal so it flows through the same qualification engine as everything else.

Endpoint

POST /signals
Headers:
Authorization: Bearer <UNSTUCK_API_KEY>
Content-Type: application/json

Body:
{
"signal_type": "custom_event",
"source": "your-system-name",
"event_name": "user_invited_teammate",
"occurred_at": "2026-05-26T14:30:00Z",
"identity": {
"email": "person@company.com",
"linkedin_url": "https://...",
"company_domain": "company.com",
"first_name": "...",
"last_name": "...",
"title": "..."
},
"context": {
"team_size": 12,
"plan_tier": "free"
}
}

Required fields:

  • signal_type — must be a Signal type that's enabled in your workspace (custom or built-in)
  • source — the system that originated the event (free string; appears in attribution)
  • occurred_at — ISO 8601 timestamp
  • identity — at least one of email / linkedin_url / company_domain

Optional:

  • event_name — sub-classifier within signal_type
  • context — arbitrary JSON. Stored alongside the signal capture; usable in audience conditions via signals.context.team_size > 10

Response

{
"signal_capture_id": "sig_capture_abc123",
"matched_record_id": "lead_xyz789",
"qualification": {
"icp_code": "Mid-market SaaS",
"icp_score": 73,
"persona_code": "VP Engineering",
"persona_score": 81
}
}

If qualification ran (autoqualify is on for the signal_type), the response includes the qualification result. If autoqualify is off, qualification fields are null and you'd query them separately later.

Defining a custom signal type

Before sending custom-type events, declare the signal in the workspace:

Signals → + Add → Custom signal →

  • Name — what shows up in the Signals table
  • Source description — for documentation
  • Default sub-rules (optional) — for filtering custom events into named buckets
  • Autoqualify — on / off

Once declared, your signal_type in the API body matches the declared name (lowercased, underscored).

Idempotency

The Signals API is idempotent on (signal_type, source, identity, occurred_at). Sending the same event twice doesn't double-capture. Useful when your delivery is at-least-once.

To force a re-process (rare — usually for testing), include idempotency_key as a unique string in the body.

Rate limits

  • 500 events per minute per workspace
  • 50,000 events per day per workspace
  • Higher limits available — contact us

Sending signals in without the API

If all you need is to get events into Unstuck Engine, the Webhook signal is usually less work than the API. It mints a URL per endpoint on the signal's own detail page, accepts any JSON shape, and needs no key management. See Replies and Conversions for how those inbound endpoints work.

Related

  • What signals are
  • The 30 signal types — a tour
  • Using the Enrichment API
  • Using the MCP server and CLI
Previous02Destination routing and send rulesDestinations & APINext 04Using the Enrichment APIDestinations & API

On this page

  • When to use it
  • Endpoint
  • Response
  • Defining a custom signal type
  • Idempotency
  • Rate limits
  • Sending signals in without the API
  • Related

Share

> wave is here.

Schedule it.
>unstuck engine
PricingBlogContact
>unstuck engine

The B2B GTM engine. Signal-led targeting, ICP-fit pipeline.

Product

  • Pricing
  • Comparisons
  • Blog
  • Handbook
  • Help

Company

  • Contact

Legal

  • Terms
  • Privacy

© 2026 Unstuck Engine. All rights reserved.

> wave is here.

Schedule it.
>unstuck engine
PricingBlogContact
>unstuck engine

The B2B GTM engine. Signal-led targeting, ICP-fit pipeline.

Product

  • Pricing
  • Comparisons
  • Blog
  • Handbook
  • Help

Company

  • Contact

Legal

  • Terms
  • Privacy

© 2026 Unstuck Engine. All rights reserved.