Search the Developer Index
POST is available on the same path when you want to pass array filters as JSON.
Repeatable filters accept either form on GET: a repeated query parameter such as types=issue&types=pull_request, or one comma separated value such as types=issue,pull_request.
How repos and sources scope a search
The index has two halves, and these two filters scope them independently:
reposscopes the GitHub half, meaning theissue,pull_request, andreadmetypessourcesscopes the documentation half, meaning thedoctype- Passing both combines the two halves rather than intersecting them, so you get matching results from either
reposwith no GitHub type intypesreturns400withrepos cannot match any requested type; add github types or drop repossourceswith nodocintypesreturns400withsources cannot match any requested type; add doc or drop sources
How the repository filters scope a search
The seven repository filters —language (such as Rust), topic (such as async), license (such as MIT), min_stars, max_stars, archived, and fork — describe a GitHub repository. Most documentation pages in the index come from a crawled website with no repository behind it, and no repository fact can admit or exclude such a page.
A request that sends one of these filters and no sources scope therefore gets no doc results. Its response holds GitHub evidence only: the issue, pull_request, and readme types. The coverage map reports doc as unavailable, because the documentation half of the index never ran. This is the design, not an index fault.
To keep documentation results, drop the repository filters. You can also scope the documentation half with sources, then read coverage to confirm that the doc type answered.
Which values sources accepts
sources is not a fixed enum. It takes documentation source ids, each a nonempty string of at most 512 characters, and at most 20 per request. The ids reflect the documentation sites in the index, and the set grows over time.
To confirm an id resolves, pass it and read the sources array the response adds. It appears only when you sent sources, and reports each id exactly as you requested it along with whether it is indexed:
indexed: true means the source has a published generation, so documentation evidence from it may appear. indexed: false means nothing from that id can match, which distinguishes an id that is not in the index from a query that simply found nothing.
repos echoes back the same way, as a repos array reporting indexed plus a per type breakdown under types:
Reading coverage
coverage reports the outcome for each result type, one of ok, degraded, unavailable, or skipped. Check it when a result type you expected is missing:
skippedmeans yourtypesvalue did not ask for that typedegradedorunavailablemeans the gap came from the index or from a filter, not from the query. A repository filter is one such cause, as how the repository filters scope a search describes
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Query Parameters
Natural-language question or search phrase.
1Number of ranked results to return.
1 <= x <= 100Result kinds to search. Defaults to all four. Accepts a repeated parameter (types=issue&types=pull_request) or one comma-separated value (types=issue,pull_request).
doc, issue, pull_request, readme Repository slugs to scope the GitHub half of the index to, such as firecrawl/firecrawl. Applies to the issue, pull_request, and readme types only. Sent together with sources, the two halves are combined rather than intersected, so matching results come back from either. Returns 400 with repos cannot match any requested type; add github types or drop repos when no GitHub type is in types.
Documentation source ids to scope the documentation half to, at most 20. Applies to the doc type only. Not a fixed enum: ids reflect the documentation sites in the index and the set grows over time, so confirm an id resolves by sending it and reading the sources array on the response. Returns 400 with sources cannot match any requested type; add doc or drop sources when doc is not in types.
201 - 512Set to only to limit the search to indexed agent-skill files.
only Matched passages to return per result.
1 <= x <= 5Repository primary language, such as Rust. Applies to GitHub results only; sending it with no sources scope returns no doc results. See how the repository filters scope a search.
"Rust"
Repository topic, such as async. Applies to GitHub results only; sending it with no sources scope returns no doc results.
"async"
Repository license, such as MIT. Applies to GitHub results only; sending it with no sources scope returns no doc results.
"MIT"
Lower bound on repository stars. Applies to GitHub results only; sending it with no sources scope returns no doc results.
x >= 0Upper bound on repository stars. Applies to GitHub results only; sending it with no sources scope returns no doc results.
x >= 0Include or exclude archived repositories. Applies to GitHub results only; sending it with no sources scope returns no doc results.
Include or exclude forks. Applies to GitHub results only; sending it with no sources scope returns no doc results.
Response
Ranked developer results with matched passages.
Outcome for each result type. Check this when an expected result type is missing: skipped means your types value did not ask for that type, while degraded or unavailable means the gap came from the index or from a filter, not from the query. A repository filter is one such cause — see how the repository filters scope a search.
Whether the ranked list went through the reranking stage.
Present only when repos was sent. Echoes each slug with whether it is indexed, plus a per-type breakdown under types.
Present only when sources was sent. Reports each id exactly as requested along with whether it is indexed. indexed: true means the source has a published generation, so documentation evidence from it may appear; indexed: false means nothing from that id can match, which distinguishes an id that is not in the index from a query that simply found nothing.

