Translate Law API
API Reference
Automated legal document translation, with certification and notarization when the order needs it.
Production https://api.translate.law/api/v1
Sandbox https://api-dev.translate.law/api/v1
Requests and responses use application/json, except file uploads, which use multipart/form-data. Each order is priced and paid on its own. There is no monthly subscription.
From your own application you can:
- Upload a document, get an instant price, and pay for a translation order.
- Track an order from submission through certification to delivery.
- Download the finished translation and, for certified orders, its signed certificate, through short-lived links.
- Book a human interpreter (on-site, video, or ASL) for depositions, hearings, or client meetings.
Authentication uses a per-account API key. v1 has no webhooks. Poll GET /orders/{id} or GET /interpretation-bookings/{id}.
Workflow
A document translation order follows these steps:
- 01Upload each source file with
POST /filesand keep the file ID. - 02Price it with
POST /quotes, passing the file IDs, the language pair, and the service type. The quote comes back immediately. - 03Turn the quote into an order with
POST /quotes/{id}/convert. Send your customer to the returnedpaypal_approval_url. - 04After payment, translation starts at once, including scanned images. Standard translations have no manual step.
- 05Certified orders are reviewed by our team. They attach the signed certificate of accuracy and coordinate notarization before the order is complete.
- 06Poll
GET /orders/{id}untilstatusiscompleted. The translation and certificate, if any, are temporary signed download links.
Interpretation bookings use a shorter, request-first flow. See Interpretation below.
Authentication
Send the API key as a bearer token on every authenticated request:
Authorization: Bearer tl_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Accept: application/json
To get a key, contact api@translate.law. After the account is approved, the key arrives by email and is shown only once. Store it securely. GET /languages and GET /pricing do not require authentication. Every other endpoint does.
An account that is not approved yet, or a revoked or regenerated key, returns 401 Unauthorized or 403 Forbidden.
Errors
| Status | Meaning |
|---|---|
| 401 | Missing or invalid API key |
| 403 | Valid key, but the account is not approved yet |
| 404 | Resource not found, or it does not belong to your account |
| 422 | Validation error. See the errors object below. |
{
"message": "The service type field is required.",
"errors": {
"service_type": ["The service type field is required."]
}
}Languages
/languages
No authReturns supported languages: 200+ languages and dialects, including Spanish, Portuguese, Mandarin, Arabic, Russian, French, Korean, Vietnamese, and Haitian Creole.
curl https://api.translate.law/api/v1/languages
{
"data": [
{ "code": "en", "name": "English" },
{ "code": "es", "name": "Spanish" }
]
}Pricing
/pricing
No authReturns current rates per service type and the add-on catalog.
curl https://api.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 counts as 1 page) at $9.90 per page. Notarization is included, and the delivery includes a signed certificate of accuracy for USCIS, immigration, courts, and other official filings.
Standard translations, branded as AI Translation on translate.law, are billed at $0.01 per word. They are fully automated, with no manual review, for internal or business use where certification is not required. Rush delivery (1-2 hours) is 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 attached to a quote or order can no longer be deleted.
/files
Authcurl -X POST https://api.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"
}
}/files/{id}
AuthReturns file metadata, including a temporary download link once the file is a translation or certificate.
/files/{id}
AuthRemoves a file that is not attached to a quote or order yet. Returns 422 otherwise.
Download links (download_url) are signed and expire after 5 minutes. Request the file again for a fresh link.
Quotes
A quote prices uploaded files before you commit to an order. Convert it when you are ready to pay.
/quotes
Authcurl -X POST https://api.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 with POST /files |
| unit_count | Required only for scanned images, when the page count cannot be detected |
| addons | Optional. Each item has a code and an 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 on certified translations, so it does not add to the total. Pass it anyway so the order records it and the final document includes it.
/quotes/{id}/convert
AuthTurns a priced quote into a payable order and creates a PayPal checkout.
curl -X POST https://api.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. Once PayPal confirms payment, the order moves to processing and translation begins.
/quotes
AuthLists your quotes, newest first. Paginated with per_page, max 100.
/quotes/{id}
AuthDiscards a quote that has not been converted yet.
Orders
/orders
AuthLists your orders. Filter with ?status=.
/orders/{id}
AuthPoll this to track progress and get the finished files.
curl https://api.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"
}
}/orders/{id}/cancel
AuthAllowed only 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. The booking is priced immediately, but it is not paid right away. Our team first confirms an interpreter is available for the date, time, language pair, and mode. Then a payment link becomes available. The minimum billable time is 2 hours, even for a shorter session.
/interpretation-bookings
Authcurl -X POST https://api.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 x $56.00 = $112.00. No payment link exists yet. Keep polling GET /interpretation-bookings/{id}.
/interpretation-bookings
AuthLists your bookings. Filter with ?status=.
/interpretation-bookings/{id}
AuthOnce availability is confirmed, status becomes awaiting_payment and payment.approval_url is set.
{
"data": {
"status": "awaiting_payment",
"payment": {
"provider": "paypal",
"paypal_order_id": "5O190127TN364715T",
"approval_url": "https://www.paypal.com/checkoutnow?token=...",
"paid_at": null
}
}
}/interpretation-bookings/{id}/cancel
AuthAllowed only while a booking is requested or awaiting_payment. Once it is confirmed, contact us to cancel or reschedule.
| Status | Meaning |
|---|---|
| requested | Submitted. We are confirming an interpreter is available. |
| awaiting_payment | Availability confirmed. Pay via payment.approval_url. |
| confirmed | Paid and locked in for the scheduled date and time. |
| completed | The session took place. |
| on_hold | Needs manual attention, for example no interpreter available. We 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 is in progress. |
| in_review | Translation is done. A certified translation or notarization is being finalized. |
| completed | Done. Translated files are available for download. |
| on_hold | Needs manual attention, for example an unsupported document. We follow up by email. |
| cancelled | Cancelled before completion. |
v1 does not send webhooks. Poll GET /orders/{id} until status is completed.
Full example
# 1. Upload the source document
curl -X POST https://api.translate.law/api/v1/files \
-H "Authorization: Bearer tl_xxx" \
-F "file=@document.pdf"
# file id "abc123"
# 2. Get a quote
curl -X POST https://api.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.translate.law/api/v1/quotes/q1/convert \
-H "Authorization: Bearer tl_xxx"
# order id "o1", paypal_approval_url
# 4. Customer pays, then poll the order
curl https://api.translate.law/api/v1/orders/o1 \
-H "Authorization: Bearer tl_xxx"
# status moves: processing, in_review (if certified), completedTranslate.Law · api@translate.law