Translate Law API v1

Automated legal document translation with human-in-the-loop certification and notarization.

Base URL (production)  https://api.translate.law/api/v1
Base URL (sandbox)     https://api-dev.translate.law/api/v1

All requests and responses use application/json, except file uploads which use multipart/form-data. Every order is priced and paid individually — there is no monthly subscription; you only pay for what you translate.

The API lets you integrate legal document translation and interpreter booking directly into your own application. With it, you can:

  • Upload a document, get an instant price, and pay for a translation order programmatically
  • Track an order's progress in real time, from submission through certification to delivery
  • Download the finished translation — and, for certified orders, its signed certificate — through short-lived, secure links
  • Book a human interpreter (on-site, video, ASL) for depositions, hearings, or client meetings

Authentication is handled via a per-account API key (see Authentication below). There are no webhooks in v1 — your application tracks progress by polling GET /orders/{id} or GET /interpretation-bookings/{id}.

Workflow

A typical document translation order follows these steps:

  1. Upload your file(s). POST /files for each source document, getting back a file ID.
  2. Get a quote. POST /quotes with those file IDs, the language pair, and the service type — pricing is calculated instantly, no waiting on our end.
  3. Convert the quote to an order. POST /quotes/{id}/convert creates the order and a PayPal checkout; send your customer to the returned paypal_approval_url to pay.
  4. Automated translation. Once payment is confirmed, translation begins immediately — powered by Claude, including scanned images, with no manual step for standard translations.
  5. Certification, if applicable. Certified orders are reviewed by our team, who attach the signed certificate of accuracy (and coordinate notarization) before marking the order complete.
  6. Retrieve the finished files. Poll GET /orders/{id} until status is completed; the translation (and certificate, if any) are available as temporary, signed download links.

Interpretation bookings follow a shorter, request-first flow — see Interpretation for details.

Authentication

Every authenticated request must include your API key as a bearer token:

Authorization: Bearer tl_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Accept: application/json

Getting a key: contact us to create an account. Once our team approves it, you'll receive your API key by email — it is shown only once, so store it securely. GET /languages and GET /pricing don't require authentication; every other endpoint does.

An account that hasn't been approved yet, or a revoked/regenerated key, returns 401 Unauthorized or 403 Forbidden.

Errors

StatusMeaning
401Missing or invalid API key
403Valid key, but the account isn't approved yet
404Resource not found, or it doesn't belong to your account
422Validation error — see errors below
{
  "message": "The service type field is required.",
  "errors": {
    "service_type": ["The service type field is required."]
  }
}

Languages

GET/languagesNo auth

Returns the list of supported languages — 200+ languages and dialects, including Spanish, Portuguese, Mandarin, Arabic, Russian, French, Korean, Vietnamese and Haitian Creole.

curl https://api-dev.translate.law/api/v1/languages
{
  "data": [
    { "code": "en", "name": "English" },
    { "code": "es", "name": "Spanish" }
  ]
}

Pricing

GET/pricingNo auth

Returns current rates per service type and the add-on catalog.

curl https://api-dev.translate.law/api/v1/pricing
{
  "data": {
    "services": [
      { "service_type": "certified", "unit": "page", "unit_price_cents": 990, "currency": "USD" },
      { "service_type": "standard", "unit": "word", "unit_price_cents": 1, "currency": "USD" }
    ],
    "addons": [
      { "code": "notarization", "name": "Notarization", "pricing_type": "flat", "price_cents": 0, "currency": "USD" },
      { "code": "hard_copy", "name": "Extra hard copy (mailed)", "pricing_type": "per_copy", "price_cents": 1495, "currency": "USD" },
      { "code": "rush_2h", "name": "1-2 hour rush delivery", "pricing_type": "flat", "price_cents": 3995, "currency": "USD" }
    ]
  }
}

Certified translations are billed per page (250 words or fewer = 1 page) at $9.90/page, include notarization at no additional cost, and come with a signed certificate of accuracy — use them for USCIS, immigration, courts, and other official filings. Standard translations — branded as AI Translation on translate.law — are billed per word at $0.01/word, fully automated with no manual review, and are meant for internal or business use where certification isn't required. Rush delivery (1-2 hours) is available as an add-on on either service type.

Files

Upload source documents before requesting a quote. Accepted formats: PDF, DOCX, JPG, PNG (up to 20 MB by default). A file must be attached to a quote or order before it can't be deleted anymore.

POST/files
curl -X POST https://api-dev.translate.law/api/v1/files \
  -H "Authorization: Bearer tl_xxx" \
  -F "file=@/path/to/document.pdf" \
  -F "type=source"
{
  "data": {
    "id": "b3b1c6d0-8f2a-4b7e-9b6b-1a2b3c4d5e6f",
    "type": "source",
    "name": "document.pdf",
    "mime_type": "application/pdf",
    "size_bytes": 184320,
    "page_count": null,
    "word_count": null,
    "created_at": "2026-09-23T12:00:00.000000Z"
  }
}
GET/files/{id}

Returns file metadata, including a temporary download link once it's a translation or certificate.

DELETE/files/{id}

Removes a file that isn't attached to a quote or order yet. Returns 422 otherwise.

Download links (download_url) are signed and expire after 5 minutes — request the file resource again to get a fresh one.

Quotes

A quote prices a set of uploaded files before you commit to an order. Convert it once you're ready to pay.

POST/quotes
curl -X POST https://api-dev.translate.law/api/v1/quotes \
  -H "Authorization: Bearer tl_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "source_language": "es",
    "target_language": "en",
    "service_type": "certified",
    "file_ids": ["b3b1c6d0-8f2a-4b7e-9b6b-1a2b3c4d5e6f"],
    "addons": [{ "code": "notarization" }],
    "reference": "PO-4821"
  }'
FieldNotes
source_language / target_languageISO codes from GET /languages
service_typecertified or standard
file_idsSource files uploaded via POST /files
unit_countRequired only for scanned images (page count can't be auto-detected)
addonsOptional, each with a code and optional quantity
{
  "data": {
    "id": "a1c2...",
    "status": "priced",
    "service_type": "certified",
    "unit_type": "page",
    "unit_count": 3,
    "subtotal_cents": 2970,
    "addons_total_cents": 0,
    "total_cents": 2970,
    "currency": "USD",
    "expires_at": "2026-10-23T12:00:00.000000Z"
  }
}

Notarization is included at no extra cost on certified translations, so it doesn't add to the total — pass it anyway to have it explicitly reflected in the order and delivered with the final document.

POST/quotes/{id}/convert

Turns a priced quote into a payable order and creates a PayPal checkout for it.

curl -X POST https://api-dev.translate.law/api/v1/quotes/a1c2.../convert \
  -H "Authorization: Bearer tl_xxx" \
  -H "Content-Type: application/json" \
  -d '{ "redirect_url": "https://yourapp.example.com/orders/thanks" }'
{
  "data": { "id": "9f0e...", "number": "TL-2609-AB12CD", "status": "pending_payment" },
  "paypal_approval_url": "https://www.paypal.com/checkoutnow?token=..."
}

Send your customer to paypal_approval_url to complete payment. Once PayPal confirms it, the order moves to processing automatically and translation begins — no further action needed on your end.

GET/quotes

Lists your quotes, newest first. Paginated (per_page, max 100).

DELETE/quotes/{id}

Discards a quote that hasn't been converted yet.

Orders

GET/orders

Lists your orders. Filter with ?status=.

GET/orders/{id}

Poll this to track progress and get the finished files.

curl https://api-dev.translate.law/api/v1/orders/9f0e... -H "Authorization: Bearer tl_xxx"
{
  "data": {
    "id": "9f0e...",
    "number": "TL-2609-AB12CD",
    "status": "completed",
    "service_type": "certified",
    "source_language": "es",
    "target_language": "en",
    "total_cents": 2970,
    "currency": "USD",
    "files": [
      { "type": "source", "name": "document.pdf" },
      { "type": "translation", "name": "TL-2609-AB12CD-translation.docx", "download_url": "https://api.translate.law/api/v1/files/.../download?expires=..." },
      { "type": "certificate", "name": "certificate.pdf", "download_url": "https://api.translate.law/api/v1/files/.../download?expires=..." }
    ],
    "completed_at": "2026-09-24T09:12:00.000000Z"
  }
}
POST/orders/{id}/cancel

Only allowed while an order is pending_payment or on_hold.

Interpretation

Book a human interpreter for depositions, hearings, arbitration, or client meetings — on-site, by video, or ASL. Unlike document orders, an interpretation booking is priced instantly but not paid for right away: our team first confirms an interpreter is actually available for the requested date, time, language pair and mode, then a payment link becomes available. Minimum billable time is 2 hours, even for shorter sessions.

POST/interpretation-bookings
curl -X POST https://api-dev.translate.law/api/v1/interpretation-bookings \
  -H "Authorization: Bearer tl_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "source_language": "es",
    "target_language": "en",
    "mode": "video_remote",
    "setting": "deposition",
    "scheduled_at": "2026-10-15T14:00:00-05:00",
    "duration_hours": 1.5,
    "video_platform_notes": "Zoom link will be sent separately",
    "reference": "Case #2026-4471"
  }'
FieldNotes
modeon_site, video_remote, sight_translation, asl, or ai_conference
settingdeposition, court, arbitration, meeting, conference, or other (default)
scheduled_atMust be in the future
duration_hoursRequested length; billed at a 2-hour minimum
locationRequired when mode is on_site
{
  "data": {
    "id": "b7c1...",
    "number": "TL-INT-2609-XY45ZP",
    "status": "requested",
    "mode": "video_remote",
    "setting": "deposition",
    "scheduled_at": "2026-10-15T19:00:00.000000Z",
    "duration_hours": 1.5,
    "billable_hours": 2,
    "unit_price_cents": 5600,
    "total_cents": 11200,
    "currency": "USD",
    "payment": { "provider": "paypal", "paypal_order_id": null, "approval_url": null, "paid_at": null }
  }
}

1.5 requested hours are billed as the 2-hour minimum: 2 × $56.00 = $112.00. No payment link exists yet — keep polling GET /interpretation-bookings/{id}.

GET/interpretation-bookings

Lists your bookings. Filter with ?status=.

GET/interpretation-bookings/{id}

Once our team confirms availability, status becomes awaiting_payment and payment.approval_url is populated.

{
  "data": {
    "status": "awaiting_payment",
    "payment": {
      "provider": "paypal",
      "paypal_order_id": "5O190127TN364715T",
      "approval_url": "https://www.paypal.com/checkoutnow?token=...",
      "paid_at": null
    }
  }
}
POST/interpretation-bookings/{id}/cancel

Only allowed while a booking is requested or awaiting_payment. Once confirmed, contact us directly to cancel or reschedule.

StatusMeaning
requestedSubmitted; we're confirming an interpreter is available
awaiting_paymentAvailability confirmed — pay via payment.approval_url
confirmedPaid and locked in for the scheduled date/time
completedSession took place
on_holdNeeds manual attention (e.g. no interpreter available); we'll follow up by email
cancelledCancelled before completion

Order lifecycle

StatusMeaning
pending_paymentOrder created, waiting on the PayPal checkout
processingPayment confirmed — translation in progress
in_reviewTranslation done; a certified translation or notarization is being finalized by our team
completedDone — translated files are available for download
on_holdNeeds manual attention (e.g. unsupported document); we'll follow up by email
cancelledCancelled before completion

There are currently no outbound webhooks — poll GET /orders/{id} until status is completed.

Full example

# 1. Upload the source document
curl -X POST https://api-dev.translate.law/api/v1/files -H "Authorization: Bearer tl_xxx" -F "[email protected]"
# → file id "abc123"

# 2. Get a quote
curl -X POST https://api-dev.translate.law/api/v1/quotes -H "Authorization: Bearer tl_xxx" -H "Content-Type: application/json" \
  -d '{"source_language":"es","target_language":"en","service_type":"certified","file_ids":["abc123"]}'
# → quote id "q1", total_cents: 990

# 3. Convert to a payable order
curl -X POST https://api-dev.translate.law/api/v1/quotes/q1/convert -H "Authorization: Bearer tl_xxx"
# → order id "o1", paypal_approval_url: "https://www.paypal.com/checkoutnow?..."

# 4. Customer pays via paypal_approval_url, then poll the order
curl https://api-dev.translate.law/api/v1/orders/o1 -H "Authorization: Bearer tl_xxx"
# → status moves: processing → in_review (if certified) → completed

Translate Law · [email protected]