/v1/deep-research/reports/developers/{login}Read a persisted deep-research report for a developer
search:deepThe full research report a completed job produced: pctSignals maps each graded signal to its percentile, signalsExcluded names every signal that could not be graded and why, plus the composites, the contribution history, and the repositories sampled. Readable only for a developer this account has already researched, and free to read from then on — the job that produced it already paid, the report is persisted, and everyone on the account shares it. A developer the account has not researched is a 404, whether or not anyone else has. signalPopulations says, per graded signal, WHICH substrate its percentile was ranked against: a dive_population ranking is a coarser claim than a benchmark_grid one, and an absolute signal was never ranked against anybody. None of these are peer groups matched on language, seniority or region — there is one global measured population.
Path parameters
loginstring requiredmin 1 chars, max 39 chars
Responses
200The persisted reportidstring requiredIdentifier of this report.
githubLoginstring requiredThe GitHub handle the research was run on.
statusstring requiredWhether the research finished. Only a `done` report carries a complete set of signals.
runningdonefailedfailCodestring | nullWhy the research failed, when it did. `engine_error` is our fault and is never billed. Null or absent on a report that succeeded.
not_foundrate_limitedprovider_errortimeoutengine_errorrawSignalsobject requiredSignal name to the VALUE actually measured for this developer. Present whether or not the signal could be ranked, so this is the number to show when `pctSignals` has no entry for it. MEASURED is not the same claim as RANKED.
pctSignalsobject requiredSignal name to its percentile, 0..1, for the signals that could be ranked. A report MIXES ranking substrates, so one description never covers all of them: `signalPopulations[signal]` states which substrate each percentile here was ranked against. No percentile in this report is against a peer group matched on language, seniority, region or discipline — no such peer group exists; there is one measured population. A signal missing here is explained in `signalsExcluded`.
compositesobject requiredPercentile-derived composite scores. EMPTY (`{}`) whenever the ranking population is below its floor, which is the normal case early on: the keys are absent together rather than zeroed, so absence means "not ranked yet", never "scored zero". Read `rawSignals` and say "measured, not yet ranked" instead of showing a bare blank.
gemScorenumberThe gem score: how far this developer’s demonstrated quality runs ahead of their visible reputation. Built from the percentiles in `pctSignals`, so it inherits their populations (`signalPopulations`) — mostly the developers Vamo has previously deep-researched, which grows, which makes this number not comparable across reports taken at different times.
qualitynumberThe quality composite, built from the `qualityTerms` below.
visibilitynumberThe visibility composite, built from the `visibilityTerms` below.
reachablenumberThe reachability composite.
productionMaturitynumberThe production-maturity cluster: how much this developer builds and RUNS production software — CI, instrumentation, releases, maintenance, tests — averaged across whichever of those signals they have. A cluster score, so no single thin signal drives it. Built from `pctSignals`, so it inherits their populations. Not a factor in `gemScore`.
qualityTermsarray of objectThe individual signals that fed `quality`, with their weights, so the composite can be decomposed rather than trusted blind.
signalstring requiredThe signal that contributed.
weightnumber requiredIts weight in the composite.
pctnumber requiredThe developer’s percentile on that signal, 0 to 1. `signalPopulations[signal]` says which substrate it was ranked against, and a report mixes substrates, so read it before quoting this.
visibilityTermsarray of objectThe individual signals that fed `visibility`, with their weights.
signalstring requiredThe signal that contributed.
weightnumber requiredIts weight in the composite.
pctnumber requiredThe developer’s percentile on that signal, 0 to 1. `signalPopulations[signal]` says which substrate it was ranked against, and a report mixes substrates, so read it before quoting this.
productionMaturityTermsarray of objectThe individual signals that fed `productionMaturity`, with their weights.
signalstring requiredThe signal that contributed.
weightnumber requiredIts weight in the composite.
pctnumber requiredThe developer’s percentile on that signal, 0 to 1. `signalPopulations[signal]` says which substrate it was ranked against, and a report mixes substrates, so read it before quoting this.
evidencearray of string requiredHuman-readable evidence lines the research produced.
profileobject | null requiredThe GitHub profile as read during the research. Open to extra keys: new fields arrive without a release here. Null when the profile could not be read.
loginstring requiredThe GitHub handle, as read live during the research.
createdAtstring requiredWhen the GitHub account was created, as an ISO 8601 instant.
followersnumber requiredFollower count at research time.
followingnumber requiredHow many accounts they follow, at research time.
organizationsarray of string requiredPublic GitHub organisations they belong to. Private memberships are invisible, so an empty list is not evidence of none.
socialAccountsarray of object requiredSocial links the developer has published on their GitHub profile.
providerstring requiredWhich platform the link points at.
urlstring requiredThe linked profile URL.
contributionsobject | null requiredContribution activity, PUBLIC only: work in private repositories is invisible to GitHub’s counters, so low numbers are not evidence of low output. Null when it could not be read.
totalCommitContributionsnumber requiredCommits GitHub counted over the research window.
totalPullRequestContributionsnumber requiredPull requests opened over the window.
totalPullRequestReviewContributionsnumber requiredPull request reviews over the window.
calendararray of object requiredDaily contribution counts across the window.
datestring requiredThe calendar day, `YYYY-MM-DD`.
countnumber requiredContributions GitHub counted that day.
weekdaynumber requiredDay of the week, 0 for Sunday through 6 for Saturday. Present so weekday and weekend activity can be told apart without re-deriving it.
reposarray of object requiredThe repositories actually sampled by this research. A SAMPLE, not a complete list: `commitStats` says how much was sampled and how much was skipped.
namestring requiredThe repository name, without the owner.
ownerstring requiredThe owning account’s login, which may be a person or an organisation.
isForkboolean requiredTrue when the repository is a fork. Forks are kept in the sample rather than dropped, so filter on this if you only want original work.
primaryLanguagestring | null requiredGitHub’s primary language. Null when it reports none.
languagesarray of object requiredLanguage breakdown by bytes of code, which is a proxy for effort and not a measure of skill.
namestring requiredThe language.
sizenumber requiredBytes of code GitHub attributes to it in this repository.
topicsarray of string requiredGitHub topics the owner tagged the repository with.
starsnumber requiredStargazer count at research time.
forksnumber requiredFork count at research time.
pushedAtstring requiredWhen the repository was last pushed to, as an ISO 8601 instant.
latestReleaseAtstring | null requiredWhen it last cut a release, as an ISO 8601 instant. Null when it has never released.
contributionobject | nullWhat the developer did in this repository, AUTHORED work kept apart from MERGED-FOR-OTHERS work. Absent on reports produced before contribution depth existed, and absent means unknown, never zero.
relationstring | nullHow the developer relates to this repository, first match wins: `owner` (their own repository), `maintainer` (merged other people’s PRs here, or merged two or more of their own PRs in a repository they do not own, which shows write access), `core` (ten or more of their authored PRs merged), `reviewer` (three or more reviews given with at most two authored PRs merged), `drive-by` (one or two authored PRs merged). Reviews alone never make someone a maintainer. Absent or null means unknown, never zero.
ownermaintainercorereviewerdrive-bycommitsAuthorednumber | nullAUTHORED work: commits the developer authored in this repository that GitHub credits to them (default branch, linked email), across the years the research read. Absent or null means unknown, never zero.
min 0authoredPrsnumber | nullAUTHORED work: pull requests the developer opened in this repository, over about the trailing two years of public activity. Absent or null means unknown, never zero.
min 0authoredPrsMergednumber | nullAUTHORED work: of the PRs they opened here, how many were merged by anyone, including themselves, over about the trailing two years of public activity. Estimated from a sample when they opened more than the dive reads one by one. Absent or null means unknown, never zero.
min 0authoredPrsMergedByOthersnumber | nullAUTHORED work: of their merged PRs here, how many someone other than the developer (and not a bot) merged, which is outside validation of the work, over about the trailing two years of public activity. Absent or null means unknown, never zero.
min 0selfMergedPrsnumber | nullAUTHORED work: of their merged PRs here, how many the developer merged themselves, which shows write access rather than outside validation, over about the trailing two years of public activity. Absent or null means unknown, never zero.
min 0mergedForOthersnumber | nullMERGED-FOR-OTHERS work: other people’s PRs this developer merged here, read from the latest 50 merged PRs of each repository they own or hold write access to. A gatekeeping fact, never added to the authored counts. Absent or null means unknown, never zero.
min 0reviewsGivennumber | nullREVIEW work: reviews the developer left on other people’s PRs here, over about the trailing two years of public activity. Neither authored nor merged work. Absent or null means unknown, never zero.
min 0filesTouchedMediannumber | nullAUTHORED work: the median number of files changed per merged PR the developer authored here, over about the trailing two years of public activity. Absent or null means unknown, never zero.
min 0firstMergedAtstring | nullAUTHORED work: when the earliest PR the developer authored here was merged, as an ISO 8601 instant. Absent or null means unknown, never zero.
lastMergedAtstring | nullAUTHORED work: when the most recent PR the developer authored here was merged, as an ISO 8601 instant. Absent or null means unknown, never zero.
prTitlesarray | nullAUTHORED work: titles of PRs the developer authored here, newest first, at most 8. Absent or null means unknown, never zero.
max 8 items
subjectsarray | nullWHAT-domain tags (fintech, mobile, devtools) read off the sampled repositories — owned AND contributed, manifests included — strength order. Null on reports produced before this field existed.
technologiesarray | nullHOW-they-build tags (react, rust, kafka) read the same way as `subjects`, same vocabulary, computed alongside it but never blended in. Null on reports produced before this field existed.
commitStatsobject requiredHow much of the developer’s work this research actually looked at. Read it before treating the signals as comprehensive.
sampleNnumber requiredHow many commits were examined.
reposSamplednumber requiredHow many repositories were examined.
reposSkippednumber requiredHow many were skipped, typically for size. A high number here means the signals rest on a narrower base than the developer’s full output.
familiesPresentarray of string requiredWhich signal families had enough data to contribute to this report.
signalsGradednumber requiredHow many signals were successfully percentile-ranked. The rest are explained in `signalsExcluded`.
signalsExcludedobject requiredSignal name to why it was not ranked, and the four reasons say genuinely different things. `insufficient_cohort` = the signal WAS measured (its value is in `rawSignals`) but the ranking population is too small to place it; do not render this as "no evidence". `insufficient_evidence` = this developer did not produce enough activity to measure it. `no_family_data` = its whole signal family was unavailable. `not_percentile` = the signal is not the kind of thing that gets ranked.
signalPopulationsobject | nullPer graded signal, WHICH substrate its percentile was ranked against. THE field to read before quoting any percentile: a report mixes substrates, so one sentence never covers all of them, and a `dive_population` percentile is a coarser claim than a `benchmark_grid` one. Absent on reports produced before vamo-data started recording it.
pointsSpentnumber requiredGitHub API quota consumed by the whole round this report was part of, not by this developer alone. Divide by `roundLogins` for an average, and say that you did.
requestCountnumber requiredUpstream requests made by the whole round, shared by every developer in it. Divide by `roundLogins` for an average.
roundLoginsnumber requiredHow many developers shared the round. The divisor for `pointsSpent` and `requestCount`.
startedAtstring requiredWhen the research started, as an ISO 8601 instant.
finishedAtstring requiredWhen the research finished, as an ISO 8601 instant.
contributionDepthobject | nullContribution depth beyond owned repositories: AUTHORED work and MERGED-FOR-OTHERS work, counted separately and never summed, from public work only. Absent on reports produced before this field existed, and absent means unknown, never zero.
windowFromstring | nullStart of the window the authored PR counts cover. Absent or null means unknown, never zero.
windowTostring | nullEnd of the window the authored PR counts cover. Absent or null means unknown, never zero.
commitsAuthorednumber | nullAUTHORED work: public commits GitHub credits to the developer across the years the research read. Absent or null means unknown, never zero.
min 0authoredPrsnumber | nullAUTHORED work: pull requests the developer opened, over about the trailing two years of public activity. Absent or null means unknown, never zero.
min 0authoredPrsMergednumber | nullAUTHORED work: of those, how many were merged by anyone, over about the trailing two years of public activity. Absent or null means unknown, never zero.
min 0authoredPrsMergedExternalnumber | nullAUTHORED work: merged PRs they authored in repositories they do not own, over about the trailing two years of public activity. Absent or null means unknown, never zero.
min 0authoredPrsMergedByOthersnumber | nullAUTHORED work: merged PRs they authored that someone else (not a bot) merged, which is outside validation, over about the trailing two years of public activity. Absent or null means unknown, never zero.
min 0selfMergedPrsnumber | nullAUTHORED work: merged PRs they authored and merged themselves, which shows write access rather than validation, over about the trailing two years of public activity. Absent or null means unknown, never zero.
min 0mergedForOthersnumber | nullMERGED-FOR-OTHERS work: other people’s PRs the developer merged, read from the latest 50 merged PRs of each repository they own or hold write access to. Never added to the authored counts. Absent or null means unknown, never zero.
min 0reviewsGivennumber | nullREVIEW work: reviews they gave on other people’s PRs, over about the trailing two years of public activity. Absent or null means unknown, never zero.
min 0reviewsGivenExternalnumber | nullREVIEW work: reviews they gave in repositories they do not own, over about the trailing two years of public activity. Absent or null means unknown, never zero.
min 0externalReposnumber | nullAUTHORED work: distinct repositories they do not own with at least one merged PR they authored, over about the trailing two years of public activity. Absent or null means unknown, never zero.
min 0yearlyarray | nullPublic activity by calendar year, oldest first. Absent or null means unknown, never zero.
yearnumber requiredThe calendar year.
commitsnumber | nullAUTHORED commits GitHub credited to them that year. Absent or null means unknown, never zero.
min 0prsnumber | nullPull requests they AUTHORED that year. Absent or null means unknown, never zero.
min 0reviewsnumber | nullReviews they gave on other people’s PRs that year. Absent or null means unknown, never zero.
min 0
prsarray | nullA sample of PRs the developer AUTHORED, at most 60, each saying who merged it. Absent or null means unknown, never zero.
max 60 itemsrepostring requiredThe repository as `owner/name`.
numbernumber requiredThe PR number in that repository.
titlestring | nullThe PR title. Absent or null means unknown, never zero.
mergedboolean | nullWhether the PR was merged. Absent or null means unknown, never zero.
mergedAtstring | nullWhen it was merged, as an ISO 8601 instant. Null when unmerged. Absent or null means unknown, never zero.
changedFilesnumber | nullHow many files the PR touched. Absent or null means unknown, never zero.
min 0mergedBystring | null`self` when the developer merged their own PR (write access, not outside validation), `other` when another person merged it, `bot` when automation did. Null when unmerged or unknown.
selfotherbotreviewsReceivednumber | nullHow many reviews other people left on this PR. Absent or null means unknown, never zero.
min 0
fileMixobject | nullFiles touched by extension and by top-level directory in the developer’s own merged PRs. Absent when the report predates the file mix; null when the research could not read the file lists (unknown, never an empty mix).
samplePrsnumber | nullMerged PRs the developer AUTHORED whose file lists were read. Absent or null means unknown, never zero.
min 0reposSamplednumber | nullRepositories those PRs came from. Absent or null means unknown, never zero.
min 0filesTouchednumber | nullChanged files counted, after exclusions. Absent or null means unknown, never zero.
min 0filesExcludednumber | nullChanged files dropped as vendored, generated or lockfiles. Absent or null means unknown, never zero.
min 0extensionsarray of object requiredFiles touched by extension, most files first, at most 20 keys, counted from the changed-file PATHS of merged PRs the developer AUTHORED (never line counts), with vendored, generated and lockfile paths excluded.
max 20 itemskeystring requiredIn `extensions`: the lowercased final extension without the dot (`ts`, `rs`), a known bare file name (`dockerfile`, `makefile`), or `(none)` for other files with no extension. In `directories`: the lowercased top-level directory, or `/` for a file at the repository root.
filesTouchednumber requiredChanged files under this key across the sampled authored PRs.
min 0prsnumber requiredSampled authored PRs with at least one changed file under this key.
min 0
directoriesarray of object requiredFiles touched by top-level directory, most files first, at most 20 keys, counted from the changed-file PATHS of merged PRs the developer AUTHORED (never line counts), with vendored, generated and lockfile paths excluded.
max 20 itemskeystring requiredIn `extensions`: the lowercased final extension without the dot (`ts`, `rs`), a known bare file name (`dockerfile`, `makefile`), or `(none)` for other files with no extension. In `directories`: the lowercased top-level directory, or `/` for a file at the repository root.
filesTouchednumber requiredChanged files under this key across the sampled authored PRs.
min 0prsnumber requiredSampled authored PRs with at least one changed file under this key.
min 0
narrativeDeepResearchNarrative requiredThe written narrative of THIS report snapshot: the top summary (`persona`) and the activity, code and social paragraphs. Null when it has not been written yet, which is a normal state and never an error: it is generated off the hot path when the research job completes, a read that finds it missing or incomplete kicks the generation, and `narrativePending` is true until the complete prose is stored. Stored against the report row.
personastring requiredThe pitch: three to five sentences on what this developer is like to hire, written from this report and the engine’s read of their public work. A reading of a body of work, not a score: it asserts no employer, no title, no seniority and no location.
max 640 charssectionsobject requiredThe three supporting sections, each a paragraph. Each is nullable only while the narrative is still being completed: `narrativePending` says whether the missing ones are coming.
activitystring | null requiredHow they work: their rhythm, and what having them on a team looks like.
max 640 charscodestring | null requiredThe work itself: what recurs in it, and what they build with it.
max 640 charssocialstring | null requiredHow they work with other people, as their public work evidences it.
max 640 chars
narrativePendingboolean requiredTrue while the narrative is missing, missing a section, or being rewritten (an older version is served meanwhile) AND is still being written: render the prose that is there, a placeholder for any missing piece, and read again shortly. False once all four current pieces are stored, and also false when they cannot be written (the retries for this report are spent), so a placeholder never waits forever.
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 developer (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.