curl --request GET \
--url https://api.openpulse.cloud/v1/results/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.openpulse.cloud/v1/results/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.openpulse.cloud/v1/results/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.openpulse.cloud/v1/results/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.openpulse.cloud/v1/results/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.openpulse.cloud/v1/results/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.openpulse.cloud/v1/results/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": "<string>",
"orgId": "<string>",
"listenerId": "<string>",
"source": "x",
"url": "<string>",
"title": "<string>",
"excerpt": "<string>",
"postedAt": "2023-11-07T05:31:56Z",
"relevanceScore": 50,
"classification": "high_intent",
"rationale": "<string>",
"matchedKeywords": [
"<string>"
],
"firstSeenAt": "2023-11-07T05:31:56Z",
"author": "<string>",
"publishedAt": "2023-11-07T05:31:56Z",
"approximateDate": true,
"dedupeKey": "<string>",
"titleKey": "<string>",
"coverage": "full_text",
"scoreVersion": 1,
"scoreBreakdown": {
"purchaseIntent": 15,
"fit": 10,
"urgency": 7,
"recency": 5,
"commercialValue": 5,
"evidenceQuality": 5,
"multiSignal": 2
},
"signalCategory": "direct_intent",
"urgency": "low",
"purchaseIntent": "weak",
"confidence": "low",
"inferredNeed": "<string>",
"recommendedAction": "<string>",
"situation": "<string>",
"opportunity": "<string>",
"inferenceHops": 0,
"suggestedAngle": "<string>",
"themes": [
"<string>"
],
"rating": 3,
"subjectOrg": {
"name": "<string>",
"location": "<string>",
"workMode": "any",
"seniority": "<string>",
"compensation": "<string>"
},
"subjectName": "<string>",
"accountKey": "<string>",
"rivalKey": "<string>",
"placeKey": "<string>",
"policy": {
"propensity": 0,
"explored": true,
"scoreAtDecision": 123,
"barAtDecision": 123
},
"passedBy": "keyword",
"rerankScore": 123,
"foundByQuery": "<string>",
"queryAttribution": "exact",
"assignedTo": {
"userId": "<string>",
"at": "2023-11-07T05:31:56Z",
"by": "<string>"
},
"feedback": {
"verdict": "good",
"at": "2023-11-07T05:31:56Z"
},
"readAt": "2023-11-07T05:31:56Z",
"alertedAt": "2023-11-07T05:31:56Z"
}{
"message": "<string>",
"code": "<string>",
"detail": "<unknown>"
}{
"message": "<string>",
"code": "<string>",
"detail": "<unknown>"
}{
"message": "<string>",
"code": "<string>",
"detail": "<unknown>"
}{
"message": "<string>",
"code": "<string>",
"detail": "<unknown>"
}Get one signal
A single signal by id, regardless of how old it is or where it falls in the list’s pagination. Use this to resolve a signal a link names; use GET /v1/results to browse.
curl --request GET \
--url https://api.openpulse.cloud/v1/results/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.openpulse.cloud/v1/results/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.openpulse.cloud/v1/results/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.openpulse.cloud/v1/results/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.openpulse.cloud/v1/results/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.openpulse.cloud/v1/results/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.openpulse.cloud/v1/results/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": "<string>",
"orgId": "<string>",
"listenerId": "<string>",
"source": "x",
"url": "<string>",
"title": "<string>",
"excerpt": "<string>",
"postedAt": "2023-11-07T05:31:56Z",
"relevanceScore": 50,
"classification": "high_intent",
"rationale": "<string>",
"matchedKeywords": [
"<string>"
],
"firstSeenAt": "2023-11-07T05:31:56Z",
"author": "<string>",
"publishedAt": "2023-11-07T05:31:56Z",
"approximateDate": true,
"dedupeKey": "<string>",
"titleKey": "<string>",
"coverage": "full_text",
"scoreVersion": 1,
"scoreBreakdown": {
"purchaseIntent": 15,
"fit": 10,
"urgency": 7,
"recency": 5,
"commercialValue": 5,
"evidenceQuality": 5,
"multiSignal": 2
},
"signalCategory": "direct_intent",
"urgency": "low",
"purchaseIntent": "weak",
"confidence": "low",
"inferredNeed": "<string>",
"recommendedAction": "<string>",
"situation": "<string>",
"opportunity": "<string>",
"inferenceHops": 0,
"suggestedAngle": "<string>",
"themes": [
"<string>"
],
"rating": 3,
"subjectOrg": {
"name": "<string>",
"location": "<string>",
"workMode": "any",
"seniority": "<string>",
"compensation": "<string>"
},
"subjectName": "<string>",
"accountKey": "<string>",
"rivalKey": "<string>",
"placeKey": "<string>",
"policy": {
"propensity": 0,
"explored": true,
"scoreAtDecision": 123,
"barAtDecision": 123
},
"passedBy": "keyword",
"rerankScore": 123,
"foundByQuery": "<string>",
"queryAttribution": "exact",
"assignedTo": {
"userId": "<string>",
"at": "2023-11-07T05:31:56Z",
"by": "<string>"
},
"feedback": {
"verdict": "good",
"at": "2023-11-07T05:31:56Z"
},
"readAt": "2023-11-07T05:31:56Z",
"alertedAt": "2023-11-07T05:31:56Z"
}{
"message": "<string>",
"code": "<string>",
"detail": "<unknown>"
}{
"message": "<string>",
"code": "<string>",
"detail": "<unknown>"
}{
"message": "<string>",
"code": "<string>",
"detail": "<unknown>"
}{
"message": "<string>",
"code": "<string>",
"detail": "<unknown>"
}Authorizations
A workspace API key, created in workspace settings and sent as Authorization: Bearer op_live_…. Session cookies are not accepted. Scopes: signals:read, accounts:read, listeners:read, listeners:analyse, pipeline:read, pipeline:write, collections:write, export:read.
Path Parameters
The signal's id.
Response
The signal, outside every window and every page. Unlike the list, this applies no postedAt bound — a lead found yesterday but published five weeks ago is returned here and is not in the list that links to it.
One public post, job posting or review a listener judged relevant, with its score and the reasoning behind it.
Most fields are optional and that is structural, not incidental. Rows are stored by a pipeline that has gained stages over time, and a field added after a row was written is absent from it for ever: nothing is re-scored, because that is a model call per signal for no new information. Read defensively.
Stable identifier. What GET /v1/results/{id} takes.
The workspace this belongs to (org_…).
The listener that found it.
The platform it came from.
x, linkedin, facebook, reddit, hackernews, linkedin_jobs, indeed, ashby, greenhouse, lever, google_reviews, g2, trustpilot, youtube Link to the post itself.
The post's title, or its first line where the platform has none.
The post's text, as much of it as the source gave up. See coverage.
The sort and filter key: publishedAt when known, otherwise firstSeenAt.
0–100. The sort order of every list in the product.
0 <= x <= 100The intent label. The valid set depends on the listener's mode — a market listener never produces pain_confirmed — so filtering by one from the wrong mode returns an empty page rather than an error. The retired jobs labels are still valid here: no listener produces them, and signals carrying them are still stored and still read.
high_intent, evaluating, relevant, competitor, content, strong_match, worth_a_look, stretch, mismatch, stale, hiring_now, expanding, replacing, adjacent, switching, frustrated, comparing, praise, pain_confirmed, at_risk, healthy, noise Why this was kept, in the model's words.
Computed from the text, never taken from the model.
A keyword from the listener's plan.
When this workspace first saw it, which is not when it was published.
The poster's handle, where the source reports one.
When the post was published, when the source reports it.
True when publishedAt was derived from "3 months ago" rather than a real timestamp. Rendered as ~, because implying a precision the source never gave is worse than admitting the approximation.
Normalised URL, used to collapse one post reached through different links.
Normalised title, used to collapse one post syndicated across URLs.
How much of the post the classifier actually read. snippet and best_effort cap the evidence component of the score; enriched means the page behind a snippet was fetched. Absent on rows written before the enrichment stage.
full_text, snippet, best_effort, enriched Which rubric produced relevanceScore. No version is comparable to another and they sort against each other in the same column, which is why they are marked rather than silently mixed. Absent means 1.
1, 2, 3 The seven components the score is the sum of, each capped at its own weight. Present only on scoreVersion 2 and 3. The components are the point rather than the total: "86" says nothing, "26 of 30 on intent, 8 of 20 on fit" says a real buyer who is probably not yours.
Show child attributes
Show child attributes
What kind of event this is, as opposed to how good it is. Orthogonal to classification: a funding round and a support complaint can both be high_intent, and are not actioned by the same person.
direct_intent, hire_vs_buy, competitor_pain, growth, funding, procurement, construction, regulatory, operational_pain, tech_change, leadership_change, real_estate, new_business, cx_failure, missing_capability, incident How soon this needs acting on.
low, medium, high, immediate How directly a wish to buy was expressed.
weak, moderate, strong, explicit How much the model trusts its own read.
low, medium, high What the subject probably needs: the product-shaped restatement.
The single next action worth taking.
What is happening, stated without reference to the seller. Separate from opportunity so the leap between them is checkable by whoever reads the row.
Why that situation matters to this seller, or absent when it does not.
How far the reasoning reached: 0 they said it, 1 one step from what they said. There is no 2 — two stacked assumptions are indistinguishable from invention, and the prompt refuses it.
0, 1 One line on why this person might care: the outreach angle.
Two to four phrases naming what the post is about.
A short noun phrase.
Star rating 1–5 on a review source. Never the same number as relevanceScore.
1 <= x <= 5The organisation the signal is about, which is not the poster. Every field is optional and absent is the common case: most conversations name no company, and inventing one from the platform host would file the whole corpus under one domain.
Show child attributes
Show child attributes
Display name of the place or rival, so a row reads without a join.
The company this is about, namespaced (d:acme.com for a domain, n: for a name, p: for a place). Absent is a real and common answer — a thread that names no company has none.
Which rival this is about, on a rivals listener.
Which place this review belongs to, on a places listener.
What the surfacing policy did when this signal was stored, for off-policy evaluation. Absent on every signal written before the holdout existed — and absent must read as "unknown", never as a propensity of 1.
Show child attributes
Show child attributes
How this got past the on-topic gate. rerank means it shares no keyword and the cross-encoder judged it relevant anyway.
keyword, rerank Cross-encoder relevance, when the rerank stage ran.
Which planned query surfaced this, for per-query yield reporting.
Whether foundByQuery is known or was worked out afterwards from token overlap. Recorded because per-query yield decides which queries get retired.
exact, inferred Who is working this lead. Set through PATCH /v1/results/{id}/assign.
Show child attributes
Show child attributes
A person's verdict on the signal, which the classifier reads back.
Show child attributes
Show child attributes
When somebody in the workspace read it. Workspace-wide rather than per member: a signal is a lead somebody acts on once. Absent means unread.
When an urgency alert was sent for this. Absent means never.
Was this page helpful?