Skip to content

MaintenanceThe former company search endpoint goes into maintenance on November 9Migration guide

Endpoints // Bulk

Get a job

New

Last verified

Available inAPIMCPSDKCLI

Follow a job with long polling until it settles, with its progress, the credits it reserved and spent, and the link to its results, for free.

GET/v2/jobs/:jobId

Credits

Free, also at a zero balance, and never counted against the rate limits.

Introduction

The Get a job endpoint reads one job: it is the links.self path of a job you created. It says how far the job is, what it reserved and spent, and, once it is completed or cancelled, where to download its results. It reads any job of the job history too, such as a List import or a Search export started in the app.

Reading a job is free, also at a zero balance, and never counted against your rate limits, so you can follow a long job at the pace it asks for. A key reads the jobs its permissions allow: Person Enrichment or Contact for a Bulk enrichment job, Lists for a List job, Search for a Search export. A job the key may not read returns 404, as a job that does not exist.

Authorization

NameTypeRequiredDescription
apikeystringYesYour API key from the developer dashboard. Pass it via Authorization: Bearer YOUR_API_KEY header.

Request

The route is GET /v2/jobs/:jobId.

Path parameters

NameTypeRequiredDescription
jobIdstringYesThe id of the job (UUID)

Query Parameters

NameTypeRequiredDescription
waitintegerNoHold the request up to this many seconds, 0 to 20, while the job is queued or running. It answers as soon as the job settles or pauses, or with the job still running when the wait ends. Defaults to 0.

How to follow a job

Read the job while its status is queued or running, with wait=20 and an HTTP client timeout above it, for example 30 seconds. While the job moves, the response carries a Retry-After: 2 header: start two reads at least that far apart. A held read already lasts longer, so the next one starts right away.

statusWhat it means
queuedWaiting for its turn: read it again
runningItems are being looked up: read it again
pausedIt waits to be resumed: a member of your workspace paused it in the app, or a List import reached its maxCredits or your balance
completedEvery item was handled: download the results at links.results
cancelledStopped: the items not started were never charged. The results of the items done are at links.results, where an item still in flight reads running until it ends, within the hour
failedThe job could not run: error.code says why, and it has no results file

completed, cancelled and failed are final. The webhook of a job is sent when it reaches one of them.

Response structure

FieldTypeDescription
successbooleantrue if the request was processed successfully
errornullAlways null on success
dataobject

The job

Show child attributes
FieldTypeDescription
idstringJob id (UUID)
typestringenrich_persons (Bulk enrichment, or a file enriched in the app), list_import, list_enrich, list_search_import or search_export, see the job history
entitystringpersons or companies
statusstringqueued, running, paused, completed, cancelled or failed
sourcestring | nullWho started it: api (an API key), mcp (an AI assistant), ask or dashboard (a person in the app). null for a job older than this field.
namestringThe name given at creation, or the file name of a job started in the app
listIdstring | nullThe List a List job works on, null otherwise
estimatedSecondsRemainingnumber | nullSeconds left at the recent pace while the job runs, null when unknown or settled
errorobject | null{ "code": "..." } when the job failed, null otherwise
createdAtstringCreation date (ISO 8601)
startedAtstring | nullWhen it started running, null while queued
completedAtstring | nullWhen it settled, null while it moves
progressobject

How far the job is

Show child attributes
FieldTypeDescription
totalnumberItems in the job, duplicates included
processednumberItems done
succeedednumberItems that found at least part of what was asked
failednumberItems that found nothing, or could not be looked up
skippednumberItems not run: a duplicate, no usable field, an invalid profile URL, not enough credits, or cancelled
remainingnumberItems left to do
creditsobject

What the job reserved and spent

Show child attributes
FieldTypeDescription
estimatednumberCredits reserved when the job was created, 0 for a job that reserves nothing up front, such as a List import
usednumber | nullCredits spent. A List import counts them as it goes; any other job reads null until it has settled them, then gives back the rest of estimated.
linksobject

Where to go next

Show child attributes
FieldTypeDescription
selfstringPath that reads this job
resultsstring | nullPath of the results file, CSV or NDJSON, set once an enrich_persons job is completed or cancelled. See Download job results. To read the results while the job runs, see Read job results by page.
operationstring | nullThe List operation a List job runs as, null for other jobs

quotas and metadata are the blocks of every V2 response: see Usage.

Errors

StatusCodeMeaning
404JOB_NOT_FOUNDNo job with this id in your workspace, or one your key may not read
422VALIDATION_ERRORjobId is not a UUID, or wait is not an integer from 0 to 20

Code examples

Code Examples

curl "https://api.reversecontact.com/v2/jobs/7b1e4c2a-5d3f-4e8b-9a6c-1f2d3e4b5a60?wait=20" \
  -H "Authorization: Bearer YOUR_API_KEY"

Example response

Example Response

{
  "success": true,
  "data": {
    "id": "7b1e4c2a-5d3f-4e8b-9a6c-1f2d3e4b5a60",
    "type": "enrich_persons",
    "entity": "persons",
    "status": "completed",
    "source": "api",
    "name": "CRM export, November",
    "listId": null,
    "progress": {
      "total": 2,
      "processed": 2,
      "succeeded": 2,
      "failed": 0,
      "skipped": 0,
      "remaining": 0
    },
    "credits": { "estimated": 9, "used": 6 },
    "estimatedSecondsRemaining": null,
    "error": null,
    "createdAt": "2026-11-04T09:30:00.000Z",
    "startedAt": "2026-11-04T09:30:01.000Z",
    "completedAt": "2026-11-04T09:31:12.000Z",
    "links": {
      "self": "/v2/jobs/7b1e4c2a-5d3f-4e8b-9a6c-1f2d3e4b5a60",
      "results": "/v2/jobs/7b1e4c2a-5d3f-4e8b-9a6c-1f2d3e4b5a60/results",
      "operation": null
    }
  },
  "error": null,
  "quotas": {
    "creditsConsumed": 0,
    "workspace": {
      "id": "ws_abc123",
      "credits": { "total": 10000, "used": 4528, "left": 5472 }
    }
  },
  "metadata": {
    "requestId": "req_g1e2t3b4a5t6",
    "executionTimeMs": 31
  }
}