Comece Aqui

Início Rápido

Este guia percorre todo o ciclo — obtenha uma chave, envie um documento, inicie o processamento e receba os resultados — usando uma fatura como exemplo. Se você ainda não instalou o curl ou configurou uma variável de ambiente para sua chave, veja Configuração de Ambiente primeiro.

Passo 1 — Obtenha sua chave de API

Sua chave de API está na página de configurações do perfil da sua conta, em Chave de API. A API v1 exige um plano pago (Básico ou superior) — chaves de planos Gratuitos são aceitas na verificação de autenticação, mas toda chamada subsequente retorna um erro plan_required. As chaves geradas daqui em diante terão o formato itt_live_<64 caracteres hexadecimais>; exporte a sua como variável de ambiente para não deixá-la fixa no código de um script:

export API_KEY="itt_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Passo 2 — Envie um documento

POST /api/v1/documents aceita um file (multipart) ou uma url que o servidor baixa para você — informe exatamente um deles. batch_name é opcional — se omitido, a API gera um para você (retornado na resposta) e todo documento que você quiser processar em conjunto deve compartilhar o mesmo batch_name. Este exemplo usa url com uma fatura de amostra real hospedada em nosso próprio site, então pode ser executado exatamente como está, sem necessidade de arquivo local:

curl -X POST https://imagetotable.ai/api/v1/documents \
  -H "Authorization: Bearer $API_KEY" \
  -F "url=https://imagetotable.ai/static/samples/invoice.webp"
import os
import requests

response = requests.post(
    "https://imagetotable.ai/api/v1/documents",
    headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
    data={"url": "https://imagetotable.ai/static/samples/invoice.webp"},
)
print(response.json())
const formData = new FormData();
formData.append("url", "https://imagetotable.ai/static/samples/invoice.webp");

const response = await fetch("https://imagetotable.ai/api/v1/documents", {
  method: "POST",
  headers: { "Authorization": `Bearer ${process.env.API_KEY}` },
  body: formData,
});
console.log(await response.json());

Tem um arquivo local? Substitua url por um campo file multipart — veja Enviar um documento na Referência para a lista completa de parâmetros, incluindo batch_name, template_id e password.

A resposta retorna o ID do novo documento e o lote em que ele foi inserido — salve batch_name, você precisará dele nas próximas duas etapas:

{
  "document_id": "3f9c9e2a-1b7d-4e2b-9a3e-2f5b6c7d8e9f",
  "batch_name": "260716-4K9P",
  "remaining_batch_capacity": 199
}

Enviar um PDF de várias páginas em vez de uma imagem funciona da mesma forma, exceto que document_id retorna como um array — um documento por página — já que cada página é processada de forma independente.

Etapa 3 — Iniciar o processamento

POST /api/v1/batches/{batch_name}/process inicia a extração. Você pode apontá-lo para um Template salvo via template_id, ou — como aqui — declarar os campos desejados inline com fields para uma execução única:

curl -X POST https://imagetotable.ai/api/v1/batches/260716-4K9P/process \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
        "fields": [
          {"name": "invoice_number"},
          {"name": "invoice_date"},
          {"name": "vendor_name"},
          {"name": "total_amount"}
        ]
      }'
import os
import requests

response = requests.post(
    "https://imagetotable.ai/api/v1/batches/260716-4K9P/process",
    headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
    json={
        "fields": [
            {"name": "invoice_number"},
            {"name": "invoice_date"},
            {"name": "vendor_name"},
            {"name": "total_amount"},
        ]
    },
)
print(response.json())
const response = await fetch("https://imagetotable.ai/api/v1/batches/260716-4K9P/process", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    fields: [
      { name: "invoice_number" },
      { name: "invoice_date" },
      { name: "vendor_name" },
      { name: "total_amount" },
    ],
  }),
});
console.log(await response.json());

Isso deduz créditos imediatamente (um documento deduzido por chamada) e coloca o(s) documento(s) na fila para processamento em segundo plano:

{
  "batch_name": "260716-4K9P",
  "queued": 1,
  "quality": "fast",
  "webhook_registered": false
}

Remova completamente fields e template_id e a API infere nomes de coluna razoáveis por conta própria. quality também é opcional — omita-o e o processamento usa a configuração de velocidade/qualidade da sua conta (veja Configurações da Conta e Comportamento da API). webhook_registered: false aqui significa apenas que esta chamada específica não incluiu webhook_url — não significa que nenhum webhook está registrado para este lote; consulte a referência de Lotes se você estiver registrando um separadamente via PUT .../webhook.

Etapa 4 — Consulte e obtenha seus resultados

O processamento é assíncrono — consulte GET /api/v1/batches/{batch_name} até que all_done seja true (alguns segundos para um único documento) ou registre um webhook em vez de consultar. O ciclo de vida completo é abordado no guia Async Task Model.

Quando terminar, busque os resultados reorganizados:

curl https://imagetotable.ai/api/v1/batches/260716-4K9P/results \
  -H "Authorization: Bearer $API_KEY"
import os
import requests

response = requests.get(
    "https://imagetotable.ai/api/v1/batches/260716-4K9P/results",
    headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
)
print(response.json())
const response = await fetch("https://imagetotable.ai/api/v1/batches/260716-4K9P/results", {
  headers: { "Authorization": `Bearer ${process.env.API_KEY}` },
});
console.log(await response.json());

O JSON de resposta nunca é separado por guias de idioma — a estrutura não muda com base em qual cliente enviou a requisição:

{
  "batch_name": "260716-4K9P",
  "status": "succeeded",
  "created_at": "2026-07-16T09:12:03Z",
  "started_at": "2026-07-16T09:12:05Z",
  "completed_at": "2026-07-16T09:12:14Z",
  "documents": [
    {
      "document_id": "3f9c9e2a-1b7d-4e2b-9a3e-2f5b6c7d8e9f",
      "filename": "invoice.jpg",
      "status": "succeeded",
      "created_at": "2026-07-16T09:12:03Z",
      "started_at": "2026-07-16T09:12:05Z",
      "completed_at": "2026-07-16T09:12:14Z",
      "line_items": [
        {
          "invoice_number": "INV-1042",
          "invoice_date": "2026-06-30",
          "vendor_name": "Acme Supply Co.",
          "total_amount": "1,284.50"
        }
      ]
    }
  ]
}

completed_at é definido quando um documento (ou, no nível do lote, todos os documentos do lote) atinge um estado terminal — succeeded, failed ou canceled. Permanece null enquanto ainda estiver queued ou processing, e no nível do lote também permanece null até que todos os documentos do lote tenham terminado, mesmo que alguns deles tenham terminado antes.

Próximos passos

A partir daqui: leia Modelo de Tarefa Assíncrona para o ciclo de vida completo do status, Webhooks para ser notificado em vez de fazer polling, e Referência da API para a lista completa de parâmetros de cada endpoint.

📮 contact email: [email protected]