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

# Get API key details

> Any valid key may call this, whatever its scopes. Useful to check a key works before calling the tracking endpoints.



## OpenAPI

````yaml /api-reference/tracking.json get /api/v1/me
openapi: 3.0.0
info:
  title: OpenBorder Tracking API
  description: >-
    Tracking events for shipments whose label OpenBorder generated.


    ## Authentication


    Send your API key in the `X-OpenBorder-Api-Key` header on every request. A
    key covers one or more brands, and the

    tracking endpoints need the `tracking:read` scope. `GET /api/v1/me` works
    with any valid key and tells you

    which brands and scopes it has.


    ## Brands


    You only ever see shipments of the brands on your key. A code that belongs
    to another brand gets the same 404 as a code

    that doesn't exist.


    ## Rate limits


    Each key gets 120 requests per minute in a fixed window. A batch lookup

    counts once, however many codes it holds. Every response past authentication
    carries `RateLimit-Limit`,

    `RateLimit-Remaining` and `RateLimit-Reset` (plus the `X-RateLimit-*`
    equivalents), and going over returns 429.

    Requests rejected with 401 or 403 don't count.


    ## Reading events


    Order events by `sequence`, not `timestamp`. Carriers send events late and
    out of order, and some send only a date.

    `status` is one of a fixed set of milestones. Anything we can't map to one
    is `Unknown`, and `message`

    keeps the carrier's own wording.
  version: v1
  contact: {}
servers:
  - url: https://api.openborder.com
    description: Production
security: []
tags: []
paths:
  /api/v1/me:
    get:
      tags:
        - API key
      summary: What this API key is and which brands it covers
      description: >-
        Any valid key may call this, whatever its scopes. Useful to check a key
        works before calling the tracking endpoints.
      operationId: MeController_me
      parameters:
        - name: If-None-Match
          in: header
          description: >-
            The ETag of a previous response. Returns 304 with no body when it
            still matches.
          required: false
          schema:
            type: string
      responses:
        '200':
          description: The key, its scopes and the brands it covers
          headers:
            RateLimit-Limit:
              description: Requests this key may make per minute
              schema:
                type: integer
                example: 120
            RateLimit-Remaining:
              description: Requests left in the current window
              schema:
                type: integer
                example: 117
            RateLimit-Reset:
              description: Seconds until the window resets
              schema:
                type: integer
                example: 42
            X-RateLimit-Limit:
              description: Same as RateLimit-Limit
              schema:
                type: integer
                example: 120
            X-RateLimit-Remaining:
              description: Same as RateLimit-Remaining
              schema:
                type: integer
                example: 117
            X-RateLimit-Reset:
              description: When the window resets, in Unix epoch seconds
              schema:
                type: integer
                example: 1790000000
            ETag:
              description: Send it back in If-None-Match to get a 304 when nothing changed
              schema:
                type: string
                example: W/"4ea-sahiy1qZzzkKtIO6eqvnKV3TDgQ"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MeResponse'
        '304':
          description: >-
            Nothing changed since that ETag. No body. Counts against the rate
            limit.
          headers:
            RateLimit-Limit:
              description: Requests this key may make per minute
              schema:
                type: integer
                example: 120
            RateLimit-Remaining:
              description: Requests left in the current window
              schema:
                type: integer
                example: 117
            RateLimit-Reset:
              description: Seconds until the window resets
              schema:
                type: integer
                example: 42
            X-RateLimit-Limit:
              description: Same as RateLimit-Limit
              schema:
                type: integer
                example: 120
            X-RateLimit-Remaining:
              description: Same as RateLimit-Remaining
              schema:
                type: integer
                example: 117
            X-RateLimit-Reset:
              description: When the window resets, in Unix epoch seconds
              schema:
                type: integer
                example: 1790000000
        '401':
          description: >-
            The API key is missing ("API key required in header:
            X-OpenBorder-Api-Key") or unknown, expired or revoked ("Invalid or
            expired API key")
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiError'
                example:
                  statusCode: 401
                  message: Invalid or expired API key
                  error: Unauthorized
        '403':
          description: >-
            The key covers no active brand ("API key covers no active brand"),
            or was refused ("API key was refused")
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiError'
                example:
                  statusCode: 403
                  message: API key covers no active brand
                  error: Forbidden
        '429':
          description: Over the per key rate limit. Wait RateLimit-Reset seconds.
          headers:
            RateLimit-Limit:
              description: Requests this key may make per minute
              schema:
                type: integer
                example: 120
            RateLimit-Remaining:
              description: Requests left in the current window
              schema:
                type: integer
                example: 117
            RateLimit-Reset:
              description: Seconds until the window resets
              schema:
                type: integer
                example: 42
            X-RateLimit-Limit:
              description: Same as RateLimit-Limit
              schema:
                type: integer
                example: 120
            X-RateLimit-Remaining:
              description: Same as RateLimit-Remaining
              schema:
                type: integer
                example: 117
            X-RateLimit-Reset:
              description: When the window resets, in Unix epoch seconds
              schema:
                type: integer
                example: 1790000000
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiError'
                example:
                  statusCode: 429
                  message: Rate limit exceeded
        '503':
          description: >-
            We couldn't validate a key we haven't seen recently. Keys validated
            in the last few minutes keep working. Retry with backoff.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiError'
                example:
                  statusCode: 503
                  message: Unable to validate API key
                  error: Service Unavailable
      security:
        - api_key: []
components:
  schemas:
    MeResponse:
      type: object
      properties:
        key_id:
          type: string
          example: key_9f2c1e84
        scopes:
          example:
            - tracking:read
          type: array
          items:
            type: string
        brand_codes:
          description: The brands this key can read
          example:
            - acme
            - globex
          type: array
          items:
            type: string
      required:
        - key_id
        - scopes
        - brand_codes
    ApiError:
      type: object
      properties:
        statusCode:
          type: number
          description: The HTTP status code, repeated
          example: 404
        message:
          type: string
          description: What went wrong. Safe to log, not meant for end customers.
          example: Tracking code not found
        error:
          type: string
          description: The HTTP reason phrase. Absent on 429.
          example: Not Found
      required:
        - statusCode
        - message
  securitySchemes:
    api_key:
      type: apiKey
      in: header
      name: X-OpenBorder-Api-Key

````

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