Skip to content

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

Endpoints // Bulk

Read job results by page

New

Last verified

Available inAPIMCPSDKCLI

Read the results of a Bulk enrichment job a page at a time, in the order sent, from the start of the run, with a cursor that never skips an item, for free.

GET/v2/jobs/:jobId/rows

Credits

Free, also at a zero balance.

Each page counts toward the rate limits.

Introduction

The Read job results by page endpoint returns the results of a job you created as JSON, a page at a time, in the order you sent the items. Each item has the same fields as a line of the NDJSON results file: your own fields and externalId, what happened, what it cost, and the person found.

You can read it from the start of the run: there is no need to wait for the job to settle. While the job runs, a page stops at the first item not finished yet, so a cursor never skips an item and every item you read is final. When the next item is still running, the page is empty, nextCursor stays set and the response carries a Retry-After header: read the same cursor again after that many seconds. nextCursor is null once nothing more will come. A cursor keeps working after the job settles, so you can stop reading and pick up where you left off.

A cancelled job still finishes the items it had started, within the hour: a page waits for them the same way. While the job is paused, the page stays empty until it runs again.

This endpoint is free (0 credits), also at a zero balance. Each page counts toward your rate limits like any other call, and while the job runs, its items take up to 80% of your per-minute limit: read with limit=100, at the Retry-After pace. The TypeScript and Python SDKs and rc bulk rows --all wait out a 429 on their own. The key needs Person Enrichment or Contact, the permissions that read an enrich_persons job.

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/rows.

Path parameters

NameTypeRequiredDescription
jobIdstringYesThe id of the job (UUID)

Query Parameters

NameTypeRequiredDescription
cursorstringNonextCursor of the previous page, up to 512 characters. Without it, the page starts at the first item.
limitintegerNoItems per page, 1 to 100. Defaults to 100.

A page can hold fewer items than limit: it stops at the first item not finished, and before 2 MB of JSON.

Response structure

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

One page of results

Show child attributes
FieldTypeDescription
itemsarrayThe items of this page, in the order sent, see below
nextCursorstring | nullPass it as cursor to read on. null once nothing more will come.
statusstringThe job status when the page was read, as in Get a job
itemsobject

One item of the job

Show child attributes
FieldTypeDescription
rownumberPosition of the item in the job, from 1
inputobjectThe item as you sent it, externalId included, empty fields left out
statusstringWhat happened to the item, as the rc_status column: see Download job results
messagestringThe same in a sentence, with the credits the item cost
creditsConsumednumberCredits this item cost
personobject | nullThe person found, in the shape of Enrich profile. null when no one was found or the job did not ask for the profile.
isFullProfilebooleantrue when person is the full profile
linkedinUrlstringWithout profile in the job: the Social profile URL the finders searched from
contactEmailobjectWith contact_email: status (found, not_found, error or skipped, null when the finder did not run), value, and personalValue with emailType: "any"
contactPhoneobjectWith contact_phone: status (found, not_found, error or skipped, null when the finder did not run), value and type

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

Errors

StatusCodeMeaning
400JOB_INVALID_INPUTcursor is not a position of this job, such as a cursor of another job
404JOB_NOT_FOUNDNo enrich_persons job with this id in your workspace, or one your key may not read. A List job or a Search export has no results here.
409JOB_RESULTS_FORMAT_UNAVAILABLEThe results of this job were stored before this endpoint existed: download them as CSV with Download job results
422VALIDATION_ERRORjobId is not a UUID, limit is not an integer from 1 to 100, or cursor is longer than 512 characters
429JOB_ROWS_BUSYToo many pages are being read at once: wait error.details.retryAfter seconds, given in the Retry-After header too, then read again

A 429 can also come from your rate limits: see Rate limits.

Code examples

Code Examples

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

Example response

The example cuts person after its first fields: a page carries the whole profile.

Example Response

{
  "success": true,
  "data": {
    "items": [
      {
        "row": 1,
        "input": { "linkedinUrl": "https://www.social.com/in/janedoe", "externalId": "crm-001" },
        "status": "enriched",
        "message": "Profile and email found (4 credits)",
        "creditsConsumed": 4,
        "person": {
          "id": "prs_9f8e7d6c5b4a",
          "firstName": "Jane",
          "lastName": "Doe",
          "linkedinUrl": "https://www.social.com/in/janedoe",
          "headline": "VP of Marketing @ Acme Corp"
        },
        "isFullProfile": true,
        "contactEmail": { "status": "found", "value": "jane.doe@acme.com", "personalValue": null }
      },
      {
        "row": 2,
        "input": { "firstName": "John", "lastName": "Smith", "companyDomain": "acme.com", "externalId": "crm-002" },
        "status": "partial",
        "message": "Profile found, no email (2 credits)",
        "creditsConsumed": 2,
        "person": {
          "id": "prs_1a2b3c4d5e6f",
          "firstName": "John",
          "lastName": "Smith",
          "linkedinUrl": "https://www.social.com/in/john-smith",
          "headline": "Head of Sales at Acme"
        },
        "isFullProfile": true,
        "contactEmail": { "status": "not_found", "value": null, "personalValue": null }
      }
    ],
    "nextCursor": "eyJ2IjoxLCJyb3ciOjN9",
    "status": "running"
  },
  "error": null,
  "quotas": {
    "creditsConsumed": 0,
    "workspace": {
      "id": "ws_abc123",
      "credits": { "total": 10000, "used": 4531, "left": 5469 }
    }
  },
  "metadata": {
    "requestId": "41f7ce39-14eb-4f81-a499-bcbd97d437ed",
    "executionTimeMs": 42
  }
}