Build translation into your product with the ABC Translations API
Integrate certified and document translation into your app with the ABC Translations API. Submit files, track orders, get webhook updates, and pull finished work, across 120+ languages.
Overview
If you are still emailing files around, you already feel the problem.
You have translation volume that no longer fits in an inbox. Files get sent back and forth, someone forgets to forward a notarization approval, and a status check means another email asking where things stand. Every manual step is a place where an order stalls and a customer waits.
The ABC Translations API moves that whole workflow into your own application. You submit files, create orders, approve notarized documents, request revisions, and pull finished translations through clean endpoints, so the work runs on your schedule instead of someone else's reply time. It covers professional document translation and certified translation with notarization, in 120+ languages, at $0.09 per word.
What you can build
- Submit documents for certified or professional translation without leaving your app.
- Track every order through its life cycle and receive webhook updates on each status change.
- Approve notarized work, request revisions, and pull finished files on your own schedule.
- Offer translation under your own brand with white-label order fields.
The API has two environments, a sandbox for testing and production for live applications. Every request runs over HTTPS; plain HTTP is refused rather than redirected. See Base URLs for both. Need higher limits, a security review, or help getting started? Talk to our team.
Quickstart
Five steps take you from nothing to a finished translation: get a token, upload a file, create an order, listen for the webhook, and download the result. Run the whole path in the sandbox before you go live.
1. Authenticate
Send your access token in the Authorization header on every request. See Authentication for how to issue and rotate tokens.
curl https://api.abctranslations.com/v1/languages \ -H "Authorization: Bearer <token>" \ -H "Accept: application/json"
2. Upload a file
Upload each document before you attach it to an order. The response carries the file id.
curl https://api.abctranslations.com/v1/files \ -H "Authorization: Bearer <token>" \ -F "type=source" \ -F "file=@school-documents.pdf"
3. Create an order
Attach the file IDs, set the language pair and services, and send an idempotency key so a retry can't double-charge.
curl https://api.abctranslations.com/v1/orders \ -H "Authorization: Bearer <token>" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: 7b3c1f9a-2d4e-4c8a-9f6b-1e2d3c4b5a6f" \ -d '{ "callback_url": "https://yourapp.com/webhooks/abc", "services": { "source_language": "es", "target_language": "en", "certification": true, "notarization": true }, "page_count": 2, "files": [2304778] }'
4. Receive the webhook
When the order changes status we POST a small JSON payload to your callback_url, so you never poll. See Webhooks for the event list and signature verification.
5. Download the translation
When the order reaches completed, request a signed download URL for each finished file. The URL expires after five minutes, so fetch it right away. See Downloading Files.
Key Concepts
Four objects model the whole workflow. Everything in the API Reference builds on them.
| Object | What it is |
|---|---|
| Order | A unit of translation work. Holds the language pair, services, attached files, transactions, comments, and a status life cycle. |
| File | A document tied to an order: a source to translate, a reference for context, a finished translation, or a revision. Stored encrypted and downloaded through short-lived signed URLs. |
| Revision | A requested change to a finished translation, tracked through its own status flow. |
| Language | A supported language with its ISO 639 code, used to set the source and target of an order. |
A typical integration uploads Files, attaches them to an Order, follows the order through its life cycle by Webhook, downloads the finished files, and optionally opens a Revision.
Authentication
Every request authenticates with a bearer access token in the HTTP Authorization header. The token is scoped to your account and to a set of permissions, and all traffic must use HTTPS.
curl https://api.abctranslations.com/v1/orders \ -H "Authorization: Bearer <token>" \ -H "Accept: application/json"
Access Tokens
There are two ways to obtain a token. Both present the same Authorization: Bearer header, and both are scoped to the least privilege you grant them.
- OAuth 2.0 client credentials (recommended for production). Exchange your client ID and secret for a short-lived access token, then refresh it before it expires. Use this for server-to-server integrations so a leaked token expires on its own.
- Personal access tokens (quickstart and low volume). Generate a long-lived, rotatable token from your account page once our team enables tokens on your profile. Convenient to start with; rotate it on a schedule and revoke it immediately if it is exposed.
Request an OAuth access token
curl https://api.abctranslations.com/v1/oauth/token \ -H "Content-Type: application/json" \ -d '{ "grant_type": "client_credentials", "client_id": "<client_id>", "client_secret": "<client_secret>", "scope": "orders:read orders:write files:read files:write" }'
{ "access_token": "<token>", "token_type": "Bearer", "expires_in": 3600, "scope": "orders:read orders:write files:read files:write" }
Scopes
Grant a token only the permissions it needs. A request that uses a scope the token does not hold returns 403 Forbidden.
| Scope | Grants |
|---|---|
orders:read |
List and retrieve orders |
orders:write |
Create, cancel, and approve orders |
files:read |
List, retrieve, and download files |
files:write |
Upload and delete files |
revisions:write |
Request and manage revisions |
webhooks:write |
Manage webhook endpoints |
Keep tokens safe
- Treat a token like a password. Store it as a secret, never in client-side code, a repository, or a URL.
- Prefer short-lived OAuth tokens in production; rotate personal access tokens on a schedule.
- Revoke a token the moment it may have been exposed. Existing tokens keep working until they expire or you revoke them.
Base URLs
There are two environments: a sandbox for testing and production for live applications. Every endpoint uses the matching base URL.
| Environment | Base URL |
|---|---|
| Production | https://api.abctranslations.com/v1 |
| Sandbox | https://sandbox.abctranslations.com/api/v1 |
Core Workflow
First you upload each file with its own POST request to the files endpoint. The API returns an ID for every file, and you pass those IDs in a POST to the orders endpoint to attach them to a new order.
Our team reviews the files and your notes, then assigns a translator, and the order status updates to in_progress. If the order needs notarization, you approve it through the approval endpoint before it is finalized.
Webhooks push real-time updates to you on every status change, so you never have to poll for progress. Files are stored on Amazon S3 with no public access, and downloads use a temporary signed URL that expires after five minutes.
Need a change after delivery? A revision endpoint handles that, and reference files for a revision upload the same way they do when you place an order.
Order Lifecycle
An order moves through a fixed sequence of statuses. Notarized orders pause at client_review and wait for your approval; orders without notarization run straight through. An order can be cancelled through the API only while it is still received.
received ─▶ in_progress ─▶ in_review ─▶ client_review* ─▶ approved ─▶ finalizing ─▶ completed └────────── (no notarization) ──────────┘ received ─▶ cancelled (only while still in received) * notarized orders stop at client_review until you call the approval endpoint
| Status | Meaning |
|---|---|
received |
Order placed and queued. Can still be cancelled through the API. |
in_progress |
Assigned to a translator. |
in_review |
Internal quality review. |
client_review |
Waiting for your approval (notarized orders only). |
approved |
You approved the notarized work; it resumes automatically. |
finalizing |
Finished files are being prepared. |
completed |
All files finalized and ready to download. |
on_hold |
Paused; contact support for the reason. |
cancelled |
Cancelled; translation work has stopped. |
Revision Lifecycle
A revision tracks a post-delivery change through its own short flow.
requested ─▶ in_progress ─▶ in_review ─▶ completed
You can delete a revision while it is still requested. For any later status, contact support.
Conventions
Rules that hold across every endpoint: how to send requests, what comes back, the status and error codes, rate limits, pagination, idempotent retries, and how the API is versioned.
Requests
Send parameters as JSON with the Content-Type: application/json header. The one exception is a POST to the files endpoint, which expects form data with the Content-Type: multipart/form-data header.
A few fields, including order notes, comment body, and revision body, accept basic HTML tags: b, br, em, li, ol, p, s, u, and ul. Any other tag or attribute is stripped.
The API uses these HTTP verbs:
GETreads resources.POSTcreates new resources.PATCHmodifies existing resources.DELETEremoves resources.
Responses
Every endpoint returns JSON with the Content-Type: application/json header. Timestamps are UTC in ISO 8601 format, and monetary amounts are integers in cents (USD).
Status Codes
Standard HTTP response codes tell you the outcome of each request, covering successful responses, client errors, and server errors.
| Code | Name | Description |
|---|---|---|
200 |
OK | Request was successful, and the response contains data |
201 |
Created | Resource was successfully created |
204 |
No Content | Request was successful, but there is no response body |
400 |
Bad Request | The request was malformed or could not be understood |
401 |
Unauthorized | API token is missing or invalid |
403 |
Forbidden | API token is valid, but access is denied |
404 |
Not Found | The requested resource does not exist |
413 |
Entity Too Large | The request exceeds the allowed size limit |
422 |
Unprocessable Entity | Validation failed. The response includes error details |
429 |
Too Many Requests | The request rate limit has been exceeded |
500 |
Internal Server Error | The server encountered an unexpected error |
503 |
Service Unavailable | The server is temporarily unable to process the request |
Error Messages
Any status code other than 204 returns a response object with more detail in the message key. When validation fails, the API returns a 422 status with an errors object, where each field name is a key and the messages come back as arrays. Nested fields use dot notation, as the example shows.
{ "message": "The given data was invalid.", "errors": { "services.source_language": [ "The source language field is required." ], "services.target_language": [ "The target language field is required." ] } }
Rate Limiting
Requests are capped at 60 per minute. Exceed the limit and you get a 429 status code. Every response includes headers with your current rate limit details. Lean on webhooks instead of polling to stay well under the limit.
| Name | Description |
|---|---|
X-RateLimit-Limit |
Total number of requests allowed per minute. |
X-RateLimit-Remaining |
Number of requests remaining in the current minute. |
X-RateLimit-Reset |
Seconds until the current rate limit window resets. |
Retry-After |
Seconds to wait before the rate limit resets after being exceeded. |
Pagination
Endpoints that return multiple results are paginated, with a default of 60 items per page. You can raise per_page up to a maximum of 500 items. The response includes links and meta objects with the pagination details.
{ "data": [...], "links": { "first": "https://api.abctranslations.com/v1/orders?page=1", "last": "https://api.abctranslations.com/v1/orders?page=3", "prev": "https://api.abctranslations.com/v1/orders?page=1", "next": "https://api.abctranslations.com/v1/orders?page=3" }, "meta": { "current_page": 2, "from": 61, "last_page": 3, "path": "https://api.abctranslations.com/v1/orders", "per_page": 60, "to": 120, } }
Idempotency
Creating an order or uploading a file is not naturally safe to retry, so a dropped connection could leave you unsure whether the request went through. Send an Idempotency-Key header (any unique value, such as a UUID) on a POST and the API guarantees the operation runs at most once. Replaying the same key returns the original response instead of creating a duplicate.
POST https://api.abctranslations.com/v1/orders Idempotency-Key: 7b3c1f9a-2d4e-4c8a-9f6b-1e2d3c4b5a6f
Versioning
The API is versioned in the path; the current version is v1. Additive changes — new endpoints, new optional fields — ship without a version bump, so build clients to ignore fields they do not recognize. Any breaking change ships under a new path version.
When an endpoint or field is scheduled for removal, responses carry Deprecation and Sunset headers with the date it stops working, and the change is announced in the Changelog ahead of time.
Files & Transfer
Files are the documents that flow through an order: source files to translate, reference files for context, finished translation files, and revision files. This section covers how to get bytes in and out; the Files reference documents each endpoint in full.
Uploading Files
Upload each file with a multipart/form-data POST to the files endpoint before you attach it to an order. Every upload returns a file id you reference later. When possible, combine multi-page documents into a single file before upload. Uploads are capped at 100 MB; a larger request returns 413.
curl https://api.abctranslations.com/v1/files \ -H "Authorization: Bearer <token>" \ -F "type=source" \ -F "file=@school-documents.pdf"
Large Files
For files near the size limit or on an unreliable connection, upload in resumable chunks instead of a single request. Initialize an upload, send the file in parts, and the transfer picks up where it left off after an interruption rather than starting over. Each part is acknowledged before the next is sent, so a dropped connection costs you one chunk, not the whole file. Contact us to enable resumable uploads for your account.
Downloading Files
Files are encrypted and stored in an Amazon S3 bucket with no public access. To download one, request a temporary signed URL from the download endpoint. The URL grants secure, read-only access and expires after five minutes, so generate it right before you fetch the file rather than storing it.
GET https://api.abctranslations.com/v1/files/:file_id/download
{ "url": "https://abctranslations-files.s3.amazonaws.com/files/..." }
Webhooks
If you include a callback_url when you place an order, we send an HTTP POST to that URL on every status change, so you never have to poll. The request carries JSON in the body.
{ "id": 3290541, "order_number": "12543-5465123", "status": "completed", "updated_at": "2025-03-01T22:00:26Z" }
Events
These statuses trigger a notification:
in_progress: the order has been assigned to a translator.client_review: the order needs your approval before it can be finalized.completed: all files are finalized and ready to retrieve.cancelled: the order has been cancelled and translation work has stopped.
Signature Verification
So your endpoint can trust that a callback came from us and was not tampered with, each request is signed. We send an X-ABC-Signature header containing an HMAC-SHA256 of the raw request body, keyed with your webhook signing secret. Recompute the HMAC over the body you receive and compare it to the header with a constant-time comparison; reject the request if they do not match. Always verify the signature before acting on a payload, and read the raw body before parsing it as JSON.
Delivery & Retries
When we POST to your URL, we listen for these status codes:
200: the request succeeded, and we will not retry.406: the request was not accepted, and we will not retry.- For any other status code, we retry the
POSTwith these delays: 15 minutes, 1 hour, 4 hours, 8 hours, and 48 hours.
Respond quickly with a 200 as soon as you have stored the event, then do the slow work afterward. Because a delivery can be retried, make your handler idempotent — key off the order id and status so a repeated delivery is harmless.
API Reference
The endpoints below are grouped by resource: Languages, Files, Orders, and Revisions. Each resource starts with its object schema, then lists every operation with its request, parameters, and example response. All paths use the production base URL https://api.abctranslations.com/v1; swap in the sandbox base while testing.
Languages
The API returns a list of supported languages with their ISO 639 codes and availability status. You use these codes when placing orders to set the source and target languages, across our 120+ languages.
Language Object
| Field | Type | Description |
|---|---|---|
code |
String | ISO 639 language code |
name |
String | Language name |
active |
Boolean | Whether or not the language is currently active |
List Languages
Retrieve the list of supported languages. The response includes the language codes you need when placing orders through the API, and returns an array of language objects.
Request
GET https://api.abctranslations.com/v1/languages
Response - 200
[ { "code": "ar", "name": "Arabic", "active": true }, { "code": "bg", "name": "Bulgarian", "active": true }, ... ]
Files
The API lets you upload, manage, and retrieve the files tied to translation orders. Files can be source files for translation, reference materials, completed translations, or revisions. This section covers how to create, list, retrieve, download, and delete files, including file storage and access through temporary signed URLs.
File Object
| Field | Type | Description |
|---|---|---|
id |
Number | File identifier |
name |
String | Name |
type |
String | Type of file - source, reference, translation or revision |
size |
Number | File size in bytes |
download_url |
String | Location for file download |
created_at |
String | Time and date when the file was created (UTC) |
List Files
Retrieve a paginated list of files. The response includes a paginated array of file objects.
Request
GET https://api.abctranslations.com/v1/files
Request Parameters
| Field | Type | Required | Description |
|---|---|---|---|
certified_from |
String | N | Filter by certified date, returning only those that were certified on or after the specified date |
certified_to |
String | N | Filter by certified date, returning only those that were certified on or before the specified date |
created_from |
String | N | Filter by created date, returning only those that were created on or after the specified date |
created_to |
String | N | Filter by created date, returning only those that were created on or before the specified date |
extension |
String | N | Filter by file extension; docx, pdf, xlsx, etc... |
is_archived |
Boolean | N | Filter by archived status. Default is false |
notarized_from |
String | N | Filter by notarized date, returning only those that were notarized on or after the specified date |
notarized_to |
String | N | Filter by notarized date, returning only those that were notarized on or before the specified date |
order |
Number | N | Filter by order ID |
quote |
Number | N | Filter by quote ID |
search |
String | N | Search by filename |
sort |
String | N | Comma separated list of sort options; certified_at, created_at, extension, filename, notarized_at, size, type, and updated_at. Prepend `-` for descending order. |
type |
String | N | Comma separated list of file type options; source, reference, translation, or revision. |
Response - 200
{ "data": [ { "id": 2304778, "name": "School Documents.jpg", "type": "source", "size": 39099, "download_url": "https://api.abctranslations.com/v1/...", "created_at": "2025-02-17T15:51:11Z" }, ... ], "links": {...}, "meta": {...} }
Create a File
Upload a new file with a form data request using the Content-Type: multipart/form-data header. Uploads are capped at 100MB, and each file can be attached to only one resource after creation. Returns a file object.
File types
source: files to be translated. When possible, combine multi-page documents into a single file before upload.reference: reference files that help the translator when attached to an order, or marked up files attached to a revision.
Request
POST https://api.abctranslations.com/v1/files
{ "file": {}, "type": "source" }
Request Parameters
| Field | Type | Required | Description |
|---|---|---|---|
file |
Object | Y | File to be uploaded |
type |
String | Y | Type of file - source or reference |
Response - 201
{ "id": 2304778, "name": "School Documents.jpg", "type": "source", "size": 39099, "download_url": "https://api.abctranslations.com/v1/...", "created_at": "2025-02-17T15:51:11Z" }
Retrieve a File
Retrieve detailed information about a specific file. Returns a file object.
Request
GET https://api.abctranslations.com/v1/files/:file_id
Response - 200
{ "id": 2304778, "name": "School Documents.jpg", "type": "source", "size": 39099, "download_url": "https://api.abctranslations.com/v1/...", "created_at": "2025-02-17T15:51:11Z" }
Download a File
Generate a temporary download URL for a file. Files are encrypted and stored in an Amazon S3 bucket. This request returns a signed URL that gives secure access to download the file, and the URL expires after five minutes.
Request
GET https://api.abctranslations.com/v1/files/:file_id/download
Response - 200
{ "url": "https://abctranslations-files.s3.amazonaws.com/files/..." }
Response Attributes
| Field | Type | Description |
|---|---|---|
url |
String | Temporary download URL |
Delete a File
You can only delete a file that has not been attached to a quote or order. To delete other files, contact our support team.
Request
DELETE https://api.abctranslations.com/v1/files/:file_id
Response - 204
No Content
Orders
The API lets you create, manage, and track translation orders. An order holds details such as status, language pairs, services, attached files, transactions, and comments. This section covers how to list, retrieve, create, approve, and cancel orders so the flow fits your own workflow.
Order Object
| Field | Type | Description |
|---|---|---|
id |
Number | Order identifier |
order_number |
String | Order number |
order_url |
String | Order URL for web app |
reference |
String | Customer-supplied internal reference (number, ID, etc.) |
field1 |
String | Client-supplied data for use in custom coversheets for white label services |
field2 |
String | Client-supplied data for use in custom coversheets for white label services |
origin |
String | Origin of the order - api or website |
status |
String | Current order status - received, in_progress, in_review, client_review, approved, finalizing, in_revision, completed, on_hold, or cancelled |
source_language |
String | ISO 639 source language code |
target_language |
String | ISO 639 target language code |
total |
Number | Order total in cents (USD) |
received_at |
String | Time and date when the order was placed (UTC) |
review_at |
String | Time and date when the order was available for review by the client (UTC) |
approved_at |
String | Time and date when the order was approved by the client (UTC) |
completed_at |
String | Time and date when the order was completed (UTC) |
cancelled_at |
String | Time and date when the order was cancelled (UTC) |
services |
Array | List of service objects |
files |
Array | List of file objects |
transactions |
Array | List of transaction objects |
comments |
Array | List of comment objects |
revisions |
Array | List of revision objects |
Service Object
| Field | Type | Description |
|---|---|---|
name |
String | Name |
quantity |
Number | Quantity ordered |
price |
Number | Price each in cents (USD) |
discount |
Number | Discount each in cents (USD) |
total |
Number | Total service price in cents (USD) |
Transaction Object
| Field | Type | Description |
|---|---|---|
type |
String | Type of transaction - charge or refund |
amount |
Number | Transaction amount in cents (USD) |
description |
String | Description of the transaction |
payment_type |
String | Type of payment - invoice |
created_at |
String | Time and date when the transaction was created (UTC) |
Comment Object
| Field | Type | Description |
|---|---|---|
author |
String | Name of the comment author |
body |
String | Comment body - basic HTML allowed |
created_at |
String | Time and date when the comment was created (UTC) |
List Orders
Retrieve a paginated list of your orders. The response includes a paginated array of order objects.
Request
GET https://api.abctranslations.com/v1/orders
Request Parameters
| Field | Type | Required | Description |
|---|---|---|---|
completed_from |
String | N | Filter by completed date, returning only those that were completed on or after the specified date |
completed_to |
String | N | Filter by completed date, returning only those that were completed on or before the specified date |
created_from |
String | N | Filter by created date, returning only those that were created on or after the specified date |
created_to |
String | N | Filter by created date, returning only those that were created on or before the specified date |
search |
String | N | Search by filename or customer reference |
sort |
String | N | Comma separated list of sort options; completed_at, created_at, status, and updated_at. Prepend `-` for descending order. |
source_language |
String | N | Filter by source language ISO 639 language code |
target_language |
String | N | Filter by target language ISO 639 language code |
Response - 200
{ "data": [ { "id": 3290112, "order_number": "55112-7859361", "order_url": "order/55112-7859361/mC18ihWVx...", "reference": "HN-2632", "field1": "John Anderson", "field2": "Feb 1, 2025", "origin": "api", "status": "completed", "source_language": "es", "target_language": "en", "total": 11270, "received_at": "2025-02-17T15:52:13Z", "review_at": "2025-02-17T09:15:22Z", "approved_at": "2025-02-17T11:43:35Z", "completed_at": "2025-02-17T14:04:50Z", "cancelled_at": null }, ... ], "links": {...}, "meta": {...} }
Create an Order
Create a new order. Upload your files first, since their IDs go in the files array of this request. Returns an order object.
Request
POST https://api.abctranslations.com/v1/orders
{ "reference": "HN-2632", "field1": "John Anderson", "field2": "Feb 1, 2025", "callback_url": "https://domain.com/webhooks", "notes": "<p>Please spell the last name Montanez.</p>", "services": { "source_language": "es", "target_language": "en", "certification": true, "expedited": true, "notarization": true, "currency_conversion": false, }, "page_count": 2, "files": [ 2304778 ] }
Request Parameters
| Field | Type | Required | Description |
|---|---|---|---|
reference |
String | N | Your internal reference (number, ID, etc.) |
field1 |
String | N | Data for use in custom coversheets for white label services |
field2 |
String | N | Data for use in custom coversheets for white label services |
callback_url |
String | N | Callback URL for webhooks |
notes |
String | N | Notes for staff or translators - basic HTML allowed |
services |
Object | Y | Specify the services you'd like to order |
services.source_language |
String | Y | ISO 639 language code |
services.target_language |
String | Y | ISO 639 language code |
services.certification |
Boolean | N | If you would like certified translation service otherwise professional translation provided. - Default is false |
services.expedited |
Boolean | N | If you would like expedited turnaround service. - Default is false |
services.notarization |
Boolean | N | If you would like the certification notarized - only available with certified translation. - Default is false |
services.currency_conversion |
Boolean | N | If you would like currency conversion - only available with certified translation. - Default is false |
page_count |
Number | Y* | Number of pages in the order files (250 words per page) - required if services.certification is true |
word_count |
Number | Y* | Number of words in the order files - required if services.certification is true |
files |
Array | Y | List of file IDs - type must be either source or reference |
Response - 201
{ "id": 3290112, "order_number": "55112-7859361", "order_url": "order/55112-7859361/mC18ihWVx...", "reference": "HN-2632", "field1": "John Anderson", "field2": "Feb 1, 2025", "origin": "api", "status": "completed", "source_language": "es", "target_language": "en", "total": 11270, "received_at": "2025-02-17T15:52:13Z", "review_at": "2025-02-17T09:15:22Z", "approved_at": "2025-02-17T11:43:35Z", "completed_at": "2025-02-17T14:04:50Z", "cancelled_at": null, "services": [ { "name": "Certified Translation", "quantity": 2, "price": 2495, "discount": 0, "total": 4990 }, { "name": "Expedited Turnaround", "quantity": 2, "price": 1495, "discount": 0, "total": 2990 }, { "name": "Notarization", "quantity": 1, "price": 1995, "discount": 0, "total": 1995 } ], "files": [ { "id": 2304778, "name": "School Documents.jpg", "type": "source", "size": 39099, "download_url": "https://api.abctranslations.com/v1/...", "created_at": "2025-02-17T15:51:11Z" }, { "id": 2304779, "name": "School-Documents-55112-7859361.pdf", "type": "translation", "size": 20748, "download_url": "https://api.abctranslations.com/v1/...", "created_at": "2025-02-17T13:04:13Z" } ], "transactions": [ { "type": "charge", "amount": 11270, "description": "Order Payment", "payment_type": "invoice", "created_at": "2025-02-17T16:01:26Z" } ], "comments": [ { "author": "Alexander M. Montanez", "body": "<p>Please spell last name Montanez.</p>", "created_at": "2025-02-17T15:52:13Z" } ], "revisions": [ { "id": 61233, "status": "completed", "body": "<p>School name is Canterbury School.</p>", "requested_at": "2025-02-17T12:22:57Z", "completed_at": "2025-02-17T13:04:13Z", "files": [] } ] }
Retrieve an Order
Retrieve detailed information about a specific order. Returns an order object.
Request
GET https://api.abctranslations.com/v1/orders/:order_id
Response - 200
{ "id": 3290112, "order_number": "55112-7859361", "order_url": "order/55112-7859361/mC18ihWVx...", "reference": "HN-2632", "field1": "John Anderson", "field2": "Feb 1, 2025", "origin": "api", "status": "completed", "source_language": "es", "target_language": "en", "total": 11270, "received_at": "2025-02-17T15:52:13Z", "review_at": "2025-02-17T09:15:22Z", "approved_at": "2025-02-17T11:43:35Z", "completed_at": "2025-02-17T14:04:50Z", "cancelled_at": null, "services": [ { "name": "Certified Translation", "quantity": 2, "price": 2495, "discount": 0, "total": 4990 }, { "name": "Expedited Turnaround", "quantity": 2, "price": 1495, "discount": 0, "total": 2990 }, { "name": "Notarization", "quantity": 1, "price": 1995, "discount": 0, "total": 1995 } ], "files": [ { "id": 2304778, "name": "School Documents.jpg", "type": "source", "size": 39099, "download_url": "https://api.abctranslations.com/v1/...", "created_at": "2025-02-17T15:51:11Z" }, { "id": 2304779, "name": "School-Documents-55112-7859361.pdf", "type": "translation", "size": 20748, "download_url": "https://api.abctranslations.com/v1/...", "created_at": "2025-02-17T13:04:13Z" } ], "transactions": [ { "type": "charge", "amount": 11270, "description": "Order Payment", "payment_type": "invoice", "created_at": "2025-02-17T16:01:26Z" } ], "comments": [ { "author": "Alexander M. Montanez", "body": "<p>Please spell last name Montanez.</p>", "created_at": "2025-02-17T15:52:13Z" } ], "revisions": [ { "id": 61233, "status": "completed", "body": "<p>School name is Canterbury School.</p>", "requested_at": "2025-02-17T12:22:57Z", "completed_at": "2025-02-17T13:04:13Z", "files": [] } ] }
Cancel an Order
Cancel an existing order. Only orders with a status of received can be canceled through the API. For orders with any other status, contact support.
Request
POST https://api.abctranslations.com/v1/orders/:order_id/cancel
Response - 204
No Content
Approve an Order
Approve an order that has a status of client_review.
Request
POST https://api.abctranslations.com/v1/orders/:order_id/approve
Response - 204
No Content
Revisions
Revisions let you request changes to a completed translation. This section covers how to create, retrieve, list, and delete revisions, including attaching reference files. Revisions follow a status flow so every change is tracked and processed.
Revision Object
| Field | Type | Description |
|---|---|---|
id |
Number | Revision identifier |
status |
String | Current revision status - requested, in_progress, in_review, completed or on_hold |
body |
String | Revision body HTML |
requested_at |
Number | Time and date when the revision was requested (UTC) |
completed_at |
String | Time and date when the revision was completed (UTC) |
files |
Array | List of File objects |
List Revisions
Retrieve a paginated list of your revisions, sorted in descending order by requested_at date. Returns a paginated list of revision objects.
Request
GET https://api.abctranslations.com/v1/orders/:order_id/revisions
Response - 200
{ "data": [ { "id": 61233, "status": "completed", "body": "<p>Please spell last name as Silvia.</p>", "requested_at": "2025-03-22T19:56:01Z", "completed_at": "2025-03-22T23:13:27Z", "files": [] }, { "id": 61234, "status": "completed", "body": "<p>School name is Canterbury School.</p>", "requested_at": "2025-02-17T12:22:57Z", "completed_at": "2025-02-17T13:04:13Z", "files": [ { "id": 23904338, "name": "ID Document.jpg", "type": "reference", "size": 80296, "download_url": "https://api.abctranslations.com/v1/...", "created_at": "2025-02-17T12:21:04Z" } ] } ], "links": {...}, "meta": {...} }
Create a Revision
Create a new revision request for an order. Upload any optional files first, since their IDs go in the files array of this request. Only files of type reference are accepted. Returns a revision object.
Request
POST https://api.abctranslations.com/v1/orders/:order_id/revisions
{ "body": "<p>School name is Canterbury School.</p>", "files": [ 23904338 ] }
Request Parameters
| Field | Type | Required | Description |
|---|---|---|---|
body |
String | Y | Revision body - basic HTML allowed |
files |
Array | Y | List of file IDs |
Response - 201
{ "id": 61233, "status": "completed", "body": "<p>School name is Canterbury School.</p>", "requested_at": "2025-02-17T12:22:57Z", "completed_at": "2025-02-17T13:04:13Z", "files": [ { "id": 23904338, "name": "ID Document.jpg", "type": "reference", "size": 80296, "download_url": "https://api.abctranslations.com/v1/...", "created_at": "2025-02-17T12:21:04Z" } ] }
Retrieve a Revision
Retrieve detailed information about a specific revision request. Returns a revision object.
Request
GET https://api.abctranslations.com/v1/orders/:order_id/revisions/:revision_id
Response - 200
{ "id": 61233, "status": "completed", "body": "<p>School name is Canterbury School.</p>", "requested_at": "2025-02-17T12:22:57Z", "completed_at": "2025-02-17T13:04:13Z", "files": [ { "id": 23904338, "name": "ID Document.jpg", "type": "reference", "size": 80296, "download_url": "https://api.abctranslations.com/v1/...", "created_at": "2025-02-17T12:21:04Z" } ] }
Delete a Revision
Delete an existing revision request. Only revisions with a status of requested can be deleted through the API. For revisions with any other status, contact support.
Request
DELETE https://api.abctranslations.com/v1/orders/:order_id/revisions/:revision_id
Response - 204
No Content
SDKs & Samples
Every example in this reference is shown as a curl command you can copy and run. The same calls work from any HTTP client, and official SDKs wrap them in idiomatic methods for the most common languages.
| Language | Install |
|---|---|
| JavaScript / TypeScript | npm install @abctranslations/api |
| Python | pip install abctranslations |
| Java | com.abctranslations:api |
| C# / .NET | dotnet add package AbcTranslations.Api |
The SDKs are generated from the API's OpenAPI specification, so they stay in step with this reference. Contact us for SDK access.
Resources for AI coding assistants
Point AI coding assistants at llms.txt, a concise, machine-readable map of the site and its services.
- llms.txt — concise, machine-readable guide for coding assistants.
Samples
The same create-order call in several languages. Each sends the bearer token, a JSON body, and an idempotency key for safe retries.
cURL
curl https://api.abctranslations.com/v1/orders \ -H "Authorization: Bearer <token>" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: 7b3c1f9a-2d4e-4c8a-9f6b-1e2d3c4b5a6f" \ -d '{ "callback_url": "https://yourapp.com/webhooks/abc", "services": { "source_language": "es", "target_language": "en", "certification": true, "notarization": true }, "page_count": 2, "files": [2304778] }'
JavaScript / TypeScript
const res = await fetch("https://api.abctranslations.com/v1/orders", { method: "POST", headers: { "Authorization": `Bearer ${token}`, "Content-Type": "application/json", "Idempotency-Key": crypto.randomUUID(), }, body: JSON.stringify({ callback_url: "https://yourapp.com/webhooks/abc", services: { source_language: "es", target_language: "en", certification: true, notarization: true }, page_count: 2, files: [2304778], }), }); const order = await res.json();
Python
import uuid, requests res = requests.post( "https://api.abctranslations.com/v1/orders", headers={ "Authorization": f"Bearer {token}", "Idempotency-Key": str(uuid.uuid4()), }, json={ "callback_url": "https://yourapp.com/webhooks/abc", "services": {"source_language": "es", "target_language": "en", "certification": True, "notarization": True}, "page_count": 2, "files": [2304778], }, ) order = res.json()
Java
var body = """ {"callback_url":"https://yourapp.com/webhooks/abc", "services":{"source_language":"es","target_language":"en","certification":true,"notarization":true}, "page_count":2,"files":[2304778]} """; var request = HttpRequest.newBuilder() .uri(URI.create("https://api.abctranslations.com/v1/orders")) .header("Authorization", "Bearer " + token) .header("Content-Type", "application/json") .header("Idempotency-Key", UUID.randomUUID().toString()) .POST(HttpRequest.BodyPublishers.ofString(body)) .build(); var response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString());
C#
using var client = new HttpClient(); client.DefaultRequestHeaders.Authorization = new("Bearer", token); var payload = new { callback_url = "https://yourapp.com/webhooks/abc", services = new { source_language = "es", target_language = "en", certification = true, notarization = true }, page_count = 2, files = new[] { 2304778 }, }; using var content = new StringContent(JsonSerializer.Serialize(payload), Encoding.UTF8, "application/json"); content.Headers.Add("Idempotency-Key", Guid.NewGuid().ToString()); var response = await client.PostAsync("https://api.abctranslations.com/v1/orders", content); var order = await response.Content.ReadAsStringAsync();
Sandbox
Test your code in the sandbox environment first. Contact us to get your account approved, set up, and your access token generated. The sandbox mimics the normal life cycle of an order, and orders and revisions move to the next status automatically every two minutes. When an order leaves in_progress, we attach a single PDF file to it with a type of translation.
- For orders that include notarization, the status flow is
received,in_progress,client_review,approved, thencompleted. Once an order reachesclient_reviewit stops there, and you must approve it with the order approval endpoint. After approval it resumes moving automatically. - For orders without notarization, the status flow is
received,in_progress, thencompleted. - For revisions, the status flow is
requested,in_progress, thencompleted.
Changelog
Dated, newest first. Additive changes are backward compatible; breaking changes ship under a new path version and are announced here ahead of their Sunset date.
| Date | Change |
|---|---|
| 2026-06-01 | Added OAuth 2.0 client-credentials tokens, scoped permissions, idempotency keys, webhook signatures, and resumable large-file uploads. |
| 2025-02-01 | Initial public release of the v1 API: Languages, Files, Orders, and Revisions. |
Support & SLA
Document translation runs at $0.09 per word and certified pages at $24.10 per page, the same whether you order through the API or by hand. The sandbox is free to test against.
- Get help: contact our team for onboarding, higher rate limits, SDK access, or a security review.
- Status & uptime: production runs over HTTPS with monitored availability; ask us for the current status page and uptime targets.
- Security & privacy: files are encrypted at rest with no public access, and downloads use short-lived signed URLs. See our security and privacy pages.
Join 255,000+ happy customers
ABC Translations and its family of companies are proud to have delivered reliable, affordable, best-in-class translation and localization services to individuals, and global corporations and institutions for more than 25 years.
Join 255,000+ happy customers
ABC Translations and its family of companies are proud to have delivered reliable, affordable, best-in-class translation and localization services to individuals, and global corporations and institutions for more than 25 years.
Frequently asked questions
Answers to common questions about authentication, placing orders, webhooks, security, the sandbox, rate limits, and revisions when you build on the ABC Translations API.
How do I get a personal access token and start calling the API?
Contact us so our team can approve and set up your account and enable tokens on your profile. Once tokens are enabled, you generate and manage your personal access token from your account page. Send it in the Authorization header with the type set to Bearer, and start in the sandbox before you point your code at production.
Your token gives full read and write access to your account, so store it like a password and keep it out of client-side code.
How do I create an order through the API once my files are uploaded?
Upload each file with a multipart POST to the files endpoint, which returns an ID for every file. Then POST to the orders endpoint with those file IDs in the files array, plus your language codes and any services such as certification or notarization. The call returns an order object you can track from there.
How do webhooks tell my app when a translation order changes status?
Include a callback URL when you create the order, and we POST a JSON payload to it on every status change, so you never have to poll. You get notified on in_progress, client_review, completed, and cancelled.
We expect a 200 or 406 back from your endpoint. For any other code we retry the POST at 15 minutes, 1 hour, 4 hours, 8 hours, and 48 hours.
How do I approve a notarized order that is waiting in client_review?
Orders that include notarization stop at the client_review status and wait for you. Call the order approval endpoint on that order to approve it, and the order resumes moving toward completed. Until you approve, the notarized work is not finalized.
How are my uploaded files secured, and how long do download links last?
Files are encrypted and stored in an Amazon S3 bucket with no public access. To download a finished translation, you request a signed URL from the download endpoint, and that URL expires after five minutes, so generate it right before you fetch the file.
Can I test the full order life cycle before going live?
Yes. The sandbox mimics a real order: statuses advance automatically every two minutes, and when an order leaves in_progress we attach a sample PDF of type translation. Notarized orders pause at client_review until you approve them, exactly as production does, so you can rehearse your whole integration first.
What are the rate limits, and how should my integration handle high volume?
Requests are capped at 60 per minute, and going over returns a 429 status. Every response carries headers with your current rate limit details so you can pace your calls. Lean on webhooks for status updates instead of polling, and use pagination with per_page up to 500 items to pull large result sets efficiently.
Document translation runs at $0.09 per word and certified pages at $24.10 per page, the same whether you order through the API or by hand. For higher limits or a larger rollout, contact us to talk through it.
Can I request a revision to a finished translation through the API?
Yes. POST to the revision endpoint for the order, describe the change in the body field, and attach any marked-up reference files by uploading them first and passing their IDs. Revisions follow the flow requested, in_progress, completed. You can delete a revision while it is still in the requested status; for any other status, contact support.
















