---
title: "Get a single developer's profile by GitHub username"
method: GET
path: "/v1/users/{login}"
---

# Get a single developer's profile by GitHub username

`GET /v1/users/{login}`

## Request

- Base URL: `https://api.githunt.ai`
- URL: `https://api.githunt.ai/v1/users/{login}`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-Api-Key`

## Path parameters

- `login` string, required

## Query parameters

- `skills` string
- `signals` 'all' | 'timeline' | 'timezone' | 'none'

## Response `200`

Developer profile

- UserResponse
  - `success` true
  - `data` object
    - `username` string
    - `score` number
    - `profile_score` number
    - `tech_stack_score` number
    - `activity_score` number
    - `github_experience` number
    - `matching_keywords` string: Comma-separated list of matched keywords
    - `bio` string, nullable
    - `profile_url` string
    - `email` string, nullable
    - `name` string, nullable
    - `company` string, nullable
    - `location` string, nullable
    - `followers` integer
    - `blog` string, nullable
    - `twitter_username` string, nullable
    - `created_at` string, date-time
    - `updated_at` string, date-time
    - `hireable` 'Yes' | 'No'
    - `avatar_url` string
    - `last_active_date` string, nullable: Date of the candidate's most recent GitHub activity. Usually a date (YYYY-MM-DD); may be a full ISO date-time when derived from fallback sources.
    - `commits_per_month` number, nullable: Average commits per month over recent history
    - `commit_frequency_label` string, nullable: Human label for commit activity (e.g. Very Active, Active, Unknown)
    - `semantic_commit_percentage` number, nullable: Percentage of analyzed commits with semantic/descriptive messages
    - `commit_message_quality_label` string, nullable: Human label for commit message quality (e.g. Excellent, Good, Insufficient Data)
    - `top_repositories` object[]: The candidate's top repositories, as shown on the website candidate card
      - `name` string
      - `stars` integer
      - `language` string, nullable
    - `top_oss_contributions` object[]: Notable open-source projects the candidate contributed to
      - `repository` string: Full repository name (owner/name)
      - `tier_label` string: Project prominence tier (e.g. Elite, Popular, Notable)
      - `commits` integer
      - `language` string, nullable
    - `evidence` object[]: Where each matched skill/keyword was found on the candidate.
      - `keyword` string
      - `source` 'repo_name' | 'repo_description' | 'repo_language' | 'bio' | 'company' | 'skill_fallback'
      - `repo` string: Bare repository name (no owner), present when the match came from a repository. Use `top_repositories` or the evidence report for owner-qualified names.
      - `snippet` string: Short surrounding text for bio/company matches
    - `inferred_utc_offset` InferredUtcOffset, nullable: UTC offset inferred from the candidate's own commit author timestamps, used when GitHub's `location` field is empty or unresolvable. Null when no signal is available.
      - `offset` number
      - `confidence` 'none' | 'low' | 'medium' | 'high'
      - `sample_size` integer: Number of commits the inference was based on
      - `share` number: Fraction of sampled commits at the dominant offset
      - `latest_commit` string, date-time
    - `skill_timeline` object: Per-language commit history, keyed by GitHub Linguist language name (e.g. "Scala", "TypeScript"). Always present; independent of the `skills` query parameter.
    - `skill_checks` SkillCheck[]: Present only when the `skills` query parameter was given.
      - `skill` string: Echoes the requested skill name (alias-resolved for matching, e.g. "ts" -> TypeScript)
      - `matched` boolean
      - `first_year` integer, nullable
      - `last_year` integer, nullable
      - `last_activity_at` string, nullable: Date of the most recent dated activity in this skill, or null when the cached timeline predates dated activity (missing evidence, not evidence of inactivity).
      - `years_active` integer[]
      - `recent_commits` integer
      - `total_commits` integer
      - `top_repos` object[]
        - `name_with_owner` string
        - `owner_type` string
        - `commits` integer
    - `commercial_context` CommercialContext, nullable: Typed, dated evidence about commercial work, plus explicitly reasoned assessments. Null when derivation failed. Nothing here is ever `contradicted`: absent public evidence cannot disprove private or commercial work, so the only statuses are `supported` and `unknown`. `supported` requires dated work-history evidence explicitly connecting the person, the paid work, and the dates it covers. Public GitHub data carries no such evidence, so the tenure and recency assessments are `unknown` on every profile served here. Contribution years and self-reported employers are context, never duration.
      - `schema_version` integer
      - `evaluated_at` string, date-time
      - `window_years` integer: Rolling recency window used by the recency assessment.
      - `records` CommercialContextRecord[]
        - `id` string
        - `kind` 'public_org_contribution' | 'self_reported_employment' | 'commit_email_domain': `public_org_contribution` - the candidate authored commits in a repository owned by a company organization; contribution dates are contribution dates, never tenure. `self_reported_employment` - the profile company field or bio says so; always undated and unverified. `commit_email_domain` - commits were authored from a non-consumer mail domain; a hint only, and the address itself is never exposed.
        - `source_url` string, nullable
        - `repository` string, nullable
        - `commit_sha` string, nullable
        - `observed_at` string, nullable
        - `activity_at` string, nullable
        - `interval` object, nullable
          - `from` string
          - `to` string
          - `precision` 'year' | 'day'
        - `claim` string
        - `attribution` string
        - `limitations` string[]
        - `company` string, nullable
        - `organization` string, nullable
        - `languages` string[]
        - `commits` integer
        - `active_years` integer[]
      - `records_truncated` boolean: True when more records existed than the server-controlled cap. Records are ordered strongest-evidence-first, so a truncated list still contains the ones the assessments cite.
      - `assessments` object
        - `commercial_scala_duration` CommercialAssessment
          - `status` 'supported' | 'unknown'
          - `supported_months` integer: Months covered by merged dated work-history intervals. Contribution years never count towards it, so it is 0 while the profile carries no work-history evidence.
          - `required_months` integer: Months the criterion requires (36 for commercial skill duration, 60 for engineering experience, 0 for the recency question, which is an overlap test rather than a duration one).
          - `intervals` object[]
            - `from` string
            - `to` string
          - `evidence_ids` string[]: Ids of the dated work-history records the assessment counted. Empty when the status is `unknown`; the corroborating contribution and self-report records are still listed under `records`.
          - `reason` string
          - `window` object: Present on the recency assessment.
            - `from` string
            - `to` string
          - `hints` object: Discovery hints on the engineering-experience assessment only. Account age and first public activity never satisfy an experience requirement.
            - `account_created_at` string, nullable
            - `first_public_activity_year` integer, nullable
            - `discovery_hint` boolean
        - `recent_commercial_scala` CommercialAssessment
          - `status` 'supported' | 'unknown'
          - `supported_months` integer: Months covered by merged dated work-history intervals. Contribution years never count towards it, so it is 0 while the profile carries no work-history evidence.
          - `required_months` integer: Months the criterion requires (36 for commercial skill duration, 60 for engineering experience, 0 for the recency question, which is an overlap test rather than a duration one).
          - `intervals` object[]
            - `from` string
            - `to` string
          - `evidence_ids` string[]: Ids of the dated work-history records the assessment counted. Empty when the status is `unknown`; the corroborating contribution and self-report records are still listed under `records`.
          - `reason` string
          - `window` object: Present on the recency assessment.
            - `from` string
            - `to` string
          - `hints` object: Discovery hints on the engineering-experience assessment only. Account age and first public activity never satisfy an experience requirement.
            - `account_created_at` string, nullable
            - `first_public_activity_year` integer, nullable
            - `discovery_hint` boolean
        - `engineering_experience` CommercialAssessment
          - `status` 'supported' | 'unknown'
          - `supported_months` integer: Months covered by merged dated work-history intervals. Contribution years never count towards it, so it is 0 while the profile carries no work-history evidence.
          - `required_months` integer: Months the criterion requires (36 for commercial skill duration, 60 for engineering experience, 0 for the recency question, which is an overlap test rather than a duration one).
          - `intervals` object[]
            - `from` string
            - `to` string
          - `evidence_ids` string[]: Ids of the dated work-history records the assessment counted. Empty when the status is `unknown`; the corroborating contribution and self-report records are still listed under `records`.
          - `reason` string
          - `window` object: Present on the recency assessment.
            - `from` string
            - `to` string
          - `hints` object: Discovery hints on the engineering-experience assessment only. Account age and first public activity never satisfy an experience requirement.
            - `account_created_at` string, nullable
            - `first_public_activity_year` integer, nullable
            - `discovery_hint` boolean
      - `limitations` string[]

## Other responses

- `401`: Missing, invalid, or revoked API key
- `404`: No matching developer
- `429`: Monthly or daily quota exceeded
- `500`: Unexpected server error

---

[API](https://skmtc.dev/githunt/apis/githunt-api.md) · [All operations](https://skmtc.dev/githunt/apis/githunt-api/llms.txt) · [OpenAPI document](https://skmtc.dev/githunt/apis/githunt-api/revisions/6fc325607da0?raw)
