---
title: "Read a List operation"
method: GET
path: "/v2/lists/{listId}/operations/{operationId}/progress"
tags: ["Lists"]
---

# Read a List operation

`GET /v2/lists/{listId}/operations/{operationId}/progress`

## Request

- Base URL: `https://api.reversecontact.com`
- URL: `https://api.reversecontact.com/v2/lists/{listId}/operations/{operationId}/progress`
- Auth: HTTP bearer

Reads an operation started by an import (its pollUrl). While clientAction is poll, read again no sooner than pollAfterSeconds; with wait=N (0 to 20) the request is held and answers as soon as the operation settles, pauses or stops, or still running when the wait ends. completed means the data can be read. When it stops (clientAction resume), stopReason and nextStep say what to do. With rows=true, also returns one page of per-line results (index in the request, externalId, outcome, memberId); pass rows.nextCursor back as cursor for the next page, with perPage from 1 to 1000 (default 200). Free, also at a zero balance, and never counted against rate limits. Credits: 0.

## Path parameters

- `listId` string, uuid, required: List id
- `operationId` string, required: Operation id (operationId of the acknowledgement)

## Query parameters

- `wait` integer: Hold the request up to this many seconds while it runs
- `rows` 'true' | 'false': Add per-line results
- `cursor` string: With rows=true: rows.nextCursor of the previous page of lines
- `perPage` integer: With rows=true: lines per page

## Response `200`

The operation

- object
  - `success` true, required
  - `data` object, required
    - `operationId` string, required: Operation id
    - `listId` string, uuid, required: List id
    - `kind` string: Operation kind
    - `status` 'queued' | 'running' | 'paused' | 'completed' | 'partial' | 'stopped_budget' | 'failed' | 'cancelled' | 'refused' | 'unknown', required
    - `clientAction` 'poll' | 'resume' | 'done' | 'reconcile', required: poll: read again after pollAfterSeconds. resume: read stopReason and nextStep, then resume. done: finished, the data can be read. reconcile: the outcome is ambiguous, never replay it.
    - `progress` object
      - `processed` integer: Lines processed
      - `total` integer: Lines in the operation
      - `succeeded` integer: Lines that resolved a member
      - `failed` integer: Lines that failed or were not found
      - `skipped` integer: Lines skipped
      - `remaining` integer: Lines left
      - `unknownCount` integer: Lines with an ambiguous outcome
    - `creditsConsumed` number: Credits charged so far
    - `creditsPending` number: Credits reserved by steps in flight
    - `creditsEstimated` number: Credits reserved when the operation was created: an import reserves nothing (0) and spends up to maxCredits
    - `maxCredits` number, nullable: Credit ceiling of the operation
    - `estimatedSeconds` integer, nullable: Advisory time left while it runs
    - `estimateBlockedUntil` string, date-time, nullable: When the daily extraction limit holds it: the next 00:00 UTC
    - `pollAfterSeconds` integer, required: Seconds to wait before reading again (0 once polling stops)
    - `pollUrl` string, nullable, required: Path that reads this operation
    - `stopReason` string, nullable: Why it stopped: balance, max_credits, paused_by_user, a limit, cancelled
    - `nextStep` unknown
    - `errorMessage` string, nullable: Failure message
    - `startedAt` string, date-time, nullable: Start date
    - `completedAt` string, date-time, nullable: End date, once the data can be read
    - `rows` object, nullable: With rows=true on an intake operation: one page of per-line results
      - `items` object[]
        - `index` integer, nullable, required: Position of the line in the request (0-based)
        - `rowNumber` integer, required: Line number in the operation (1-based)
        - `outcome` 'pending' | 'added' | 'already_present' | 'resolved' | 'not_found' | 'refused' | 'failed' | 'not_reached' | 'unknown', required
        - `externalId` string, nullable, required: Your identifier, as sent
        - `memberId` string, uuid, nullable, required: Member the line names
        - `errorCode` string, nullable: Why a line was refused or failed, or a requested family missed
        - `reason` string, nullable: Short reason
        - `signal` object: The identifiers sent
      - `nextCursor` string, nullable: Cursor of the next page of lines, null on the last one
  - `error` unknown, required
  - `quotas` V2Quotas, required
    - `creditsConsumed` number, required: Credits used for this request after pricing resolution
    - `workspace` object, required
      - `id` string, required: Workspace identifier
      - `credits` V2Credits, required
        - `total` number, required: Total credits in your plan
        - `used` number, required: Credits consumed so far
        - `left` number, required: Remaining credits
      - `hasUnlimitedCredits` boolean, required: Whether workspace credits are unlimited
      - `allowDailyOvercost` boolean, required: Whether the workspace may exceed its daily cap (Enterprise only)
      - `dailyLimit` V2LimitInfo
        - `limit` integer, required: Maximum allowed in the window
        - `used` integer, required: Amount used in the window
        - `left` integer, required: Remaining in the window
        - `nextReset` string, required: When the window resets (ISO 8601)
      - `minuteRateLimit` V2LimitInfo, required
        - `limit` integer, required: Maximum allowed in the window
        - `used` integer, required: Amount used in the window
        - `left` integer, required: Remaining in the window
        - `nextReset` string, required: When the window resets (ISO 8601)
    - `key` object, nullable, required
      - `id` string, required: API key identifier
      - `dailyLimit` V2LimitInfo
        - `limit` integer, required: Maximum allowed in the window
        - `used` integer, required: Amount used in the window
        - `left` integer, required: Remaining in the window
        - `nextReset` string, required: When the window resets (ISO 8601)
      - `minuteRateLimit` V2LimitInfo, required
        - `limit` integer, required: Maximum allowed in the window
        - `used` integer, required: Amount used in the window
        - `left` integer, required: Remaining in the window
        - `nextReset` string, required: When the window resets (ISO 8601)
      - `creditLimits` object, required: Credit limits set on this API key. Each is null when the key has no such limit.
        - `daily` V2KeyCreditLimit, required
          - `limit` number, required: Credits this key may spend in the period
          - `used` number, required: Credits this key spent in the period, this request included
          - `left` number, required: Credits this key may still spend in the period
          - `nextReset` string, nullable, required: When the period resets (ISO 8601): 00:00 UTC for the daily limit, the 1st of next month at 00:00 UTC for the monthly limit, null for the total limit
        - `monthly` V2KeyCreditLimit, required
          - `limit` number, required: Credits this key may spend in the period
          - `used` number, required: Credits this key spent in the period, this request included
          - `left` number, required: Credits this key may still spend in the period
          - `nextReset` string, nullable, required: When the period resets (ISO 8601): 00:00 UTC for the daily limit, the 1st of next month at 00:00 UTC for the monthly limit, null for the total limit
        - `total` V2KeyCreditLimit, required
          - `limit` number, required: Credits this key may spend in the period
          - `used` number, required: Credits this key spent in the period, this request included
          - `left` number, required: Credits this key may still spend in the period
          - `nextReset` string, nullable, required: When the period resets (ISO 8601): 00:00 UTC for the daily limit, the 1st of next month at 00:00 UTC for the monthly limit, null for the total limit
  - `metadata` V2Metadata, required
    - `requestId` string, required: Unique identifier for this request
    - `executionTimeMs` integer, required: Total execution time in milliseconds
    - `updatedAt` string: Last upstream update timestamp (ISO 8601). Present only when available.

## Other responses

- `400`: Invalid JSON body or endpoint-specific business validation
- `401`: Missing or invalid API key or OAuth access token
- `402`: No credits left. Purchase more to continue.
- `403`: Forbidden: the API key lacks permission for this endpoint, or reached its total credit limit (KEY_CREDIT_LIMIT_REACHED, no reset: raise or reset the limit)
- `404`: LIST_OPERATION_NOT_FOUND
- `422`: Schema or validation error, unresolved internal id, or disposable email domain
- `429`: Rate limit exceeded, or the API key reached its daily or monthly credit limit (KEY_CREDIT_LIMIT_REACHED). Wait error.details.retryAfter seconds, then retry. The response carries no quotas object.
- `451`: Data subject blocked. The profile has been removed per GDPR/CCPA data subject request.

---

[API](https://skmtc.dev/scrapin/apis/reverse-contact-api.md) - [All operations](https://skmtc.dev/scrapin/apis/reverse-contact-api/llms.txt) - [OpenAPI document](https://skmtc.dev/scrapin/apis/reverse-contact-api/revisions/7d02242af2a9?raw)
