/v1/deep-research/reports/repos/{owner}/{name}Read a persisted deep-research report for a repository
search:deepThe 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
ownerstring requiredmin 1 chars, max 39 charsnamestring requiredmin 1 chars, max 100 chars
Responses
200The persisted reportidstring requiredIdentifier of this report.
repoNamestring requiredThe `owner/name` the research was run on.
statusstring requiredWhether the research finished.
donefailedfailCodestring | nullWhy the research failed, when it did. Null on a report that succeeded.
not_foundrate_limitedprovider_errortimeoutmetaobject | null requiredThe repository header as read from GitHub at research time: description, topics, primary language, stars, forks, created/pushed instants, license, archived and fork flags.
contributorsarray of object requiredWho 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).
depthobject | nullWhat 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.
loginstring requiredThe contributor’s GitHub handle.
authoredPrsMergednumber | nullAUTHORED 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 0authoredPrsMergedByOthersnumber | nullAUTHORED 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 0selfMergedPrsnumber | nullAUTHORED 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 0mergedForOthersnumber | nullMERGED-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 0reviewsGivennumber | nullREVIEW 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 0topExtensionsarray | nullThe 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 itemsextensionstring requiredThe lowercased final extension without the dot (`ts`, `rs`), a known bare file name (`dockerfile`), or `(none)`.
filesTouchednumber requiredChanged files with this extension across the contributor’s own sampled merged PRs here, counted from paths (never line counts).
min 0
earlyStarrersarray | nullThe 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.
starrersarray of object requiredA 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.
forkersarray | nullThe 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.
starPlacementsobject | nullHow 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.
audienceWeightobject | null requiredWhere 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.
placementstring requiredWhere 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").
pctnumber requiredThe quantile it resolved to, 0..1. Ordering and debugging only — never rendered.
audienceShareobject | null requiredWhere 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.
placementstring requiredWhere 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").
pctnumber requiredThe quantile it resolved to, 0..1. Ordering and debugging only — never rendered.
authenticitystring | null requiredA 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.
organicsuspectepochstring requiredThe measurement day these placements were resolved against, as YYYY-MM-DD.
structuralMeasuresobject | nullWork-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.
contributorDepthobject | nullContributor 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.
statusstring required`ok` when the merged-PR sample was read; `unavailable` when it could not be, which says nothing about the repository.
okunavailablesourcestring | nullWhich lane produced the depth. Absent when unavailable.
sampledPrsnumber | nullMerged PRs the sample read. Absent or null means unknown, never zero.
min 0windowFromstring | nullThe earliest merge in the sample, as an ISO 8601 instant. Absent or null means unknown, never zero.
windowTostring | nullThe latest merge in the sample, as an ISO 8601 instant. Absent or null means unknown, never zero.
unlistedarray | nullDepth 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 itemsloginstring requiredThe contributor’s GitHub handle.
authoredPrsMergednumber | nullAUTHORED 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 0authoredPrsMergedByOthersnumber | nullAUTHORED 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 0selfMergedPrsnumber | nullAUTHORED 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 0mergedForOthersnumber | nullMERGED-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 0reviewsGivennumber | nullREVIEW 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 0topExtensionsarray | nullThe 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 itemsextensionstring requiredThe lowercased final extension without the dot (`ts`, `rs`), a known bare file name (`dockerfile`), or `(none)`.
filesTouchednumber requiredChanged files with this extension across the contributor’s own sampled merged PRs here, counted from paths (never line counts).
min 0
contributorGrowthobject | nullDistinct 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.
audienceGrowthobject | nullThe `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.
commitActivityobject | nullWhether 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`.
subjectsarray | nullWHAT-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.
technologiesarray | nullHOW-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.
anchorstring requiredThe dataset instant the contributor and starrer windows end at.
contributionAnchorstring | nullThe 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.
contributorsFoundnumber requiredHow many contributors the report carries (the top slice by weight).
contributorsWindowTotalnumber default: 0TOTAL 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.
starrersSamplednumber requiredHow many recent starrers were sampled.
starrersWindowTotalnumber default: 0TOTAL distinct starrers in the sample window. 0 on reports produced before it was recorded.
forkersSamplednumber default: 0How many recent forkers were sampled and hydrated into `forkers`. 0 on reports produced before forkers were captured.
forkersWindowTotalnumber default: 0TOTAL 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.
identitiesResolvednumber requiredHow many surfaced people resolved to a known identity in Vamo’s index — the denominator behind the hydrated facts.
startedAtstring requiredWhen the research started, as an ISO 8601 instant.
finishedAtstring requiredWhen the research finished, as an ISO 8601 instant.
401No or invalid credentialcodestring requiredStable 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_failedmessagestring requiredHuman-readable explanation of the refusal.
statusinteger requiredThe HTTP status code, repeated in the body.
remedyobjectA self-serve path forward, when one exists (a 402 points at how to restore access).
kindstring requiredWhat 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_mailboxurlstring requiredWhere to go to clear the condition: an API path, or a web app page when only a person can.
402Plan lacks search:deepcodestring requiredStable 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_failedmessagestring requiredHuman-readable explanation of the refusal.
statusinteger requiredThe HTTP status code, repeated in the body.
remedyobjectA self-serve path forward, when one exists (a 402 points at how to restore access).
kindstring requiredWhat 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_mailboxurlstring requiredWhere to go to clear the condition: an API path, or a web app page when only a person can.
403Missing search:deep (role)codestring requiredStable 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_failedmessagestring requiredHuman-readable explanation of the refusal.
statusinteger requiredThe HTTP status code, repeated in the body.
remedyobjectA self-serve path forward, when one exists (a 402 points at how to restore access).
kindstring requiredWhat 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_mailboxurlstring requiredWhere to go to clear the condition: an API path, or a web app page when only a person can.
404This account has not researched this repository (or nobody has)codestring requiredStable 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_failedmessagestring requiredHuman-readable explanation of the refusal.
statusinteger requiredThe HTTP status code, repeated in the body.
remedyobjectA self-serve path forward, when one exists (a 402 points at how to restore access).
kindstring requiredWhat 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_mailboxurlstring requiredWhere to go to clear the condition: an API path, or a web app page when only a person can.
429A rate limit or a usage quota is exhausted. Back off and retry; the `x-quota-*` response headers report the remaining allowance.codestring requiredStable 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_failedmessagestring requiredHuman-readable explanation of the refusal.
statusinteger requiredThe HTTP status code, repeated in the body.
remedyobjectA self-serve path forward, when one exists (a 402 points at how to restore access).
kindstring requiredWhat 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_mailboxurlstring requiredWhere to go to clear the condition: an API path, or a web app page when only a person can.