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

  1. 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.
  2. Upload each document: POST /uploads → PUT the bytes to upload_url with the same Content-Type.
  3. POST /quotes to see pages and amount (cents, at your organization's rate), then POST /orders with an Idempotency-Key header and the end customer's name, email and phone.
  4. Poll GET /orders/{id} or register a webhook for order.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_… or jlb_test_…. Keys carry scopes (orders:read, orders:write, documents:read, webhooks:manage) and a per-key rate limit (120 requests/min by default; 429 with retry_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 returns 409.
  • 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"); send end_customer.notify: false to 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].