Eden AI Keys API

The keys API from Eden AI — 4 operation(s) for keys.

Operations 7

GET /manage/keys/ Manage keys list #
POST /manage/keys/ Manage keys create #
GET /manage/keys/{key_id}/ Manage keys retrieve #
PATCH /manage/keys/{key_id}/ Manage keys partial update #
DELETE /manage/keys/{key_id}/ Manage keys destroy #
POST /manage/keys/{key_id}/rotate/ Manage keys rotate create #
GET /manage/keys/{key_id}/usage/ Manage keys usage retrieve #

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/eden-ai-keys-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

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

eden-ai-keys-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Organization Management Keys API
  version: '2.0'
  description: Your project description
servers:
- url: https://api.edenai.run/v3
tags:
- name: Keys
paths:
  /manage/keys/:
    get:
      operationId: manage_keys_list
      description: '``GET /v3/manage/keys`` (list, ``manage:read``) and ``POST /v3/manage/keys`` (mint an inference

        key, ``manage:write``). Org-scoped through ``principals_in_org``. Balance is pending-adjusted per

        page on the list; the created secret is returned ONCE in the 201 and never by a read.'
      parameters:
      - name: limit
        required: false
        in: query
        description: Number of results to return per page.
        schema:
          type: integer
      - name: offset
        required: false
        in: query
        description: The initial index from which to return the results.
        schema:
          type: integer
      tags:
      - Keys
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedManagementKeyList'
          description: ''
      summary: Manage keys list
      x-summary-source: derived
    post:
      operationId: manage_keys_create
      description: '``GET /v3/manage/keys`` (list, ``manage:read``) and ``POST /v3/manage/keys`` (mint an inference

        key, ``manage:write``). Org-scoped through ``principals_in_org``. Balance is pending-adjusted per

        page on the list; the created secret is returned ONCE in the 201 and never by a read.'
      tags:
      - Keys
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ManagementKeyRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/ManagementKeyRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/ManagementKeyRequest'
        required: true
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ManagementKey'
          description: ''
      summary: Manage keys create
      x-summary-source: derived
  /manage/keys/{key_id}/:
    get:
      operationId: manage_keys_retrieve
      description: '``GET`` (read), ``PATCH`` (write, policy fields + rename), ``DELETE`` (write, IRREVERSIBLE revoke)

        for one key at ``/v3/manage/keys/{key_id}``, org-scoped: a ``key_id`` not in the calling key''s org

        is a 404, not another org''s key. DELETE destroys the secret and keeps the row marked revoked (see

        ``destroy``); there is no re-enable. Balance is pending-adjusted. Never returns the secret or its hash.'
      parameters:
      - in: path
        name: key_id
        schema:
          type: string
          format: uuid
        required: true
      tags:
      - Keys
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ManagementKey'
          description: ''
      summary: Manage keys retrieve
      x-summary-source: derived
    patch:
      operationId: manage_keys_partial_update
      description: '``GET`` (read), ``PATCH`` (write, policy fields + rename), ``DELETE`` (write, IRREVERSIBLE revoke)

        for one key at ``/v3/manage/keys/{key_id}``, org-scoped: a ``key_id`` not in the calling key''s org

        is a 404, not another org''s key. DELETE destroys the secret and keeps the row marked revoked (see

        ``destroy``); there is no re-enable. Balance is pending-adjusted. Never returns the secret or its hash.'
      parameters:
      - in: path
        name: key_id
        schema:
          type: string
          format: uuid
        required: true
      tags:
      - Keys
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedManagementKeyRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedManagementKeyRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedManagementKeyRequest'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ManagementKey'
          description: ''
      summary: Manage keys partial update
      x-summary-source: derived
    delete:
      operationId: manage_keys_destroy
      description: '``GET`` (read), ``PATCH`` (write, policy fields + rename), ``DELETE`` (write, IRREVERSIBLE revoke)

        for one key at ``/v3/manage/keys/{key_id}``, org-scoped: a ``key_id`` not in the calling key''s org

        is a 404, not another org''s key. DELETE destroys the secret and keeps the row marked revoked (see

        ``destroy``); there is no re-enable. Balance is pending-adjusted. Never returns the secret or its hash.'
      parameters:
      - in: path
        name: key_id
        schema:
          type: string
          format: uuid
        required: true
      tags:
      - Keys
      responses:
        '204':
          description: No response body
      summary: Manage keys destroy
      x-summary-source: derived
  /manage/keys/{key_id}/rotate/:
    post:
      operationId: manage_keys_rotate_create
      description: '``POST /v3/manage/keys/{key_id}/rotate`` (manage:write) -- replace a key''s secret in place: same

        identity (name, key_id, budget, guardrail), a brand-new ``sk-eden`` value returned ONCE. Lets a

        compliance pipeline roll a secret without reconfiguring the key. Distinct from DELETE: revoke KILLS

        (terminal), rotate RE-SECRETS.


        A REVOKED key is a 404 here, never resurrected. ``rotate_key_secret`` clears ``revoked_at`` and

        writes fresh secret material, so rotating a revoked key would REVIVE it -- the exact one-way-door

        that revoke depends on. The read filters a revoked (or cross-org, or unknown) key_id to a 404, and

        the whole rotate runs in a transaction that ``select_for_update``-locks the row: a concurrent DELETE

        either commits its revoke first (``revoked_at`` then filters the row out -> 404) or blocks on the

        lock until the rotate commits and then still wins its own compare-and-set. Without the lock the read

        filter alone is a check-then-act race -- a rotate that resolved a live key could blind-write a fresh

        secret AFTER a concurrent revoke landed, resurrecting a terminally-revoked key. So revocation stays

        terminal.'
      parameters:
      - in: path
        name: key_id
        schema:
          type: string
          format: uuid
        required: true
      tags:
      - Keys
      responses:
        '200':
          description: No response body
      summary: Manage keys rotate create
      x-summary-source: derived
  /manage/keys/{key_id}/usage/:
    get:
      operationId: manage_keys_usage_retrieve
      description: '``GET /v3/manage/keys/{key_id}/usage`` -- usage for one key, filtered by ``custom_token``

        IDENTITY (precise, unlike the dashboard''s name filter). A ``key_id`` not in the org is a 404.

        Time-series only. ``manage:read``.'
      parameters:
      - in: path
        name: key_id
        schema:
          type: string
          format: uuid
        required: true
      tags:
      - Keys
      responses:
        '200':
          description: No response body
      summary: Manage keys usage retrieve
      x-summary-source: derived
components:
  schemas:
    ManagementKey:
      type: object
      description: 'An org''s inference key as the management plane exposes it. Never the secret or

        its hash — only non-secret metadata, addressed by the stable ``key_id`` (``id``).


        ``balance`` is the pending-adjusted LIVE sub-limit, not the raw settled column.

        For a credit-ledger-enrolled org the stored ``Token.balance`` lags by whatever the

        batched rollup has not settled, so a management admin must be shown available, not

        settled (the shipped display-vs-accounting doctrine, mirrored from

        ``utils/check_credits.py`` and ``manage_user_account_serializers``). The un-settled

        deltas (≤ 0, so they ADD) are batch-fetched once per page by the view and passed in

        ``context["pending"]``; a non-ledger org simply has none, so the add is a no-op.


        ``id`` is null for an un-migrated legacy key (one still stored as a JWT, no

        ``key_id`` yet); such a key is listed but not addressable via ``/keys/{id}`` until

        it is regenerated onto the hashed scheme.'
      properties:
        id:
          type: string
          format: uuid
          readOnly: true
        name:
          type: string
          description: The token name
          maxLength: 200
        token_type:
          $ref: '#/components/schemas/TokenTypeEnum'
        member:
          type: string
          format: email
          readOnly: true
        masked:
          type: string
          readOnly: true
        active_balance:
          type: boolean
          description: Weither to use the balance field or not.
        balance:
          type: string
          readOnly: true
        expire_time:
          type:
          - string
          - 'null'
          format: date-time
        revoked:
          type: boolean
          readOnly: true
        revoked_at:
          type:
          - string
          - 'null'
          format: date-time
      required:
      - balance
      - id
      - masked
      - member
      - name
      - revoked
    TokenTypeEnum:
      enum:
      - sandbox_api_token
      - api_token
      type: string
      description: '* `sandbox_api_token` - Sandbox

        * `api_token` - Back'
    PaginatedManagementKeyList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type:
          - string
          - 'null'
          format: uri
          example: http://api.example.org/accounts/?offset=400&limit=100
        previous:
          type:
          - string
          - 'null'
          format: uri
          example: http://api.example.org/accounts/?offset=200&limit=100
        results:
          type: array
          items:
            $ref: '#/components/schemas/ManagementKey'
    PatchedManagementKeyRequest:
      type: object
      description: 'An org''s inference key as the management plane exposes it. Never the secret or

        its hash — only non-secret metadata, addressed by the stable ``key_id`` (``id``).


        ``balance`` is the pending-adjusted LIVE sub-limit, not the raw settled column.

        For a credit-ledger-enrolled org the stored ``Token.balance`` lags by whatever the

        batched rollup has not settled, so a management admin must be shown available, not

        settled (the shipped display-vs-accounting doctrine, mirrored from

        ``utils/check_credits.py`` and ``manage_user_account_serializers``). The un-settled

        deltas (≤ 0, so they ADD) are batch-fetched once per page by the view and passed in

        ``context["pending"]``; a non-ledger org simply has none, so the add is a no-op.


        ``id`` is null for an un-migrated legacy key (one still stored as a JWT, no

        ``key_id`` yet); such a key is listed but not addressable via ``/keys/{id}`` until

        it is regenerated onto the hashed scheme.'
      properties:
        name:
          type: string
          minLength: 1
          description: The token name
          maxLength: 200
        token_type:
          $ref: '#/components/schemas/TokenTypeEnum'
        active_balance:
          type: boolean
          description: Weither to use the balance field or not.
        expire_time:
          type:
          - string
          - 'null'
          format: date-time
        revoked_at:
          type:
          - string
          - 'null'
          format: date-time
    ManagementKeyRequest:
      type: object
      description: 'An org''s inference key as the management plane exposes it. Never the secret or

        its hash — only non-secret metadata, addressed by the stable ``key_id`` (``id``).


        ``balance`` is the pending-adjusted LIVE sub-limit, not the raw settled column.

        For a credit-ledger-enrolled org the stored ``Token.balance`` lags by whatever the

        batched rollup has not settled, so a management admin must be shown available, not

        settled (the shipped display-vs-accounting doctrine, mirrored from

        ``utils/check_credits.py`` and ``manage_user_account_serializers``). The un-settled

        deltas (≤ 0, so they ADD) are batch-fetched once per page by the view and passed in

        ``context["pending"]``; a non-ledger org simply has none, so the add is a no-op.


        ``id`` is null for an un-migrated legacy key (one still stored as a JWT, no

        ``key_id`` yet); such a key is listed but not addressable via ``/keys/{id}`` until

        it is regenerated onto the hashed scheme.'
      properties:
        name:
          type: string
          minLength: 1
          description: The token name
          maxLength: 200
        token_type:
          $ref: '#/components/schemas/TokenTypeEnum'
        active_balance:
          type: boolean
          description: Weither to use the balance field or not.
        expire_time:
          type:
          - string
          - 'null'
          format: date-time
        revoked_at:
          type:
          - string
          - 'null'
          format: date-time
      required:
      - name