Skip to content

Opportunities

Search Opportunities

GET /api/v1/opportunities

Returns a paginated list of funding opportunities with full-text search and filters.

Query Parameters

ParameterTypeDefaultDescription
qstringFull-text search query (max 500 chars). Uses PostgreSQL FTS with relevance ranking.
typestringFilter by type. Comma-separated: rfp, grant, bounty, fellowship, hackathon
statusstringFilter by status. Comma-separated: draft, open, closing_soon, closed, awarded
ecosystemstringFilter by ecosystem (e.g., ethereum, optimism)
funderstringFilter by funding source slug
categorystringFilter by category
tagstringFilter by tag
min_budgetnumberMinimum budget filter
max_budgetnumberMaximum budget filter
closing_afterISO dateOnly opportunities closing after this date
closing_beforeISO dateOnly opportunities closing before this date
sortstringcreated_at:descSort field and direction. Options: created_at, closes_at, budget_max, title with :asc or :desc
pagenumber1Page number
limitnumber20Results per page (max 100)
cursorUUIDCursor for keyset pagination

Response

{
  "data": [
    {
      "id": "018e1234-5678-7890-abcd-ef1234567890",
      "title": "Privacy Research Grant",
      "summary": "Funding for ZK privacy research...",
      "rfpType": "grant",
      "status": "open",
      "budgetMin": 10000,
      "budgetMax": 50000,
      "currency": "USD",
      "ecosystems": ["ethereum"],
      "categories": ["research", "privacy"],
      "applicationUrl": "https://example.com/apply",
      "closesAt": "2026-06-30T00:00:00.000Z",
      "createdAt": "2026-03-01T00:00:00.000Z"
    }
  ],
  "meta": {
    "total": 23,
    "page": 1,
    "limit": 20,
    "hasMore": true,
    "nextCursor": "018e1234-..."
  }
}

Conditional GET

This endpoint supports ETag and If-Modified-Since headers. Responses include Cache-Control: public, max-age=60.


Get Opportunity

GET /api/v1/opportunities/:id

Returns a single opportunity by UUID.

Parameters

ParameterTypeDescription
idUUIDOpportunity ID (path parameter)

Response

Returns the full FundingOpportunity object. Returns 404 if not found or inactive.


Create Opportunity

POST /api/v1/opportunities

Requires API key (X-API-Key header).

Request Body

All fields from the RFP Object Standard except system-managed fields (id, createdAt, updatedAt, version, verifiedBy, verifiedAt, duplicateOf).

Required fields: title, description, summary, rfpType, slug, status, sourceId, applicationUrl, sourceUrl, submittedBy, publisherType, currency, categories, ecosystems, tags, eligibility, requiredCredentials.

Response

Returns the created opportunity with 201 status.


Update Opportunity

PUT /api/v1/opportunities/:id

Requires API key (X-API-Key header).

Request Body

Partial update — only include fields you want to change. All fields from the create schema are accepted, but none are required.

Response

Returns the updated opportunity. Returns 404 if not found. Version is auto-incremented.