Attesto
Preços e verificação de traduções certificadas de documentos para imigração dos EUA (USCIS): preços por página e orçamentos em tempo real, os 80 idiomas suportados, tipos de documentos e as regras de certificação de tradução da USCIS. Somente leitura, sem cadastro.
Servidor MCP hospedado
npx add-mcp 'https://attestodocs.com/mcp'Instala no Claude Code, Codex, Cursor e outros
Documentação
Documentação da API
Tudo o que o site faz, via REST. Versionado em /api/v1, autenticação por chave, POSTs idempotentes, webhooks assinados com HMAC. Especificação OpenAPI →
Autenticação
Crie chaves no portal da sua empresa. Chaves de produção começam com atk\_live\_, chaves de sandbox com atk\_test\_ — pedidos em sandbox são concluídos instantaneamente com entregas fictícias claramente marcadas e não custam nada. Envie a chave em todas as solicitações:
Authorization: Bearer atk_live_xxxxxxxx
POSTs aceitam um cabeçalho Idempotency-Key — novas tentativas com a mesma chave reproduzem a resposta original. Limite de taxa: 60 solicitações/minuto por chave (429 com seu limite quando excedido).
Fazer um 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
Assine com POST /webhooks para order.paid, order.client\_review, order.delivered e qualquer outra transição. Cada entrega é assinada; verifique assim:
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
}
Erros
Toda falha retorna { "error": { "code", "message" } } com um code estável: unauthorized, insufficient_scope, rate_limited, invalid_request, document_not_found, unreadable_document, quote_expired, matter_number_required, not_found, not_ready.