Look up developers (alias of POST /v2/developers)

POST https://api.vamotalent.ai/v2/developers/lookup
Access
Authenticated
search:read
Cost
Free
Rate limit
30 / minute per account
Quota
None

v2 of POST /v1/developers: the v1 body and response, plus conveniences folded into it, with two differences. facets takes the public menu only: a depth tier (core, enriched, deep) or identity.linkedin, contact.socials, contact.emails, tags.repos, ai.person_summary, ai.repo_summaries, ai.match_rationale; anything else is a 400. And each result’s relationship says whether the developer is your contact (contactId) and which of your shortlists they are on (shortlistIds), with no project or outreach history. The conveniences: logins (GitHub handles) and linkedin (slugs or URLs) join inputs; ids (or githubIds: the GitHub numeric id is the developer id) join developerIds; depth (core, enriched, deep) asks for that tier’s facet bundle, and facets adds facets on top of the depth. Up to 1000 people per call, logins, LinkedIn and ids together; GitHub logins and the ids search returned are the fastest. Answers come from data Vamo already holds, so they are fast. Contribution gardens are opt-in: send garden (true, summary or full) to get them, whatever the input count; a garden not held yet is null and POST /v2/developers/gardens returns it a few seconds later. Ambiguous and not-found inputs are free. Billed 1 credit per developer returned, plus each facet cell delivered for that developer: depth is a bundle of facet cells (core, enriched, deep, each a superset of the last) and facets adds more. A cell you already own bills 0. Price a request before sending it from the free GET /v2/pricing/catalog (skus, facets, and the depth tiers under bundles). The x-cost response header is what the call cost, and GET /v1/account/credits reads the balance.

Request body application/json

  • inputs array of string

    Human identifiers to resolve, up to 1000: a GitHub handle, a github.com URL, an @handle, a LinkedIn URL, a person’s name, or a repository (`owner/name` or its URL, which resolves to the owner). GitHub handles are the fastest. You are billed 1 credit per DEVELOPER this call hands back, plus each facet cell you ask for (priced in the free `GET /v2/pricing/catalog`); ambiguous and not-found inputs are free, and two inputs that resolve to the same developer are one charge. At least one of `inputs` or `developerIds` is required.

    min 1 items, max 1000 items
  • developerIds array of string

    Developer ids you already hold (every search result's `id`), up to 1000, hydrated directly. Billed the same 1 credit per developer as every other door, plus each facet cell you ask for. An unknown id is free and degrades to a `not_found` result for that entry rather than failing the batch.

    min 1 items, max 1000 items
  • garden one of

    Return each result with its contribution garden and live GitHub stats, which is what lets you render a whole set of developers from this one request instead of one request each. Free. For `developerIds` it is off by default, because it costs one extra upstream request per 25 developers in latency; `inputs` results carry one when there are 25 inputs or fewer, and otherwise only when asked. The garden comes back as a compact `gardenSummary` (totals, active days and weeks, the last 90 days, per-month counts) with `garden` null, which is what `true` and `"summary"` return. Send `"full"` for the whole daily `garden` instead, for drawing a heatmap.

  • facets array of string

    What to resolve inline for every developer that resolves, billed per cell: a depth tier (`core`, `enriched`, `deep`) and/or the à-la-carte keys `identity.linkedin`, `contact.socials`, `contact.emails`, `tags.repos`, `ai.person_summary`, `ai.repo_summaries`, `ai.match_rationale`. Anything else is a 400. The AI summaries are written in the background: when one is not held yet its cell comes back `report_required` at no charge. This endpoint never returns a pending cell.

    min 1 items, max 10 items
  • contextRef string

    A registered job-description context, required for facets that judge a developer against a role rather than describing them in isolation.

    max 200 chars

Responses

Positional results plus the optional inline facets block

  • results array of object required

    Results in a fixed order: every `inputs` result first, positionally, then every `developerIds` result, positionally. A miss is always a result with a status, never a gap in the array.

    max 1000 items
    • input string required

      The input string this result answers, echoed back verbatim.

      max 2048 chars
    • status string required

      `resolved` = exactly one developer matched and `developer` is populated. `ambiguous` = more than one developer plausibly matched (a common name, a repository with an unclear owner), so `developer` is null and `candidates` holds the ranked possibilities for you to disambiguate. `not_found` = nothing matched. A miss is always one of these three and never a silent empty result.

      resolvedambiguousnot_found
    • developer object | null required

      The resolved developer. Null unless `status` is `resolved`.

      • developerId string required

        The stable Vamo identifier for this developer (GitHub's numeric user id, stringified). This is the id every other endpoint takes: facets, reports, contacts, shortlists, steering. Use it, not `login` — a login can be renamed and then belongs to someone else.

        max 64 chars
      • login string required

        The GitHub handle as of the last snapshot. Display it, do not key on it: handles are renameable and reusable.

        max 200 chars
      • name string | null required

        Display name as the developer set it on GitHub. Null when they set none.

        max 200 chars
      • avatarUrl string | null required

        GitHub avatar image URL. Null when absent.

        max 2048 chars
      • currentRole string | null required

        A single free-text role line for the developer. Best-effort and unverified; `professional.title` is the LinkedIn-sourced equivalent when we hold a LinkedIn overlay.

        max 200 chars
      • organization object | null required

        The developer's current employer, when one is known. Null means we hold no employer, NOT that they are unemployed.

        • name string required

          The organization name as recorded.

          max 200 chars
        • logoUrl string | null required

          Organization logo URL, null when absent.

          max 2048 chars
      • university string | null required

        Most recent institution, when the LinkedIn overlay carries education. Null when unknown.

        max 200 chars
      • profiles object required

        Where this developer can be found, plus the addresses if you have already bought them.

        • github string required

          The developer’s github.com profile URL. Always present — GitHub is the identity anchor for every developer in the index.

          max 2048 chars
        • linkedin string | null required

          LinkedIn profile URL when we hold a GitHub↔LinkedIn match for this person. Null for the large majority of developers: only a minority of the indexed GitHub population carries a LinkedIn overlay, so null means "no match held", never "no LinkedIn account".

          max 2048 chars
        • emails array of string

          Every email address we hold for this developer. Present ONLY when this account has already paid to reveal them and the purchase is still within its reveal window; a base search or profile read never populates it. ABSENT is not the same as "no email": absent means you have not bought it, while `hasEmail: false` means we hold none. These are addresses we have OBSERVED — from public commit metadata and GitHub profile data — and we do not check deliverability, so treat the order as meaningless and expect some to bounce. Buy them with the `contact.emails` facet.

          max 50 items
      • hasEmail boolean required

        Whether we hold at least one email address for this developer. It says we have an address on file, not that the address works — we do not check deliverability. The addresses themselves are never returned by a search or a base profile read: this boolean is the free signal, and the paid `contact.emails` facet is the only way to get them. Use `hasEmail` on a search request to filter to developers we hold an address for, without paying.

      • bio string | null required

        The developer’s GitHub bio, verbatim. Null when empty.

        max 5000 chars
      • location object | null required

        Self-reported location, plus our geocoding of it. Self-reported and never verified against anything: a developer can leave it stale or blank. `source` says whether the clean city/country came from the LinkedIn overlay or from geocoding GitHub. Null when we hold nothing at all.

        • raw string | null required

          The location string exactly as the developer typed it on GitHub ("SF / remote").

          max 200 chars
        • city string | null required

          City resolved from `raw` by geocoding. Null when `raw` was empty or unresolvable.

          max 200 chars
        • state string | null

          The country subdivision (US state, province, region) as a full name, e.g. "Ohio". Present only from the clean LinkedIn overlay, for the developers we hold a match for. Absent otherwise: the GitHub geocoder does not reliably resolve it (so we do not surface its guess), and it is legitimately absent for city-states and metro-only profiles.

          max 200 chars
        • country string | null required

          Country resolved from `raw`. Null when `raw` was empty or unresolvable. It can also be null while `city` is set, so read `city` and `raw` beside it before treating a location as unknown.

          max 200 chars
        • source string

          Where the resolved city/country came from: `linkedin` when our LinkedIn overlay supplied it (clean, self-reported on LinkedIn), `github` when it is geocoded from the GitHub `raw` string. Most developers have no LinkedIn match, so `github` is the common case and its city/country are often sparse. Absent on unresolved payloads.

          linkedingithub
      • joinedAt string | null required

        When the GitHub account was created, as an ISO 8601 instant. Null when unknown.

        max 40 chars
      • stats object | null required

        Snapshot counts and standing for this developer. These are from our index and go stale between refreshes; `GET /v1/developers/{id}` returns live GitHub equivalents alongside the contribution garden when you need current numbers. Null when we hold no stats at all.

        • followers integer | null required

          GitHub follower count at snapshot time.

          min 0, max 100000000
        • following integer | null required

          How many accounts this developer follows, at snapshot time.

          min 0, max 100000000
        • totalStars integer | null required

          Sum of stargazers across the repositories ATTRIBUTED to this developer — the same set as `repos`, so the count can never contradict the list. Owned and contributed-to repositories both count; forks do not.

          min 0, max 100000000
        • crackedScore number | null required

          Devrank: a 0–100 standing for this developer within the WHOLE indexed GitHub developer population (tens of millions of accounts), not within a language, region, or seniority peer group — so it is not a like-for-like comparison between two candidates for the same role. It is derived from the follower/contribution graph, is recomputed upstream on its own schedule, and carries no version on the wire, so the same developer can read differently across two snapshots. It contributes one term to the page-local `score` and backs the `levers.github.minDevrank` filter. Null when the developer is not in the devrank table.

        • tier string | null required

          The upstream provider’s own coarse label for `crackedScore` (for example "Elite"). The label set is the provider’s and is not a Vamo-stable vocabulary — treat it as display text and branch on `crackedScore` if you need a threshold. Null when the developer is not in the devrank table.

          max 200 chars
      • repos array of object required

        The developer’s top ATTRIBUTED public repositories — owned or authored-into, forks excluded — stars descending, capped at 12. This is a sample of their best work, not a complete repository list, and it is not an answer to "why did this person match my query" — read `evidence.matchedRepos` for that.

        max 12 items
        • name string required

          The repository name alone, without the owner (`linux`).

          max 200 chars
        • fullName string required

          GitHub `owner/name`. This is the join key: an evidence repo and a profile repo describing the same repository carry the same `fullName`.

          max 200 chars
        • description string | null required

          The repository's own GitHub description, verbatim. Null when it has none.

          max 5000 chars
        • language string | null required

          GitHub's primary language for the repository. Null when GitHub reports none (an empty or docs-only repo); never inferred from the code.

          max 200 chars
        • stars integer required

          Stargazer count at the time this profile was snapshotted, not at request time.

          min 0, max 100000000
        • commits integer

          How many commits THIS developer authored to this repository over the trailing year. This is the difference between a project they wrote and a project they landed one drive-by fix in — a 385k-star repository with 4 of their commits is not their work. Absent when no commit signal was captured; 0 means none in the trailing year, which for older dormant work is not the same as none ever.

          min 0, max 100000000
        • owned boolean

          True when the repository sits under the developer's own account, false when it is someone else's (an organisation's or another person's) and they are a contributor to it. This is the difference between "they built this" and "they committed to this", and it is the ONLY honest basis for crediting a repository's stars to a person. Absent when no ownership signal was captured; treat absent as unknown, never as false.

        • url string required

          The public github.com URL of the repository.

          max 2048 chars
      • languages array of string required

        Distinct primary languages across the developer’s repositories, at most 8. Presence means they have shipped public code in it; the list is not ranked by proficiency and carries no line counts.

        max 8 items
      • experience array of object required

        Employment history from the LinkedIn overlay, newest first. Empty for any developer we hold no LinkedIn match for, which is most of them.

        max 25 items
        • title string | null

          Job title, on an experience entry.

          max 200 chars
        • company string | null

          Employer name, on an experience entry.

          max 200 chars
        • companyCanonicalId string | null

          Vamo canonical company id for the employer (`li_co:<LinkedIn company id>`, `dom:<domain>` or `name:<key>`). Absent when the employer is not matched to a verified company.

          max 200 chars
        • companyDomain string | null

          The employer's verified website domain (`vercel.com`). Absent when unknown; never derived from the name.

          max 200 chars
        • companyLogoUrl string | null

          The employer's logo image URL (https). Absent when we hold no verified logo.

          max 2048 chars
        • companyGithubOrg string | null

          The employer's GitHub organization login, verified by its website matching the company domain.

          max 200 chars
        • companyKind string

          `placeholder` when the employer is not a company (self-employed, freelance, stealth, between roles, ...). Such a row never carries a company domain, logo or id.

          placeholder
        • placeholderType string

          Which kind of placeholder employer, when `companyKind` is `placeholder`.

          self_employedfreelancestealthindependentconsultantbetween_rolesstudent
        • school string | null

          Institution name, on an education entry.

          max 200 chars
        • degree string | null

          Degree awarded, on an education entry.

          max 200 chars
        • fieldOfStudy string | null

          Field of study, on an education entry.

          max 200 chars
        • startDate string | null

          Start date exactly as the source rendered it. Free text, NOT a normalised date: expect "2019", "Jan 2019" and "2019-01" from different records. Parse defensively.

          max 200 chars
        • endDate string | null

          End date in the same unnormalised free-text form as `startDate`. Absent or null on a current role.

          max 200 chars
        • current boolean | null

          The source's own "still there" flag. Set on experience entries; null on education entries.

      • education array of object required

        Education history from the LinkedIn overlay. Empty for any developer we hold no LinkedIn match for.

        max 25 items
        • title string | null

          Job title, on an experience entry.

          max 200 chars
        • company string | null

          Employer name, on an experience entry.

          max 200 chars
        • companyCanonicalId string | null

          Vamo canonical company id for the employer (`li_co:<LinkedIn company id>`, `dom:<domain>` or `name:<key>`). Absent when the employer is not matched to a verified company.

          max 200 chars
        • companyDomain string | null

          The employer's verified website domain (`vercel.com`). Absent when unknown; never derived from the name.

          max 200 chars
        • companyLogoUrl string | null

          The employer's logo image URL (https). Absent when we hold no verified logo.

          max 2048 chars
        • companyGithubOrg string | null

          The employer's GitHub organization login, verified by its website matching the company domain.

          max 200 chars
        • companyKind string

          `placeholder` when the employer is not a company (self-employed, freelance, stealth, between roles, ...). Such a row never carries a company domain, logo or id.

          placeholder
        • placeholderType string

          Which kind of placeholder employer, when `companyKind` is `placeholder`.

          self_employedfreelancestealthindependentconsultantbetween_rolesstudent
        • school string | null

          Institution name, on an education entry.

          max 200 chars
        • degree string | null

          Degree awarded, on an education entry.

          max 200 chars
        • fieldOfStudy string | null

          Field of study, on an education entry.

          max 200 chars
        • startDate string | null

          Start date exactly as the source rendered it. Free text, NOT a normalised date: expect "2019", "Jan 2019" and "2019-01" from different records. Parse defensively.

          max 200 chars
        • endDate string | null

          End date in the same unnormalised free-text form as `startDate`. Absent or null on a current role.

          max 200 chars
        • current boolean | null

          The source's own "still there" flag. Set on experience entries; null on education entries.

      • professional object | null

        LinkedIn-sourced professional scalars, present only when we hold a LinkedIn match for this developer. Absent or null for the majority of developers, which says nothing about their employment — only that we hold no overlay.

        • headline string | null required

          The LinkedIn headline, verbatim.

          max 5000 chars
        • title string | null required

          Current job title per LinkedIn, e.g. "Chief Technology Officer".

          max 200 chars
        • company string | null required

          Current employer per LinkedIn. Distinct from the GitHub-sourced `organization` field, and the two disagree often — LinkedIn is usually the fresher of the two.

          max 200 chars
        • seniority string | null required

          A coarse seniority label from the LinkedIn overlay ("c-level", "senior", …). Free text from the source, not a Vamo enum; do not switch on the exact string.

          max 200 chars
        • expertise array of string required

          Self-declared skill tags from the LinkedIn profile. Claimed, not demonstrated — the demonstrated equivalent is the repositories under `repos` and `evidence`.

          max 25 items
    • garden object | null required

      The developer’s contribution garden. Null on a miss, and also null when the garden fetch itself failed — a garden failure never fails the lookup, it lands in `warnings` instead.

      • counts object required

        Contribution counts as a sparse map: `YYYY-MM-DD` → contributions GitHub counted that day (commits to default branches, opened issues and pull requests, and reviews). A day inside the [from, to] window that is absent here had ZERO contributions — zero days are omitted on purpose.

      • from string required

        First day of the garden window, `YYYY-MM-DD`, inclusive.

        max 10 chars
      • to string required

        Last day of the garden window, `YYYY-MM-DD`, inclusive.

        max 10 chars
      • total integer required

        Total contributions across `days`. Public activity only: work in private repositories is invisible here, so a low total is not evidence of a low output.

        min 0, max 1000000
      • fetchedAt string required

        When the garden was last read from GitHub, as an ISO 8601 instant. It can be older than your request.

        max 40 chars
      • liveStats object

        Live GitHub counts fetched alongside the calendar. Absent on older gardens.

        • followers integer required

          Current GitHub follower count, live.

          min 0, max 100000000
        • following integer required

          How many accounts they currently follow, live.

          min 0, max 100000000
        • totalStars integer required

          Sum of stargazers across the repositories this developer OWNS (`repos[].owned === true`), forks excluded, computed live. Stars on repositories they merely contribute to are NOT counted: those stars were earned by whoever built the project. Read this as "stars on their own work", never as their total reach. Never a provider-reported aggregate.

          min 0, max 100000000
        • repos array of object required

          Their attributed repositories as they exist right now — owned plus the org-owned projects they author commits and pull requests into, each flagged by `owned` — ordered by how much of the work is theirs, weighing their own commit count against the repository’s stars rather than stars alone, with a modest weight toward what they own. Same shape as the profile’s snapshot repos, so one renderer handles both.

          max 12 items
          • name string required

            The repository name alone, without the owner (`linux`).

            max 200 chars
          • fullName string required

            GitHub `owner/name`. This is the join key: an evidence repo and a profile repo describing the same repository carry the same `fullName`.

            max 200 chars
          • description string | null required

            The repository's own GitHub description, verbatim. Null when it has none.

            max 5000 chars
          • language string | null required

            GitHub's primary language for the repository. Null when GitHub reports none (an empty or docs-only repo); never inferred from the code.

            max 200 chars
          • stars integer required

            Stargazer count at the time this profile was snapshotted, not at request time.

            min 0, max 100000000
          • commits integer

            How many commits THIS developer authored to this repository over the trailing year. This is the difference between a project they wrote and a project they landed one drive-by fix in — a 385k-star repository with 4 of their commits is not their work. Absent when no commit signal was captured; 0 means none in the trailing year, which for older dormant work is not the same as none ever.

            min 0, max 100000000
          • owned boolean

            True when the repository sits under the developer's own account, false when it is someone else's (an organisation's or another person's) and they are a contributor to it. This is the difference between "they built this" and "they committed to this", and it is the ONLY honest basis for crediting a repository's stars to a person. Absent when no ownership signal was captured; treat absent as unknown, never as false.

          • url string required

            The public github.com URL of the repository.

            max 2048 chars
    • warnings array of string required

      Non-fatal problems with this input: a malformed identifier, a failed garden fetch. A warning never means the result is invalid.

      max 8 items
    • candidates array of object

      Ranked possible matches, best first, when `status` is `ambiguous`. Empty or absent on every other status.

      max 10 items
      • developerId string required

        The stable Vamo identifier for this developer (GitHub's numeric user id, stringified). This is the id every other endpoint takes: facets, reports, contacts, shortlists, steering. Use it, not `login` — a login can be renamed and then belongs to someone else.

        max 64 chars
      • login string required

        The GitHub handle as of the last snapshot. Display it, do not key on it: handles are renameable and reusable.

        max 200 chars
      • name string | null required

        Display name as the developer set it on GitHub. Null when they set none.

        max 200 chars
      • avatarUrl string | null required

        GitHub avatar image URL. Null when absent.

        max 2048 chars
      • currentRole string | null required

        A single free-text role line for the developer. Best-effort and unverified; `professional.title` is the LinkedIn-sourced equivalent when we hold a LinkedIn overlay.

        max 200 chars
      • organization object | null required

        The developer's current employer, when one is known. Null means we hold no employer, NOT that they are unemployed.

        • name string required

          The organization name as recorded.

          max 200 chars
        • logoUrl string | null required

          Organization logo URL, null when absent.

          max 2048 chars
      • university string | null required

        Most recent institution, when the LinkedIn overlay carries education. Null when unknown.

        max 200 chars
      • profiles object required

        Where this developer can be found, plus the addresses if you have already bought them.

        • github string required

          The developer’s github.com profile URL. Always present — GitHub is the identity anchor for every developer in the index.

          max 2048 chars
        • linkedin string | null required

          LinkedIn profile URL when we hold a GitHub↔LinkedIn match for this person. Null for the large majority of developers: only a minority of the indexed GitHub population carries a LinkedIn overlay, so null means "no match held", never "no LinkedIn account".

          max 2048 chars
        • emails array of string

          Every email address we hold for this developer. Present ONLY when this account has already paid to reveal them and the purchase is still within its reveal window; a base search or profile read never populates it. ABSENT is not the same as "no email": absent means you have not bought it, while `hasEmail: false` means we hold none. These are addresses we have OBSERVED — from public commit metadata and GitHub profile data — and we do not check deliverability, so treat the order as meaningless and expect some to bounce. Buy them with the `contact.emails` facet.

          max 50 items
      • hasEmail boolean required

        Whether we hold at least one email address for this developer. It says we have an address on file, not that the address works — we do not check deliverability. The addresses themselves are never returned by a search or a base profile read: this boolean is the free signal, and the paid `contact.emails` facet is the only way to get them. Use `hasEmail` on a search request to filter to developers we hold an address for, without paying.

      • bio string | null required

        The developer’s GitHub bio, verbatim. Null when empty.

        max 5000 chars
      • location object | null required

        Self-reported location, plus our geocoding of it. Self-reported and never verified against anything: a developer can leave it stale or blank. `source` says whether the clean city/country came from the LinkedIn overlay or from geocoding GitHub. Null when we hold nothing at all.

        • raw string | null required

          The location string exactly as the developer typed it on GitHub ("SF / remote").

          max 200 chars
        • city string | null required

          City resolved from `raw` by geocoding. Null when `raw` was empty or unresolvable.

          max 200 chars
        • state string | null

          The country subdivision (US state, province, region) as a full name, e.g. "Ohio". Present only from the clean LinkedIn overlay, for the developers we hold a match for. Absent otherwise: the GitHub geocoder does not reliably resolve it (so we do not surface its guess), and it is legitimately absent for city-states and metro-only profiles.

          max 200 chars
        • country string | null required

          Country resolved from `raw`. Null when `raw` was empty or unresolvable. It can also be null while `city` is set, so read `city` and `raw` beside it before treating a location as unknown.

          max 200 chars
        • source string

          Where the resolved city/country came from: `linkedin` when our LinkedIn overlay supplied it (clean, self-reported on LinkedIn), `github` when it is geocoded from the GitHub `raw` string. Most developers have no LinkedIn match, so `github` is the common case and its city/country are often sparse. Absent on unresolved payloads.

          linkedingithub
      • joinedAt string | null required

        When the GitHub account was created, as an ISO 8601 instant. Null when unknown.

        max 40 chars
      • stats object | null required

        Snapshot counts and standing for this developer. These are from our index and go stale between refreshes; `GET /v1/developers/{id}` returns live GitHub equivalents alongside the contribution garden when you need current numbers. Null when we hold no stats at all.

        • followers integer | null required

          GitHub follower count at snapshot time.

          min 0, max 100000000
        • following integer | null required

          How many accounts this developer follows, at snapshot time.

          min 0, max 100000000
        • totalStars integer | null required

          Sum of stargazers across the repositories ATTRIBUTED to this developer — the same set as `repos`, so the count can never contradict the list. Owned and contributed-to repositories both count; forks do not.

          min 0, max 100000000
        • crackedScore number | null required

          Devrank: a 0–100 standing for this developer within the WHOLE indexed GitHub developer population (tens of millions of accounts), not within a language, region, or seniority peer group — so it is not a like-for-like comparison between two candidates for the same role. It is derived from the follower/contribution graph, is recomputed upstream on its own schedule, and carries no version on the wire, so the same developer can read differently across two snapshots. It contributes one term to the page-local `score` and backs the `levers.github.minDevrank` filter. Null when the developer is not in the devrank table.

        • tier string | null required

          The upstream provider’s own coarse label for `crackedScore` (for example "Elite"). The label set is the provider’s and is not a Vamo-stable vocabulary — treat it as display text and branch on `crackedScore` if you need a threshold. Null when the developer is not in the devrank table.

          max 200 chars
      • repos array of object required

        The developer’s top ATTRIBUTED public repositories — owned or authored-into, forks excluded — stars descending, capped at 12. This is a sample of their best work, not a complete repository list, and it is not an answer to "why did this person match my query" — read `evidence.matchedRepos` for that.

        max 12 items
        • name string required

          The repository name alone, without the owner (`linux`).

          max 200 chars
        • fullName string required

          GitHub `owner/name`. This is the join key: an evidence repo and a profile repo describing the same repository carry the same `fullName`.

          max 200 chars
        • description string | null required

          The repository's own GitHub description, verbatim. Null when it has none.

          max 5000 chars
        • language string | null required

          GitHub's primary language for the repository. Null when GitHub reports none (an empty or docs-only repo); never inferred from the code.

          max 200 chars
        • stars integer required

          Stargazer count at the time this profile was snapshotted, not at request time.

          min 0, max 100000000
        • commits integer

          How many commits THIS developer authored to this repository over the trailing year. This is the difference between a project they wrote and a project they landed one drive-by fix in — a 385k-star repository with 4 of their commits is not their work. Absent when no commit signal was captured; 0 means none in the trailing year, which for older dormant work is not the same as none ever.

          min 0, max 100000000
        • owned boolean

          True when the repository sits under the developer's own account, false when it is someone else's (an organisation's or another person's) and they are a contributor to it. This is the difference between "they built this" and "they committed to this", and it is the ONLY honest basis for crediting a repository's stars to a person. Absent when no ownership signal was captured; treat absent as unknown, never as false.

        • url string required

          The public github.com URL of the repository.

          max 2048 chars
      • languages array of string required

        Distinct primary languages across the developer’s repositories, at most 8. Presence means they have shipped public code in it; the list is not ranked by proficiency and carries no line counts.

        max 8 items
      • experience array of object required

        Employment history from the LinkedIn overlay, newest first. Empty for any developer we hold no LinkedIn match for, which is most of them.

        max 25 items
        • title string | null

          Job title, on an experience entry.

          max 200 chars
        • company string | null

          Employer name, on an experience entry.

          max 200 chars
        • companyCanonicalId string | null

          Vamo canonical company id for the employer (`li_co:<LinkedIn company id>`, `dom:<domain>` or `name:<key>`). Absent when the employer is not matched to a verified company.

          max 200 chars
        • companyDomain string | null

          The employer's verified website domain (`vercel.com`). Absent when unknown; never derived from the name.

          max 200 chars
        • companyLogoUrl string | null

          The employer's logo image URL (https). Absent when we hold no verified logo.

          max 2048 chars
        • companyGithubOrg string | null

          The employer's GitHub organization login, verified by its website matching the company domain.

          max 200 chars
        • companyKind string

          `placeholder` when the employer is not a company (self-employed, freelance, stealth, between roles, ...). Such a row never carries a company domain, logo or id.

          placeholder
        • placeholderType string

          Which kind of placeholder employer, when `companyKind` is `placeholder`.

          self_employedfreelancestealthindependentconsultantbetween_rolesstudent
        • school string | null

          Institution name, on an education entry.

          max 200 chars
        • degree string | null

          Degree awarded, on an education entry.

          max 200 chars
        • fieldOfStudy string | null

          Field of study, on an education entry.

          max 200 chars
        • startDate string | null

          Start date exactly as the source rendered it. Free text, NOT a normalised date: expect "2019", "Jan 2019" and "2019-01" from different records. Parse defensively.

          max 200 chars
        • endDate string | null

          End date in the same unnormalised free-text form as `startDate`. Absent or null on a current role.

          max 200 chars
        • current boolean | null

          The source's own "still there" flag. Set on experience entries; null on education entries.

      • education array of object required

        Education history from the LinkedIn overlay. Empty for any developer we hold no LinkedIn match for.

        max 25 items
        • title string | null

          Job title, on an experience entry.

          max 200 chars
        • company string | null

          Employer name, on an experience entry.

          max 200 chars
        • companyCanonicalId string | null

          Vamo canonical company id for the employer (`li_co:<LinkedIn company id>`, `dom:<domain>` or `name:<key>`). Absent when the employer is not matched to a verified company.

          max 200 chars
        • companyDomain string | null

          The employer's verified website domain (`vercel.com`). Absent when unknown; never derived from the name.

          max 200 chars
        • companyLogoUrl string | null

          The employer's logo image URL (https). Absent when we hold no verified logo.

          max 2048 chars
        • companyGithubOrg string | null

          The employer's GitHub organization login, verified by its website matching the company domain.

          max 200 chars
        • companyKind string

          `placeholder` when the employer is not a company (self-employed, freelance, stealth, between roles, ...). Such a row never carries a company domain, logo or id.

          placeholder
        • placeholderType string

          Which kind of placeholder employer, when `companyKind` is `placeholder`.

          self_employedfreelancestealthindependentconsultantbetween_rolesstudent
        • school string | null

          Institution name, on an education entry.

          max 200 chars
        • degree string | null

          Degree awarded, on an education entry.

          max 200 chars
        • fieldOfStudy string | null

          Field of study, on an education entry.

          max 200 chars
        • startDate string | null

          Start date exactly as the source rendered it. Free text, NOT a normalised date: expect "2019", "Jan 2019" and "2019-01" from different records. Parse defensively.

          max 200 chars
        • endDate string | null

          End date in the same unnormalised free-text form as `startDate`. Absent or null on a current role.

          max 200 chars
        • current boolean | null

          The source's own "still there" flag. Set on experience entries; null on education entries.

      • professional object | null

        LinkedIn-sourced professional scalars, present only when we hold a LinkedIn match for this developer. Absent or null for the majority of developers, which says nothing about their employment — only that we hold no overlay.

        • headline string | null required

          The LinkedIn headline, verbatim.

          max 5000 chars
        • title string | null required

          Current job title per LinkedIn, e.g. "Chief Technology Officer".

          max 200 chars
        • company string | null required

          Current employer per LinkedIn. Distinct from the GitHub-sourced `organization` field, and the two disagree often — LinkedIn is usually the fresher of the two.

          max 200 chars
        • seniority string | null required

          A coarse seniority label from the LinkedIn overlay ("c-level", "senior", …). Free text from the source, not a Vamo enum; do not switch on the exact string.

          max 200 chars
        • expertise array of string required

          Self-declared skill tags from the LinkedIn profile. Claimed, not demonstrated — the demonstrated equivalent is the repositories under `repos` and `evidence`.

          max 25 items
    • gardenSummary object
      • from string required

        First day of the garden window, `YYYY-MM-DD`, inclusive.

      • to string required

        Last day of the garden window, `YYYY-MM-DD`, inclusive.

      • total integer required

        Public contributions across the window.

      • activeDays integer required

        Days in the window with at least one contribution.

      • activeWeeks integer required

        Distinct weeks in the window with at least one contribution. Steady contributors score close to 52.

      • last90Days integer required

        Contributions in the 90 days ending on `to`.

      • lastActiveDay string | null required

        The most recent day with a contribution, `YYYY-MM-DD`. Null when the window is empty.

      • byMonth object required

        Contributions per calendar month, `YYYY-MM` → count. Months with none are omitted.

      • fetchedAt string required

        When the underlying garden was read from GitHub, as an ISO 8601 instant.

      • followers integer | null required

        Current GitHub follower count, live. Null on older gardens.

      • totalStars integer | null required

        Stars on repositories they OWN, live. Null on older gardens.

    • relationship PublicLookupDeveloperRelationship required

      What your account already holds on this developer, plus who on your team put them there. Always present, even on a miss, where it reports no relationship.

      • inContacts boolean required

        True when your account already holds this developer as a contact, hidden ones included.

      • contactId string | null required

        Your contact id for this developer (use it on the contacts routes). Null when they are not a contact.

      • shortlistIds array of string required

        The ids of your shortlists this developer is on, archived ones included. Empty when they are on none.

      • doNotContactAt string | null required

        When this contact was marked do-not-contact, as an ISO 8601 instant. Non-null means outreach to them is suppressed. Null when they are contactable or not a contact at all.

      • addedAt string | null required

        When they became a contact, as an ISO 8601 instant. Null when they are not a contact.

      • addedBy string | null required

        Who added them: a member id, or an API key id when an agent did. Null when they are not a contact.

      • addedByEmail string | null required

        `addedBy` resolved for display: a member’s email address, the literal "API key", or the raw id when neither resolves.

      • addedByName string | null required

        `addedBy` resolved to a display NAME: the member’s name (or their email local part), or the API key’s label when an agent added them. Null when they are not a contact, and when the id resolves to neither. `addedByEmail` resolves the same id to an email address instead.

  • facets object

    The inline enrichment block. Present only when `facets` was requested.

    • cells array of object required

      One cell per resolved developer per requested facet. Check each cell’s `status` before reading its value.

      • developerId string required

        The developer this cell is about.

        max 64 chars
      • facetKey string required

        Which facet this cell answers.

      • status string required

        The outcome for this one (developer × facet) pair. Exactly one status is billed: `ok`. `ok` = delivered, `value` is populated, and you were charged for it (or you already owned it). `pending` = a background job is computing it; poll the report until it settles. Not charged now; the charge is settled by the job. `unavailable` = we ran and there is genuinely nothing to return for this developer, including the case where the source answered with an empty result. Not charged. `failed` = the attempt errored. Not charged, and never retried inside the same report. `report_required` = this facet needs a background report and this call does not start background work. Not charged; request it via `POST /v1/developers/reports` to get it. Treat every status other than `ok` as "no data", not as a value.

        okpendingunavailablefailedreport_required
      • value object

        The facet payload. Present only when `status` is `ok`; its shape is specific to the facet key, so read it against the facet you asked for. A cell whose payload came back with nothing in it is downgraded to `unavailable` rather than returned as an empty `ok`, so an `ok` cell always carries at least one real field.

      • jobId string

        The background compute job producing this cell. Present only when `status` is `pending`.

    • plan object required

      What you named versus what the dependency graph added and charged on top. There is no opt out of a dependency: the facet you asked for does not exist without it.

      • requested array of string required

        The facet keys you asked for, with any bundle macro expanded into its members.

      • added array of string required

        Facets that were resolved and CHARGED on top because a facet you requested cannot be computed without them. This is why a bill can exceed the price of the keys you named.

    • billing object required

      The itemised bill. Reconcile on `billing.totalCredits`, which is the per-developer base plus the facet cells.

      • items array of object required

        One line per (developer × facet) cell, including the ones that cost nothing.

        • developerId string required

          The developer this line item is for.

          max 64 chars
        • facetKey string required

          The facet this line item is for.

        • credits integer required

          Credits charged for this one cell. Zero unless `state` is `billed`.

          min 0
        • state string required

          `billed` = charged on this call. `owned` = you had already paid for this cell and it is still within its reveal window, so it cost 0 and you still get the value. `included` = a sibling key of the same SKU carried this call's charge, so this cell cost 0 and is fully yours: you buy the SKU, not the key. `not_billed` = the cell did not resolve (failed, unavailable, or report_required), so it cost 0 and you got nothing. A failed cell can never be reported as billed.

          ownedbilledincludednot_billed
      • total integer required

        The sum of `items`, so FACET CELLS ONLY. This is NOT what the call cost — it excludes the route’s own charge. Reconciling a finance integration on this field under-reports every bill. Use `totalCredits`.

        min 0
      • baseCredits integer required

        The route’s own charge, separate from enrichment: one credit per developer returned on a search, one per input resolved on a lookup, 0 on a route that is free.

        min 0
      • totalCredits integer required

        What this call actually cost you: `baseCredits + total`. This is the number that matches the `x-cost` response header and the ledger entry. Reconcile on this.

        min 0