Vamo

Developer Search API

Semantic search over 27 million GitHub developers, matched on what they have actually built. One endpoint, one bearer key, JSON in and out.

Base URL https://search.vamotalent.ai

Step 1

Get a key

Keys are invite-only during the pilot. Paste the code we sent you and we will mint one immediately.

Step 2

Authenticate

Every search sends your key as a bearer token.

curl -s https://search.vamotalent.ai/v1/search \
  -H "Authorization: Bearer $VAMO_KEY" \
  -H "content-type: application/json" \
  -d '{"query":"rust compiler and LLVM backend engineers","languages":["Rust"],"limit":10}'
Your allowance is measured in developer profiles returned, not requests. A search with limit: 10 that returns 10 developers costs 10. Every response carries quota so you can self-throttle without a second call. Rate limit is 30 searches a minute.

401 the key is missing, wrong or revoked. 402 the allowance is spent — talk to us about a plan. 429 slow down. 502 search was briefly unavailable, and it cost you nothing.

Reference

POST /v1/search

FieldTypeNotes
querystringRequired. Plain language. Matched semantically against what people have built.
languagesstring[]Up to 10, e.g. ["Rust","C++"].
locationsstring[]Up to 10. Matched against self-reported GitHub location, which is often stale or blank.
minStarsint | nullMinimum stars across their repositories.
limitint1–50, default 25. This is also what the page costs you.
cursorstring | nullFrom the previous response. Opaque — do not construct or parse.

Response

FieldNotes
results[]id, login, name, avatarUrl, githubUrl, bio, company, location, hasEmail, followers, totalStars, languages, topRepos, matchedRepos
matchedReposWhy this person matched: the repositories that drove it.
hasEmailWhether we hold an address. The address itself is never returned by this API.
cursornull means there is nothing more on this lane.
unsupportedAny filter that did not bind, named. Empty is the normal case.
countStatusexact, or short with a reason. A short page is declared, never padded.
quota{ limit, used } in profile rows.

Step 3

Try it