Skip to content

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

Endpoints // Bulk

Read task results by page

New

Last verified

Available inAPIMCPSDKCLI

Read the results of a Bulk enrichment task 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/tasks/:taskId/rows

Credits

Free, also at a zero balance.

Each page counts toward the rate limits.

Introduction

The Read task results by page endpoint returns the results of a task 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 task to settle. While the task 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 task settles, so you can stop reading and pick up where you left off.

A cancelled task still finishes the items it had started, within the hour: a page waits for them the same way. While the task 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 task 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 task.

Authorization

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

Request

The route is GET /v2/tasks/:taskId/rows.

Path parameters

NameTypeRequiredDescription
taskIdstringYesThe id of the task (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 task status when the page was read, as in Get a task
itemsobject

One item of the task

Show child attributes
FieldTypeDescription
rownumberPosition of the item in the task, 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 task 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 task did not ask for the profile.
isFullProfilebooleantrue when person is the full profile
linkedinUrlstringWithout profile in the task: 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
400TASK_INVALID_INPUTcursor is not a position of this task, such as a cursor of another task
404TASK_NOT_FOUNDNo enrich_persons task with this id in your workspace, or one your key may not read. A List task or a Search export has no results here.
409TASK_RESULTS_FORMAT_UNAVAILABLEThe results of this task were stored before this endpoint existed: download them as CSV with Download task results
422VALIDATION_ERRORtaskId is not a UUID, limit is not an integer from 1 to 100, or cursor is longer than 512 characters
429TASK_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/tasks/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
  }
}