RallyPropRallyProp.ai

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
ParameterFormatExample
statusComma-separated or repeatedopen,pre_release
sourceComma-separated or repeatedNSTXL,GOCOLOSSEUM
agencyPartial text matchAir Force
program_typeComma-separated or repeatedSBIR,STTR
source_opportunity_idString, with exactly one sourceAF26.1-CSO1
updated_sinceRFC 3339 timestamp2026-10-01T00:00:00Z
limitInteger from 1 to 10025
cursorOpaque string from next_cursorDo 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=25

Store 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.