Skip to main content

Criar upload

Após o envio, o arquivo é processado automaticamente. Nenhuma configuração adicional é necessária.

Endpoint

POST /v2/file_uploads

Requisição

curl -X POST https://api.base39.com.br/v2/file_uploads \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -d '{
    "filename": "balanco_2024.pdf",
    "content_type": "application/pdf"
  }'

Resposta

{
	"object": "file_upload",
	"id": "fu_abc123def456",
	"status": "pending",
	"filename": "balanco_2024.pdf",
	"content_type": "application/pdf",
	"upload_url": "https://s3.amazonaws.com/bucket/...?X-Amz-Signature=...",
	"expires_at": "2024-12-07T12:00:00.000Z",
	"parsing": {
		"status": "not_started"
	}
}

Enviar o arquivo

Use a upload_url retornada para enviar o conteúdo do arquivo via PUT:
curl -X PUT "https://s3.amazonaws.com/bucket/...?X-Amz-Signature=..." \
  -H "Content-Type: application/pdf" \
  --data-binary @/caminho/do/arquivo.pdf
A URL expira em 1 hora. O arquivo deve ser enviado logo após criar o upload.

Exemplo completo em JavaScript

async function uploadFile(file) {
	// Criar upload e obter URL
	const response = await fetch('https://api.base39.com.br/v2/file_uploads', {
		method: 'POST',
		headers: {
			'Content-Type': 'application/json',
			Authorization: 'Bearer YOUR_TOKEN',
		},
		body: JSON.stringify({
			filename: file.name,
			content_type: file.type,
		}),
	})

	const { id, upload_url } = await response.json()

	// Enviar arquivo para S3
	await fetch(upload_url, {
		method: 'PUT',
		headers: { 'Content-Type': file.type },
		body: file,
	})

	// Aguardar processamento
	let fileUpload
	do {
		await new Promise((r) => setTimeout(r, 2000))

		const res = await fetch(`https://api.base39.com.br/v2/file_uploads/${id}`, {
			headers: { Authorization: 'Bearer YOUR_TOKEN' },
		})
		fileUpload = await res.json()
	} while (fileUpload.parsing.status === 'pending' || fileUpload.parsing.status === 'processing')

	return fileUpload
}

// Uso
const file = document.querySelector('input[type="file"]').files[0]
const result = await uploadFile(file)

if (result.parsing.status === 'completed') {
	console.log('Template:', result.parsing.template)
	console.log('Dados:', result.parsed_data)
}

Exemplo em Python

import requests
import time

def upload_file(file_path: str, token: str):
    # Criar upload
    with open(file_path, 'rb') as f:
        filename = file_path.split('/')[-1]
        content_type = 'application/pdf'

        response = requests.post(
            'https://api.base39.com.br/v2/file_uploads',
            headers={
                'Authorization': f'Bearer {token}',
                'Content-Type': 'application/json'
            },
            json={
                'filename': filename,
                'content_type': content_type
            }
        )

        data = response.json()
        file_id = data['id']
        upload_url = data['upload_url']

        # Enviar arquivo
        f.seek(0)
        requests.put(
            upload_url,
            headers={'Content-Type': content_type},
            data=f
        )

    # Aguardar processamento
    while True:
        time.sleep(2)
        response = requests.get(
            f'https://api.base39.com.br/v2/file_uploads/{file_id}',
            headers={'Authorization': f'Bearer {token}'}
        )
        file_upload = response.json()

        if file_upload['parsing']['status'] not in ['pending', 'processing']:
            break

    return file_upload

# Uso
result = upload_file('/caminho/para/balanco.pdf', 'YOUR_TOKEN')
print(f"Template: {result['parsing']['template']}")

Parâmetros

CampoTipoObrigatórioDescrição
filenamestringSimNome do arquivo (máx. 900 caracteres)
content_typestringSimTipo MIME do arquivo
size_bytesnumberNãoTamanho em bytes para validação prévia

Limites de tamanho

PlanoMáximo por arquivo
Free5 MB
Paid5 GB