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.

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]