/projects/{id}/reconciliations

A CSV or XLSX carrying a uid or hashed uid column. Accepted header aliases: uid, hashed uid, hasheduid, hashed_uid. Max file size 20 MB.

202 Accepted, and autoApprove is hard-coded false. The upload lands as PENDING and changes nothing until an admin approves it on the main dashboard. A client approving its own reconciliation would let it reclassify its own traffic unilaterally, which is the entire reason that review step exists.

Requires S3 to be configured (app.aws.*): the file goes to S3 before the row is written. This is also the one write path that is deliberately not transactional — a rolled-back transaction cannot un-upload an S3 object.

POSThttps://dashboard.a2bsample.com/api/developer/playground/client/projects/{projectId}/reconciliations
RequiresAuthorizationandX-Api-Tokenas headers.
Client
Client·Reconciliations·POST/projects/{id}/reconciliations
POSThttps://dashboard.a2bsample.com/api/developer/playground/client/projects/{projectId}/reconciliations
file — CSV or XLSX, max 20 MB

missing projectId

Response

Send a request to see the response.

Example request

Request
curl --request POST \  --url 'https://dashboard.a2bsample.com/api/developer/playground/client/projects/{projectId}/reconciliations' \  --header 'Authorization: Bearer $A2B_BEARER_TOKEN' \  --header 'X-Api-Token: $A2B_API_TOKEN' \  --header 'Accept: application/json' \  --form 'file=@reconciliation.csv'

Request

Headers4

Authorizationstringrequired

The secret half. A client token starts clt_ — the four-character prefix says which table to resolve it in, so the row it matches is the caller. A vnd_… token on this prefix is a 403, not a 404.

example: Bearer clt_4c8ea1f52d6b8e0c4a919f1c4e2a7b3d
X-Api-Tokenstringrequired

The identity half — this client's own 40-hex apiToken, the value GET /api/developer/me echoes back. Compared in constant time against the bearer token's own row, so a bearer token lifted on its own is not enough to call the playground.

example: 3c7a1b905e424d189f637a2c5e1b8d40b1d9f4e6
Content-Typestringrequired

Request media type.

default: application/json
Acceptstringoptional

Response media type.

default: application/json

Path parameters1

projectIdstring<uuid>required

Project identifier. Ownership-checked in the service, never trusted from the URL.

Body1

filestring<binary>required

The CSV or XLSX to reconcile against. Max 20 MB.

Responses

202Accepted

Accepted and stored as PENDING. Nothing has been parsed and no hit has changed.

successboolean
Whether the call succeeded.
messagestring
reconciliationobject
One reconcile submission and where it sits in the review lifecycle. Only an approval ever parses the file or changes a hit — nothing is automatic.
Example response
{  "success": true,  "message": "Upload received and queued for review.",  "reconciliation": {    "id": "4a919f1c-4e2a-7b3d-4c8e-a1f52d6b8e0c",    "projectId": "9f1c4e2a-7b3d-4c8e-a1f5-2d6b8e0c4a91",    "projectName": "Q3 Brand Tracker",    "clientName": "Acme Insights",    "fileName": "reconcile-aug.csv",    "status": "PENDING",    "uploadedAt": "2026-08-20T09:14:02",    "uploadedByName": "string",    "reviewedAt": "2026-08-24T16:58:00Z",    "reviewedByName": "string",    "totalRows": 0,    "matchedRows": 0,    "rejectionReason": "string"  }}