Predictive Signals: who in your audience is in market
Predictive Signals: who in your audience is in market
Base URL: https://api.delivr.ai
Version: v1
Authentication: Organization API key. Send X-Api-Key: <dlvr_...> and X-Api-Secret: <secret> on every request (both required). Create the key + secret in the dashboard at https://app.delivr.ai/{org_id}/settings/api-keys.
Once you have an intents audience, Predictive Signals answers the next question: which of its members are showing buying intent right now, which companies they roll up to, and whether that intent is accelerating or fading.
See the Predictive Signals reference for the full request and response schemas.
The audience calls
| Call | Answers |
|---|---|
GET /api/v1/signals/audiences/{id} | How many members are in market right now, broken out by momentum, plus the top companies. |
GET /api/v1/signals/audiences/{id}/history?range= | The same counts over the last 30, 90 (default), 180, or 365 days. |
GET /api/v1/signals/audiences/{id}/topics | Which topics this audience concentrates in or avoids, against an archived day. |
All three take the audience's numeric id in the path. Per-person lookups are covered under "Trends for one person" below.
In market and momentum
A member counts as in market when they were active on 3 or more of the last 14 days on the audience's defining topics, at medium or high score. This is computed daily after 13:40 UTC over the trailing 14-day window ending on the document's day.
Every in-market member is also bucketed into a single best momentum tier, checked in this order:
new: first seen active on a defining topic within the window.rising: this week's activity is at least 1.5x the prior week's.steady: roughly flat week over week.cooling: this week's activity is at most half the prior week's.
A member is counted once, under the highest tier that applies.
Reading the overview
GET /api/v1/signals/audiences/{id}?project_id=YOUR_PROJECT_ID
{
"audience_id": "10482",
"view": "intents",
"status": "ready",
"signals": {
"day": "20260921",
"members": 48213,
"with_intent": 9104,
"in_market": 2211,
"momentum": { "new": 340, "rising": 588, "steady": 1102, "cooling": 181, "unknown": 0 },
"top_companies": [ { "...": "..." } ]
}
}status is one of:
ready: checkviewbefore readingsignals. Whenviewisintents,signalsis present. Whenviewisprofile,signalsisnull; use thetopicscall instead.preparing: the audience has no membership index yet and one has been started; ask again after the next indexing run (hourly, except 03:00-09:00 UTC).unavailable: the audience can't have signals right now: a company audience, a paused or failed intents audience, or signals not enabled in this environment.reasonsays which and what to do (for example, resume or refresh the audience).
Trend, not just a snapshot
GET /api/v1/signals/audiences/{id}/history?project_id=YOUR_PROJECT_ID&range=90d
Returns the same daily counts across the requested window, ending on the audience's latest signals day. range accepts 30d, 90d (default), 180d, or 365d; anything else is a 400.
Unlike the overview, this call never starts preparing the audience: an audience with no history yet answers 200 with days: []. To start preparation, call the overview endpoint above.
Trends for one person
The audience calls above answer questions about a group. To ask about a single person, look them up by hem or email. No audience is needed.
POST /api/v1/signals/people/lookup?project_id=YOUR_PROJECT_ID
{ "id": "lead-1042", "email": "[email protected]", "min_score": "medium" }{
"response": {
"id": "lead-1042",
"matched": true,
"matched_on": "email",
"topics": [
{
"topic_id": "crm_software",
"topic_name": "CRM Software",
"score": "high",
"perc_score": 91,
"intent_trend": "rising",
"active_days_14d": 6,
"first_seen": "2026-09-23",
"last_seen": "2026-10-05"
}
]
},
"as_of": "2026-10-05"
}- Fields.
hem(lowercase SHA-256 of the email) oremail; a validhemwins if both are sent. Optional:id(echoed back),topic_ids(keep only these topics),min_score(highormedium, defaultmedium),dry_run. - Topics. Only high and medium topics that carry a trend are returned.
intent_trendisnew,rising,steady, orcooling, as for momentum above, but per person and per topic. matched. True when at least one trend topic came back after filtering. A person who has opted out looks exactly like a person we do not hold:matched: false,topics: [].- Batch.
POST /api/v1/signals/people/batchtakesitems(1 to 1,000, each withid,hem, oremail) plus the sametopic_ids,min_score, anddry_run. It returns{"response": {"results": [...], "matched_count": N}, "as_of": "..."}with results in request order. - Errors.
400formin_score: low(low topics carry no trend),linkedin_url,resolve_person, an item with nohemoremail, or a batch outside 1 to 1,000.402when the spend gate refuses the call.403for anything but an API key.429when the Platform Cap would be exceeded.503when the lookups are not enabled or the data is unavailable; it is retryable and nothing is billed. - Test keys. A test API key returns a fixed sample person with the header
X-Delivr-Mode: testand is never billed. Ahemof 64 zeros returnsmatched: false.
These two calls are for API keys only, and the project comes from X-Project-Id or ?project_id=.
Billing
Calls from the dashboard are never metered. An API-key caller is metered as Predictive Signals:
- One unit per company row returned in the overview's
top_companies. - One unit per result row returned by
topics. - The overview and
topicsbill the same answer only once per audience per day, no matter how many times it is fetched. - One unit per
historycall that returns at least one day. Repeating the call bills again, and a call withdays: []is free. - One unit per distinct person with at least one trend topic returned by
people/lookuporpeople/batch, counted aftertopic_idsandmin_scoreare applied. A person with no trend topic, or one filtered out, costs nothing, and a hem repeated in a batch bills once.
Add "dry_run": true to a people call to get records_to_charge back with no topics and no charge.
Updated 11 days ago
