Opportunities
Find and retrieve opportunities
Results are ordered by updated_at descending, then id descending. That order is fixed.
Find opportunities
GET https://eoqbgibebefvxxzadphf.supabase.co/functions/v1/external-api/v1/opportunities?status=open,pre_release&source=NSTXL,GOCOLOSSEUM&limit=25| Parameter | Format | Example |
|---|---|---|
| status | Comma-separated or repeated | open,pre_release |
| source | Comma-separated or repeated | NSTXL,GOCOLOSSEUM |
| agency | Partial text match | Air Force |
| program_type | Comma-separated or repeated | SBIR,STTR |
| source_opportunity_id | String, with exactly one source | AF26.1-CSO1 |
| updated_since | RFC 3339 timestamp | 2026-10-01T00:00:00Z |
| limit | Integer from 1 to 100 | 25 |
| cursor | Opaque string from next_cursor | Do not parse it |
Status values: forecast, pre_release, open, closing_soon, closed, awarded, cancelled, archived. Program types: SBIR, STTR, BAA, RFI, RFP, OTA, GRANT, CONTRACT, PRIZE, CSO, CRADA, INDUSTRY_EVENT, OTHER.
Source codes are open-ended. Read them from GET /sources or from each record. source=OTHER returns only records that are not assigned to a named source. Matching is case-insensitive.
Fetch changes since your last sync
GET https://eoqbgibebefvxxzadphf.supabase.co/functions/v1/external-api/v1/opportunities?updated_since=2026-10-01T00:00:00Z&limit=25Store the newest updated_at from the page and send it as updated_since on the next poll. This is not a substitute for event history. A record can change without a material event you care about, and an event can describe a field the list response does not expand.
Pagination
When meta.has_more is true, repeat the same filters and append cursor set to meta.next_cursor. Changing a filter requires a new request without the previous cursor. A cursor that does not match the filters returns 400 invalid_cursor.
Do not call links.next as returned. Build the next request against the base URL above. If you proxy RallyProp, return the cursor to your client and build your own next-page URL.
Retrieve a full opportunity
GET https://eoqbgibebefvxxzadphf.supabase.co/functions/v1/external-api/v1/opportunities/57c6b61e-2333-4737-8186-139cd27b929a
If-None-Match: W/"57c6b61e-2333-4737-8186-139cd27b929a:2026-10-02T13:04:04.387352+00:00"A non-UUID id returns 400. An unknown UUID returns 404. Detail responses include ETag and Last-Modified. Send the previous ETag as If-None-Match to receive 304 when the record has not changed.
description is source text and may contain HTML. Sanitize it before rendering. Funding amounts are decimal strings, not JavaScript numbers. value_estimate is reserved and is currently null. Treat null as not provided.