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.