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.
401 Unauthorized or 403 Forbidden.Errors
| Status | Meaning |
|---|---|
401 | Missing or invalid API key |
403 | Valid key, but the account isn't approved yet |
404 | Resource not found, or it doesn't belong to your account |
422 | Validation error — see errors below |
{
"message": "The service type field is required.",
"errors": {
"service_type": ["The service type field is required."]
}
}
Languages
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
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.
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"
}
}
Returns file metadata, including a temporary download link once it's a translation or certificate.
Removes a file that isn't attached to a quote or order yet. Returns
422 otherwise.
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.
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"
}'
| Field | Notes |
|---|---|
source_language / target_language | ISO codes from GET /languages |
service_type | certified or standard |
file_ids | Source files uploaded via POST /files |
unit_count | Required only for scanned images (page count can't be auto-detected) |
addons | Optional, 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.
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.
Lists your quotes, newest first. Paginated (per_page, max 100).
Discards a quote that hasn't been converted yet.
Orders
Lists your orders. Filter with ?status=.
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"
}
}
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.
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"
}'
| Field | Notes |
|---|---|
mode | on_site, video_remote, sight_translation, asl, or ai_conference |
setting | deposition, court, arbitration, meeting, conference, or other (default) |
scheduled_at | Must be in the future |
duration_hours | Requested length; billed at a 2-hour minimum |
location | Required 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}.
Lists your bookings. Filter with ?status=.
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
}
}
}
Only allowed while a booking is requested or
awaiting_payment. Once confirmed, contact us directly to cancel or
reschedule.
| Status | Meaning |
|---|---|
requested | Submitted; we're confirming an interpreter is available |
awaiting_payment | Availability confirmed — pay via payment.approval_url |
confirmed | Paid and locked in for the scheduled date/time |
completed | Session took place |
on_hold | Needs manual attention (e.g. no interpreter available); we'll follow up by email |
cancelled | Cancelled before completion |
Order lifecycle
| Status | Meaning |
|---|---|
pending_payment | Order created, waiting on the PayPal checkout |
processing | Payment confirmed — translation in progress |
in_review | Translation done; a certified translation or notarization is being finalized by our team |
completed | Done — translated files are available for download |
on_hold | Needs manual attention (e.g. unsupported document); we'll follow up by email |
cancelled | Cancelled 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]