REST API
Companies
Read companies with their account temperature, and one company card with people, campaigns and recent events. The same numbers as the Companies view in the app.
Updated 4 September 2026
Seegnals groups every prospect into a company by email domain or by the company_name you supplied. The company is where engagement is read: temperature sums what everyone at that company did in the last seven days.
GET /api/v1/companies
Query: search (matches the name, the operator-given name or the domain; www. is ignored), temperature (hot, warm, cold, quiet), limit, cursor. This list uses an offset cursor; see Pagination.
curl "https://app.seegnals.com/api/v1/companies?temperature=hot" -H "Authorization: Bearer $SEEGNALS_TOKEN"
const res = await fetch("https://app.seegnals.com/api/v1/companies?temperature=hot", {
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.SEEGNALS_TOKEN}`
}
});
const json = await res.json().catch(() => null);
console.log(res.status, json);
import os, requests
res = requests.get(
"https://app.seegnals.com/api/v1/companies?temperature=hot",
headers={"Authorization": f"Bearer {os.environ['SEEGNALS_TOKEN']}"},
timeout=20,
)
print(res.status_code, res.json() if res.content else None)
{
"data": [
{
"id": "1b4e28ba-2fa1-11d2-883f-0016d3cca427",
"display_name": "Example Ltd",
"name": "Example Ltd",
"group_name": null,
"domain": "example.com",
"tags": ["enterprise"],
"people": 3,
"temperature": {
"band": "hot", "score": 8, "replies": 1, "event_count": 5, "window_days": 7,
"trend": { "direction": "up", "change_percent": 60, "previous_score": 5 }
},
"last_activity_at": "2026-09-03T10:00:00.000+00:00",
"created_at": "2026-08-19T12:00:00.000+00:00"
}
],
"next_cursor": "eyJvIjo1MH0"
}
How temperature is computed
The score is the one that draws the bar in the Companies view: events from the last seven days, weighted by type. A reply classified as interested counts 5, any other reply 3, a return visit to an offer 2.5, a click 2, an offer opened 2, a delivery 0.5, a send 0, a bounce or unsubscribe minus 2. Bands: hot from 6, warm from 2, cold below 2, quiet when there were no events in the window at all (no signal, which is not the same as cold). trend compares the current seven days with the previous seven; direction: "unknown" with change_percent: null means there is nothing to compare against. last_activity_at is the newest event in the company’s whole history, not just the window.
display_name falls back from name to operator-given name to domain to Unnamed company.
Errors: 400 for a bad temperature, an over-long search, limit or cursor; 401; 429.
GET /api/v1/companies/{id}
The row above (temperature computed from this company’s own event bundle, so it matches the list) plus the card:
{
"…": "fields from the list",
"people_list": [
{
"id": "7c9e…", "email": "ada@example.com", "name": "Ada Lovelace", "position": "CTO",
"timezone": null,
"enrollments": [{ "campaignId": "3f2b…", "campaignName": "Q3 outbound", "status": "stopped", "lastError": "replied" }],
"last_activity_at": "2026-09-03T10:00:00.000+00:00",
"latest_reply": { "classification": "interested", "receivedAt": "2026-09-03T10:00:00.000+00:00", "campaignId": "3f2b…", "campaignName": "Q3 outbound" },
"has_responded": true
}
],
"campaigns": [{ "id": "3f2b…", "name": "Q3 outbound", "status": "active", "people": 3, "replies": 1 }],
"recent_events": [{ "id": "…", "type": "replied", "occurred_at": "2026-09-03T10:00:00.000+00:00", "prospect_id": "7c9e…", "campaign_id": "3f2b…" }]
}
people_listis in the order of the company card: people who replied first, then by recency of activity, then alphabetically.positionis a heuristic from custom fields and can benull. The text of a reply is never returned; the fact and the classification are.campaigns:peopleis how many from this company are enrolled,replieshow many replied from this company in that campaign.recent_events: up to 50 newest events of people from this company, all types.
Errors: 404 { "error": "Company not found." }; 401; 429.