> ## 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.

# Get one email with bodies and attachment metadata

> Bodies, headers, and attachment metadata for one email.

`html_body` is sanitized server-side but should still be rendered in a sandboxed iframe. `text_body` and `html_body` are each `null` when the message carried no such part — a message with only an HTML part is common, so always check both.

Returns 404 once the email expires, which is roughly an hour after it arrived.



## OpenAPI

````yaml https://api.meowmail.in/api/v1/openapi.json get /api/v1/emails/{id}
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/emails/{id}:
    get:
      tags:
        - Emails
      summary: Get one email with bodies and attachment metadata
      description: >-
        Bodies, headers, and attachment metadata for one email.


        `html_body` is sanitized server-side but should still be rendered in a
        sandboxed iframe. `text_body` and `html_body` are each `null` when the
        message carried no such part — a message with only an HTML part is
        common, so always check both.


        Returns 404 once the email expires, which is roughly an hour after it
        arrived.
      operationId: getEmail
      parameters:
        - $ref: '#/components/parameters/EmailId'
      responses:
        '200':
          description: Full email
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/EmailDetail'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
components:
  parameters:
    EmailId:
      name: id
      in: path
      required: true
      description: >-
        Email id (UUIDv7 — sorts chronologically, which is what makes the
        cursors work).
      schema:
        type: string
  schemas:
    EmailDetail:
      allOf:
        - $ref: '#/components/schemas/EmailSummary'
        - type: object
          properties:
            text_body:
              type:
                - string
                - 'null'
            html_body:
              type:
                - string
                - 'null'
              description: >-
                Scripts, event handlers, and embeddable tags are stripped
                server-side. Still render it in a sandboxed iframe — regex HTML
                filtering is defence in depth, not a guarantee.
            attachments:
              type: array
              items:
                $ref: '#/components/schemas/Attachment'
    EmailSummary:
      type: object
      properties:
        id:
          type: string
        address:
          type: string
        sender:
          type:
            - string
            - 'null'
          description: >-
            The From header as received. Unverified — no SPF/DKIM checks. Do not
            trust it.
        mailed_by:
          type:
            - string
            - 'null'
          description: Domain of the SMTP envelope sender.
        subject:
          type:
            - string
            - 'null'
        has_attachments:
          type: boolean
        received_at:
          type: string
          format: date-time
        expires_at:
          type: string
          format: date-time
    Attachment:
      type: object
      properties:
        id:
          type: string
        filename:
          type: string
        content_type:
          type:
            - string
            - 'null'
        size_bytes:
          type: integer
        download_url:
          type: string
    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:
    NotFound:
      description: No such resource. Most often the email expired.
      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.

````