Search the RFP opportunities catalog
Enterprise catalog-wide search over canonical procurement opportunities (`rfp_opportunities`) harvested from public portals. Filter by buyer state, status, posted/closing date windows, a title keyword, and `k12=true` (district portals and purchasing cooperatives only). Ordered by first_seen_at descending, or `sort=closing_soon` for due date ascending with past due dates excluded. Totals are estimates on broad filters. Gated by the `rfp_feed` module entitlement; otherwise responds 403 entitlement_required. `district_id` or `school_id` narrows the feed to the bids linked to that entity (beta inference from the portal owner or the buyer name; each row's `entities` says how). An entity-scoped read is that entity's RFP layer (also served as /districts/{districtId}/rfps and /schools/{schoolId}/rfps), so without the module it is gated instead of refused: open on paid plans and for entities the `project_id`'s project follows, and otherwise the teaser `{ data: [], gated: true, gated_count }` counting all of the entity's linked bids. Its total is exact.
Enterprise catalog-wide search over canonical procurement opportunities (rfp_opportunities) harvested from public portals. Filter by buyer state, status, posted/closing date windows, a title keyword, and k12=true (district portals and purchasing cooperatives only). Ordered by first_seen_at descending, or sort=closing_soon for due date ascending with past due dates excluded. Totals are estimates on broad filters. Gated by the rfp_feed module entitlement; otherwise responds 403 entitlement_required.
district_id or school_id narrows the feed to the bids linked to that entity (beta inference from the portal owner or the buyer name; each row's entities says how). An entity-scoped read is that entity's RFP layer (also served as /districts/{districtId}/rfps and /schools/{schoolId}/rfps), so without the module it is gated instead of refused: open on paid plans and for entities the project_id's project follows, and otherwise the teaser { data: [], gated: true, gated_count } counting all of the entity's linked bids. Its total is exact.
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
Comma-separated two-letter buyer state codes
Comma-separated statuses: open, closed, unknown, cancelled, awarded
Only opportunities first seen on/after this ISO date (first_seen_at). Date-only values compare as midnight UTC.
Only opportunities first seen on/before this ISO date (first_seen_at). Date-only values compare as midnight UTC.
Only opportunities due on/after this ISO date (due_at). Date-only values compare as midnight UTC.
Only opportunities due on/before this ISO date (due_at). Date-only values compare as midnight UTC.
Keyword search on the opportunity title
true = only opportunities from K-12 district portals and purchasing cooperatives (a source-level filter)
"true" | "false"newest (first seen, newest first) or closing_soon (due date ascending; excludes past due dates)
"newest""newest" | "closing_soon"Only bids linked to this district (beta inference from the portal owner or buyer name). An entity-scoped read is the district's RFP layer: without the rfp_feed module it opens for paid plans and followed districts, and a free, unfollowed read returns { data: [], gated: true, gated_count }.
^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$uuidOnly bids linked to this school. Gated like district_id. Not with district_id.
^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$uuidProject whose follows the district_id / school_id gate should see (must belong to your organization). Ignored without an entity filter.
^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$uuid251 <= value <= 10000 <= value <= 9007199254740991Response Body
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://loading/api/v1/rfps"{
"data": [
{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"title": "string",
"buyer_name": "string",
"buyer_state": "string",
"solicitation_id": "string",
"status": "open",
"source_url": "string",
"detail_url": "string",
"due_at": "string",
"due_date": "string",
"first_seen_at": "string",
"last_seen_at": "string",
"confidence": 0,
"entities": [
{
"entity_type": "district",
"entity_id": "8161163a-f227-466f-bc01-090a01e80165",
"name": "string",
"state": "string",
"student_count": 0,
"method": "string",
"confidence": 0
}
]
}
],
"pagination": {
"total": -9007199254740991,
"limit": -9007199254740991,
"offset": -9007199254740991,
"has_more": true
}
}{
"error": "string",
"message": "string",
"statusCode": -9007199254740991
}{
"error": "string",
"message": "string",
"statusCode": -9007199254740991
}{
"error": "entitlement_required",
"module": "string",
"message": "string",
"contact": "string"
}{
"error": "string",
"message": "string",
"statusCode": -9007199254740991
}Download a stored RFP attachment GET
Redirects to a 60-second signed URL for Bellwork's stored copy of one attachment. The document must belong to the opportunity in the path. Gated by the `rfp_feed` module entitlement.
RFPs for one profile GET
Open bids (deadline today or later) linked to the profile's followed districts and opportunity districts, closing soonest; then K-12 bids in its territory states. District links are beta inferences. Gated by the `rfp_feed` module entitlement.