Skip to main content
Execute a data endpoint. For providers which are executed synchronously (e.g. People Data Labs), they return the results immediately; for others (e.g. Apify), the server will return 202 with a run ID and processes the request in the background.

Request

Headers

Body

Example Request

Response

The response depends on the provider’s execution mode:
  • Sync providers return the completed result immediately — no polling needed. The HTTP status mirrors the provider’s HTTP status: 200 on success, 404/429/500 etc. when the provider returned that status (a provider-side 402 is surfaced as 502). A synchronous run that times out returns 408 (TIMED_OUT).
  • Async providers return 202 with a run ID. Poll GET /v1/runs/:runId for results.
  • A run rejected by a control gate returns 200 with status: "BLOCKED" plus reason and controls fields.

Completed (Sync)

The run completed immediately. Results are included in the response, and the HTTP status mirrors the provider’s status.

Example: Sync Success

Example: Sync Provider Error

The run completed, but the provider returned an error. Note status is still "COMPLETED" — the run lifecycle finished. The response’s HTTP status mirrors the provider’s status (here: 404 Not Found).

202 Accepted (Async)

The run has been created. Poll GET /v1/runs/:runId for results.

Example

Status vs Provider HTTP Status

Every completed run has two independent indicators:
  1. status — the run lifecycle. "COMPLETED" means the provider was called and responded. "FAILED" means an infrastructure error (our fault). "BLOCKED" means a control gate rejected the run before execution. "STOPPED" means the run was stopped by request. "TIMED_OUT" means the run exceeded its time budget.
  2. providerResponse.httpStatus — the provider’s HTTP response code. 200 = data returned. 404 = no match. 429 = rate limited. 500 = provider error.
A run with status: "COMPLETED" and providerResponse.httpStatus: 404 is normal — the run completed, the provider just found no data. Provider errors are not charged. See Status vs Provider HTTP Status for the full reference.

Polling for Results

For async runs (202 response), poll GET /v1/runs/:runId to check status and retrieve results. Most runs complete within 1–120 seconds. When polling, check two things:
  1. status — wait until a terminal status: "COMPLETED", "FAILED", "BLOCKED", "STOPPED", or "TIMED_OUT"
  2. providerResponse.httpStatus — once completed, check if the provider returned a success (2xx) or error (4xx/5xx)

Next Step

Use GET /v1/runs/:runId to retrieve run results.