API de Parceiros
REST sobre HTTPS para partidos políticos e escritórios contábeis integrarem com a plataforma QueroApoiar. Autenticação por chave, respostas em JSON, webhooks assinados.
Quem usa
Dois perfis de parceiro acessam a mesma API com chaves distintas. O escopo de cada chave (criar/editar/ler) é definido pela QueroApoiar no momento da emissão.
Partido político
Pré-cadastra os candidatos filiados em lote, atualiza dados ao longo da campanha e acompanha doações para auditoria interna. Ver detalhes →
Escritório contábil
Acessa em modo leitura os candidatos vinculados ao escritório e extrai doações no detalhe necessário para a prestação de contas eleitoral no SPCE. Ver detalhes →
Início rápido
1. Receba a chave
A chave é emitida pela QueroApoiar após a assinatura do contrato. Cada
parceiro recebe duas: uma de homologação ({sigla}_test_…) e
outra de produção ({sigla}_live_…).
2. Faça a primeira chamada
# Listar candidatos do seu partido
curl https://api.queroapoiar.com.br/api/parceiros/candidatos \
-H "X-API-Key: {sua_chave}"
const response = await fetch(
"https://api.queroapoiar.com.br/api/parceiros/candidatos",
{ headers: { "X-API-Key": process.env.QA_API_KEY } }
);
const { items } = await response.json();
console.log(items);
import os, requests
resp = requests.get(
"https://api.queroapoiar.com.br/api/parceiros/candidatos",
headers={"X-API-Key": os.environ["QA_API_KEY"]},
)
print(resp.json())
<?php
$ch = curl_init("https://api.queroapoiar.com.br/api/parceiros/candidatos");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ["X-API-Key: " . getenv("QA_API_KEY")]);
$resp = curl_exec($ch);
echo $resp;
3. Cadastre um candidato
curl -X POST https://api.queroapoiar.com.br/api/parceiros/candidatos \
-H "X-API-Key: {sua_chave}" \
-H "Content-Type: application/json" \
-d '{
"cpf": "12345678900",
"nome": "Maria Silva Santos",
"nomeUrna": "Maria do Bairro",
"email": "[email protected]",
"telefone": "11999998888",
"cargo": "deputado_federal",
"uf": "SP",
"municipio": "São Paulo",
"tituloEleitor": "123456789012",
"genero": "F",
"slug": "maria-do-bairro"
}'
O campo cargo tem 13 valores possíveis (enum fechado). A API rejeita
qualquer valor fora dessa lista com 422 CARGO_INVALIDO. Veja a lista
completa em Cargos válidos.
Os campos genero (M/F) e slug são opcionais.
genero personaliza o tratamento no email de boas-vindas
(Bem-vindo / Bem-vinda); se omitido, é inferido do cargo. slug
define a URL pública (queroapoiar.com.br/{slug}); se omitido,
é gerado de nomeUrna; se ocupado, retorna
409 SLUG_OCUPADO.
O candidato recebe um e-mail com link para definir a senha. Em seguida paga a taxa de inscrição, valida o celular e a campanha vai ao ar.
Partidos
Use a API para pré-cadastrar candidatos antes da abertura das campanhas. Substitui digitação manual e mantém o CRM interno sincronizado com a plataforma.
Endpoints disponíveis
| Operação | Endpoint | Permissão necessária |
|---|---|---|
| Cadastrar candidato individual | POST /candidatos | candidatos.criar |
| Cadastrar em lote | POST /candidatos/lote | candidatos.criar |
| Atualizar dados | PATCH /candidatos/{cpf} | candidatos.editar |
| Listar candidatos | GET /candidatos | candidatos.ler |
| Consultar candidato | GET /candidatos/{cpf} | candidatos.ler |
| Acompanhar doações | GET /doacoes | doacoes.ler |
Volume
Até 1.000 candidatos: chamadas individuais ou dois lotes de 500.
Acima disso, use sempre /candidatos/lote - retorna
um jobId para acompanhar o processamento.
LGPD. O acesso a doações com PII completa (nome, CPF e e-mail do doador) requer DPA assinado entre o partido e a QueroApoiar.
Contadores
Chave configurada em modo somente leitura. Permite extrair candidatos e doações do escritório para prestação de contas eleitoral, sem risco de alteração.
Endpoints disponíveis
| Operação | Endpoint | Uso típico |
|---|---|---|
| Listar candidatos | GET /candidatos | Conferir quem está ativo |
| Consultar candidato | GET /candidatos/{cpf} | Detalhes para FCC e NF |
| Doações de um candidato | GET /candidatos/{cpf}/doacoes | Escrituração mensal |
| Todas as doações | GET /doacoes | Conciliação por período |
| Resumo agregado | GET /doacoes/resumo | Relatório executivo |
Extrair doações do mês
curl "https://api.queroapoiar.com.br/api/parceiros/doacoes?desde=2026-09-01&ate=2026-09-30&status=paga&limite=100" \
-H "X-API-Key: {sua_chave}"
Resposta com doador (nome, CPF, e-mail), valor, forma de pagamento e gateway - campos suficientes para gerar o FCC e a prestação no SPCE.
Autenticação
Toda chamada inclui o cabeçalho X-API-Key. O backend
identifica o parceiro pela chave e filtra os recursos automaticamente -
cada parceiro só vê o próprio escopo.
X-API-Key: {sigla}_{ambiente}_{token}
# Exemplos:
X-API-Key: pt_live_a3f9b2c8d1e4f7a0b3c6d9e2f5a8b1c4
X-API-Key: pmdb_test_e5c1a8b2d6f9c3e7a0b4d8f1c5e9a2b6
Estrutura da chave
{sigla}- código do partido em minúsculas (ex.:pt,pmdb){ambiente}-live(produção) outest(homologação){token}- 48 caracteres hexadecimais aleatórios
Segurança. Armazene a chave em cofre de senhas (1Password, AWS Secrets Manager, Vault). Nunca comite no Git ou cole em planilhas. Em caso de suspeita de vazamento, solicite rotação - a chave antiga é invalidada imediatamente.
Fluxo de cadastro
Sequência disparada quando o parceiro cria um candidato via API até a campanha entrar no ar:
- Pré-cadastro - API cria conta, perfil eleitoral e campanha em estado pendente.
- E-mail - candidato recebe link para definir a senha.
- Primeiro acesso - ao clicar, define a senha e entra no painel.
- Pagamento - candidato paga a inscrição (responsabilidade dele).
- SMS - validação do celular obrigatória por regulação.
- Publicação - campanha vai ao ar e passa a receber doações.
Quem paga a inscrição. O partido cadastra sem custo via API. Cada candidato paga a própria taxa de inscrição ao ativar a campanha - adesão individual e em conformidade com a legislação.
Escopo e permissões
Cada chave carrega um conjunto de permissões granulares definido pela QueroApoiar no momento da emissão.
| Permissão | O que libera | Padrão para partido | Padrão para contador |
|---|---|---|---|
candidatos.criar | POST /candidatos e /lote | Sim | Não |
candidatos.editar | PATCH /candidatos/{cpf} | Sim | Não |
candidatos.ler | GET /candidatos e detalhes | Sim | Sim |
doacoes.ler | GET /doacoes e /resumo | Sim | Sim |
Sem a permissão necessária, a API retorna 403 PERMISSAO_NEGADA.
Permissões podem ser alteradas pelo painel administrativo sem rotacionar
a chave.
Rate limits
| Limite | Padrão | Configurável |
|---|---|---|
| Requisições por minuto (por chave) | 600 | Sim, por contrato |
| Requisições por minuto (por IP) | 1.200 | Não |
| Candidatos por chamada de lote | 500 | Sim, por contrato |
| Quota diária de candidatos (por chave) | 5.000/dia | Sim, por contrato |
Excedido o limite por minuto, a API responde
429 RATE_LIMIT_EXCEDIDO com Retry-After em
segundos. Excedida a quota diária, responde
429 QUOTA_DIARIA_EXCEDIDA e reseta às 00h UTC.
HTTP/1.1 429 Too Many Requests
Retry-After: 60
RateLimit-Limit: 600
RateLimit-Remaining: 0
RateLimit-Reset: 60
Content-Type: application/json
{
"erro": "RATE_LIMIT_EXCEDIDO",
"mensagem": "Limite de 600 requisições por minuto excedido para esta chave."
}
Webhooks
Configure a webhookUrl no momento de criação da chave para
receber notificações assinadas (HMAC-SHA256). A URL fica
amarrada à chave e não pode ser sobrescrita por
requisição — pra trocar, peça atualização ao admin.
Eventos suportados
type | Quando dispara |
|---|---|
donacao.confirmada | Doação confirmada pelo gateway (paid=true, status=authorized) |
donacao.cancelada | Doação cancelada/recusada pelo gateway |
donacao.estornada | Estorno (refund/chargeback) processado |
candidatos_lote.concluido | Job de POST /candidatos/lote terminou de processar |
O admin define quais eventos a chave recebe via
filtro webhookEventos. Vazio = todos os tipos liberados pelas
permissões da chave.
Headers do POST
POST {sua webhookUrl}
Content-Type: application/json
X-QA-Signature: t=<unix_seconds>,v1=<hmac_hex>
X-QA-Timestamp: <unix_seconds>
X-QA-Event: <type>
X-QA-Event-Id: evt_<uuid_hex>
X-QA-Api-Version: 2026-05
User-Agent: QueroApoiar-Webhook/1.0
Body (envelope padronizado)
{
"id": "evt_a1b2c3d4...",
"type": "donacao.confirmada",
"apiVersion": "2026-05",
"createdAt": "2026-05-09T15:30:00.000Z",
"data": { ... }
}
O conteúdo de data varia conforme o type. Para
eventos de doação, traz data.donacao com o objeto Doação
completo. Para candidatos_lote.concluido, traz
data.jobId, data.total, data.sucessos,
data.erros e data.resultados[].
Validação da assinatura
- Reconstrua a mensagem como
${'${X-QA-Timestamp}'}.${'${rawBody}'}— use exatamente os bytes recebidos, sem reparsear o JSON. - Calcule
HMAC-SHA256(webhookSecret, mensagem)em hexadecimal. - Compare em tempo constante com o valor de
v1do header. - Rejeite se
|now - X-QA-Timestamp| > 300(5 min) — protege contra replay.
const crypto = require("crypto");
function validarAssinatura(rawBody, headers, secret) {
// Header vem como "t=1715274600,v1=abc123..."
const sig = headers["x-qa-signature"] || "";
const parts = Object.fromEntries(
sig.split(",").map((p) => p.split("=").map((s) => s.trim()))
);
const ts = parseInt(parts.t, 10);
const v1 = parts.v1;
if (!ts || !v1) return false;
// Replay protection: rejeita timestamps com mais de 5 minutos
const agora = Math.floor(Date.now() / 1000);
if (Math.abs(agora - ts) > 300) return false;
const mensagem = `${'${ts}'}.${'${rawBody}'}`;
const esperado = crypto
.createHmac("sha256", secret)
.update(mensagem)
.digest("hex");
// crypto.timingSafeEqual previne timing attacks
return v1.length === esperado.length &&
crypto.timingSafeEqual(Buffer.from(v1), Buffer.from(esperado));
}
// IMPORTANTE no Express: use express.raw() pra preservar o body cru
// app.post("/webhook/qa",
// express.raw({ type: "application/json" }),
// (req, res) => {
// if (!validarAssinatura(req.body.toString("utf8"), req.headers, SECRET)) {
// return res.sendStatus(401);
// }
// const evento = JSON.parse(req.body.toString("utf8"));
// // ... processa
// res.sendStatus(200);
// }
// );
Idempotência e retry
- Use
iddo envelope (evt_…) pra deduplicar — receber 2x o mesmoiddeve descartar a 2ª. - A QueroApoiar tenta entregar 5 vezes em caso de timeout (10s) ou resposta diferente de 2xx.
- Backoff exponencial: 1 min, 5 min, 30 min, 2h, 12h.
- Ordem dos eventos não é garantida: use
data.donacao.statuscomo source of truth, não otype.
Webhook secret. Fornecido junto com a chave de API quando a chave é criada. Não aparece em nenhuma resposta da API depois disso — guarde no cofre. Em caso de suspeita de vazamento, peça rotação ao admin (rotaciona junto com a chave por padrão).
Anti-SSRF. URLs apontando para localhost, IPs privados
(10.x, 172.16-31.x, 192.168.x) ou metadata de cloud (169.254.169.254)
são rejeitadas no momento do cadastro da chave. Se o admin tentar setar
uma URL inválida, o bulk responde 400 WEBHOOK_INVALIDO.
Erros
A API segue convenções HTTP. Toda resposta de erro tem o mesmo formato:
{
"erro": "CODIGO_DO_ERRO",
"mensagem": "Mensagem amigável em português",
"detalhes": { "campo": "cpf" }
}
Códigos por status
| Status | Código | Quando ocorre |
|---|---|---|
| 400 | CAMPO_OBRIGATORIO | Campo obrigatório ausente |
| 400 | STATUS_INVALIDO | Filtro status fora do enum aceito |
| 400 | DATA_INVALIDA | desde/ate mal formatado |
| 400 | WEBHOOK_INVALIDO | webhookUrl da chave aponta pra IP privado/loopback |
| 400 | ID_OBRIGATORIO | id do job ausente |
| 401 | CHAVE_AUSENTE | Cabeçalho X-API-Key não enviado |
| 401 | CHAVE_INVALIDA | Chave inválida ou revogada |
| 403 | PERMISSAO_NEGADA | Chave sem permissão para o recurso |
| 403 | IP_NAO_AUTORIZADO | IP fora da whitelist |
| 403 | OWNERSHIP_INVALIDA | Vínculo entre candidato e partido não confirmado |
| 403 | CUPOM_PERMISSAO_NEGADA / CUPOM_NAO_PERMITIDO | Cupom não autorizado para a chave (ver Cupons) |
| 404 | CANDIDATO_NAO_ENCONTRADO | CPF não pertence ao seu partido |
| 404 | JOB_NAO_ENCONTRADO | Job inexistente ou expirado (TTL 7d sucesso/30d falha) |
| 404 | ROTA_NAO_ENCONTRADA | Método/path não mapeado em /api/parceiros/* |
| 409 | CADASTRO_DUPLICADO | CPF ou email já cadastrado (mensagem unificada anti-enumeração) |
| 409 | SLUG_OCUPADO | Slug informado já está em uso por outra campanha |
| 413 | LOTE_EXCEDE_LIMITE | Mais de 500 candidatos no lote |
| 415 | TIPO_NAO_SUPORTADO | Content-Type diferente de application/json em POST/PATCH |
| 422 | CPF_INVALIDO | CPF com dígitos verificadores inválidos |
| 422 | EMAIL_INVALIDO | E-mail mal formatado |
| 422 | EMAIL_DOMINIO_BLOQUEADO | Domínio descartável (mailinator, 10minutemail etc.) |
| 422 | TELEFONE_INVALIDO | Não tem 10/11 dígitos ou DDD fora de 11–99 |
| 422 | NOME_INVALIDO / NOME_URNA_INVALIDO | Nome fora de 3–120 chars / nome de urna > 30 chars |
| 422 | CARGO_INVALIDO | Cargo fora dos 13 valores aceitos |
| 422 | UF_INVALIDA | Sigla não está na lista IBGE |
| 422 | MUNICIPIO_INVALIDO | Município fora de 2–80 chars |
| 422 | NUMERO_CANDIDATO_INVALIDO | Número não bate ^\d{2,5}$ |
| 422 | TITULO_ELEITOR_INVALIDO | Título não tem exatamente 12 dígitos |
| 422 | DATA_NASCIMENTO_INVALIDA | Data inválida ou ano fora de 1900–hoje |
| 422 | SLUG_INVALIDO / SLUG_RESERVADO | Slug fora do regex ou na lista de reservados |
| 422 | FORMATO_INVALIDO / UPLOAD_FALHOU | Upload de imagem fora de data URL ou conteúdo corrompido |
| 429 | RATE_LIMIT_EXCEDIDO | Janela de requisições por minuto excedida |
| 429 | QUOTA_DIARIA_EXCEDIDA | 5.000 candidatos/dia por chave atingidos (reseta 00h UTC) |
| 500 | ERRO_INTERNO | Erro inesperado — tente novamente, reportado via Sentry |
| 503 | FILA_INDISPONIVEL | Sistema de fila temporariamente fora; vem com Retry-After: 60 |
Endpoints
Referência completa com parâmetros, exemplos e execução interativa no Playground.
Candidatos
| Método | Caminho | Descrição |
|---|---|---|
| POST | /api/parceiros/candidatos | Criar candidato individual |
| POST | /api/parceiros/candidatos/lote | Criar candidatos em lote |
| GET | /api/parceiros/candidatos | Listar candidatos do partido |
| GET | /api/parceiros/candidatos/{cpf} | Consultar candidato |
| PATCH | /api/parceiros/candidatos/{cpf} | Atualizar dados |
| GET | /api/parceiros/candidatos/{cpf}/doacoes | Doações recebidas |
Doações
| Método | Caminho | Descrição |
|---|---|---|
| GET | /api/parceiros/doacoes | Todas as doações do partido |
| GET | /api/parceiros/doacoes/resumo | Resumo agregado |
Documentos fiscais
| Método | Caminho | Descrição |
|---|---|---|
| GET | /api/parceiros/fccs | FCCs de todos os candidatos do partido (paginado) |
| GET | /api/parceiros/notas-fiscais | NFs de todos os candidatos do partido (paginado) |
| GET | /api/parceiros/candidatos/{cpf}/fccs | Lista FCCs (ATSEFCC TSE) com URL de download |
| GET | /api/parceiros/candidatos/{cpf}/notas-fiscais | Lista NFs (inscrição + saques) com pdfUrl |
Imagens
| Método | Caminho | Descrição |
|---|---|---|
| POST | /api/parceiros/candidatos/{cpf}/foto-perfil | Atualizar foto de perfil |
| POST | /api/parceiros/candidatos/{cpf}/foto-capa | Atualizar foto de capa da campanha |
Jobs assíncronos
| Método | Caminho | Descrição |
|---|---|---|
| GET | /api/parceiros/jobs/{id} | Status de um job em lote |
Cupons reservados (gratuidades e descontos)
Permite ao partido pré-aplicar um cupom no candidato no momento do cadastro. Útil para gratuidades emitidas pelo admin do QueroApoiar em parceria comercial. O candidato vê o desconto já aplicado no checkout e não precisa digitar o código.
Como funciona
- Admin do QueroApoiar cria o cupom no painel administrativo (ex:
MISSAO-VIP-2026com gratuidade total ou desconto fixo). - Admin habilita a chave do partido com permissão
cupons.aplicare adiciona o cupom emcuponsPermitidos(whitelist). - Partido envia
POST /candidatoscom o campo opcionalcupom: "MISSAO-VIP-2026". - API valida o cupom (existe, ativo, não esgotado, dentro da validade, tipo "inscrição" ou "ambos") e o associa ao candidato.
- Quando o candidato abre o painel pra pagar, o cupom já vem pré-aplicado.
Exemplo
curl -X POST 'https://api.queroapoiar.com.br/api/parceiros/candidatos' \
-H 'X-API-Key: missao_live_a3f9b2c8d1e4f7a0b3c6d9e2f5a8b1c4' \
-H 'Content-Type: application/json' \
-d '{
"cpf": "12345678900",
"nome": "Maria Silva Santos",
"email": "[email protected]",
"telefone": "11999998888",
"cargo": "deputado_estadual",
"uf": "SP",
"municipio": "São Paulo",
"cupom": "MISSAO-VIP-2026"
}'
Erros possíveis
| HTTP | Erro | Causa |
|---|---|---|
| 403 | CUPOM_PERMISSAO_NEGADA | Chave não tem permissoes.cupons.aplicar |
| 403 | CUPOM_NAO_PERMITIDO | Cupom não está na cuponsPermitidos da chave |
| 422 | CUPOM_INEXISTENTE | Cupom não existe |
| 422 | CUPOM_INATIVO | Cupom existe mas active: false |
| 422 | CUPOM_ESGOTADO | usedCount >= maxUses |
| 422 | CUPOM_AINDA_NAO_VALIDO | now < validFrom |
| 422 | CUPOM_EXPIRADO | now > validUntil |
| 422 | CUPOM_TIPO_INVALIDO | Cupom não é tipo inscricao ou ambos |
Cupom é opcional. Se o partido não envia o campo, o candidato paga a inscrição padrão (R$199 ou o que estiver configurado).
Documentos fiscais (FCC + NF)
Endpoints para o partido baixar arquivos FCC (Forma de Contas de Campanha, formato ATSEFCC do TSE) e Notas Fiscais. Útil para prestação de contas e auditoria interna do partido.
Cada recurso tem duas formas: a consolidada
(/fccs e /notas-fiscais), que devolve os
documentos de todos os candidatos do partido paginados numa chamada só,
e a por candidato
(/candidatos/{cpf}/...), quando você já sabe de quem quer
os arquivos.
O escopo é por campanha, não por pessoa: você recebe os documentos das campanhas que o seu partido tem na plataforma. Se um candidato seu disputou uma eleição anterior por outro partido, os documentos daquela campanha não aparecem.
Listar FCCs de todos os candidatos do partido
curl 'https://api.queroapoiar.com.br/api/parceiros/fccs?desde=2026-09-01&limite=200' \
-H 'X-API-Key: pt_live_...'
# Resposta
{
"total": 143,
"pagina": 1,
"limite": 200,
"items": [
{
"id": "67c3b8e4f1d29c5e88a0d234",
"candidatoCpf": "12345678900",
"candidatoNome": "Maria do Bairro",
"url": "https://queroapoiar.com.br/api/fcc/download/exec?id=67c3b8e4f1d29c5e88a0d234&t=9f2c...",
"nomeArquivo": "ATSEFCC00120260930000001.FCC",
"withdrawRef": "67d4c9f5a2e3a8b9c0d1e2f3",
"dataSolicitacao": "2026-09-30T14:00:00Z",
"substituidoEm": null,
"criadoEm": "2026-09-30T14:00:15Z"
}
]
}
Filtros: candidatoCpf, desde, ate
(data de geração do FCC), pagina e limite
(padrão 200, máx. 500). Ordem: mais recente primeiro.
Quando substituidoEm vem preenchido, aquele FCC virou
histórico — uma doação do saque foi estornada depois da emissão e um
arquivo novo foi gerado no lugar. Não envie o substituído ao TSE.
Listar NFs de todos os candidatos do partido
curl 'https://api.queroapoiar.com.br/api/parceiros/notas-fiscais?tipo=saque' \
-H 'X-API-Key: pt_live_...'
# Resposta
{
"total": 88,
"pagina": 1,
"limite": 50,
"items": [
{
"id": "67f6e1b7a4g5c0d1e2f3a4b5",
"candidatoCpf": "12345678900",
"candidatoNome": "Maria do Bairro",
"tipo": "saque",
"pdfUrl": "https://nfs.queroapoiar.com.br/pdf/...",
"xmlUrl": "https://nfs.queroapoiar.com.br/xml/...",
"numero": "00012346",
"emitidaEm": "2026-09-30T15:00:00Z",
"valor": 1500.00,
"referenciaCriadaEm": "2026-09-30T14:00:00Z"
}
]
}
Filtros: tipo (inscricao ou saque),
candidatoCpf, desde, ate (data de
emissão), pagina e limite (padrão 200, máx. 500).
Só aparecem NFs já emitidas, ordenadas da mais recente para a mais antiga.
Sem o filtro tipo, os dois tipos vêm intercalados por data e
pagina × limite não pode passar de 5000 — para paginar fundo,
informe o tipo.
Listar FCCs do candidato
curl 'https://api.queroapoiar.com.br/api/parceiros/candidatos/12345678900/fccs' \
-H 'X-API-Key: pt_live_...'
# Resposta
{
"candidatoCpf": "12345678900",
"candidatoNome": "Maria do Bairro",
"total": 2,
"items": [
{
"id": "67c3b8e4f1d29c5e88a0d234",
"url": "https://queroapoiar.com.br/api/fcc/download/exec?id=67c3b8e4f1d29c5e88a0d234&t=9f2c...",
"nomeArquivo": "ATSEFCC00120260930000001.FCC",
"withdrawRef": "67d4c9f5a2e3a8b9c0d1e2f3",
"dataSolicitacao": "2026-09-30T14:00:00Z",
"substituidoEm": null,
"criadoEm": "2026-09-30T14:00:15Z"
}
]
}
Listar NFs do candidato
curl 'https://api.queroapoiar.com.br/api/parceiros/candidatos/12345678900/notas-fiscais' \
-H 'X-API-Key: pt_live_...'
# Resposta
{
"candidatoCpf": "12345678900",
"candidatoNome": "Maria do Bairro",
"total": 3,
"items": [
{
"id": "67e5d0a6h3f4b9c0d1e2f3a4",
"tipo": "inscricao",
"pdfUrl": "https://nfs.queroapoiar.com.br/pdf/...",
"numero": "00012345",
"emitidaEm": "2026-04-15T18:30:00Z",
"valor": 199.00
},
{
"id": "67f6e1b7i4g5c0d1e2f3a4b5",
"tipo": "saque",
"pdfUrl": "https://nfs.queroapoiar.com.br/pdf/...",
"xmlUrl": "https://nfs.queroapoiar.com.br/xml/...",
"numero": "00012346",
"emitidaEm": "2026-09-30T15:00:00Z",
"valor": 1500.00
}
]
}
As URLs retornadas já baixam o arquivo direto, sem precisar mandar a chave de API junto: a do FCC é um link assinado do nosso endpoint de download e a da NF aponta pro provedor de notas fiscais. As duas podem expirar ou ser rotacionadas, então consulte sempre via API na hora de baixar em vez de guardar a URL.
Imagens (foto de perfil + capa)
Atualiza a foto de perfil do candidato ou a capa da campanha. Útil para o partido pré-popular as imagens em onboarding em massa.
Especificações
| Item | Valor |
|---|---|
| Formato aceito no upload | jpg, jpeg, png, webp, gif, bmp, svg |
| Tamanho máximo do upload | ~3 MB |
| Resolução recomendada | Perfil: 800x800 quadrada · Capa: 1500x500 retangular |
Toda imagem enviada passa por otimização automática:
é convertida para WebP, redimensionada para a resolução adequada e
compactada sem perda visível. O parceiro pode mandar uma foto grande
(até 3 MB) sem se preocupar - a plataforma serve a versão otimizada
com tempo de carregamento ideal. Em paralelo, é gerada uma miniatura
(campo thumb da resposta) pronta pra listagens.
Exemplo - foto de perfil
curl -X POST 'https://api.queroapoiar.com.br/api/parceiros/candidatos/12345678900/foto-perfil' \
-H 'X-API-Key: pt_live_...' \
-H 'Content-Type: application/json' \
-d '{
"imagemBase64": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAAAA..."
}'
# Resposta
{
"mensagem": "Foto de perfil atualizada",
"mediaId": "67g7f2c8j5h6d1e2f3a4b5c6",
"url": "https://arquivos.queroapoiar.com.br/media/2026/9/30/abc123.jpeg",
"thumb": "https://arquivos.queroapoiar.com.br/media/2026/9/30/abc123_thumb.jpeg"
}
Exemplo - foto de capa
curl -X POST 'https://api.queroapoiar.com.br/api/parceiros/candidatos/12345678900/foto-capa' \
-H 'X-API-Key: pt_live_...' \
-H 'Content-Type: application/json' \
-d '{
"imagemBase64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..."
}'
Erros possíveis
| HTTP | Erro | Causa |
|---|---|---|
| 400 | CAMPO_OBRIGATORIO | Campo imagemBase64 ausente |
| 422 | FORMATO_INVALIDO | Não é data URL (data:image/...;base64,...) |
| 422 | UPLOAD_FALHOU | Imagem corrompida, tipo proibido, ou maior que 4MB |
| 403 | PERMISSAO_NEGADA | Chave não tem candidatos.editar |
Taxas e valores
A plataforma cobra duas categorias de taxa: a taxa de inscrição (paga uma vez pelo candidato) e a taxa por doação (descontada do valor que entra na conta de campanha). Esta seção é informativa para que o parceiro entenda o impacto financeiro no candidato.
Taxa de inscrição
| Cenário | Valor atual | Quem se aplica |
|---|---|---|
| Valor cheio | R$ 299,00 | Padrão se nenhuma regra abaixo se aplicar |
| Promoção | R$ 199,00 | Default atual (promoção ativa). Maioria dos candidatos cai aqui |
| Retornante | R$ 99,00 | Quem teve campanha em 2020/2022/2024 (detectado automaticamente pelo email) |
| Cupom reservado | Variável (pode zerar = gratuidade) | Configurado pelo admin do QueroApoiar via cupom + parceiro envia o código no campo cupom |
| Preço por partido | Variável | Configurado pelo admin do QueroApoiar (negociação comercial). Aplica em todos candidatos do partido |
Pago uma única vez por candidato, antes de a campanha ir ao público. Os valores acima são verificados em runtime contra o valor configurado no admin - mude lá que novos cadastros pegam o novo na próxima request, sem deploy.
Taxas por doação (campanha eleitoral)
| Método | Taxa | Descontada de |
|---|---|---|
| PIX | 1,99% | Valor da doação |
| Cartão de crédito | 3,38% | Valor da doação |
| Boleto | 1,99% | Valor da doação |
Exemplo: doação de R$ 100 via PIX → R$ 1,99 vai pra plataforma, R$ 98,01
entra como saldo da campanha (campo netValue da doação).
Outras taxas
| Item | Valor | Quando aplica |
|---|---|---|
| Saque (transferência) | R$ 10,00 | 2º saque em diante (1º grátis) |
| Antecipação | +3% | Sacar antes do prazo de liberação (PIX D+1, Boleto D+2, Cartão D+30) |
| Reembolso/Estorno | R$ 5,00 | Por estorno solicitado |
| R$ 1,00 por doação | Apenas em doações originadas pelo bot WhatsApp |
Prazo de liberação do dinheiro
| Método | Liberação |
|---|---|
| PIX | D+1 (no dia útil seguinte) |
| Boleto | D+2 |
| Cartão de crédito | D+30 (proteção contra chargeback) |
O prazo conta a partir da confirmação do pagamento (campo paidAt
da doação). Antes desse prazo, o saldo aparece como pendente. Pagar a taxa
de antecipação adianta a liberação.
Valores em homologação (ambiente test): a taxa de inscrição em homologação geralmente está reduzida (R$ 5,00 ou similar) pra acelerar testes. Em produção, valor cheio.
Campos opcionais úteis
genero (M ou F)
Personaliza o tratamento no email de boas-vindas (Bem-vindo
ou Bem-vinda) e em outras comunicações de gênero. Aceita
"M", "F", "Masculino" ou
"Feminino". Recomendado passar: sem o campo,
é inferido do cargo com heurística que erra quando o nome não bate com
o sexo padrão do cargo (ex: cargo "vereador" sempre vira Masculino, mesmo
se for "Maria").
slug (URL pública customizada)
Define a URL onde a campanha do candidato fica acessível:
https://queroapoiar.com.br/{slug}.
- 3 a 50 caracteres, apenas
a-z 0-9 - - Tem que começar com letra ou número
- Se omitido, gerado de
nomeUrna(ounome) com sufixo do partido se ocupado - Se fornecido e já ocupado, retorna
409 SLUG_OCUPADO— parceiro decide qual outro slug usar (não adiciona sufixo silencioso) - Se reservado pelo sistema (
admin,painel,apie similares), retorna422 SLUG_RESERVADO - Se inválido (caracteres proibidos, fora do range), retorna
422 SLUG_INVALIDO
Recomendado: passe slug quando o candidato tiver uma identidade
digital pré-existente (ex: já é conhecido como @joaodasilva) e
você queira que a URL pública combine com isso.
Cargos válidos
O campo cargo aceita exatamente 13 valores. Use o slug
(em snake_case minúsculo). Qualquer outro valor causa
422 CARGO_INVALIDO.
| Slug | Cargo | Esfera |
|---|---|---|
presidente | Presidente da República | Federal |
vice_presidente | Vice-presidente | Federal |
governador | Governador | Estadual |
vice_governador | Vice-governador | Estadual |
senador | Senador | Federal |
suplente_senador | Suplente de senador | Federal |
deputado_federal | Deputado federal | Federal |
deputado_estadual | Deputado estadual | Estadual |
deputado_distrital | Deputado distrital (DF) | Distrital |
prefeito | Prefeito | Municipal |
vice_prefeito | Vice-prefeito | Municipal |
vereador | Vereador | Municipal |
Os campos uf e municipio são sempre
obrigatórios, mesmo para cargos estaduais ou federais. Para
cargos sem município (presidente, governador, senador), use a capital
ou município de domicílio eleitoral.
Partidos
O partido vinculado a uma chave de API é definido pela QueroApoiar no momento da emissão da chave (escolhido a partir da lista canônica abaixo). Você não envia o partido nas requisições de cadastro: ele é inferido automaticamente da chave e aplicado a todos os candidatos criados por ela.
A lista canônica segue o registro oficial do TSE. Caso seu partido tenha cancelado ou recebido novo registro, fale com nosso comercial para revisarmos a chave.
Partidos com registro ativo
| Nome |
|---|
Agir |
Avante |
Cidadania |
DC |
Democrata |
MDB |
Missão |
Mobiliza |
Novo |
PCB |
PCO |
PCdoB |
PDT |
PL |
PP |
PRD |
PRTB |
PSB |
PSD |
PSDB |
PSTU |
PT |
PV |
Podemos |
Psol |
Rede |
Republicanos |
Solidariedade |
UP |
União Brasil |
Os nomes acima são case-sensitive na exibição (ex: Novo, não
NOVO). Em comparações internas o sistema é tolerante a variações
de caixa, mas os valores apresentados ao candidato seguem este formato.
Objeto Candidato
{
"id": "67a3b8e4f1d29c5e88a0d234",
"cpf": "12345678900",
"nome": "Maria Silva Santos",
"nomeUrna": "Maria do Bairro",
"email": "[email protected]",
"telefone": "11999998888",
"cargo": "deputado_federal",
"uf": "SP",
"municipio": "São Paulo",
"numeroCandidato": "12345",
"tituloEleitor": "123456789012",
"partido": "Partido Exemplo",
"urlPublicaCampanha": "https://queroapoiar.com.br/maria-do-bairro",
"status": "aguardando_senha",
"inscricaoPaga": false,
"celularValidado": false,
"emailVerificado": false,
"campanhaPublicada": false,
"totalArrecadado": 0,
"qtdDoacoes": 0,
"criadoEm": "2026-09-20T15:42:18Z",
"criadoViaApi": true
}
Estados possíveis
| Status | Significado |
|---|---|
aguardando_senha | Candidata ainda não definiu a senha pelo e-mail |
aguardando_pagamento | Senha definida, falta pagar a inscrição |
aguardando_ativacao | Pago, falta validar o celular por SMS |
ativa | Campanha pública e recebendo doações |
expirada | 30 dias sem pagamento - conta removida automaticamente |
Objeto Doação
{
"id": "67a3...",
"data": "2026-09-15T14:32:00Z",
"valor": 100.00,
"formaPagamento": "pix",
"status": "paga",
"candidatoCpf": "12345678900",
"doador": {
"nome": "João da Silva",
"cpf": "98765432100",
"email": "[email protected]"
}
}
Changelog
v1.0.0 - Maio de 2026
- Lançamento da API de Parceiros em homologação
- Endpoints para gestão de candidatos
- Endpoints de leitura de doações
- Webhooks assinados com HMAC SHA-256
- Cadastro em lote assíncrono via fila
Suporte
- E-mail: [email protected]
- Status: api.queroapoiar.com.br/api/health
Ao reportar incidentes, inclua o prefixo da chave (16 primeiros caracteres), horário, resposta recebida e volume estimado de chamadas afetadas.