Create a project
POST /v1/projects uploads one or more source files and starts a workflow. Scope: verify:submit.
The body is multipart form, not JSON. Repeat the file part for each file.
Fields
| Field | Required | Notes |
|---|---|---|
file |
yes | One or more parts named file |
name |
yes | Shown in the arbitr UI (max 500 chars) |
source_language_code |
yes | Lowercase BCP-47, e.g. en-us |
target_language_codes |
yes | JSON array string, e.g. ["ja-jp","de-de"] |
workflow |
yes | JSON array string. AI_TRANSLATION first; optional TRANSLATION, EDIT |
due_date |
no | YYYY-MM-DD. Informational only — does not block the project |
Optional header: Idempotency-Key (see Idempotency).
Limits
- At least 1 file
- At most 100 files
- 200 MB total across all files (one file may use the whole budget)
- Over size or count →
413 payload_too_large
Language tags must be lowercase BCP-47 from GET /v1/languages. See Language codes and Workflows & credits.
Example
curl -s https://api-arbitr.straker.ai/v1/projects \
-H "X-API-Key: abr_live_…" \
-H "Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000" \
-F "file=@./handbook.docx" \
-F "file=@./appendix.pdf" \
-F "name=Q1 handbook" \
-F "source_language_code=en-us" \
-F 'target_language_codes=["ja-jp","de-de"]' \
-F 'workflow=["AI_TRANSLATION"]' \
-F "due_date=2026-09-30"
Success is 201. Copy id — that UUID is the project for every later call. assessment comes back null here and is filled in on GET /v1/projects/{id}; the key is always present, so test its value rather than its presence.
The example below is trimmed to the fields you need. The real body carries the full project record — around eighteen keys, including org_id, created_by, created_by_api_key_id, the word and character counts, timestamps, and assessment / review as null.
{
"id": "3f2a9c1e-4b7d-4c8a-9f10-2d6e5b7c8a91",
"name": "Q1 handbook",
"status": "pending",
"source_language_code": "en-us",
"target_language_codes": ["ja-jp", "de-de"]
}
abr_test_… returns the same shape without running the pipeline or charging credits. The id is not a UUID in test mode — treat every id as an opaque string. See Test mode.
Common failures
| Status | Typical cause |
|---|---|
401 / 403 |
Missing key, or key lacks verify:submit |
413 |
Over 200 MB or 100 files |
422 |
Missing file, bad JSON arrays, or invalid language / workflow |
409 |
Idempotency-Key already used — see Idempotency |
Next
Poll status with Poll project status using that id.