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

# Create a free API key

> No signup, no password, no email verification. The raw key is returned exactly once and cannot be recovered.

A key raises your rate limits and is required for long-polling (`wait`).

Limited to 3 keys per IP per 24 hours.



## OpenAPI

````yaml https://api.meowmail.in/api/v1/openapi.json post /api/v1/keys
openapi: 3.1.0
info:
  title: MeowMail API
  version: 1.0.0
  summary: Free disposable email API. Receive-only, no accounts, TTL-expiring inboxes.
  description: >-
    Create throwaway inboxes and read the mail they receive.


    Built for automated testing of signup and verification flows, and for
    privacy tooling.


    **Inboxes are public.** There is no authorization on inbox contents: anyone
    who knows the address can read it. Never use MeowMail for anything you would
    mind a stranger reading, and never for password resets on accounts that
    matter.


    **Mail is ephemeral.** Emails are permanently deleted roughly one hour after
    arrival.


    **Receive-only.** There is no send endpoint and never will be in this API
    version.
  termsOfService: https://docs.meowmail.in/fair-use
  contact:
    name: MeowMail
    url: https://docs.meowmail.in
  license:
    name: Free to use under the fair-use policy
    url: https://docs.meowmail.in/fair-use
servers:
  - url: https://api.meowmail.in
    description: Production
security:
  - bearerAuth: []
  - apiKeyHeader: []
  - {}
tags:
  - name: Meta
    description: Discovery, spec, and health
  - name: Keys
    description: Free self-serve API keys
  - name: Domains
    description: Domains that accept mail
  - name: Inboxes
    description: Create inboxes and read their mail
  - name: Emails
    description: Individual emails and attachments
paths:
  /api/v1/keys:
    post:
      tags:
        - Keys
      summary: Create a free API key
      description: >-
        No signup, no password, no email verification. The raw key is returned
        exactly once and cannot be recovered.


        A key raises your rate limits and is required for long-polling (`wait`).


        Limited to 3 keys per IP per 24 hours.
      operationId: createApiKey
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - label
              properties:
                label:
                  type: string
                  maxLength: 100
                  description: Short name for this integration. Helps us help you.
                  examples:
                    - acme-e2e-tests
                contact_email:
                  type: string
                  maxLength: 254
                  description: >-
                    Optional and unverified. Used only to warn you about
                    breaking changes. Not a real inbox we can mail today — we
                    have no outbound email.
      responses:
        '201':
          description: Key created
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      api_key:
                        type: string
                        examples:
                          - mm_kQ8fT2xLp0aZ7nVc4WmJhRb1
                      key_prefix:
                        type: string
                      label:
                        type: string
                      tier:
                        type: string
                        examples:
                          - free
                      limits:
                        $ref: '#/components/schemas/Limits'
                      created_at:
                        type: string
                        format: date-time
                      warning:
                        type: string
        '400':
          $ref: '#/components/responses/BadRequest'
        '429':
          $ref: '#/components/responses/RateLimited'
      security:
        - {}
components:
  schemas:
    Limits:
      type: object
      properties:
        requests_per_minute:
          type: integer
        requests_per_day:
          type: integer
        concurrent_waits:
          type: integer
          description: Simultaneous long-poll requests allowed. 0 for anonymous callers.
    Error:
      type: object
      properties:
        error:
          type: object
          properties:
            type:
              type: string
              enum:
                - invalid_request
                - unauthorized
                - key_required
                - not_found
                - rate_limited
                - quota_exceeded
                - too_many_waiters
                - internal_error
              description: Stable machine-readable code. Branch on this, not on `message`.
            message:
              type: string
              description: Human-readable. May be reworded at any time.
            docs:
              type: string
  responses:
    BadRequest:
      description: Malformed request
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    RateLimited:
      description: >-
        Rate limit or daily quota exceeded, or too many long-polls already in
        flight for this key. Honour `retry-after`.
      headers:
        retry-after:
          schema:
            type: integer
          description: Seconds to wait.
        ratelimit-limit:
          schema:
            type: integer
        ratelimit-remaining:
          schema:
            type: integer
        ratelimit-reset:
          schema:
            type: integer
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: '`Authorization: Bearer mm_...`. Omit entirely to use the anonymous tier.'
    apiKeyHeader:
      type: apiKey
      in: header
      name: X-API-Key
      description: Alternative to the Authorization header.

````