InternetData Authorization API

Obtaining and revoking tokens.

GitHub OpenAPI

Operations 6

GET /.well-known/oauth-authorization-server Discovery #
POST /oauth/device_authorization Device authorization #
POST /oauth/register Register #
GET /oauth/authorize Authorize #
POST /oauth/token Token #
POST /oauth/revoke Revoke #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/internetdata-io:internetdata-io-authorization-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

internetdata-io-authorization-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: InternetData Authorization API
  description: 'The InternetData API: download the databases your organization is licensed

    for, and manage the account behind them.


    See https://docs.internetdata.io for guides and https://github.com/internetdata

    for the official client libraries.'
  contact:
    name: InternetData Support
    email: support@internetdata.io
    url: https://internetdata.io
  termsOfService: https://internetdata.io/terms
  version: 2026.11.08
servers:
- url: https://internetdata.io
tags:
- name: Authorization
  description: Obtaining and revoking tokens.
  x-displayName: Authorization
paths:
  /.well-known/oauth-authorization-server:
    get:
      operationId: oauthMetadata
      tags:
      - Authorization
      summary: Discovery
      description: 'RFC 8414 authorization server metadata: the endpoints, the grant types

        and the scopes this server supports.


        Read this rather than hardcoding endpoints. It is also served at

        `/.well-known/openid-configuration`, identically, because several

        clients probe that path first.'
      security: []
      responses:
        '200':
          description: The server's metadata.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OauthMetadata'
  /oauth/device_authorization:
    post:
      operationId: oauthDeviceAuthorization
      tags:
      - Authorization
      summary: Device authorization
      description: 'Starts the device flow. Show the `user_code` to the person and send them

        to `verification_uri`; `verification_uri_complete` has the code already

        embedded, which is what to open if you can open a browser at all.


        Then poll `/oauth/token`, no faster than `interval` seconds.'
      security: []
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/DeviceAuthorizationRequest'
      responses:
        '200':
          description: A pending device authorization.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeviceAuthorization'
        '400':
          description: '`invalid_request`, `unauthorized_client` when the client may not use

            the device flow, or `slow_down` when this address has started too

            many authorizations.

            '
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OauthError'
        '401':
          description: '`invalid_client`: the `client_id` is not registered.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OauthError'
  /oauth/register:
    post:
      operationId: oauthRegister
      tags:
      - Authorization
      summary: Register
      description: 'RFC 7591 dynamic client registration, for a client that cannot use a

        Client ID Metadata Document. Post your client''s metadata as JSON, then

        use the `client_id` in the answer at `/oauth/authorize` and

        `/oauth/token`. Nothing is kept until a person approves your client, so

        registering again costs nothing and leaves nothing to clean up.


        Each redirect URI must be https on a public host name, or http on a

        loopback address (`127.0.0.1`, `[::1]`, `localhost`), which then

        matches on any port. A custom URI scheme is refused: use a loopback

        redirect instead. So is a host on one of our own domains.


        `client_name` is shown to the person as your client''s own claim, with

        where its redirect goes beside it. A name that renders blank, or mixes

        Latin letters with Cyrillic or Greek ones, is shown as an unnamed

        application.


        The client is public whatever you ask for: `token_endpoint_auth_method`

        comes back `none`, there is no client secret, and every authorization

        proves itself with PKCE. It may be granted `apikeys.use` at most.'
      security: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ClientRegistrationRequest'
      responses:
        '201':
          description: The client, as registered.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ClientRegistration'
        '400':
          description: '`invalid_redirect_uri` names the redirect URI refused and why, and

            `invalid_client_metadata` anything else, such as a client that

            does not use the authorization code flow. `slow_down` means this

            address registered too many clients in the last minute.

            '
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OauthError'
  /oauth/authorize:
    get:
      operationId: oauthAuthorize
      tags:
      - Authorization
      summary: Authorize
      description: 'The browser entry point for the authorization-code flow. This is a

        redirect target, not something to call from code.


        Any client may sign in without registering first by using a Client ID

        Metadata Document: make `client_id` an https URL that serves your

        client''s metadata as JSON, naming that same URL as its `client_id`,

        with `token_endpoint_auth_method` `none` and your `redirect_uris`. An

        https redirect URI must be on the same origin as the `client_id`; a

        loopback one (`http://127.0.0.1`, `http://[::1]`, `http://localhost`)

        matches on any port. Such a client is granted `apikeys.use` at most. A

        client registered at `/oauth/register` uses the `client_id` it was

        given and one of the `redirect_uris` it registered.


        An unknown `client_id` or an unregistered `redirect_uri` is shown to the

        person and never redirected, because sending an error to an address we

        have not verified belongs to you is how an open redirector works. Any

        other error in the request is shown to the person too: anyone can make a

        client, so its `redirect_uri` is verified only as its own (RFC 9700

        section 4.11.2). Only the person''s answer comes back to your

        `redirect_uri`: a `code`, or `error` `access_denied`, each with your

        `state` and `iss`.'
      security: []
      parameters:
      - name: client_id
        in: query
        required: true
        schema:
          type: string
      - name: redirect_uri
        in: query
        required: true
        schema:
          type: string
      - name: response_type
        in: query
        required: true
        schema:
          type: string
          enum:
          - code
      - name: code_challenge
        in: query
        required: true
        schema:
          type: string
      - name: code_challenge_method
        in: query
        required: true
        schema:
          type: string
          enum:
          - S256
        description: S256, named explicitly. `plain`, or no method at all, is refused rather than downgraded.
      - name: scope
        in: query
        required: false
        schema:
          type: string
      - name: state
        in: query
        required: false
        schema:
          type: string
        description: Returned unchanged. Use it to bind the response to your request.
      - name: resource
        in: query
        required: false
        schema:
          type: string
        description: 'RFC 8707. What the token is FOR, so it cannot be replayed elsewhere:

          this brand''s MCP server, the only resource it issues tokens for.

          Anything else answers `invalid_target`. A client that names none is

          given that server.

          '
      responses:
        '302':
          description: A redirect to the consent screen.
        '400':
          description: Shown to the person. No error in the request is sent to your redirect_uri.
        '429':
          description: Shown to the user. Too many authorizations from one address.
  /oauth/token:
    post:
      operationId: oauthToken
      tags:
      - Authorization
      summary: Token
      description: 'Issues tokens for three grant types: a device code, an authorization

        code and a refresh token.


        `urn:ietf:params:oauth:grant-type:device_code` polls a device

        authorization. Until the person approves it answers

        `authorization_pending`; poll faster than `interval` and it answers

        `slow_down`, which means widen your interval and keep it widened.


        `authorization_code` exchanges a code from `/oauth/authorize`, with the

        `code_verifier` matching the challenge you sent and the same

        `redirect_uri`. A code works once: presenting it again also revokes

        what the first exchange issued.


        `refresh_token` exchanges a refresh token. The presented token is

        consumed whatever happens next, so store the new one before using it.

        Presenting a consumed refresh token again ends the whole authorization,

        since it means the token was copied.'
      security: []
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/TokenRequest'
      responses:
        '200':
          description: Tokens.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TokenResponse'
        '400':
          description: 'An RFC 6749 error. `authorization_pending` and `slow_down` are

            normal answers while polling a device authorization, not failures.

            `access_denied` means the person refused, and `expired_token` that

            the device code is no longer valid: it expired, or it was already

            exchanged or refused. `invalid_grant` means the code, device code or

            refresh token is not valid for this `client_id`. `invalid_target`

            means `resource` names something other than what was authorized.

            `slow_down` also answers any grant when this address sends too many

            requests.

            '
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OauthError'
        '401':
          description: '`invalid_client`: the `client_id` is not registered.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OauthError'
  /oauth/revoke:
    post:
      operationId: oauthRevoke
      tags:
      - Authorization
      summary: Revoke
      description: 'RFC 7009. Always answers 200, even for a token that was never valid, so

        it can''t be used to test whether a token is live.


        Revoking a refresh token ends the whole authorization and takes its

        access tokens with it. Revoking an access token affects only that token.'
      security: []
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/RevokeRequest'
      responses:
        '200':
          description: Always, whatever was presented.
          content:
            application/json:
              schema:
                type: object
components:
  schemas:
    RevokeRequest:
      type: object
      properties:
        token:
          type: string
          description: An access token or a refresh token.
        client_id:
          type: string
          description: Accepted and not checked.
      required:
      - token
    TokenRequest:
      type: object
      properties:
        grant_type:
          type: string
          description: '`urn:ietf:params:oauth:grant-type:device_code`, `authorization_code` or `refresh_token`.'
        client_id:
          type: string
        device_code:
          type: string
          description: Required by the device code grant.
        code:
          type: string
          description: Required by the authorization code grant.
        code_verifier:
          type: string
          description: Required by the authorization code grant.
        redirect_uri:
          type: string
          description: 'Required by the authorization code grant: the `redirect_uri` the code was issued against, exactly.'
        resource:
          type: string
          description: 'Authorization code grant, optional: RFC 8707, and it must name what was authorized.'
        refresh_token:
          type: string
          description: Required by the refresh token grant.
      required:
      - grant_type
      - client_id
    DeviceAuthorization:
      type: object
      properties:
        device_code:
          type: string
          description: Yours. Poll with it; never show it to anyone.
        user_code:
          type: string
          description: Short and typable. This is what the person confirms.
        verification_uri:
          type: string
        verification_uri_complete:
          type: string
          description: The same page with the code already filled in.
        expires_in:
          type: integer
          description: Seconds until both codes expire.
        interval:
          type: integer
          description: Seconds between polls.
      required:
      - device_code
      - user_code
      - verification_uri
      - expires_in
      - interval
    ClientRegistrationRequest:
      type: object
      properties:
        redirect_uris:
          type: array
          items:
            type: string
          description: One to ten, each matched exactly, apart from a loopback one's port.
        client_name:
          type: string
          description: Shown to the person as your client's own claim, marked unverified, beside where its redirect goes.
        grant_types:
          type: array
          items:
            type: string
          description: Must include `authorization_code` when given.
        response_types:
          type: array
          items:
            type: string
          description: Must include `code` when given.
        token_endpoint_auth_method:
          type: string
          description: Read as `none`, whatever is sent.
      required:
      - redirect_uris
    ClientRegistration:
      type: object
      properties:
        client_id:
          type: string
        client_id_issued_at:
          type: integer
          format: int64
          description: Unix seconds. 64-bit, since 32 bits run out on 2038-01-19.
        client_name:
          type: string
          description: As the person will see it.
        redirect_uris:
          type: array
          items:
            type: string
        grant_types:
          type: array
          items:
            type: string
          description: '`authorization_code` and `refresh_token`.'
        response_types:
          type: array
          items:
            type: string
        token_endpoint_auth_method:
          type: string
          description: Always `none`.
        scope:
          type: string
          description: 'The most this client may be granted: `apikeys.use`.'
      required:
      - client_id
      - client_id_issued_at
      - client_name
      - redirect_uris
      - token_endpoint_auth_method
    OauthError:
      type: object
      properties:
        error:
          type: string
        error_description:
          type: string
      required:
      - error
    OauthMetadata:
      type: object
      properties:
        issuer:
          type: string
        authorization_endpoint:
          type: string
        token_endpoint:
          type: string
        device_authorization_endpoint:
          type: string
        revocation_endpoint:
          type: string
        scopes_supported:
          type: array
          items:
            type: string
        response_types_supported:
          type: array
          items:
            type: string
        grant_types_supported:
          type: array
          items:
            type: string
        code_challenge_methods_supported:
          type: array
          items:
            type: string
        client_id_metadata_document_supported:
          type: boolean
          description: Any client may sign in with an https `client_id` serving its own metadata.
        registration_endpoint:
          type: string
          description: RFC 7591 dynamic client registration, for a client that cannot serve its own metadata.
        token_endpoint_auth_methods_supported:
          type: array
          items:
            type: string
          description: Always `none`. Every client is public and has no secret.
        authorization_response_iss_parameter_supported:
          type: boolean
          description: RFC 9207. A redirect back from the authorization endpoint carries `iss`.
        service_documentation:
          type: string
      required:
      - issuer
      - authorization_endpoint
      - token_endpoint
    DeviceAuthorizationRequest:
      type: object
      properties:
        client_id:
          type: string
        scope:
          type: string
          description: Space-delimited. Anything your client is not registered for is dropped rather than refused.
        resource:
          type: string
          description: 'RFC 8707: what the token is for.'
      required:
      - client_id
    TokenResponse:
      type: object
      properties:
        access_token:
          type: string
        token_type:
          type: string
          description: Always `Bearer`.
        expires_in:
          type: integer
          description: Seconds until the access token expires.
        refresh_token:
          type: string
          description: Always returned. A refresh consumes the token it presents, so keep this one.
        scope:
          type: string
          description: What was actually granted, which may be narrower than what was asked for.
        mslm:apikey_id:
          type: string
          description: 'Not part of OAuth, and only for our own clients. The ID of the API

            key the person picked when they approved, returned by every grant

            while this authorization may still read that key back. Absent when

            no key was picked, or when the person''s role no longer allows

            reading keys back.

            '
        mslm:apikey:
          type: string
          description: 'Not part of OAuth, and only for our own clients: a client that signed

            in with a Client ID Metadata Document or registered itself never

            receives a key. The API

            key itself, so a device ends up holding an ordinary key. Returned by

            the device code and authorization code grants only, never by a

            refresh, and only alongside

            `mslm:apikey_id`. Absent when that key''s secret cannot be read back,

            which is the case for a key created before keys could be shown again

            in the console; a rotated key can be.

            '
      required:
      - access_token
      - token_type
      - expires_in
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: query
      name: apikey
      description: 'UUID-format API key issued to the customer. Each key is authorized for a

        specific set of database IDs; requesting any other ID returns 403.


        v1 only. The v2 endpoints take a console-issued key as a bearer token.

        '
    BearerAuth:
      type: http
      scheme: bearer
      description: '`Authorization: Bearer <key>`, with a key from the console. Keys are

        default-deny: each operation names the scope it needs, and an existing

        key does not gain an operation until that scope is added to it.

        '
    ApiKeyHeaderAuth:
      type: apiKey
      in: header
      name: X-Api-Key
      description: '`X-Api-Key: <key>`. The same v2 key, for clients that do not set a bearer.'
    ApiKeyQueryAuth:
      type: apiKey
      in: query
      name: apikey
      description: '`?apikey=<key>`. Convenient in a browser or a curl one-liner, which is

        how a database is usually fetched; prefer a header elsewhere.


        This is the same v2 key as the other two schemes. A v1 credential is a

        different vocabulary and fails validation here, as it would anywhere.

        '
x-tagGroups:
- name: InternetData Database API
  tags:
  - Database
  - Database v2
- name: InternetData IAM API
  tags:
  - Account
  - Organization
  - API keys
- name: InternetData Authorization
  tags:
  - Authorization