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

# Create Contact Export

> Queue a full filtered CSV export. Requires audience:read and brand ownership. Returns 202 only after enqueue. Poll exact job for download URL; no email is sent by this API. Idempotency-Key replay uses a stable queue job ID and rejects different request bodies. Jobs retained up to seven days. Filters use tag IDs. Export does not synchronize external services.



## OpenAPI

````yaml /api-reference/openapi.json post /v1/contacts/exports
openapi: 3.1.0
info:
  title: Migma.ai API (v1)
  description: >-
    API for managing brands, contacts, email generation, sending, and
    integrations. API request budgets are plan-based and shared across an
    account's API keys per route group. Sending request allowances support the
    account's recipients/second rate; recipient throughput and daily/monthly
    email quotas remain separate. See
    https://docs.migma.ai/api-reference/introduction#rate-limiting for limits,
    response headers, and retry behavior.
  license:
    name: MIT
  version: 1.0.0
servers:
  - url: https://api.migma.ai
    description: Production
security:
  - apiKeyAuth: []
tags:
  - name: Projects/Brands
    description: Manage projects (brands) and import from websites
  - name: Contacts
    description: Manage your contacts, segments, tags, and topics
  - name: Segments
    description: Create and manage dynamic contact segments
  - name: Tags
    description: Organize contacts with tags
  - name: Topics
    description: Manage subscription topics and preferences
  - name: Emails
    description: Generate, send, and export emails
  - name: Email Validation
    description: Validate email content for compatibility and deliverability
  - name: Email Previews
    description: Preview emails across devices and email clients
  - name: Domains
    description: Manage sending domains and verification
  - name: Webhooks
    description: Manage webhook endpoints for real-time event notifications
  - name: Events
    description: Record customer events and conversions
  - name: Integrations
    description: Third-party platform integrations
  - name: Campaigns
    description: Create, schedule, send, and manage email campaigns
  - name: Billing
    description: View your plan and credits and create billing links
  - name: Project Editing
    description: Edit project assets, logos, images, and knowledge base entries
paths:
  /v1/contacts/exports:
    post:
      tags:
        - Contacts
      summary: Create Contact Export
      description: >-
        Queue a full filtered CSV export. Requires audience:read and brand
        ownership. Returns 202 only after enqueue. Poll exact job for download
        URL; no email is sent by this API. Idempotency-Key replay uses a stable
        queue job ID and rejects different request bodies. Jobs retained up to
        seven days. Filters use tag IDs. Export does not synchronize external
        services.
      operationId: CreateContactExport
      parameters:
        - name: Idempotency-Key
          in: header
          required: false
          schema:
            type: string
            minLength: 1
            maxLength: 100
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateContactExportRequest'
            example:
              projectId: aaaaaaaaaaaaaaaaaaaaaaaa
              filters:
                status: unsubscribed
      responses:
        '202':
          description: Export queued (or existing replay job returned)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiResponseContactExportStatus'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          description: Replay key already used for different body
        '503':
          description: Queue temporarily unavailable
components:
  schemas:
    CreateContactExportRequest:
      type: object
      additionalProperties: false
      required:
        - projectId
      properties:
        projectId:
          type: string
          pattern: ^[a-fA-F0-9]{24}$
        segmentId:
          type: string
          pattern: ^[a-fA-F0-9]{24}$
        filters:
          allOf:
            - $ref: '#/components/schemas/AudienceFilters'
            - type: object
              properties:
                search:
                  type: string
                  maxLength: 200
    ApiResponseContactExportStatus:
      allOf:
        - $ref: '#/components/schemas/ApiResponse'
        - type: object
          properties:
            data:
              $ref: '#/components/schemas/ContactExportStatus'
    AudienceFilters:
      type: object
      description: >-
        Each group combines its conditions and child groups using match: all
        (AND) by default, or any (OR). Values within one condition keep their
        existing semantics. At most 3 nested group levels below the root (root
        depth 0), 10 child groups per group, and 50 conditions across the entire
        tree. Each nonempty tags or excludeTags array, status, validationStatus,
        nonempty customFields key, fields entry, or activity entry counts as one
        condition; group containers do not count. Nested groups must contain a
        condition or a nonempty child group; the root may be empty.
        Campaign-specific activity requires all in its own group and every
        ancestor, but an any sibling is allowed. Send eligibility and project
        scope always apply outside these conditions.
      properties:
        match:
          type: string
          enum:
            - all
            - any
          default: all
        groups:
          type: array
          maxItems: 10
          description: >-
            Child condition groups, combined with this group's conditions using
            its match mode. At most 3 levels below root. Each child must be
            nonempty.
          items:
            $ref: '#/components/schemas/AudienceFilters'
        tags:
          type: array
          items:
            type: string
        excludeTags:
          type: array
          items:
            type: string
        status:
          type: string
          enum:
            - subscribed
            - unsubscribed
            - non-subscribed
            - bounced
        validationStatus:
          type: string
          enum:
            - valid
            - invalid
            - risky
            - unknown
        customFields:
          type: object
          additionalProperties:
            type: array
            items:
              type: string
        fields:
          type: array
          maxItems: 10
          items:
            type: object
            properties:
              key:
                type: string
                minLength: 1
                maxLength: 100
              mode:
                type: string
                enum:
                  - is
                  - is_not
                  - starts_with
                  - ends_with
                  - contains
                  - not_contains
                  - date_after
                  - date_before
                  - date_on
                  - date_between
                  - number_gt
                  - number_gte
                  - number_lt
                  - number_lte
                  - number_between
                default: is
              values:
                type: array
                minItems: 1
                maxItems: 50
                items:
                  type: string
                  minLength: 1
                  maxLength: 200
            required:
              - key
              - values
        activity:
          type: array
          items:
            type: object
            properties:
              action:
                type: string
                enum:
                  - sent
                  - opened
                  - clicked
              channel:
                type: string
                enum:
                  - email
                description: Email is the only supported activity channel today.
              mode:
                type: string
                enum:
                  - within
                  - before
                  - never
                  - between
                description: between is reserved and currently rejected.
              unit:
                type: string
                enum:
                  - hours
                  - days
              amount:
                type: integer
                minimum: 1
                maximum: 8760
                description: 'Required for within/before. days: 1-365, hours: 1-8760.'
              from:
                type: string
                format: date-time
              to:
                type: string
                format: date-time
              campaignId:
                type: string
            required:
              - action
              - mode
    ApiResponse:
      type: object
      properties:
        success:
          type: boolean
        data:
          nullable: true
        error:
          type: string
          nullable: true
      required:
        - success
    ContactExportStatus:
      type: object
      required:
        - jobId
        - projectId
        - status
        - contactCount
        - fileName
        - createdAt
        - completedAt
      properties:
        jobId:
          type: string
          pattern: ^[a-fA-F0-9]{24}$
        projectId:
          type: string
          pattern: ^[a-fA-F0-9]{24}$
        status:
          type: string
          enum:
            - pending
            - processing
            - completed
            - failed
        contactCount:
          type: integer
          minimum: 0
          description: Estimated count until completed; actual exported rows on completion.
        fileName:
          type: string
        createdAt:
          type: string
          format: date-time
        completedAt:
          type: string
          format: date-time
          nullable: true
        downloadUrl:
          type: string
          format: uri
          description: Private signed URL present only when completed; expires in one hour.
        downloadExpiresAt:
          type: string
          format: date-time
        error:
          type: string
    ApiError:
      type: object
      properties:
        success:
          type: boolean
          default: false
        error:
          type: string
        code:
          type: string
          description: >-
            Machine-readable error code (e.g., IDEMPOTENCY_CONFLICT,
            DOMAIN_CLAIMABLE).
        data:
          type: object
          description: >-
            Additional structured context for the error, such as the affected
            domain.
          additionalProperties: true
      required:
        - success
        - error
  responses:
    BadRequest:
      description: Bad request
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiError'
    Unauthorized:
      description: Unauthorized
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiError'
    Forbidden:
      description: Forbidden - Missing required permissions or access denied
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiError'
    NotFound:
      description: Resource not found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiError'
  securitySchemes:
    apiKeyAuth:
      type: apiKey
      in: header
      name: Authorization
      description: >-
        API key authentication. Use 'Authorization: Bearer YOUR_API_KEY' where
        YOUR_API_KEY is obtained from the Migma dashboard under Settings →
        Developers → API Keys.

````