JukeLingo for Business API v1
Submit documents for translator-certified translation from your own systems, track status, download the English translation plus certification page, request corrections, and receive webhooks. Every business translation is signed by a JukeLingo translator.
Quickstart
- An owner or admin creates a key under Developers in the portal. Start with a sandbox key (
jlb_test_…): sandbox orders walk the real statuses and are delivered with a SAMPLE file — never billed, never sent to a translator. - Upload each document:
POST /uploads→ PUT the bytes toupload_urlwith the sameContent-Type. POST /quotesto see pages and amount (cents, at your organization's rate), thenPOST /orderswith anIdempotency-Keyheader and the end customer's name, email and phone.- Poll
GET /orders/{id}or register a webhook fororder.delivered; download deliverables from the URLs in the response.
curl -X POST https://jukelingo.com/api/v1/business/orders \
-H "Authorization: Bearer jlb_test_…" \
-H "Idempotency-Key: order-2026-0042-attempt-1" \
-H "Content-Type: application/json" \
-d '{
"documents": [{ "upload_id": "<upload_id>", "content_type": "application/pdf", "filename": "acta.pdf" }],
"source_language": "es",
"external_reference": "2026-0042",
"end_customer": { "name": "Lucía Ramírez Ejemplo", "email": "[email protected]", "phone": "+15555550100", "sms_consent": false }
}'Authentication, limits, idempotency
Authorization: Bearer jlb_live_…orjlb_test_…. Keys carry scopes (orders:read,orders:write,documents:read,webhooks:manage) and a per-key rate limit (120 requests/min by default;429withretry_after_seconds).- Writes require
Idempotency-Key(8–128 chars). The same key with the same body replays the original response (Idempotent-Replayed: true); a different body returns409. - Errors are JSON:
{ "error": { "code": "…", "message": "…" } }. - The end customer's contact is stored encrypted, shown to the assigned translator only while the job is active, never logged, and texted only with
sms_consent: true. By default JukeLingo emails the customer a tracking link at submission and delivery ("Translations by JukeLingo"); sendend_customer.notify: falseto handle all customer communication yourself.
Endpoints
get/me — The key's organization and permissions
post/uploads — Create a presigned upload for one document
PUT the file bytes to `upload_url` (same `Content-Type`), then reference `upload_id` in a quote or order. Accepted: PDF, JPEG, PNG, WEBP, HEIC; up to 25 MB and 30 pages per document.
post/quotes — Quote uploaded documents (no order created)
post/orders — Create an order
One order per call, up to 10 documents. `end_customer` (name, email, phone) is required so the translator can ask questions and the customer can track delivery; it is stored encrypted and never logged. `billing_owner` defaults to `partner` (your organization is billed); `customer` is not available yet.
Parameters: Idempotency-Key (header, required)
get/orders — List orders (newest first)
Parameters: limit (query) · cursor (query) · status (query) · external_reference (query)
get/orders/{id} — Fetch an order
Parameters: id (path, required)
get/orders/{id}/documents/{document_id}/download — Download a deliverable (PDF or DOCX)
Streams the file (`Content-Disposition: attachment`). Every download is audited.
Parameters: id (path, required) · document_id (path, required)
post/orders/{id}/edit-requests — Request a correction
Within 60 days of delivery. A genuine translator error is corrected free (same translator first); firm-side changes need a new order.
Parameters: id (path, required) · Idempotency-Key (header, required)
get/webhooks — List webhook endpoints
post/webhooks — Create a webhook endpoint
The signing secret is returned ONCE. Verify `JL-Signature: t=<unix>,v1=<hex HMAC-SHA256 of "<t>.<body>">` with it; reject timestamps older than 5 minutes. Events: order.status_changed, order.delivered, edit_request.resolved.
Parameters: Idempotency-Key (header, required)
delete/webhooks/{id} — Delete a webhook endpoint
Parameters: id (path, required)
post/webhooks/{id}/test — Send a ping event to this endpoint only
Parameters: id (path, required)
Webhooks
We POST JSON { id, type, created_at, sandbox, data } and sign it: JL-Signature: t=<unix seconds>,v1=<hex HMAC-SHA256 of "<t>.<raw body>" with your endpoint secret>. Reject signatures older than 5 minutes. We retry up to 5 times with increasing backoff over several hours; respond 2xx quickly and process asynchronously. Deliveries are replayable from the portal. A test ping goes only to the endpoint you chose.
order.status_changed{ "order_id": "uuid", "external_reference": "string|null", "status": "public status", "previous_status": "public status" }order.delivered{ "order_id": "uuid", "document_id": "uuid", "version": 0, "certification_id": "CT-…", "pdf": "download url", "docx": "download url|null" }edit_request.resolved{ "order_id": "uuid", "document_id": "uuid", "edit_request_id": "uuid", "resolution": "corrected|no_change_needed|new_order_required", "version": "integer|null" }
Hosted order page and widget
No code? Enable the co-branded hosted order page under Developers → Hosted order page & widget and link to it, or drop the widget on your site:
<div id="jukelingo-order"></div>
<script src="https://jukelingo.com/business-widget.js" data-partner="your-slug" data-target="#jukelingo-order"></script>
<script>
window.addEventListener("message", (e) => {
if (e.data && e.data.type === "jl:order_submitted") console.log("order", e.data.orderId);
});
</script>Deliverable: the English translation plus the translator's certification page. Delivery windows are per your account; they are a window, not a guarantee. Questions: [email protected].