Skip to main content

Search the Developer Index

3 min read
get/search/developer
Request example
Response
get/search/developer

Search issues, merged pull requests, and READMEs from public code repositories, alongside curated documentation sites. Results are ranked and carry the matched passages in markdown.

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.

The index has two halves, and these two filters scope them independently:

  • repos scopes the repository half, meaning the issue, pull_request, and readme types
  • sources scopes the documentation half, meaning the doc type
  • Passing both combines the two halves rather than intersecting them, so you get matching results from either

Because each filter only applies to one half, a filter that cannot match any requested type is rejected rather than silently returning nothing:

  • repos with no repository type in types returns 400, reporting that repos cannot match any requested type and that you should add repository types or drop repos
  • sources with no doc in types returns 400 with sources cannot match any requested type; add doc or drop sources

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 code 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 repository evidence only: the issue, pull_request, and readme types, 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 the sources echo in the response to confirm the id is indexed.

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:

For a workflow overview, see the Developer Index guide.

Authorization

Authorizationstringheaderrequired#
Bearer authentication header of the form Bearer <token>, where <token> is your API key.

Query parameters

querystringrequired#
Natural-language question or search phrase.

Length: min 1

kinteger#
Number of ranked results to return.

Default: 10

Range: 1–100

typesenum<string>[]#
Result 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).
reposstring[]#
Repository slugs to scope the repository 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 when no repository type is in types, reporting that repos cannot match any requested type and that you should add repository types or drop repos.
sourcesstring[]#
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.

Items: max 20

skillsenum<string>#
Set to only to limit the search to indexed agent-skill files.
Options:only
passagesinteger#
Matched passages to return per result.

Default: 1

Range: 1–5

languagestring#
Repository primary language, such as Rust. Applies to repository results only; sending it with no sources scope returns no doc results. See how the repository filters scope a search.
topicstring#
Repository topic, such as async. Applies to repository results only; sending it with no sources scope returns no doc results.
licensestring#
Repository license, such as MIT. Applies to repository results only; sending it with no sources scope returns no doc results.
min_starsinteger#
Lower bound on repository stars. Applies to repository results only; sending it with no sources scope returns no doc results.

Range: >= 0

max_starsinteger#
Upper bound on repository stars. Applies to repository results only; sending it with no sources scope returns no doc results.

Range: >= 0

archivedboolean#
Include or exclude archived repositories. Applies to repository results only; sending it with no sources scope returns no doc results.
forkboolean#
Include or exclude forks. Applies to repository results only; sending it with no sources scope returns no doc results.

Responses

application/json
Ranked developer results with matched passages.
successboolean#
resultsobject[]#
Show child attributes
idstring#
Stable result id, such as issue:owner/repo#123.
typeenum<string>#
Result kind.
Options:docissuepull_requestreadme
urlstring#
titlestring#
Frequently absent on doc results, where the source page carries no usable title. Fall back to url.
passagesobject[]#
Matched passages in markdown, so tables and code blocks survive.
Show child attributes
textstring#
coverageobject#
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.
Show child attributes
docenum<string>#
Options:okdegradedunavailableskipped
issueenum<string>#
Options:okdegradedunavailableskipped
pull_requestenum<string>#
Options:okdegradedunavailableskipped
readmeenum<string>#
Options:okdegradedunavailableskipped
rerankedboolean#
Whether the ranked list went through the reranking stage.
reposobject[]#
Present only when repos was sent. Echoes each slug with whether it is indexed, plus a per-type breakdown under types.
Show child attributes
repostring#
indexedboolean#
typesobject#
Which result types are indexed for this repository: issue, pullRequest, and readme.
Show child attributes
issueboolean#
pullRequestboolean#
readmeboolean#
sourcesobject[]#
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.
Show child attributes
sourcestring#
indexedboolean#