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

# Batch Progress and Results

> Company-scoped job progress. Origination jobs return ordered per-row results and failures; customer-create jobs return failures with results empty. Partial while running. completed can include failed rows, so always inspect failed and the row outcomes.

Use the `jobId` or `Location` returned by [batch enrollment](/api-reference/origination/batch).
Authenticate with the company key used for submission. Another company's job
returns `404`.

`202` acceptance does not mean processing is complete. While a job is running,
`results` contains only finished origination rows, ordered by the submitted
zero-based `index`. A `completed` job can include failures; inspect `failed`,
`failures`, and the per-row result before declaring the list successful.

For the existing customer-create batch workflow, `results` is empty; use
`failures` and the job counts. See [retry rules](/api-reference/origination/batch#retry-without-duplicate-enrollments)
before resubmitting an origination row.


## OpenAPI

````yaml GET /customers/batch/{jobId}
openapi: 3.1.0
info:
  title: Finosu API
  description: Finosu API
  license:
    name: MIT
  version: 1.0.0
servers:
  - url: https://api.finosu.com
security:
  - apiKeyAuth: []
paths:
  /customers/batch/{jobId}:
    get:
      summary: Batch Progress and Results
      description: >-
        Company-scoped job progress. Origination jobs return ordered per-row
        results and failures; customer-create jobs return failures with results
        empty. Partial while running. completed can include failed rows, so
        always inspect failed and the row outcomes.
      parameters:
        - name: jobId
          in: path
          description: Job ID returned by POST /customers/batch
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: Batch job status
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CustomerBatchStatusResponse'
        '400':
          description: Job ID is not a valid UUID
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: No customer batch job with that ID for the authenticated company
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    CustomerBatchStatusResponse:
      type: object
      properties:
        jobId:
          type: string
          format: uuid
        status:
          type: string
          enum:
            - pending
            - processing
            - completed
            - failed
            - cancelled
          description: >-
            completed still allows individual row failures — check failures.
            failed means the job hit a fatal error.
        totalCustomers:
          type: integer
          description: Customers submitted in the batch
        processed:
          type: integer
          description: Customers successfully processed
        failed:
          type: integer
          description: Customers that failed
        progressPercentage:
          type: number
          format: float
        createdAt:
          type: string
          format: date-time
        processingStartedAt:
          type:
            - string
            - 'null'
          format: date-time
        processingCompletedAt:
          type:
            - string
            - 'null'
          format: date-time
        errorMessage:
          type:
            - string
            - 'null'
          description: Job-level error. Null unless status is failed.
        failures:
          type: array
          description: >-
            Every row that could not be created, sorted by submitted index and
            never truncated. Partial while status is processing; final once
            status is completed or failed. Empty for jobs that ran before August
            2026.
          items:
            $ref: '#/components/schemas/CustomerBatchFailure'
        results:
          type: array
          items:
            $ref: '#/components/schemas/OriginationBatchResult'
          description: >-
            Origination row outcomes in original zero-based index order. Partial
            until terminal; empty for legacy customer-create batches.
    Error:
      required:
        - error
        - message
      type: object
      properties:
        error:
          type: integer
          format: int32
        message:
          type: string
    CustomerBatchFailure:
      type: object
      description: >-
        A single customer that could not be created. Successful rows are not
        enumerated.
      properties:
        index:
          type: integer
          description: >-
            0-based position of the row in the customers array you submitted,
            not within a server-side batch. -1 if the position could not be
            determined
          example: 4
        customerId:
          type: string
          description: External customer reference ID, as submitted
          example: CUST127
        message:
          type: string
          description: >-
            Why the row was rejected, prefixed with the status code the
            equivalent single POST /customers call would have returned
          example: '400: Missing required fields: phoneNumber'
    OriginationBatchResult:
      properties:
        index:
          title: Index
          type: integer
        customerId:
          title: Customerid
          type: string
        loanId:
          anyOf:
            - type: string
            - type: 'null'
          default: null
          title: Loanid
        status:
          enum:
            - scheduled
            - already_scheduled
            - failed
          title: Status
          type: string
        replayed:
          default: false
          title: Replayed
          type: boolean
        retryable:
          default: false
          title: Retryable
          type: boolean
        code:
          anyOf:
            - type: string
            - type: 'null'
          default: null
          title: Code
        message:
          anyOf:
            - type: string
            - type: 'null'
          default: null
          title: Message
        origination:
          anyOf:
            - $ref: '#/components/schemas/OriginationScheduleReceipt'
            - type: 'null'
          default: null
      required:
        - index
        - customerId
        - status
      title: OriginationBatchResult
      type: object
    OriginationScheduleReceipt:
      properties:
        id:
          format: uuid
          title: Id
          type: string
        status:
          enum:
            - scheduled
            - already_scheduled
          title: Status
          type: string
        customerId:
          title: Customerid
          type: string
        loanId:
          title: Loanid
          type: string
        scheduleId:
          format: uuid
          title: Scheduleid
          type: string
        scheduledCallId:
          format: uuid
          title: Scheduledcallid
          type: string
        scheduledTime:
          format: date-time
          title: Scheduledtime
          type: string
        scheduledCallCount:
          title: Scheduledcallcount
          type: integer
      required:
        - id
        - status
        - customerId
        - loanId
        - scheduleId
        - scheduledCallId
        - scheduledTime
        - scheduledCallCount
      title: OriginationScheduleReceipt
      type: object
      description: >-
        Snapshot recorded at enrollment. Replays return the saved receipt, not
        current eligibility or call progress.
  securitySchemes:
    apiKeyAuth:
      type: apiKey
      in: header
      name: X-API-Key

````