For the complete documentation index, see llms.txt. This page is also available as Markdown.

Customer Data Intake

Register governed intake datasets, upload and download catalog files, refresh mapped Drive sources, and monitor durable dataset processing and update runs.

These endpoints manage the dataset intake catalog: registered dataset contracts, direct file uploads, files discovered by mapped intake sources, and dataset update runs. They require a workspace-scoped Platform bearer credential.

The separate upload-link system has been retired. New file integrations should use the authenticated dataset workflow described here.

The Developer Console's dataset-intake surface is feature-gated. API availability does not guarantee that the Intake tab is enabled for every production environment.

Files

List Files

Returns a paginated dataset-file catalog. Results can be sorted by ingestion time, filename, status, dataset, or size; filtered by status; searched by filename; and optionally include withdrawn document versions.

List Intake Files

get
Authorizations
AuthorizationstringRequired

API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.

Path parameters
workspace_idstring · uuidRequired
Query parameters
limitinteger · min: 1 · max: 200OptionalDefault: 50
continuation_tokenintegerOptionalDefault: 0
sort_bystring · max: 64OptionalDefault: -ingested_at
statusstring · enum · nullableOptionalPossible values:
searchstring · max: 200 · nullableOptional
include_withdrawnbooleanOptionalDefault: false
Responses
200

Successful Response

application/json
has_morebooleanRequired
continuation_tokeninteger · nullableOptional
totalinteger · nullableOptional
get/v1/{workspace_id}/intake/files
GET /v1/{workspace_id}/intake/files HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "items": [
    {
      "id": "123e4567-e89b-12d3-a456-426614174000",
      "filename": "text",
      "dataset": "text",
      "schema_version": "text",
      "status": "received",
      "error_reason": "text",
      "size_bytes": 1,
      "ingested_at": "text",
      "document_id": "123e4567-e89b-12d3-a456-426614174000",
      "version": 1,
      "source_type": "text",
      "source_file_id": "text",
      "source_folder_path": "text",
      "doc_metadata": {
        "ANY_ADDITIONAL_PROPERTY": "text"
      }
    }
  ],
  "has_more": true,
  "continuation_token": 1,
  "total": 1
}

The status vocabulary is received, scanned, processing, curated, rejected, failed, and held. Current upload paths commonly use:

Status
Meaning

received

Stored and waiting for, or eligible for, downstream processing

curated

Validation or configured processing completed successfully

rejected

The file did not satisfy the tabular contract

failed

Document extraction or another processing step failed

scanned, processing, and held are valid wire values, but they do not by themselves prove that malware scanning ran. Use error_reason for failure context and treat unknown future values defensively.

Upload File

Uploads one file as multipart/form-data to a registered dataset. The service enforces a 100 MB request cap.

max_size_mb is stored on the dataset contract and returned by the dataset list, but the current upload runtime does not enforce a lower per-dataset value. Enforce that value in the client if your workflow depends on it.

Before persistence, the service computes a SHA-256 hash and returns the existing file row for byte-identical content already present in the same workspace and dataset. The current upload path does not perform inline malware scanning; arrange a separate pre-submission control if your workflow requires a malware verdict.

Upload Intake File

post
Authorizations
AuthorizationstringRequired

API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.

Path parameters
workspace_idstring · uuidRequired
Body
datasetstring · min: 2 · max: 63RequiredPattern: ^[a-z0-9][a-z0-9_-]*[a-z0-9]$
filestringRequired
document_idstring · uuid · nullableOptional
doc_metadatastring · nullableOptional
Responses
201

Successful Response

application/json

A file in the Files list (intake-ui-mvp-design.md §5.1).

idstring · uuidRequired

file_id — used for download.

filenamestringRequired
datasetstringRequired

Schema slug (UI label "Schema").

schema_versionstring · nullableOptional

The contract version this file validated against (e.g. v1).

statusstring · enumRequiredPossible values:
error_reasonstring · nullableOptional

Null unless rejected/failed.

size_bytesintegerRequired
ingested_atstringRequired

ISO-8601 timestamp the file was received.

document_idstring · uuid · nullableOptional

The document this version belongs to (§5.9). Null for snapshot/CSV rows; set for documents — the console groups versions by it and the version chain.

versioninteger · nullableOptional

The file's version number (per-document for documents, per-dataset for snapshot). Lets the UI render a document's version history.

source_typestring · nullableOptional

Origin of the document this version belongs to — manual for console uploads, google_shared_drive for the Drive connector (V269). Null for snapshot/CSV rows.

source_file_idstring · nullableOptional

The source's stable external id (e.g. the Google Drive file id) for the document. Lets the console show provenance and confirm a re-synced file bumped the same document. Null for manual uploads and snapshot rows.

source_folder_pathstring · nullableOptional

Where the file lived within the mapped Drive folder tree (V279) — the relative path, folder names joined by / (e.g. clinical/notes); '' at the mapped root. Lets the console show the original folder structure. Null for manual uploads and snapshot rows.

post/v1/{workspace_id}/intake/files
POST /v1/{workspace_id}/intake/files HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: multipart/form-data
Accept: */*
Content-Length: 107

{
  "dataset": "text",
  "file": "text",
  "document_id": "123e4567-e89b-12d3-a456-426614174000",
  "doc_metadata": "text"
}
{
  "id": "123e4567-e89b-12d3-a456-426614174000",
  "filename": "text",
  "dataset": "text",
  "schema_version": "text",
  "status": "received",
  "error_reason": "text",
  "size_bytes": 1,
  "ingested_at": "text",
  "document_id": "123e4567-e89b-12d3-a456-426614174000",
  "version": 1,
  "source_type": "text",
  "source_file_id": "text",
  "source_folder_path": "text",
  "doc_metadata": {
    "ANY_ADDITIONAL_PROPERTY": "text"
  }
}

Upload behavior depends on the dataset mode:

  • Snapshot - The current processing format is CSV. Depending on workspace configuration, validation can complete synchronously (curated or rejected) or the file can enter asynchronous processing as received.

  • Document - The filename extension must be in the dataset's accepted set. Omit document_id to create a logical document, or pass an existing document ID to add a same-type version. Documents enter as received and require the extraction processor for a terminal verdict.

Common route errors include:

Status
Condition

413

File exceeds the global 100 MB cap

422

Missing dataset contract, invalid or empty filename, disallowed document type, invalid document version target

Tag a Document with Its Subject

A document upload can carry doc_metadata, a JSON-encoded form field of string tags that link the document to the subject it is about, for example {"patient_id": "synthetic-123"}. Send 1 to 32 tags. Keys are 1 to 64 characters of letters, digits, _, ., and -; values are 1 to 256 characters. Omit the field for no tags; an empty object is rejected.

  • Tags are set when the document is created and apply to every later version. Sending doc_metadata with an existing document_id returns 422, and so does sending it to a snapshot dataset.

  • Byte-identical content deduplicates onto an existing document only when its tags match exactly, so two subjects' identical files stay separate documents.

  • The Files list returns each document's tags in doc_metadata ({} when untagged, null for snapshot files). The upload response echoes the tags sent with that request, so read the Files list for the stored value.

Tags are caller-supplied data. They can hold identifiers about a person, so handle them like the document itself, and do not treat them as verified identity.

Download File

Downloads the original catalog file. The response includes Content-Disposition: attachment and Cache-Control: no-store; a file outside the workspace scope returns 404.

Download Intake File

get
Authorizations
AuthorizationstringRequired

API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.

Path parameters
workspace_idstring · uuidRequired
file_idstring · uuidRequired
Responses
200

Successful Response

application/json
anyOptional
get/v1/{workspace_id}/intake/files/{file_id}/download
GET /v1/{workspace_id}/intake/files/{file_id}/download HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*

No content

Dataset Contracts

List Datasets

Returns registered dataset contracts with their mode, representative file type, accepted document types, schema version, field count, and recorded max_size_mb value.

List Intake Datasets

get
Authorizations
AuthorizationstringRequired

API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.

Path parameters
workspace_idstring · uuidRequired
Query parameters
limitinteger · min: 1 · max: 200OptionalDefault: 50
continuation_tokenintegerOptionalDefault: 0
sort_bystring · max: 64OptionalDefault: name
searchstring · max: 200 · nullableOptional
Responses
200

Successful Response

application/json
has_morebooleanRequired
continuation_tokeninteger · nullableOptional
totalinteger · nullableOptional
get/v1/{workspace_id}/intake/datasets
GET /v1/{workspace_id}/intake/datasets HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "items": [
    {
      "name": "text",
      "schema_version": "text",
      "field_count": 1,
      "file_type": "text",
      "accepted_file_types": [
        "text"
      ],
      "ingestion_mode": "text",
      "limits": {
        "max_size_mb": 1
      }
    }
  ],
  "has_more": true,
  "continuation_token": 1,
  "total": 1
}

Register a Dataset

The server infers ingestion_mode from file_type:

  • Snapshot - csv, xls, or xlsx; requires one or more primary-key columns and fields. The supported field types are str, int, float, bool, date, and datetime.

  • Document - Any other lowercase alphanumeric type; ignores the tabular primary key and field list. accepted_file_types can contain up to 16 non-tabular types.

Register Intake Schema

post
Authorizations
AuthorizationstringRequired

API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.

Path parameters
workspace_idstring · uuidRequired
Body

Create Schema payload (intake-ui-mvp-design.md §5.4, §5.9).

ingestion_mode is inferred from file_type (csv/xls/xlsx → snapshot; else document) — not part of the wire contract. Snapshot datasets require primary_key + schema; document datasets take an optional document_processing config and ignore primary_key/schema. The backend applies the other hidden defaults (on_schema_change=additive, schema_version auto).

namestring · min: 2 · max: 63RequiredPattern: ^[a-z0-9][a-z0-9_-]*[a-z0-9]$
file_typestring · min: 1 · max: 16RequiredPattern: ^[a-z0-9]+$
accepted_file_typesstring[] · max: 16Optional

Document only — the SET of accepted file types (V265, e.g. ["pdf","docx","md"]). Empty → single-type (just file_type). file_type is included as the primary. Mixing in a tabular type (csv/xls/xlsx) is rejected; snapshot datasets are single-type.

Default: []
primary_keystring[] · max: 32Optional

Snapshot only — the canonical PK column(s). Empty/ignored for documents.

Default: []
max_size_mbinteger · nullableOptional
Responses
201

Successful Response

application/json

A registered schema in the Schemas list (intake-ui-mvp-design.md §5.3).

namestringRequired

Dataset slug (UI label "Schema").

schema_versionstringRequired
field_countintegerRequired
file_typestringRequired

Primary/representative file type (the first accepted type).

accepted_file_typesstring[]Optional

Document datasets: the full accepted-type set (V265). Empty for snapshot or legacy single-type documents (the UI falls back to file_type).

Default: []
ingestion_modestringRequired

snapshot (CSV/Excel → CDC) or document (PDF/docx → extraction).

post/v1/{workspace_id}/intake/schema/register
POST /v1/{workspace_id}/intake/schema/register HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 222

{
  "name": "text",
  "file_type": "text",
  "accepted_file_types": [
    "text"
  ],
  "primary_key": [
    "text"
  ],
  "schema": [
    {
      "name": "text",
      "type": "str"
    }
  ],
  "document_processing": {
    "retain_source": true,
    "extraction_mode": "text_extract"
  },
  "max_size_mb": 1
}
{
  "name": "text",
  "schema_version": "text",
  "field_count": 1,
  "file_type": "text",
  "accepted_file_types": [
    "text"
  ],
  "ingestion_mode": "text",
  "limits": {
    "max_size_mb": 1
  }
}

Document contracts accept document_processing.extraction_mode values of text_extract, OCR, or hybrid, but the current processor implements text_extract only. OCR and hybrid reach a failed processing verdict rather than performing OCR.

With text_extract, the current processor handles PDF, DOCX, and UTF-8 text types such as txt, text, md, and markdown. An unknown type is treated as text only when its bytes decode as UTF-8; otherwise processing fails. Registering an accepted extension does not guarantee parser support.

Status
Condition

409

A dataset with this name already exists in the workspace

422

Invalid fields, types, primary key, extraction mode, or mixed tabular/document type set

Update a Dataset

POST /v1/{workspace_id}/intake/datasets/{dataset}/update starts the one-click workflow for a dataset backed by at least one active Google Drive source. It checks mapped folders, creates batches for newly landed files, starts preparation, and then starts publication when preparation succeeds.

This route does not refresh a dataset made only from manual uploads. If no active Drive source maps to the dataset, the accepted run transitions to failed with an explanatory error.

Update Intake Dataset

post

Run the customer-facing dataset update flow.

This is the one-click orchestration path for the console: check mapped Drive folders, prepare any newly landed files, and publish immediately when no preparation is needed. If preparation is async, the run remains durable and is advanced by file write-backs or by refresh.

Authorizations
AuthorizationstringRequired

API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.

Path parameters
workspace_idstring · uuidRequired
datasetstring · min: 2 · max: 63RequiredPattern: ^[a-z0-9][a-z0-9_-]*[a-z0-9]$
Responses
202

Successful Response

application/json

Durable status for one dataset update action.

run_idstring · uuidRequired
datasetstringRequired
statusstring · enumRequiredPossible values:
source_idsstring · uuid[]Required
batch_idsstring · uuid[]Required
materialize_run_idinteger · nullableOptional
errorstring · nullableOptional
created_atstringRequired
updated_atstringRequired
completed_atstring · nullableOptional
post/v1/{workspace_id}/intake/datasets/{dataset}/update
POST /v1/{workspace_id}/intake/datasets/{dataset}/update HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "run_id": "123e4567-e89b-12d3-a456-426614174000",
  "dataset": "text",
  "status": "checking_drive",
  "source_ids": [
    "123e4567-e89b-12d3-a456-426614174000"
  ],
  "batch_ids": [
    "123e4567-e89b-12d3-a456-426614174000"
  ],
  "materialize_run_id": 1,
  "error": "text",
  "created_at": "text",
  "updated_at": "text",
  "completed_at": "text"
}

The 202 Accepted response is a durable run record, not a completion receipt. Its status is one of checking_drive, preparing, publishing, completed, needs_review, or failed. Poll the run until it reaches a terminal status:

Get Intake Update Run

get
Authorizations
AuthorizationstringRequired

API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.

Path parameters
workspace_idstring · uuidRequired
run_idstring · uuidRequired
Responses
200

Successful Response

application/json

Durable status for one dataset update action.

run_idstring · uuidRequired
datasetstringRequired
statusstring · enumRequiredPossible values:
source_idsstring · uuid[]Required
batch_idsstring · uuid[]Required
materialize_run_idinteger · nullableOptional
errorstring · nullableOptional
created_atstringRequired
updated_atstringRequired
completed_atstring · nullableOptional
get/v1/{workspace_id}/intake/update-runs/{run_id}
GET /v1/{workspace_id}/intake/update-runs/{run_id} HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "run_id": "123e4567-e89b-12d3-a456-426614174000",
  "dataset": "text",
  "status": "checking_drive",
  "source_ids": [
    "123e4567-e89b-12d3-a456-426614174000"
  ],
  "batch_ids": [
    "123e4567-e89b-12d3-a456-426614174000"
  ],
  "materialize_run_id": 1,
  "error": "text",
  "created_at": "text",
  "updated_at": "text",
  "completed_at": "text"
}

The run response includes source_ids, batch_ids, timestamps, and optional materialize_run_id and error. Starting another update while one is active can return the existing run rather than create parallel work.

External HMAC Upload

The legacy external HMAC upload route has been removed from the current Platform API. It is no longer a separately provisioned compatibility option. Migrate file integrations to the authenticated dataset upload workflow above; dataset registration and processing remain explicit steps.

Last updated

Was this helpful?