Bellwork
Opportunities

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. Each row carries the team's `verdict` from /opportunities/verdicts — acted on (`pursued`), set aside (`dismissed`) or `not_useful` — or null when nothing is filed (open). `verdict` filters on it in the query, so totals and pages are the filtered set.

GET
/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.

Each row carries the team's verdict from /opportunities/verdicts — acted on (pursued), set aside (dismissed) or not_useful — or null when nothing is filed (open). verdict filters on it in the query, so totals and pages are the filtered set.

AuthorizationBearer <token>

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

project_id?string

Filter by project

Formatuuid
supplementary?string

Signal-based (false) vs ICP-fallback prospecting (true)

Value in"true" | "false"
verdict?string

open = nothing filed (the Opportunities page's Open tab); pursued = Acted on; dismissed = Set aside; not_useful; all (default) = every row

Default"all"
Value in"open" | "pursued" | "dismissed" | "not_useful" | "all"
limit?integer

Results per page

Default50
Rangevalue <= 200
offset?integer

Pagination offset

Default0

Response Body

application/json

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",
      "association_id": "b7261822-545a-4eed-9acd-2428afa0245c",
      "head_start_program_id": "d6d32a6c-34a9-40a4-857a-18d6694c812d",
      "childcare_center_id": "c3a58d52-fb27-4f3d-ae32-8c65705b3a35",
      "operator_id": "fa9de6bb-1df8-4ba6-9e6d-1172fbf7e166",
      "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"
        }
      ],
      "verdict": "pursued",
      "verdict_reason_code": "not_what_we_sell",
      "verdict_reason_note": "string",
      "verdict_updated_at": "string"
    }
  ],
  "pagination": {
    "total": -9007199254740991,
    "limit": -9007199254740991,
    "offset": -9007199254740991,
    "has_more": true
  }
}
{
  "error": "string",
  "message": "string",
  "statusCode": -9007199254740991
}
{
  "error": "string",
  "message": "string",
  "statusCode": -9007199254740991
}
{
  "error": "string",
  "message": "string",
  "statusCode": -9007199254740991
}