> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dis.dog/llms.txt
> Use this file to discover all available pages before exploring further.

# Discord profile

> The profile module on its own: everything public about a Discord account, from its ID. Answering `200` or `404` takes 1 search from your quota; `400`, `451` and `429` take none.

Everything public about a Discord account, from its ID: usernames, display name and its Nitro style, avatar, banner, avatar decoration, nameplate, server tag, badges, Nitro signals and creation date, plus every username and display name DisDog has seen for it before. A `200` or a `404` takes **1 search** from your quota.

The same object is in every [search](https://docs.dis.dog/api-reference/endpoints/search.md) for a Discord ID, as `data` of the `profile` module. [About the module →](https://docs.dis.dog/modules/profile.md)

> [!NOTE]
>
> Profiles are re-read from Discord at most every 15 minutes (`fetchedAt`). `history` holds what DisDog itself has observed, so it grows with every lookup.


## OpenAPI

````yaml GET /v1/profile/{id}
openapi: 3.1.0
info:
  title: dis.dog API
  version: 1.0.0
  description: >-
    Discord OSINT from one key. Look up a Discord ID, a username or an invite
    and get the profile, the servers it has been seen in, its message logs, and
    the linked Roblox and guns.lol accounts. Your access key authenticates both
    the website and this API.


    **Base URL** `https://api.dis.dog`  

    **Auth** send your key as `Authorization: Bearer DD-...` (or `X-API-Key:
    DD-...`).  

    The API is included with the **Hound** and **Alpha** plans. On the free plan
    only `/v1/me` and `/v1/modules` answer; every other endpoint returns `403
    plan_has_no_api`.
servers:
  - url: https://api.dis.dog
security:
  - bearerAuth: []
paths:
  /v1/profile/{id}:
    get:
      tags:
        - Modules
      summary: Profile
      description: >-
        The Discord profile for an ID: names, avatar, banner, badges, server
        tag, and every username and display name we have seen before. Counts as
        one search.
      parameters:
        - $ref: '#/components/parameters/Id'
      responses:
        '200':
          description: Profile
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Profile'
        '400':
          $ref: '#/components/responses/Error'
        '403':
          $ref: '#/components/responses/Error'
        '404':
          $ref: '#/components/responses/Error'
        '429':
          $ref: '#/components/responses/Error'
components:
  parameters:
    Id:
      name: id
      in: path
      required: true
      description: A Discord ID (17 to 20 digits).
      schema:
        type: string
        pattern: ^\d{17,20}$
        example: '80351110224678912'
  schemas:
    Profile:
      type: object
      description: >-
        Trimmed; the live response carries more nested fields (decoration,
        nameplate, name style).
      properties:
        id:
          type: string
        username:
          type: string
          example: nelly
        displayName:
          type:
            - string
            - 'null'
          example: Nelly
        discriminator:
          type:
            - string
            - 'null'
          description: Only on legacy name#1234 accounts.
        bot:
          type: boolean
        system:
          type: boolean
        createdAt:
          type: string
          format: date-time
        accountAgeDays:
          type: integer
          example: 4100
        avatar:
          type: object
          properties:
            url:
              type: string
            animated:
              type: boolean
            default:
              type: boolean
        banner:
          type:
            - object
            - 'null'
          properties:
            url:
              type: string
            animated:
              type: boolean
        accentColor:
          type:
            - string
            - 'null'
          example: '#5865f2'
        bannerColor:
          type:
            - string
            - 'null'
        serverTag:
          type:
            - object
            - 'null'
          properties:
            tag:
              type: string
              example: DOG
            guildId:
              type: string
            badgeUrl:
              type:
                - string
                - 'null'
        badges:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
              name:
                type: string
              iconUrl:
                type: string
        history:
          type: object
          properties:
            usernames:
              type: array
              items:
                $ref: '#/components/schemas/Seen'
            displayNames:
              type: array
              items:
                $ref: '#/components/schemas/Seen'
            previousNames:
              type: array
              items:
                type: object
                properties:
                  name:
                    type: string
                  seenAt:
                    type:
                      - string
                      - 'null'
        fetchedAt:
          type: string
          format: date-time
    Seen:
      type: object
      properties:
        value:
          type: string
        firstSeen:
          type: string
          format: date-time
        lastSeen:
          type: string
          format: date-time
    Error:
      type: object
      required:
        - error
      description: >-
        Every error is a flat object with an `error` code. Some add fields (for
        example `retryAfterMs` on `rate_limited`).
      properties:
        error:
          type: string
          example: plan_has_no_api
          enum:
            - invalid_request
            - invalid_id
            - invalid_name
            - invalid_invite
            - unauthorized
            - invalid_api_key
            - plan_has_no_api
            - user_not_found
            - invite_not_found
            - not_available
            - removed_by_owner
            - rate_limited
            - quota_exceeded
            - module_unavailable
            - upstream_unavailable
            - upstream_busy
            - not_found
        retryAfterMs:
          type: integer
          description: 'On `rate_limited`: wait this long before retrying.'
          example: 2000
  responses:
    Error:
      description: Error
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        Your access key, `DD-XXXXX-XXXXX-XXXXX-XXXXX-XXXXX`. The same key is
        your website login. Keep it server-side.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.