Skip to content

REST API Overview

The DataRecs REST API provides full programmatic access to the platform.

This page covers the essentials — authentication, validation, errors, and rate limiting. For every endpoint, request/response schema, and field:

  • Browse the API Reference right here in these docs, generated from the same committed OpenAPI spec our contract-testing harness checks against shipped core-api — it can’t silently drift out of sync.
  • Try it live at /docs — an interactive Swagger UI served directly by the API. Paste your API key in once (top right, “Authorize”) and execute real requests against your own tenant from the browser.
https://api.datarecs.io

The API is served at the root of your API host — there is no version path segment. If your tenant is pinned to a specific cell you may also use that cell’s host directly (for example https://api.<your-cell>.datarecs.io); both route to the same API.

All requests require a Bearer token in the Authorization header:

Terminal window
curl -H "Authorization: Bearer $DATARECS_API_KEY" \
https://api.datarecs.io/workspaces

API keys are scoped to your tenant and can be created in the Console or via Terraform. A request may carry either an Authorization: Bearer API key or the session cookie set by the Console — not both; sending both is rejected.

MethodPathDescription
GET/workspacesList workspaces
POST/workspacesCreate a workspace
GET/connectionsList connections
POST/connectionsCreate a connection
GET/jobsList reconciliation jobs
POST/jobsCreate a job
POST/jobs/{jobId}/runs/trigger?workspaceId={id}Trigger a job run
GET/jobs/{jobId}/runs?workspaceId={id}List run history for a job
GET/jobs/{jobId}/runs/{runId}?workspaceId={id}Get a single run

Most job- and run-scoped endpoints require a workspaceId query parameter that identifies the workspace the resource belongs to; the request is rejected with 400 if it is omitted where required.

Request bodies and query parameters are strictly validated. Unknown fields are rejected — a body or query string containing a parameter the endpoint does not declare returns 400 Bad Request. Send only the documented fields. Request bodies are also size-bounded (1 MiB by default); an oversized body is rejected.

Validation and other 4xx/5xx errors use the standard NestJS error shape:

{
"statusCode": 400,
"message": "Validation failed",
"error": "Bad Request"
}

message may be a string or an array of field-level validation messages. A few endpoints return a typed error body instead — see Limits & Quotas for the QUOTA_EXCEEDED (403) and RATE_LIMITED (429) bodies.

REST API requests are rate-limited per tenant, as a sustained requests-per-second budget that depends on your plan (Free 5 req/s, Standard 50 req/s). A few endpoints — notably triggering runs and the unauthenticated authentication endpoints — have their own tighter, plan-independent limits.

When you exceed a limit you receive 429 with a Retry-After header (seconds). See Limits & Quotas for the full behaviour and the response body.