Attesto

Tarifs et vérification des traductions certifiées de documents pour l’immigration américaine (USCIS) : prix en direct par page et devis, les 80 langues prises en charge, les types de documents et les règles de certification de traduction USCIS. Lecture seule, sans inscription.

Serveur MCP hébergé

npx add-mcp 'https://attestodocs.com/mcp'

S’installe dans Claude Code, Codex, Cursor et plus

Documentation

API documentation

Everything the site does, as REST. Versioned at /api/v1, key authentication, idempotent POSTs, HMAC-signed webhooks. OpenAPI spec →

Authentication

Create keys in your firm portal. Live keys start atk\_live\_, sandbox keys atk\_test\_ — sandbox orders complete instantly with clearly-marked fake deliverables and cost nothing. Send the key on every request:


Authorization: Bearer atk_live_xxxxxxxx

POSTs accept an Idempotency-Key header — retries with the same key replay the original response. Rate limit: 60 requests/minute per key (429 with your limit when exceeded).

Place an order — cURL


# 1. Presign an upload
curl -s https://attestodocs.com/api/v1/documents \
  -H "Authorization: Bearer $ATTESTO_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: upl-001" \
  -d '{"filename":"birth-certificate.pdf","contentType":"application/pdf","byteSize":18037}'
# → { "key": "documents/…", "uploadUrl": "…" }

# 2. Upload the file bytes
curl -s -X PUT "$UPLOAD_URL" -H "Content-Type: application/pdf" \
  --data-binary @birth-certificate.pdf

# 3. Quote (page count + language detection + locked price)
curl -s https://attestodocs.com/api/v1/quotes \
  -H "Authorization: Bearer $ATTESTO_KEY" \
  -H "Content-Type: application/json" \
  -d '{"documents":[{"key":"'$KEY'","filename":"birth-certificate.pdf","mimeType":"application/pdf"}]}'
# → { "quoteToken": "…", "totalCents": 2495, "totalPages": 1, … }

# 4. Create the order
curl -s https://attestodocs.com/api/v1/orders \
  -H "Authorization: Bearer $ATTESTO_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: ord-001" \
  -d '{"quoteToken":"'$QUOTE_TOKEN'","email":"paralegal@firm.example","matterNumber":"2026-0142"}'
# → { "orderNumber": "AT-…", "status": "PAID", "billing": "invoice_net30", … }

# 5. Poll status (or subscribe a webhook instead)
curl -s https://attestodocs.com/api/v1/orders/$ORDER_NUMBER \
  -H "Authorization: Bearer $ATTESTO_KEY"

# 6. Download deliverables when status is CLIENT_REVIEW or DELIVERED
curl -s https://attestodocs.com/api/v1/orders/$ORDER_NUMBER/deliverables \
  -H "Authorization: Bearer $ATTESTO_KEY"

Node.js


const BASE = "https://attestodocs.com/api/v1";
const KEY = process.env.ATTESTO_KEY;
const h = { authorization: `Bearer ${KEY}`, "content-type": "application/json" };

// 1–2. presign + upload
const bytes = await fs.promises.readFile("birth-certificate.pdf");
const presign = await fetch(`${BASE}/documents`, {
  method: "POST", headers: h,
  body: JSON.stringify({ filename: "birth-certificate.pdf", contentType: "application/pdf", byteSize: bytes.length }),
}).then(r => r.json());
await fetch(presign.uploadUrl, { method: "PUT", headers: { "content-type": "application/pdf" }, body: bytes });

// 3. quote
const quote = await fetch(`${BASE}/quotes`, {
  method: "POST", headers: h,
  body: JSON.stringify({ documents: [{ key: presign.key, filename: "birth-certificate.pdf", mimeType: "application/pdf" }] }),
}).then(r => r.json());

// 4. order
const order = await fetch(`${BASE}/orders`, {
  method: "POST", headers: { ...h, "idempotency-key": "ord-001" },
  body: JSON.stringify({ quoteToken: quote.quoteToken, email: "paralegal@firm.example", matterNumber: "2026-0142" }),
}).then(r => r.json());
console.log(order.orderNumber, order.status);

Python


import os, requests

BASE = "https://attestodocs.com/api/v1"
H = {"Authorization": f"Bearer {os.environ['ATTESTO_KEY']}"}

# 1–2. presign + upload
data = open("birth-certificate.pdf", "rb").read()
presign = requests.post(f"{BASE}/documents", headers=H, json={
    "filename": "birth-certificate.pdf", "contentType": "application/pdf", "byteSize": len(data),
}).json()
requests.put(presign["uploadUrl"], data=data, headers={"Content-Type": "application/pdf"})

# 3. quote
quote = requests.post(f"{BASE}/quotes", headers=H, json={
    "documents": [{"key": presign["key"], "filename": "birth-certificate.pdf", "mimeType": "application/pdf"}],
}).json()

# 4. order
order = requests.post(f"{BASE}/orders", headers={**H, "Idempotency-Key": "ord-001"}, json={
    "quoteToken": quote["quoteToken"], "email": "paralegal@firm.example", "matterNumber": "2026-0142",
}).json()
print(order["orderNumber"], order["status"])

Webhooks

Subscribe with POST /webhooks to order.paid, order.client\_review, order.delivered and every other transition. Each delivery is signed; verify like this:


import { createHmac, timingSafeEqual } from "crypto";

function verify(req, secret) {
  const ts = req.headers["x-attesto-timestamp"];
  const sig = req.headers["x-attesto-signature"]; // "sha256=…"
  const expected = "sha256=" + createHmac("sha256", secret)
    .update(`${ts}.${req.rawBody}`).digest("hex");
  return timingSafeEqual(Buffer.from(sig), Buffer.from(expected))
    && Math.abs(Date.now() / 1000 - Number(ts)) < 300; // 5-min tolerance
}

Errors

Every failure returns { "error": { "code", "message" } } with a stable code: unauthorized, insufficient_scope, rate_limited, invalid_request, document_not_found, unreadable_document, quote_expired, matter_number_required, not_found, not_ready.


Source: https://attestodocs.com/docs/api