AgentMail Apps API

The apps API from AgentMail — 5 operation(s) for apps.

Operations 5

GET /v0/apps List Apps #
GET /v0/apps/{app_id} Get App #
GET /v0/apps/{app_id}/accounts List App Accounts #
POST /v0/apps/{app_id}/connect Connect App #

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/agentmail:agentmail-apps-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

agentmail-apps-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Reference Apps API
  version: 1.0.0
servers:
- url: https://api.agentmail.to
  description: prod
- url: https://x402.api.agentmail.to
  description: prod-x402
- url: https://mpp.api.agentmail.to
  description: prod-mpp
- url: https://api.agentmail.eu
  description: eu-prod
tags:
- name: Apps
paths:
  /v0/apps:
    get:
      operationId: apps_list
      summary: List Apps
      description: Lists apps, most popular first.
      tags:
      - Apps
      parameters:
      - name: limit
        in: query
        required: false
        schema:
          $ref: '#/components/schemas/Limit'
      - name: page_token
        in: query
        required: false
        schema:
          $ref: '#/components/schemas/PageToken'
      - name: category
        in: query
        description: Only apps in this category. A filtered page can hold fewer than `limit` apps while more remain, so page until `next_page_token` is absent. A `page_token` works only with the `category` it was returned for.
        required: false
        schema:
          $ref: '#/components/schemas/apps_AppCategory'
      responses:
        '200':
          description: Response with status 200
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_ListAppsResponse'
        '400':
          description: Error response with status 400
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
      security:
      - Bearer: []
  /v0/apps/search:
    get:
      operationId: apps_search
      summary: Search Apps
      description: Searches apps by name prefix.
      tags:
      - Apps
      parameters:
      - name: q
        in: query
        description: Name prefix to search for.
        required: true
        schema:
          type: string
      - name: limit
        in: query
        required: false
        schema:
          $ref: '#/components/schemas/Limit'
      responses:
        '200':
          description: Response with status 200
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_SearchAppsResponse'
        '400':
          description: Error response with status 400
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
      security:
      - Bearer: []
  /v0/apps/{app_id}:
    get:
      operationId: apps_get
      summary: Get App
      description: 'Gets one app by ID or slug. A catalog app returns its full entry.

        A registered app that the catalog does not list returns its ID and

        name only, without `updated_at`, so anyone holding its ID can still look

        it up; a slug finds catalog apps only. List Apps and Search Apps show

        catalog entries only.'
      tags:
      - Apps
      parameters:
      - name: app_id
        in: path
        description: ID of app, or the `slug` of an app in the catalog. A slug ignores case, spaces and punctuation.
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Response with status 200
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_App'
        '404':
          description: Error response with status 404
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
      - Bearer: []
  /v0/apps/{app_id}/accounts:
    get:
      operationId: apps_listAccounts
      summary: List App Accounts
      description: Lists accounts at one app, most recent sign-in first.
      tags:
      - Apps
      parameters:
      - name: app_id
        in: path
        description: ID of app, or the `slug` of an app in the catalog. A slug ignores case, spaces and punctuation.
        required: true
        schema:
          type: string
      - name: limit
        in: query
        required: false
        schema:
          $ref: '#/components/schemas/Limit'
      - name: page_token
        in: query
        required: false
        schema:
          $ref: '#/components/schemas/PageToken'
      responses:
        '200':
          description: Response with status 200
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_ListAppAccountsResponse'
        '400':
          description: Error response with status 400
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
      security:
      - Bearer: []
  /v0/apps/{app_id}/connect:
    post:
      operationId: apps_connect
      summary: Connect App
      description: 'Starts signing an inbox in to an app. Returns a single-use `magic_url`,

        valid for five minutes, to open in the client that will hold the sign-in;

        the client enrolls as the inbox and continues to the app.

        An app in the catalog can be named by its `slug`, as in

        `POST /v0/apps/firecrawl/connect`.

        A `404` names the missing resource: `App` or `Inbox`.

        A `403` `AppSignupLimitError` means the app accepts no more sign-ups from

        your organization; sign in with an inbox that already has an account there.'
      tags:
      - Apps
      parameters:
      - name: app_id
        in: path
        description: ID of app, or the `slug` of an app in the catalog. A slug ignores case, spaces and punctuation.
        required: true
        schema:
          type: string
      responses:
        '202':
          description: Response with status 202
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/apps_ConnectAccepted'
        '400':
          description: Error response with status 400
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
        '403':
          description: 'The app''s sign-up limit for your organization is reached, or the app has paused new

            sign-ups. `code` is `limit_exceeded` and `fix` says which. Inboxes that already have an

            account at the app can still sign in.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Error response with status 404
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/apps_ConnectAppBody'
      security:
      - Bearer: []
components:
  schemas:
    accounts_AccountStatus:
      type: string
      enum:
      - disabled
      description: '`disabled` refuses every new sign-in for the account until it is

        re-enabled. Access tokens already issued are not revoked.'
      title: AccountStatus
    OrganizationId:
      type: string
      description: ID of organization.
      title: OrganizationId
    accounts_Account:
      type: object
      properties:
        account_id:
          $ref: '#/components/schemas/accounts_AccountId'
        app_id:
          $ref: '#/components/schemas/apps_AppId'
        app_name:
          type: string
          description: Display name of app.
        inbox_id:
          $ref: '#/components/schemas/inboxes_InboxId'
        pod_id:
          $ref: '#/components/schemas/pods_PodId'
        organization_id:
          $ref: '#/components/schemas/OrganizationId'
        first_signed_in_at:
          type: string
          format: date-time
          description: Time of first sign-in at app.
        last_signed_in_at:
          type: string
          format: date-time
          description: Time of most recent sign-in at app.
        sign_in_count:
          type: integer
          description: Number of sign-ins at app.
        status:
          $ref: '#/components/schemas/accounts_AccountStatus'
          description: Present only while the account is disabled. Absent means the inbox may sign in.
        disabled_at:
          type: string
          format: date-time
          description: Time at which the account was disabled. Present only while `status` is `disabled`.
      required:
      - account_id
      - app_id
      - inbox_id
      - pod_id
      - organization_id
      - first_signed_in_at
      - last_signed_in_at
      - sign_in_count
      description: One inbox signed in at one app.
      title: Account
    Count:
      type: integer
      description: Number of items returned.
      title: Count
    ErrorCode:
      type: string
      description: Stable, machine-readable error code in snake_case (for example, not_found or missing_permission). Branch on this rather than the message text.
      title: ErrorCode
    inboxes_InboxId:
      type: string
      description: The ID of the inbox.
      title: InboxId
    apiKeys_AcceptDisclosure:
      type: boolean
      description: 'Accept the app''s disclosure on the agent''s behalf, skipping the

        first-use disclosure page. Requires `app_share_owner` when owner

        scopes are involved.'
      title: AcceptDisclosure
    ErrorResponse:
      type: object
      properties:
        name:
          $ref: '#/components/schemas/ErrorName'
        code:
          $ref: '#/components/schemas/ErrorCode'
        message:
          $ref: '#/components/schemas/ErrorMessage'
        fix:
          $ref: '#/components/schemas/ErrorFix'
        docs:
          $ref: '#/components/schemas/ErrorDocs'
      required:
      - name
      - message
      title: ErrorResponse
    ErrorFix:
      type: string
      description: The concrete next action that resolves the error.
      title: ErrorFix
    apps_ConnectAccepted:
      type: object
      properties:
        api_key_id:
          $ref: '#/components/schemas/apiKeys_ApiKeyId'
        magic_url:
          $ref: '#/components/schemas/apps_MagicUrl'
        expires_at:
          $ref: '#/components/schemas/apiKeys_ExpiresAt'
      required:
      - api_key_id
      - magic_url
      - expires_at
      description: The pending sign-in key the client will activate. Poll Get API Key with `api_key_id` for `status`.
      title: ConnectAccepted
    apps_ConnectAppBody:
      type: object
      properties:
        inbox_id:
          $ref: '#/components/schemas/apps_ConnectInboxId'
        accept_disclosure:
          $ref: '#/components/schemas/apiKeys_AcceptDisclosure'
      title: ConnectAppBody
    PageToken:
      type: string
      description: Page token for pagination.
      title: PageToken
    apps_AppCategory:
      type: string
      enum:
      - ai
      - search
      - scraping
      - browser
      - data
      - developer-tools
      - communication
      - productivity
      - payments
      - finance
      - commerce
      - marketing
      - analytics
      - security
      - infrastructure
      - other
      description: Kind of app.
      title: AppCategory
    Limit:
      type: integer
      description: Limit of number of items returned.
      title: Limit
    accounts_AccountId:
      type: string
      format: uuid
      description: ID of account.
      title: AccountId
    apps_ListAppAccountsResponse:
      type: object
      properties:
        app:
          $ref: '#/components/schemas/apps_App'
        count:
          $ref: '#/components/schemas/Count'
        limit:
          $ref: '#/components/schemas/Limit'
        next_page_token:
          $ref: '#/components/schemas/PageToken'
        accounts:
          type: array
          items:
            $ref: '#/components/schemas/accounts_Account'
      required:
      - count
      - limit
      - accounts
      title: ListAppAccountsResponse
    ErrorMessage:
      type: string
      description: Error message.
      title: ErrorMessage
    apps_App:
      type: object
      properties:
        app_id:
          $ref: '#/components/schemas/apps_AppId'
        slug:
          type: string
          description: Short name accepted in place of `app_id` by Get App, List App Accounts and Connect App. Set by AgentMail on apps in the catalog; renaming the app does not change it. Store `app_id`, the app's permanent ID.
        name:
          type: string
        updated_at:
          type: string
          format: date-time
          description: Time at which app was last updated.
        description:
          type: string
        logo_url:
          type: string
        terms_url:
          type: string
        privacy_url:
          type: string
        categories:
          type: array
          items:
            $ref: '#/components/schemas/apps_AppCategory'
          description: Kinds of app, up to 3. Omitted when the app sets none.
        owner_signup_limit:
          type: integer
          description: Maximum number of accounts your organization may sign up at this app. Omitted when the app sets no limit. 0 means the app has paused new sign-ups; existing accounts keep signing in.
      required:
      - app_id
      description: An app an inbox can sign in to.
      title: App
    ErrorDocs:
      type: string
      description: Link to the error reference entry for this code.
      title: ErrorDocs
    apps_MagicUrl:
      type: string
      description: Single-use URL to open in the client that will hold the key.
      title: MagicUrl
    apps_ListAppsResponse:
      type: object
      properties:
        count:
          $ref: '#/components/schemas/Count'
        limit:
          $ref: '#/components/schemas/Limit'
        next_page_token:
          $ref: '#/components/schemas/PageToken'
        apps:
          type: array
          items:
            $ref: '#/components/schemas/apps_App'
      required:
      - count
      - limit
      - apps
      title: ListAppsResponse
    apps_SearchAppsResponse:
      type: object
      properties:
        count:
          $ref: '#/components/schemas/Count'
        limit:
          $ref: '#/components/schemas/Limit'
        apps:
          type: array
          items:
            $ref: '#/components/schemas/apps_App'
      required:
      - count
      - limit
      - apps
      title: SearchAppsResponse
    apps_ConnectInboxId:
      $ref: '#/components/schemas/inboxes_InboxId'
      description: Inbox to sign in as. Required unless the API key is scoped to an inbox.
      title: ConnectInboxId
    apps_AppId:
      type: string
      format: uuid
      description: ID of app.
      title: AppId
    ErrorName:
      type: string
      description: Name of error.
      title: ErrorName
    apiKeys_ExpiresAt:
      type: string
      format: date-time
      description: Time at which api key expires. Omitted when it does not expire.
      title: ExpiresAt
    ValidationErrorResponse:
      type: object
      properties:
        name:
          $ref: '#/components/schemas/ErrorName'
        code:
          $ref: '#/components/schemas/ErrorCode'
        message:
          $ref: '#/components/schemas/ErrorMessage'
        errors:
          description: Validation errors. Each entry has a path and a message identifying the invalid field.
        fix:
          $ref: '#/components/schemas/ErrorFix'
        docs:
          $ref: '#/components/schemas/ErrorDocs'
      required:
      - name
      - errors
      title: ValidationErrorResponse
    apiKeys_ApiKeyId:
      type: string
      description: ID of api key.
      title: ApiKeyId
    pods_PodId:
      type: string
      description: ID of pod.
      title: PodId
  securitySchemes:
    Bearer:
      type: http
      scheme: bearer