Documentation navigation
GET /v1/deep-research/reports/repos/{owner}/{name}

Read a persisted deep-research report for a repository

Access
Authenticated
search:deep
Cost
Free
Rate limit
120 / minute per account
Quota
None

The full research report a completed repos job produced: contributors weighted toward recent work, a recent-starrer sample, identity facts on every surfaced person the index knows, and starPlacements — where this repo’s star audience places, as bands, so you can tell a project practitioners respect from one that is merely popular. Readable only for a repository this account has already researched, and free to read from then on. A repository the account has not researched is a 404, whether or not anyone else has.

Path parameters

  • owner string required
    min 1 chars, max 39 chars
  • name string required
    min 1 chars, max 100 chars

Responses

  • 200 The persisted report
    • id string required

      Identifier of this report.

    • repoName string required

      The `owner/name` the research was run on.

    • status string required

      Whether the research finished.

      donefailed
    • failCode string | null

      Why the research failed, when it did. Null on a report that succeeded.

      not_foundrate_limitedprovider_errortimeout
    • meta object | null required

      The repository header as read from GitHub at research time: description, topics, primary language, stars, forks, created/pushed instants, license, archived and fork flags.

    • contributors array of object required

      Who actually builds this, recency-weighted: Push and merged-PR actors over the last year, scored so current maintainers outrank drive-by history. Each row carries the activity counts, first/last seen, whether they own the repo, `depth` (authored vs merged-for-others vs review work in this repository), and — where Vamo knows them — contact-shaped identity facts: name, title, LinkedIn URL, resolved city and country, raw location, company, cracked score 0-100 with its tier, gem score, seniority, years of experience, and `hasEmail` (the address itself is a paid facet).

      • depth object | null

        What this contributor does here, read off the repository’s sampled merged PRs: the PRs they authored and how those were merged, the other people’s PRs they merged, the reviews they gave, and the file types their own PRs touch. Null when they do not appear in the sample; absent on reports produced before contributor depth existed. Absent or null means unknown, never zero.

        • login string required

          The contributor’s GitHub handle.

        • authoredPrsMerged number | null

          AUTHORED work: merged PRs this contributor opened here, over the most recently updated merged PRs of this repository (up to 50) the research sampled. Absent or null means unknown, never zero.

          min 0
        • authoredPrsMergedByOthers number | null

          AUTHORED work: of those, how many another person (not a bot) merged, which is outside validation, over the most recently updated merged PRs of this repository (up to 50) the research sampled. Absent or null means unknown, never zero.

          min 0
        • selfMergedPrs number | null

          AUTHORED work: of those, how many the contributor merged themselves, which shows write access rather than validation, over the most recently updated merged PRs of this repository (up to 50) the research sampled. Absent or null means unknown, never zero.

          min 0
        • mergedForOthers number | null

          MERGED-FOR-OTHERS work: other people’s PRs this contributor merged here, over the most recently updated merged PRs of this repository (up to 50) the research sampled. A gatekeeping fact, never added to the authored counts. Absent or null means unknown, never zero.

          min 0
        • reviewsGiven number | null

          REVIEW work: reviews this contributor left on other people’s PRs here, over the most recently updated merged PRs of this repository (up to 50) the research sampled. A floor, since each PR’s reviews are read up to a cap. Absent or null means unknown, never zero.

          min 0
        • topExtensions array | null

          The extensions this contributor’s own merged PRs here touch most, at most 5, vendored, generated and lockfile paths excluded. Absent or null means unknown, never zero.

          max 5 items
          • extension string required

            The lowercased final extension without the dot (`ts`, `rs`), a known bare file name (`dockerfile`), or `(none)`.

          • filesTouched number required

            Changed files with this extension across the contributor’s own sampled merged PRs here, counted from paths (never line counts).

            min 0
    • earlyStarrers array | null

      The earliest recorded starrers — who was there before the crowd, oldest first, hydrated with the same identity facts. Dataset coverage starts 2023, so for older repos this is "earliest recorded", not "earliest ever". Absent on reports produced before it was recorded.

    • starrers array of object required

      A sample of the repo’s most recent starrers, hydrated with the same identity facts, so the CURRENT audience is readable person by person next to the `starPlacements` bands that summarise it.

    • forkers array | null

      The repo’s most recent forkers, dated and hydrated with the same identity facts as `starrers`. Forks are the audience surface GitHub left open when it closed repo-side stargazer enumeration in 2026, so on a repo whose recent stars can no longer be read this list IS the current audience. Absent on reports produced before forkers were captured.

    • starPlacements object | null

      How this repo’s star audience places against the wider field of scored repositories, as formatted bands. This is the read for "is this project respected by people who build, or just popular": `audienceWeight` for the authority behind the audience, `audienceShare` for how much of it are builders rather than passers-by, and `authenticity` for whether the stars arrived the way real discovery arrives. Null when the repo is not scored, and absent on reports produced before placements were recorded — in both cases absence of a measurement, never a bad result.

      • audienceWeight object | null required

        Where the authority-weighted weight of this repo’s audience places: stars counted in proportion to what the people giving them build and maintain themselves. A high band means practitioners with real work behind them are watching this.

        • placement string required

          Where this repository placed, already formatted for reading. Inside the top ten percent this carries real resolution ("Top 7.9%"); below it, a band ("Top 25%", "Top 50%", "Bottom half").

        • pct number required

          The quantile it resolved to, 0..1. Ordering and debugging only — never rendered.

      • audienceShare object | null required

        Where the builder SHARE of the recent audience places: how much of the recent attention comes from people who ship, rather than from passers-by. The hidden-gem read — a small project can place at the top here.

        • placement string required

          Where this repository placed, already formatted for reading. Inside the top ten percent this carries real resolution ("Top 7.9%"); below it, a band ("Top 25%", "Top 50%", "Bottom half").

        • pct number required

          The quantile it resolved to, 0..1. Ordering and debugging only — never rendered.

      • authenticity string | null required

        A verdict on how the stars arrived: `organic` when the pattern looks like ordinary discovery, `suspect` when attention landed in bursts the way purchased or coordinated stars do. Null when it was not measured.

        organicsuspect
      • epoch string required

        The measurement day these placements were resolved against, as YYYY-MM-DD.

    • structuralMeasures object | null

      Work-distribution, succession, and momentum measurements over the FULL contributor set (not just the recency-weighted top slice above), anchored per-repo at that repo’s own last contribution: how many people carry half/80% of the work, the top-1/3/5 concentration shares, a Gini coefficient, quarter-over-quarter builder and activity momentum ratios, and contributor retention. Every flat field above measures HOW CONCENTRATED the building is and is blind to who does it; the nested `contributorQuality` block adds that axis, weighting the same work by each contributor’s cracked score (`eliteWorkMass`/`eliteWorkShare`, with `scoredContributors`/`scoredWorkShare` as their own coverage denominators, since an unscored contributor is outside the scored population rather than a weak one). It is nested because its POPULATION is different: the ranked top slice the `contributors` array carries, never the full set the flat fields aggregate, so the two are never averaged or compared. It rides here whenever contributors surfaced, including when the full-set measures did not. Null on reports computed before this measure existed.

      • contributorDepth object | null

        Contributor depth for this repository: `status`, the merged-PR sample window, and `unlisted` (mergers and reviewers the ranked `contributors` list does not carry). Absent on reports produced before contributor depth existed.

        • status string required

          `ok` when the merged-PR sample was read; `unavailable` when it could not be, which says nothing about the repository.

          okunavailable
        • source string | null

          Which lane produced the depth. Absent when unavailable.

        • sampledPrs number | null

          Merged PRs the sample read. Absent or null means unknown, never zero.

          min 0
        • windowFrom string | null

          The earliest merge in the sample, as an ISO 8601 instant. Absent or null means unknown, never zero.

        • windowTo string | null

          The latest merge in the sample, as an ISO 8601 instant. Absent or null means unknown, never zero.

        • unlisted array | null

          Depth for people absent from `contributors` (mergers and reviewers who rarely push), strongest first, at most 20. Absent or null means unknown, never zero.

          max 20 items
          • login string required

            The contributor’s GitHub handle.

          • authoredPrsMerged number | null

            AUTHORED work: merged PRs this contributor opened here, over the most recently updated merged PRs of this repository (up to 50) the research sampled. Absent or null means unknown, never zero.

            min 0
          • authoredPrsMergedByOthers number | null

            AUTHORED work: of those, how many another person (not a bot) merged, which is outside validation, over the most recently updated merged PRs of this repository (up to 50) the research sampled. Absent or null means unknown, never zero.

            min 0
          • selfMergedPrs number | null

            AUTHORED work: of those, how many the contributor merged themselves, which shows write access rather than validation, over the most recently updated merged PRs of this repository (up to 50) the research sampled. Absent or null means unknown, never zero.

            min 0
          • mergedForOthers number | null

            MERGED-FOR-OTHERS work: other people’s PRs this contributor merged here, over the most recently updated merged PRs of this repository (up to 50) the research sampled. A gatekeeping fact, never added to the authored counts. Absent or null means unknown, never zero.

            min 0
          • reviewsGiven number | null

            REVIEW work: reviews this contributor left on other people’s PRs here, over the most recently updated merged PRs of this repository (up to 50) the research sampled. A floor, since each PR’s reviews are read up to a cap. Absent or null means unknown, never zero.

            min 0
          • topExtensions array | null

            The extensions this contributor’s own merged PRs here touch most, at most 5, vendored, generated and lockfile paths excluded. Absent or null means unknown, never zero.

            max 5 items
            • extension string required

              The lowercased final extension without the dot (`ts`, `rs`), a known bare file name (`dockerfile`), or `(none)`.

            • filesTouched number required

              Changed files with this extension across the contributor’s own sampled merged PRs here, counted from paths (never line counts).

              min 0
    • contributorGrowth object | null

      Distinct ACTIVE contributors per calendar month over the trailing year: `{ status: "ok", measure, source, months: [{ month, contributors }] }`. An activity trend, never a cumulative "contributors ever" total — it goes DOWN when a repo gets quieter, and `measure` names what the numbers are so a reader cannot relabel a decline as growth. `status: "ok"` with an empty `months` is a MEASUREMENT (the query ran, the repo had no in-window activity); `{ status: "query_failed" }` is not a measurement at all and is worth re-asking. Null means only that the report predates this measure, and a report written between it landing and the status wrapper carries the bare `{ measure, source, months }` object instead.

    • audienceGrowth object | null

      The `forkers` and `starrers` lists re-aggregated into a month-by-month audience curve: ascending contiguous `months` of `{ month, forkers, scoredForkers, forkerEliteMass, starrers, scoredStarrers, starrerEliteMass }`, plus the `forkersTotal`/`forkersScored`/`starrersTotal`/`starrersScored` denominators behind them. Raw counts are the primary signal; the elite-mass fields are a partial-coverage overlay that weights each month’s audience by what those people build themselves, which is why each carries its own scored denominator rather than being averaged in. A month is `null` when NO source observed it (the frozen mirror and the live graph cover disjoint eras) and `0` only when a source did cover it and saw nothing, so a gap in the curve is never a quiet month. Null overall when neither list carried dated rows, and absent on reports produced before this was computed.

    • commitActivity object | null

      Whether the CODE moves, where the audience curves say only who is watching: GitHub’s trailing-52-week commit rollup bucketed into `{ month, commits, weeks }` per calendar month. A verdict object rather than a bare trend, because the three ways there is no trend are three different facts. `{ status: "ok", months }` is measured, and a year of `commits: 0` there is a real finding about the repo. `{ status: "not_computed" }` means GitHub had not built the series when we asked (its stats endpoints answer a cold repo with an empty 202, and the ask itself warms it), so the next dive of the same repo likely gets it — never read it as a zero-commit year. `{ status: "unavailable" }` means the ask failed outright and says nothing about the repo. `weeks` is each month’s coverage denominator: a 52-week window opens and closes mid-month, so the first and last buckets hold fewer weeks and would otherwise read as a slump. Null when the report predates this measure; a report written between it landing and the verdict shape carries a bare ARRAY of months, which reads as `ok`.

    • subjects array | null

      WHAT-domain tags (fintech, mobile, devtools) read off this repo’s topics + description + manifest dependencies — never the README body, which has no cross-repo repetition to corroborate a loose match against for a single repo. Null on reports produced before this field existed.

    • technologies array | null

      HOW-it-builds tags (react, rust, kafka) read the same way as `subjects`, same vocabulary as a developer report’s `technologies`, computed alongside `subjects` but never blended in. Null on reports produced before this field existed.

    • anchor string required

      The dataset instant the contributor and starrer windows end at.

    • contributionAnchor string | null

      The dataset instant the contribution (push/merged-PR) window ends at — later than `anchor`, since contribution data lags star data. Empty on reports computed before this measure existed.

    • contributorsFound number required

      How many contributors the report carries (the top slice by weight).

    • contributorsWindowTotal number default: 0

      TOTAL distinct human contributors in the window. `contributors` is the top slice; this says what the cap hid. 0 on reports produced before it was recorded.

    • starrersSampled number required

      How many recent starrers were sampled.

    • starrersWindowTotal number default: 0

      TOTAL distinct starrers in the sample window. 0 on reports produced before it was recorded.

    • forkersSampled number default: 0

      How many recent forkers were sampled and hydrated into `forkers`. 0 on reports produced before forkers were captured.

    • forkersWindowTotal number default: 0

      TOTAL forks GitHub reports for the repo (its own `forkCount`), not just the sampled slice — the denominator that says whether `forkers` is the whole audience or the most recent face of it. 0 on reports produced before it was recorded.

    • identitiesResolved number required

      How many surfaced people resolved to a known identity in Vamo’s index — the denominator behind the hydrated facts.

    • startedAt string required

      When the research started, as an ISO 8601 instant.

    • finishedAt string required

      When the research finished, as an ISO 8601 instant.

  • 401 No or invalid credential
    • code string required

      Stable machine-readable error code. Branch on this, never on the numeric status.

      bad_requestunauthorizedsignature_requiredpayment_requiredforbiddennot_foundconflictgonepayload_too_largeunprocessable_entitytoo_many_requestsinternal_errornot_implementedbilling_unavailablenot_contactablemailbox_link_unavailablemailbox_requiredmail_engine_unavailablewebhook_publisher_unavailabledatabase_unavailableclient_errorbuild_failed
    • message string required

      Human-readable explanation of the refusal.

    • status integer required

      The HTTP status code, repeated in the body.

    • remedy object

      A self-serve path forward, when one exists (a 402 points at how to restore access).

      • kind string required

        What kind of remedy this is, so a client can route it: whether the caller can clear the condition through the API, or a person must act in the web app.

        topupconnect_mailbox
      • url string required

        Where to go to clear the condition: an API path, or a web app page when only a person can.

  • 402 Plan lacks search:deep
    • code string required

      Stable machine-readable error code. Branch on this, never on the numeric status.

      bad_requestunauthorizedsignature_requiredpayment_requiredforbiddennot_foundconflictgonepayload_too_largeunprocessable_entitytoo_many_requestsinternal_errornot_implementedbilling_unavailablenot_contactablemailbox_link_unavailablemailbox_requiredmail_engine_unavailablewebhook_publisher_unavailabledatabase_unavailableclient_errorbuild_failed
    • message string required

      Human-readable explanation of the refusal.

    • status integer required

      The HTTP status code, repeated in the body.

    • remedy object

      A self-serve path forward, when one exists (a 402 points at how to restore access).

      • kind string required

        What kind of remedy this is, so a client can route it: whether the caller can clear the condition through the API, or a person must act in the web app.

        topupconnect_mailbox
      • url string required

        Where to go to clear the condition: an API path, or a web app page when only a person can.

  • 403 Missing search:deep (role)
    • code string required

      Stable machine-readable error code. Branch on this, never on the numeric status.

      bad_requestunauthorizedsignature_requiredpayment_requiredforbiddennot_foundconflictgonepayload_too_largeunprocessable_entitytoo_many_requestsinternal_errornot_implementedbilling_unavailablenot_contactablemailbox_link_unavailablemailbox_requiredmail_engine_unavailablewebhook_publisher_unavailabledatabase_unavailableclient_errorbuild_failed
    • message string required

      Human-readable explanation of the refusal.

    • status integer required

      The HTTP status code, repeated in the body.

    • remedy object

      A self-serve path forward, when one exists (a 402 points at how to restore access).

      • kind string required

        What kind of remedy this is, so a client can route it: whether the caller can clear the condition through the API, or a person must act in the web app.

        topupconnect_mailbox
      • url string required

        Where to go to clear the condition: an API path, or a web app page when only a person can.

  • 404 This account has not researched this repository (or nobody has)
    • code string required

      Stable machine-readable error code. Branch on this, never on the numeric status.

      bad_requestunauthorizedsignature_requiredpayment_requiredforbiddennot_foundconflictgonepayload_too_largeunprocessable_entitytoo_many_requestsinternal_errornot_implementedbilling_unavailablenot_contactablemailbox_link_unavailablemailbox_requiredmail_engine_unavailablewebhook_publisher_unavailabledatabase_unavailableclient_errorbuild_failed
    • message string required

      Human-readable explanation of the refusal.

    • status integer required

      The HTTP status code, repeated in the body.

    • remedy object

      A self-serve path forward, when one exists (a 402 points at how to restore access).

      • kind string required

        What kind of remedy this is, so a client can route it: whether the caller can clear the condition through the API, or a person must act in the web app.

        topupconnect_mailbox
      • url string required

        Where to go to clear the condition: an API path, or a web app page when only a person can.

  • 429 A rate limit or a usage quota is exhausted. Back off and retry; the `x-quota-*` response headers report the remaining allowance.
    • code string required

      Stable machine-readable error code. Branch on this, never on the numeric status.

      bad_requestunauthorizedsignature_requiredpayment_requiredforbiddennot_foundconflictgonepayload_too_largeunprocessable_entitytoo_many_requestsinternal_errornot_implementedbilling_unavailablenot_contactablemailbox_link_unavailablemailbox_requiredmail_engine_unavailablewebhook_publisher_unavailabledatabase_unavailableclient_errorbuild_failed
    • message string required

      Human-readable explanation of the refusal.

    • status integer required

      The HTTP status code, repeated in the body.

    • remedy object

      A self-serve path forward, when one exists (a 402 points at how to restore access).

      • kind string required

        What kind of remedy this is, so a client can route it: whether the caller can clear the condition through the API, or a person must act in the web app.

        topupconnect_mailbox
      • url string required

        Where to go to clear the condition: an API path, or a web app page when only a person can.