Forward Email Aliases API

Domain alias management endpoints

Operations 6

POST /v1/domains/{domain_id}/aliases/{alias_id}/generate-password Generate an alias password #
GET /v1/domains/{domain_id}/aliases List domain aliases #
POST /v1/domains/{domain_id}/aliases Create new domain alias #
GET /v1/domains/{domain_id}/aliases/{alias_id} Retrieve domain alias #
PUT /v1/domains/{domain_id}/aliases/{alias_id} Update domain alias #
DELETE /v1/domains/{domain_id}/aliases/{alias_id} Delete domain alias #

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/forward-email:forward-email-aliases-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

forward-email-aliases-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Forward Email Aliases API
  description: 'Welcome to the comprehensive API documentation for Forward Email. This API allows you to manage email forwarding, domains, aliases, outbound emails, and more programmatically.


    ## Key Features

    * **Domain Management:** Create, retrieve, update, delete, and verify domains.

    * **Alias Management:** Manage email aliases, including creation, updates, and recipient management.

    * **Outbound SMTP:** Send emails via SMTP, manage limits, and track sent emails.

    * **Account & Logs:** Manage your account details and download activity logs.

    * **Security:** Encrypt TXT records and manage domain members/invites.

    * **CardDAV Contacts:** Full CRUD operations for contact management with vCard support.

    * **CalDAV Calendars:** Complete calendar management with timezone and color support.

    * **IMAP/POP3 Messages:** Comprehensive message management with advanced search capabilities.

    * **IMAP/POP3 Folders:** Full folder management including creation, renaming, and deletion.


    ## Authentication

    Most endpoints require authentication using your **API Key**. Provide the API Key as the `username` in the Basic Authentication header, leaving the password empty.


    ```http

    Authorization: Basic QVBJX1RPS0VOOg==

    ```

    (Replace `API_TOKEN` with your actual key before Base64 encoding)


    Endpoints related to **Alias Contacts, Calendars, Messages, and Folders** require a generated alias username and password for Basic Authentication.


    ## Errors

    The API uses standard HTTP status codes to indicate success or failure. Error responses include a JSON body with a `message` field detailing the error.


    | Status Code | Meaning |

    |-------------|---------------------|

    | 200 | OK |

    | 400 | Bad Request |

    | 401 | Unauthorized |

    | 403 | Forbidden |

    | 404 | Not Found |

    | 409 | Conflict |

    | 412 | Precondition Failed |

    | 429 | Too Many Requests |

    | 500 | Internal Server Error|

    | 501 | Not Implemented |

    | 502 | Bad Gateway |

    | 503 | Service Unavailable |

    | 504 | Gateway Time-out |


    *If you encounter a `5xx` error, please contact api@forwardemail.net.*


    ## Localization

    API responses are translated based on the user''s detected locale or the `Accept-Language` header. Over 25 languages are supported.


    ## Pagination

    Endpoints returning lists support pagination via query parameters.


    | Parameter | Type | Optional | Description | Default | Constraints |

    |--------------|---------|----------|-----------------------------------------------------------------------------|---------|--------------------|

    | `page` | Integer | Yes | Page number to retrieve. | 1 | `>= 1` |

    | `limit` | Integer | Yes | Number of results per page. | 25 | `>= 1`, `<= 100` |

    | `pagination` | Boolean | Yes | Opt-in to pagination behavior (required before Nov 1st, 2024 for some endpoints). | false | |


    **Pagination Headers:**

    * `X-Page-Count`: Total page count.

    * `X-Page-Current`: Current page number.

    * `X-Page-Size`: Number of items on the current page.

    * `X-Item-Count`: Total number of items across all pages.

    * `Link`: Navigation links (prev, next, first, last).


    **Example:**

    ```bash

    curl "https://api.forwardemail.net/v1/domains?page=2&limit=20&pagination=true" \

    -u API_TOKEN:

    ```


    ## Recommended Libraries

    * **Ruby:** Faraday

    * **Python:** requests

    * **Java:** OkHttp

    * **PHP:** Guzzle

    * **JavaScript/Node.js:** superagent (Maintained by Forward Email)

    * **Go:** `net/http`

    * **.NET:** RestSharp'
  version: 1.0.0
  contact:
    name: Forward Email Support
    url: https://forwardemail.net
    email: api@forwardemail.net
servers:
- url: https://api.forwardemail.net
  description: Forward Email API Server
tags:
- name: Aliases
  description: Domain alias management endpoints
paths:
  /v1/domains/{domain_id}/aliases/{alias_id}/generate-password:
    post:
      summary: Generate an alias password
      description: Generate a password for an alias. If `emailed_instructions` is not provided, the response will contain the generated username and password.
      tags:
      - Aliases
      parameters:
      - name: domain_id
        in: path
        required: true
        schema:
          type: string
        description: Fully qualified domain name (FQDN)
      - name: alias_id
        in: path
        required: true
        schema:
          type: string
        description: Unique identifier of the alias
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GenerateAliasPasswordInput'
      responses:
        '200':
          description: Alias credentials returned successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  username:
                    type: string
                    example: alias@yourdomain.com
                  password:
                    type: string
                    example: some-generated-password
                required:
                - username
                - password
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
      operationId: postV1DomainsByDomainIdAliasesByAliasIdGeneratePassword
      x-operation-id-source: derived
  /v1/domains/{domain_id}/aliases:
    parameters:
    - $ref: '#/components/parameters/domainId'
    get:
      summary: List domain aliases
      description: '>[!NOTE]

        >As of November 1st, 2024 the API endpoints for `List domains` and `List domain aliases` will default to `1000` max results per page. If you would like to opt-in to this behavior early, you can pass `?paginate=true` as an additional querystring parameter to the URL for the endpoint query. See Pagination for more insight.'
      tags:
      - Aliases
      security:
      - ApiKeyAuth: []
      parameters:
      - name: q
        in: query
        description: Search for aliases in a domain by name, label, or recipient (RegExp supported)
        required: false
        schema:
          type: string
      - name: name
        in: query
        description: Search for aliases in a domain by name (RegExp supported)
        required: false
        schema:
          type: string
      - name: recipient
        in: query
        description: Search for aliases in a domain by recipient (RegExp supported)
        required: false
        schema:
          type: string
      - name: sort
        in: query
        description: Sort by a specific field (prefix with a single hyphen - to sort in reverse). Defaults to created_at.
        required: false
        schema:
          type: string
      - $ref: '#/components/parameters/page'
      - $ref: '#/components/parameters/limit'
      responses:
        '200':
          description: List of domain aliases
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Alias'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
      operationId: getV1DomainsByDomainIdAliases
      x-operation-id-source: derived
    post:
      summary: Create new domain alias
      description: 'Create a new alias for a specific domain. Note: this endpoint does not accept `password` or `new_password` fields. To set or change alias credentials, use the "POST /v1/domains/:domain_id/aliases/:alias_id/generate-password" endpoint.'
      tags:
      - Aliases
      security:
      - ApiKeyAuth: []
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AliasInput'
      responses:
        '200':
          description: Domain alias created successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Alias'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/TooManyRequests'
      operationId: postV1DomainsByDomainIdAliases
      x-operation-id-source: derived
  /v1/domains/{domain_id}/aliases/{alias_id}:
    parameters:
    - $ref: '#/components/parameters/domainId'
    - $ref: '#/components/parameters/aliasId'
    get:
      summary: Retrieve domain alias
      description: Retrieve a specific alias for a domain.
      tags:
      - Aliases
      security:
      - ApiKeyAuth: []
      responses:
        '200':
          description: Domain alias retrieved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Alias'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
      operationId: getV1DomainsByDomainIdAliasesByAliasId
      x-operation-id-source: derived
    put:
      summary: Update domain alias
      description: 'Update a specific alias for a domain. Note: this endpoint does not accept `password` or `new_password` fields. To set or change alias credentials, use the "POST /v1/domains/:domain_id/aliases/:alias_id/generate-password" endpoint.'
      tags:
      - Aliases
      security:
      - ApiKeyAuth: []
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AliasUpdateInput'
      responses:
        '200':
          description: Domain alias updated successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Alias'
        '400':
          $ref: '#/components/responses/Error'
        '401':
          $ref: '#/components/responses/Error'
        '403':
          $ref: '#/components/responses/Error'
        '404':
          $ref: '#/components/responses/Error'
      operationId: putV1DomainsByDomainIdAliasesByAliasId
      x-operation-id-source: derived
    delete:
      summary: Delete domain alias
      description: Delete a specific alias for a domain.
      tags:
      - Aliases
      security:
      - ApiKeyAuth: []
      responses:
        '200':
          description: Domain alias deleted successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    example: Alias deleted successfully
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
      operationId: deleteV1DomainsByDomainIdAliasesByAliasId
      x-operation-id-source: derived
components:
  schemas:
    GenerateAliasPasswordInput:
      type: object
      properties:
        new_password:
          type: string
          description: Your custom new password to use for the alias. Custom mailbox passwords must be 128 characters or fewer, cannot start or end with whitespace, and cannot contain quotes or apostrophes.
        password:
          type: string
          description: Existing password for alias to change it without deleting mailbox storage
        is_override:
          type: boolean
          description: Override existing password and delete IMAP storage (use with caution)
        emailed_instructions:
          type: string
          format: email
          description: Email address to send alias password and setup instructions
    AliasInput:
      type: object
      properties:
        name:
          type: string
          description: Alias name (if not provided or if blank, then a random alias is generated)
        recipients:
          oneOf:
          - type: string
            description: Line-break/space/comma separated string of valid email addresses, FQDNs, IPs, or webhook URLs
          - type: array
            items:
              type: string
              format: email
            description: Array of valid recipients
          description: List of recipients. If not provided or empty, defaults to the requester's email
        description:
          type: string
          description: Alias description
        labels:
          oneOf:
          - type: string
            description: Line-break/space/comma separated string of labels
          - type: array
            items:
              type: string
            description: Array of labels
        has_recipient_verification:
          type: boolean
          description: Require recipients to click verification link (defaults to domain setting)
        is_enabled:
          type: boolean
          description: Whether to enable or disable this alias
        error_code_if_disabled:
          type: number
          enum:
          - 250
          - 421
          - 550
          description: Error code if alias is disabled. Defaults to 250
        has_imap:
          type: boolean
          description: Enable or disable IMAP storage for this alias
        has_pgp:
          type: boolean
          description: Enable or disable OpenPGP encryption for this alias
        public_key:
          type: string
          description: OpenPGP public key in ASCII Armor format
        has_smime:
          type: boolean
          description: Enable or disable S/MIME encryption for this alias
        smime_certificate:
          type: string
          description: S/MIME X.509 certificate in PEM format
        has_wkd_disabled:
          type: boolean
          description: Whether WKD (Web Key Directory) public key lookup is disabled for this alias
        max_quota:
          type: string
          description: Storage max quota (e.g. '1 GB')
        vacation_responder_is_enabled:
          type: boolean
          description: Enable or disable vacation responder
        vacation_responder_start_date:
          type: string
          description: Start date (e.g. 'YYYY-MM-DD') for vacation responder
        vacation_responder_end_date:
          type: string
          description: End date (e.g. 'YYYY-MM-DD') for vacation responder
        vacation_responder_subject:
          type: string
          description: Plaintext subject for vacation responder
        vacation_responder_message:
          type: string
          description: Plaintext message for vacation responder
        retention:
          type: integer
          minimum: 0
          maximum: 365
          description: Retention period in days (0-365) for Trash and Junk mailbox cleanup. Set to 0 to use automatic storage-based scaling.
        smtp_limit:
          type: integer
          minimum: 0
          default: 0
          description: Per-alias daily SMTP outbound message limit. Set to 0 to use the domain-level limit.
    Error:
      type: object
      required:
      - message
      properties:
        message:
          type: string
          description: Error message
    Alias:
      type: object
      properties:
        user:
          type: object
          properties:
            email:
              type: string
              format: email
            display_name:
              type: string
            id:
              type: string
          required:
          - email
          - display_name
          - id
        domain:
          type: object
          properties:
            name:
              type: string
            id:
              type: string
          required:
          - name
          - id
        name:
          type: string
        labels:
          type: array
          items:
            type: string
        is_enabled:
          type: boolean
        has_recipient_verification:
          type: boolean
        verified_recipients:
          type: array
          items:
            type: string
            format: email
        pending_recipients:
          type: array
          items:
            type: string
            format: email
        recipients:
          type: array
          items:
            type: string
            format: email
        id:
          type: string
        object:
          type: string
          enum:
          - alias
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
        storage_location:
          type: string
        has_imap:
          type: boolean
        retention:
          type: integer
          minimum: 0
          maximum: 365
          description: Retention period in days (0-365) for Trash and Junk mailbox cleanup. 0 means automatic storage-based scaling.
        smtp_limit:
          type: integer
          minimum: 0
          default: 0
          description: Per-alias daily SMTP outbound message limit. Set to 0 to use the domain-level limit.
        is_smtp_suspended:
          type: boolean
          default: false
          description: Whether this alias is currently suspended from outbound SMTP access.
          readOnly: true
        smtp_suspended_sent_at:
          type:
          - string
          - 'null'
          format: date-time
          description: The date and time when the alias was suspended from outbound SMTP.
          readOnly: true
      required:
      - user
      - domain
      - name
      - labels
      - is_enabled
      - has_recipient_verification
      - verified_recipients
      - pending_recipients
      - recipients
      - id
      - object
      - created_at
      - updated_at
      - storage_location
      - has_imap
      - retention
      example:
        user:
          email: test@test.com
          display_name: test@test.com
          id: 5efabd39xxxxxxx4512890b8
        domain:
          name: mailsire.com
          id: 5e3c0550xxxxxxx09b7ba023
        name: abc123
        labels: []
        is_enabled: true
        has_recipient_verification: false
        verified_recipients: []
        pending_recipients: []
        recipients:
        - abc@test1.com
        id: 62fa3dcxxxxxxx79dda83ff2
        object: alias
        created_at: '2022-08-15T12:36:26.593Z'
        updated_at: '2022-08-15T12:36:26.593Z'
        storage_location: storage_loc
        has_imap: false
        retention: 0
    AliasUpdateInput:
      type: object
      properties:
        name:
          type: string
          description: Alias name
        recipients:
          oneOf:
          - type: string
            description: Line-break/space/comma separated string of valid email addresses, FQDNs, IPs, or webhook URLs
          - type: array
            items:
              type: string
              format: email
            description: Array of valid recipients. Pass an empty array to remove all forwarding recipients (e.g. for IMAP-only aliases).
          description: If omitted, existing recipients are preserved. Pass an empty array to clear all forwarding recipients.
        description:
          type: string
          description: Alias description
        labels:
          oneOf:
          - type: string
            description: Line-break/space/comma separated string of labels
          - type: array
            items:
              type: string
            description: Array of labels
        has_recipient_verification:
          type: boolean
          description: Require recipients to click verification link (defaults to domain setting)
        is_enabled:
          type: boolean
          description: Enable or disable alias
        error_code_if_disabled:
          type: number
          enum:
          - 250
          - 421
          - 550
          description: Error code to use if alias is disabled (defaults to 250)
        has_imap:
          type: boolean
          description: Enable or disable IMAP storage
        has_pgp:
          type: boolean
          description: Enable or disable OpenPGP encryption
        public_key:
          type: string
          description: OpenPGP public key in ASCII Armor format
        has_smime:
          type: boolean
          description: Enable or disable S/MIME encryption
        smime_certificate:
          type: string
          description: S/MIME X.509 certificate in PEM format
        has_wkd_disabled:
          type: boolean
          description: Whether WKD (Web Key Directory) public key lookup is disabled for this alias
        max_quota:
          type: string
          description: Storage maximum quota (e.g., '1 GB')
        vacation_responder_is_enabled:
          type: boolean
          description: Enable or disable vacation responder
        vacation_responder_start_date:
          type: string
          description: Vacation responder start date (e.g. YYYY-MM-DD)
        vacation_responder_end_date:
          type: string
          description: Vacation responder end date (e.g. YYYY-MM-DD)
        vacation_responder_subject:
          type: string
          description: Plaintext subject of vacation responder
        vacation_responder_message:
          type: string
          description: Plaintext message of vacation responder
        retention:
          type: integer
          minimum: 0
          maximum: 365
          description: Retention period in days (0-365) for Trash and Junk mailbox cleanup. Set to 0 to use automatic storage-based scaling.
        smtp_limit:
          type: integer
          minimum: 0
          default: 0
          description: Per-alias daily SMTP outbound message limit. Set to 0 to use the domain-level limit.
  responses:
    NotFound:
      description: Not Found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Forbidden:
      description: Forbidden
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    BadRequest:
      description: Bad Request
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Error:
      description: Error response
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Unauthorized:
      description: Unauthorized
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    TooManyRequests:
      description: Too Many Requests
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  parameters:
    page:
      name: page
      in: query
      description: Page of results to return. If not specified, value will be 1. Must be a number greater than or equal to 1.
      schema:
        type: integer
        minimum: 1
        default: 1
    aliasId:
      name: alias_id
      in: path
      required: true
      description: Alias ID
      schema:
        type: string
    limit:
      name: limit
      in: query
      description: Number of results to return per page. Defaults to 25 if not specified. Must be a number greater than or equal to 1, and less than or equal to 100.
      schema:
        type: integer
        minimum: 1
        maximum: 100
        default: 25
    domainId:
      name: domain_id
      in: path
      required: true
      description: Domain ID
      schema:
        type: string
  securitySchemes:
    ApiKeyAuth:
      type: http
      scheme: basic
      description: '

        Use your API Key as the **username** for Basic Authentication. Leave the password field empty.


        **Example:**

        If your API Key is `YOUR_API_KEY`, the Base64 encoded value for the `Authorization` header would be `echo -n "YOUR_API_KEY:" | base64`.


        ```http

        Authorization: Basic WU9VUl9BUElfS0VZOg==

        ```

        '
    AliasAuth:
      type: http
      scheme: basic
      description: '

        Use the generated **alias username and password** for Basic Authentication. This applies to endpoints under:

        *   Alias Contacts (CardDAV)

        *   Alias Calendars (CalDAV)

        *   Alias Messages (IMAP/POP3)

        *   Alias Folders (IMAP/POP3)

        *   Alias Sieve Scripts


        **Example:**

        If the alias username is `alias@domain.com` and password is `GENERATED_PASSWORD`, the Base64 encoded value would be `echo -n "alias@domain.com:GENERATED_PASSWORD" | base64`.


        ```http

        Authorization: Basic YWxpYXNAZG9tYWluLmNvbTpHRU5FUkFURURfUEFTU1dPUkQ=

        ```

        '