Referência da API
Integre o Data2MD no seu fluxo com um único HTTP POST. Incluída na assinatura; até 200 MB por requisição.
Autenticação
Toda requisição leva um token no cabeçalho Authorization. O token pertence a uma conta com assinatura ativa e é criado no seu painel.
Authorization: Bearer d2md_4f1c8ab2d3e076950000000000000000000000000000beef
O token aparece uma única vez e é guardado apenas como hash, então trate-o como uma senha. Gerar um novo substitui o anterior na hora.
Endpoint
https://aiu4.com/api
Content-Type: multipart/form-data
Campos da requisição
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
file | file | Sim | O arquivo a converter. Máx 200 MB. |
format | string | Não | Formato do arquivo. Padrão: pdf. Suportado atualmente: pdf. |
Resposta de sucesso 201 Created
preview traz até ~8 KB de Markdown cortado num final de linha. preview_truncated indica se o arquivo é maior; busque o documento completo via download_url.
{
"success": true,
"hash": "a3f9c12b84e7d01",
"original_name": "report.pdf",
"format": "pdf",
"lines": 148,
"characters": 9342,
"pages": 3,
"download_url": "/download?hash=a3f9c12b84e7d01",
"preview": "# Report Title\n\n...",
"preview_truncated": false
}
Resposta de erro 4xx · 5xx
{
"success": false,
"message": "The API is part of the subscription.",
"code": "plan_required"
}
Todo erro traz success: false e uma message legível. Onde houver code, decida pelo code e não pelo texto da mensagem.
| Status | Code | Significado |
|---|---|---|
| 401 | token_required | Sem cabeçalho Authorization, ou com um que não é bearer token. |
| 401 | token_invalid | O token não existe — foi substituído, revogado, ou a conta dele foi excluída. |
| 403 | plan_required | Token válido numa conta sem assinatura ativa. |
| 422 | — | O arquivo foi recusado: tipo errado, acima do limite de tamanho, ou sem camada de texto para extrair. |
| 429 | — | O limite de uso foi consumido. Retry-After diz quantos segundos esperar. |
| 503 | — | Todas as vagas de conversão estão ocupadas, ou esta instalação está com contas desligadas. |
Limites de uso
1 requisição(ões) a cada 30 segundos, contadas por conta e separadas do que a mesma conta converte no site. Exceder retorna 429 Too Many Requests.
As respostas de conversão e de /api/me trazem X-RateLimit-Limit, X-RateLimit-Remaining e X-RateLimit-Reset, um timestamp Unix. Um 429 acrescenta Retry-After em segundos.
Conferir a conta
https://aiu4.com/api/me
Devolve o plano por trás do token, os limites que se aplicam a ele e quanto resta da janela atual.
{
"success": true,
"email": "you@example.com",
"plan": "premium",
"api_access": true,
"limits": {
"max_conversions": 1,
"window_seconds": 30,
"max_file_size_bytes": 209715200
},
"rate_limit": { "limit": 1, "remaining": 0, "reset": 1767225600 },
"subscription": { "status": "active", "current_period_end": 1767225600, "cancel_at_period_end": false },
"token": { "prefix": "d2md_4f1c", "last4": "beef", "created_at": 1764547200, "rotated_at": null, "last_used_at": 1767139200 }
}
Funciona em qualquer plano e não entra no limite de uso, então um 403 numa conversão sempre pode ser explicado: leia api_access e plan.
Exemplos
cURL
curl -X POST https://aiu4.com/api \ -H "Authorization: Bearer $D2MD_TOKEN" \ -F "file=@document.pdf" \ -F "format=pdf" curl https://aiu4.com/api/me \ -H "Authorization: Bearer $D2MD_TOKEN"
PHP
// stream a file via cURL $ch = curl_init('https://aiu4.com/api'); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('D2MD_TOKEN')], CURLOPT_POSTFIELDS => [ 'file' => new CURLFile('document.pdf', 'application/pdf', 'document.pdf'), 'format' => 'pdf', ], ]); $data = json_decode(curl_exec($ch), true); curl_close($ch); $markdown = file_get_contents('https://aiu4.com' . $data['download_url']); echo $markdown;
Python
import os, requests headers = {'Authorization': 'Bearer ' + os.environ['D2MD_TOKEN']} with open('document.pdf', 'rb') as f: r = requests.post('https://aiu4.com/api', headers=headers, files={'file': f}, data={'format': 'pdf'}) data = r.json() markdown = requests.get('https://aiu4.com' + data['download_url']).text print(markdown)