Primeira integração
Implemente o fluxo mínimo: configure o cliente, autorize uma conexão, crie um trabalho, acompanhe o status e leia o resultado.
1. Prepare o cliente
Defina a URL base entregue para seu ambiente e mantenha a chave no backend.
DISTRISYNC_BASE_URL=<URL_BASE>
DISTRISYNC_API_KEY=<SUA_CHAVE>2. Crie uma conexão
POST
/api/v1/connections/authorizeCELESC aceita um e-mail válido. COPEL aceita CPF ou CNPJ com dígitos verificadores válidos, sem pontuação nem espaços. Para atualizar credenciais, envie o connectionId atual.
const response = await fetch(`${BASE_URL}/connections/authorize`, {
method: "POST",
headers: {
"X-API-Key": process.env.DISTRISYNC_API_KEY,
"Content-Type": "application/json"
},
body: JSON.stringify({
dist: "CELESC",
username: "integracao@exemplo.com.br",
password: process.env.DISTRIBUIDORA_PASSWORD
})
});
const connection = await response.json();3. Crie um trabalho
POST
/api/v1/jobs200 ou 202HTTP 202 significa que o trabalho foi aceito e deve ser acompanhado. HTTP 200 significa que o resultado já está completo. Trate os dois como sucesso.
const jobResponse = await fetch(`${BASE_URL}/jobs`, {
method: "POST",
headers,
body: JSON.stringify({
type: "invoice_sync_latest",
dist: "CELESC",
connectionId: connection.connectionId,
uc: "154026601110",
count: 1,
getPdfData: false,
forceRefresh: false
})
});
let job = await jobResponse.json();4. Acompanhe até o estado terminal
GET
/api/v1/jobs/{jobId}?limit=50&offset=0const waiting = new Set(["queued", "running", "cancelling"]);
while (waiting.has(job.status)) {
await new Promise(resolve => setTimeout(resolve, 2000));
const response = await fetch(
`${BASE_URL}/jobs/${job.jobId}?limit=50&offset=0`,
{ headers }
);
job = await response.json();
}5. Leia resultado e erro separadamente
if (job.status === "completed" || job.status === "partial_success") {
for (const invoice of job.result?.items ?? []) {
console.log(invoice.invoice.id, invoice.invoice.amount);
}
}
if (job.error) {
console.error(job.error.code, job.error.message);
}partial_success pode conter itens úteis e também um erro. Processe result.items e registre error para decidir se a parte ausente deve ser solicitada novamente.