Attesto
Consulta y verifica traducciones certificadas de documentos para inmigración de EE. UU. (USCIS): precios en vivo por página y cotizaciones, los 80 idiomas compatibles, tipos de documentos y las reglas de certificación de traducción de USCIS. Solo lectura, sin registro.
Servidor MCP alojado
npx add-mcp 'https://attestodocs.com/mcp'Se instala en Claude Code, Codex, Cursor y más
Documentación
Documentación de la API
Todo lo que el sitio hace, como REST. Versionado en /api/v1, autenticación por clave, POSTs idempotentes, webhooks firmados con HMAC. Especificación OpenAPI →
Autenticación
Crea claves en el portal de tu firma. Las claves en vivo comienzan con atk\_live\_, las claves de sandbox con atk\_test\_ — los pedidos de sandbox se completan al instante con entregables falsos claramente marcados y no cuestan nada. Envía la clave en cada solicitud:
Authorization: Bearer atk_live_xxxxxxxx
Los POSTs aceptan un encabezado Idempotency-Key — los reintentos con la misma clave reproducen la respuesta original. Límite de velocidad: 60 solicitudes/minuto por clave (429 con tu límite cuando se excede).
Realizar un pedido — 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
Suscríbete con POST /webhooks a order.paid, order.client\_review, order.delivered y cualquier otra transición. Cada entrega está firmada; verifícala así:
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
}
Errores
Cada fallo devuelve { "error": { "code", "message" } } con un code estable: unauthorized, insufficient_scope, rate_limited, invalid_request, document_not_found, unreadable_document, quote_expired, matter_number_required, not_found, not_ready.
Fuente: https://attestodocs.com/docs/api