// rest api

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

POST https://aiu4.com/api

Content-Type: multipart/form-data

Campos da requisição

CampoTipoObrigatórioDescrição
filefileSimO arquivo a converter. Máx 200 MB.
formatstringNãoFormato 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.

StatusCodeSignificado
401token_requiredSem cabeçalho Authorization, ou com um que não é bearer token.
401token_invalidO token não existe — foi substituído, revogado, ou a conta dele foi excluída.
403plan_requiredToken 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

GET 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)