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:

  1. 01Upload each source file with POST /files and keep the file ID.
  2. 02Price it with POST /quotes, passing the file IDs, the language pair, and the service type. The quote comes back immediately.
  3. 03Turn the quote into an order with POST /quotes/{id}/convert. Send your customer to the returned paypal_approval_url.
  4. 04After payment, translation starts at once, including scanned images. Standard translations have no manual step.
  5. 05Certified orders are reviewed by our team. They attach the signed certificate of accuracy and coordinate notarization before the order is complete.
  6. 06Poll GET /orders/{id} until status is completed. 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

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

Languages

GET

/languages

No auth

Returns 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

GET

/pricing

No auth

Returns 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.

POST

/files

Auth
curl -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"
  }
}
GET

/files/{id}

Auth

Returns file metadata, including a temporary download link once the file is a translation or certificate.

DELETE

/files/{id}

Auth

Removes 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.

POST

/quotes

Auth
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": ["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 with POST /files
unit_countRequired only for scanned images, when the page count cannot be detected
addonsOptional. 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.

POST

/quotes/{id}/convert

Auth

Turns 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.

GET

/quotes

Auth

Lists your quotes, newest first. Paginated with per_page, max 100.

DELETE

/quotes/{id}

Auth

Discards a quote that has not been converted yet.

Orders

GET

/orders

Auth

Lists your orders. Filter with ?status=.

GET

/orders/{id}

Auth

Poll 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"
  }
}
POST

/orders/{id}/cancel

Auth

Allowed 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.

POST

/interpretation-bookings

Auth
curl -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"
  }'
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 x $56.00 = $112.00. No payment link exists yet. Keep polling GET /interpretation-bookings/{id}.

GET

/interpretation-bookings

Auth

Lists your bookings. Filter with ?status=.

GET

/interpretation-bookings/{id}

Auth

Once 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
    }
  }
}
POST

/interpretation-bookings/{id}/cancel

Auth

Allowed only while a booking is requested or awaiting_payment. Once it is confirmed, contact us to cancel or reschedule.

StatusMeaning
requestedSubmitted. We are confirming an interpreter is available.
awaiting_paymentAvailability confirmed. Pay via payment.approval_url.
confirmedPaid and locked in for the scheduled date and time.
completedThe session took place.
on_holdNeeds manual attention, for example no interpreter available. We follow up by email.
cancelledCancelled before completion.

Order lifecycle

StatusMeaning
pending_paymentOrder created, waiting on the PayPal checkout.
processingPayment confirmed. Translation is in progress.
in_reviewTranslation is done. A certified translation or notarization is being finalized.
completedDone. Translated files are available for download.
on_holdNeeds manual attention, for example an unsupported document. We follow up by email.
cancelledCancelled 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), completed

Translate.Law · api@translate.law