Attesto

Định giá và kiểm tra bản dịch tài liệu có chứng nhận cho di trú Hoa Kỳ (USCIS): giá theo trang trực tiếp và báo giá, 80 ngôn ngữ được hỗ trợ, loại tài liệu và quy tắc chứng nhận bản dịch của USCIS. Chỉ đọc, không cần đăng ký.

Máy chủ MCP được lưu trữ

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

Cài vào Claude Code, Codex, Cursor và nhiều công cụ khác

Tài liệu

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