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

# Request a CSV export of your jobs

> Request a CSV export of the jobs matching a filter — the same filters as the jobs listing (`batch_id`, `status`, `record_set_id`). The flagship use is exporting the rejected rows of a bulk upload: every row of the file carries the record you originally uploaded alongside its outcome, so you can fix the offending column and re-upload the corrected file as a new record set.

**Generation is asynchronous.** This endpoint returns immediately with the export's id and a `pending` status — it never streams a file. Poll `GET /jobs/exports/{export_id}` until the status is `ready`, then use the short-lived `download_url` it returns.

**The file is deleted 7 days after the export is requested**, which is what `expires_at` reports. After that, request the export again to regenerate it from the underlying jobs, for as long as those jobs are inside your retention window.

At least one filter is required (422). One export at a time per account: while an export is pending or generating, a second request returns 409.



## OpenAPI

````yaml /openapi.json post /flows/jobs/export
openapi: 3.1.0
info:
  title: GetDialed API
  version: 0.1.0
servers:
  - url: https://api.getdialed.ai/v1
    description: Production
security: []
paths:
  /flows/jobs/export:
    post:
      tags:
        - jobs
      summary: Request a CSV export of your jobs
      description: >-
        Request a CSV export of the jobs matching a filter — the same filters as
        the jobs listing (`batch_id`, `status`, `record_set_id`). The flagship
        use is exporting the rejected rows of a bulk upload: every row of the
        file carries the record you originally uploaded alongside its outcome,
        so you can fix the offending column and re-upload the corrected file as
        a new record set.


        **Generation is asynchronous.** This endpoint returns immediately with
        the export's id and a `pending` status — it never streams a file. Poll
        `GET /jobs/exports/{export_id}` until the status is `ready`, then use
        the short-lived `download_url` it returns.


        **The file is deleted 7 days after the export is requested**, which is
        what `expires_at` reports. After that, request the export again to
        regenerate it from the underlying jobs, for as long as those jobs are
        inside your retention window.


        At least one filter is required (422). One export at a time per account:
        while an export is pending or generating, a second request returns 409.
      operationId: request_jobs_export_flows_jobs_export_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ExportRequest'
        required: true
      responses:
        '202':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ExportResponse'
        '401':
          description: Missing or invalid authentication
          content:
            application/json:
              example:
                detail: Authentication required
        '409':
          description: >-
            This account already has an export pending or generating — one at a
            time
          content:
            application/json:
              example:
                detail: >-
                  An export is already being generated for this account. Wait
                  for it to finish, then request the next one.
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
        '429':
          description: Rate limit exceeded — retry after the Retry-After header
          headers:
            Retry-After:
              description: Seconds to wait before retrying
              schema:
                type: integer
          content:
            application/json:
              example:
                detail: 'Rate limit exceeded: 100 per 1 minute'
        '503':
          description: >-
            The export surface is not configured on this deployment — the
            request fails closed and no export record is created
          content:
            application/json:
              example:
                detail: >-
                  CSV export is not available on this deployment. No export was
                  created — contact support rather than retrying.
      security:
        - APIKeyHeader: []
        - HTTPBearer: []
components:
  schemas:
    ExportRequest:
      properties:
        batch_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Batch Id
          description: Export only jobs belonging to this batch.
        status:
          anyOf:
            - type: string
              enum:
                - staged
                - queued
                - pending
                - started
                - needs_reconcile
                - completed
                - failed
                - cancelled
                - accepted
                - rejected
                - unprocessed
                - unresolved
            - type: 'null'
          title: Status
          description: >-
            Export only jobs in this status, such as the rejected rows of a bulk
            upload.
        record_set_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Record Set Id
          description: Export only jobs staged from this record set.
      type: object
      title: ExportRequest
      description: >-
        Request a CSV export of your jobs.


        Accepts the same filters as the jobs listing. The flagship use is
        exporting

        the rejected rows of one batch: filter by `batch_id` and the rejected

        `status`, and every row of the file carries the record you originally

        uploaded alongside its outcome, so you can correct the offending column
        and

        re-upload the file as a new record set.


        Generation is asynchronous. The response comes back immediately with the

        export's id and a `pending` status; poll the export to find out when the
        file

        is ready, then fetch its download URL.


        At least one filter is required. An export with no filters would mean
        "every

        job in the account", which is not a report — scope it to the batch,
        status or

        record set you actually want.
      example:
        batch_id: batch_55667788
        status: rejected
    ExportResponse:
      properties:
        id:
          type: string
          title: Id
          description: Identifier of this export.
        status:
          type: string
          enum:
            - pending
            - running
            - ready
            - failed
            - expired
          title: Status
          description: >-
            Lifecycle state: pending, running, ready, failed, or expired once
            the file has passed its deletion deadline.
        row_count:
          anyOf:
            - type: integer
            - type: 'null'
          title: Row Count
          description: >-
            Number of rows in the generated file. Null until the export is
            ready.
        error_reason:
          anyOf:
            - type: string
            - type: 'null'
          title: Error Reason
          description: >-
            Why a failed export could not be produced: row_cap_exceeded when the
            filters matched more rows than one export may contain,
            source_unavailable when the records were no longer retained, or
            generation_failed. Null unless the export failed.
        created_at:
          type: string
          format: date-time
          title: Created At
          description: When the export was requested.
        expires_at:
          type: string
          format: date-time
          title: Expires At
          description: >-
            When the generated file is deleted — 7 days after the export was
            requested.
        download_url:
          anyOf:
            - type: string
            - type: 'null'
          title: Download Url
          description: >-
            Short-lived signed download URL, present once the export is ready.
            Re-read the export to get a fresh one.
        download_url_expires_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Download Url Expires At
          description: >-
            When this download URL stops working. The export itself lives until
            expires_at.
      type: object
      required:
        - id
        - status
        - created_at
        - expires_at
      title: ExportResponse
      description: >-
        An export and, once it is ready, how to download it.


        `status` moves from `pending` to `running` while the file is generated,
        then

        to `ready` — or to `failed` if the export could not be produced, in
        which

        case `error_reason` says why. `expired` means the file has passed its

        deletion deadline and is gone.


        `download_url` is a short-lived signed URL that appears once the export
        is

        ready. It expires quickly by design and is re-fetchable: read the export

        again whenever you need a fresh URL. The file itself is deleted 7 days
        after

        the export was created; after that, request the export again to
        regenerate it

        from the underlying jobs, for as long as those jobs are inside your
        retention

        window.
      example:
        created_at: '2026-08-11T12:00:00Z'
        download_url: https://example-bucket.s3.amazonaws.com/...
        download_url_expires_at: '2026-08-11T12:15:00Z'
        expires_at: '2026-08-18T12:00:00Z'
        id: exp_0123456789abcdef
        row_count: 1284
        status: ready
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
        input:
          title: Input
        ctx:
          type: object
          title: Context
      type: object
      required:
        - loc
        - msg
        - type
      title: ValidationError
  securitySchemes:
    APIKeyHeader:
      type: apiKey
      in: header
      name: X-API-Key
    HTTPBearer:
      type: http
      scheme: bearer
      bearerFormat: JWT

````