List opportunities
Agent-produced, verified sales opportunities for the caller's projects. There is no review gate: an opportunity is visible to its owner the moment the agent writes it. An opportunity is written once from a signal and is NOT re-verified on its own, so a vacancy can since have been filled. Read `verification_status` and `last_verified_at` before acting on a row, and call POST /opportunities/{id}/refresh to re-check it. A row that has never been re-checked reports `verification_status: "unverified"` and a null `last_verified_at` rather than implying freshness.
Agent-produced, verified sales opportunities for the caller's projects. There is no review gate: an opportunity is visible to its owner the moment the agent writes it.
An opportunity is written once from a signal and is NOT re-verified on its own, so a vacancy can since have been filled. Read verification_status and last_verified_at before acting on a row, and call POST /opportunities/{id}/refresh to re-check it. A row that has never been re-checked reports verification_status: "unverified" and a null last_verified_at rather than implying freshness.
API key (sk_live_... prefix). Generate keys in the UI under Settings > API Keys, then send it as Authorization: Bearer sk_live_...
In: header
Query Parameters
Filter by project
uuidSignal-based (false) vs ICP-fallback prospecting (true)
"true" | "false"Results per page
50value <= 200Pagination offset
0Response Body
application/json
application/json
application/json
curl -X GET "https://loading/api/v1/opportunities"{
"data": [
{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"project_id": "405d8375-3514-403b-8c43-83ae74cfe0e9",
"entity_type": "district",
"district_id": "880bc4ee-477a-4e12-a0f0-c89f020ba05d",
"school_id": "c1317ebe-519d-4c8a-9ab1-7bfd15017c1c",
"geo_scope": "string",
"title": "string",
"signal_type": "string",
"event_date": "string",
"event_date_basis": "string",
"why_now": "string",
"suggested_action": "string",
"confidence": 1,
"caveats": "string",
"source_urls": [
"string"
],
"signal_ids": [
"497f6eca-6276-4993-bfeb-53cbbbba6f08"
],
"contacts": [
{
"contact_id": "f245e2a3-e141-4d41-912c-b1c1f5bd5598",
"name": "string",
"title": "string",
"email": "string",
"email_status": "string",
"source": "string"
}
],
"suggested_prompts": [
"string"
],
"supplementary": true,
"created_at": "string",
"updated_at": "string",
"last_verified_at": "string",
"verification_status": "unverified",
"verification_note": "string",
"window_status": "unknown",
"window_ends_on": "string",
"source_checks": [
{
"url": "string",
"checked_at": "string",
"status": "ok",
"note": "string"
}
]
}
],
"pagination": {
"total": -9007199254740991,
"limit": -9007199254740991,
"offset": -9007199254740991,
"has_more": true
}
}{
"error": "string",
"message": "string",
"statusCode": -9007199254740991
}{
"error": "string",
"message": "string",
"statusCode": -9007199254740991
}Get a single news article GET
Single article with ALL its non-noise signals (unfiltered), for drill-down. Same API-key-only access as GET /news.
Read an opportunity's verification verdict GET
The stored verdict. Poll this after a POST returns 202. TWO independent verdicts, and acting on one alone will burn your reps: `verification_status` — does the CLAIM still hold? `window_status` — is there still a chance to ACT? They fail independently. A procurement page describes its bid accurately for months after the deadline passes, so a row can be `confirmed` and `closed` at the same time — the claim is true and the opportunity is dead. Treat `confirmed` + (`open` | `closing` | `durable`) as live, and nothing else. `durable` means there is nothing to expire (a standing staffing gap, an adopted law). `unreachable` means we could not settle it — unconfirmed, never confirmed. `verifying` means a run is still going.