Cogrant Search API

Discover EU grant matches, programmatically.

A partner-facing API in front of Cogrant's grant-matching engine. Submit a client profile; get back the funding calls that actually fit.

1 · Authenticate

Every request needs a partner API key passed as Authorization: Bearer <key>. Contact Cogrant to get one issued.

2 · Kick off a search

POST /v1/searches is accepted asynchronously; the response returns a job_id you then poll. Two payload shapes are supported — pick one per request.

Existing company — if the company already has a profile in Cogrant:

curl -sS -X POST https://api.cogrant.eu/v1/searches \
  -H 'Authorization: Bearer cog_live_...' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: sprint-42-client-acme' \
  -d '{"payload": {"company_id": "recABCDEFGHIJKLMN"}}'

New company — the gateway creates the profile on the fly (Organisation Type is set to Private Business) and then runs the search:

curl -sS -X POST https://api.cogrant.eu/v1/searches \
  -H 'Authorization: Bearer cog_live_...' \
  -H 'Content-Type: application/json' \
  -d '{"payload": {
    "company_name": "Acme Bio",
    "company_description": "Fermentation-based protein for the food industry.",
    "country": "Lithuania",
    "website": "https://acme.bio"
  }}'

company_name, company_description, and country are required; website is optional. country must match one of the values Cogrant uses on the Companies → Country field.

3 · Poll for completion

Searches typically finish in 60–120 seconds. Poll every 5–10 seconds until status is done or failed.

curl -sS https://api.cogrant.eu/v1/searches/{job_id} \
  -H 'Authorization: Bearer cog_live_...'

4 · Fetch the matches

Once the job is done, pull the full match set — parsed match analysis plus complete grant-detail JSON for every match.

curl -sS https://api.cogrant.eu/v1/searches/{job_id}/matches \
  -H 'Authorization: Bearer cog_live_...'

Each row carries two nested objects:

Every individual field is documented in the Swagger reference — expand MatchDetails and GrantDetails in the schemas panel for the full list with per-field meaning.

Errors & rate limits

Every error response uses a single envelope. error.code is machine-readable; error.request_id matches the X-Request-Id header and appears in Cogrant's logs — quote it in support requests.

{
  "error": {
    "code": "JOB_NOT_READY",
    "message": "Job not yet complete.",
    "request_id": "req_7c0a1f9e4b2d88ab",
    "details": { "status": "running", "hint": "..." }
  }
}

Known codes: UNAUTHORIZED, JOB_NOT_FOUND, JOB_NOT_READY, JOB_FAILED, INVALID_REQUEST, RATE_LIMITED.

Every authenticated response carries X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Window so you can pace requests. On a 429 the Retry-After header tells you how long until the tripped window frees up.

There are two bucket families: a general cap on all authenticated calls (minute / day / week) and a stricter cap on POST /v1/searches alone (searches_day / searches_week). Polling status and fetching matches hit only the general buckets — feel free to poll freely.

Idempotency

Pass an Idempotency-Key header on POST /v1/searches to make calls safely retryable. A repeat with the same key returns the original job and sets Idempotency-Replayed: true.

Interactive reference

The full OpenAPI schema lives at /openapi.json. A ready-to-try Swagger UI is mounted at /docs — hit the Authorize button and test every endpoint from your browser.