Você está sem conexão. As ações serão enviadas quando a internet voltar.
Desenvolvedores

API pública do App do MEI

Leve contatos, orçamentos, cobranças e agenda para o seu sistema, planilha, Zapier, Make ou n8n. REST + JSON, chave por conta com escopos, OpenAPI 3.1, idempotência e webhooks assinados.

Versão 1.0.0 · base https://appdomei.com/api/public/v1

Início rápido

  1. Crie uma chave em Mais → Integrações → Chaves de API. Dê um nome, marque só os escopos que a integração precisa e copie o token (adm_live_…) — ele aparece uma única vez. No plano Grátis dá para criar 1 chave de leitura para testar; Pro e Negócio liberam tudo.
  2. Faça a primeira chamada. Guarde o token numa variável de ambiente e peça os dados do seu negócio:
    curl "https://appdomei.com/api/public/v1/account" \
      -H "Authorization: Bearer $ADM_API_KEY"
  3. Crie algo. Um contato novo, com Idempotency-Key para poder repetir a chamada sem duplicar:
    curl -X POST "https://appdomei.com/api/public/v1/contacts" \
      -H "Authorization: Bearer $ADM_API_KEY" \
      -H "Content-Type: application/json" \
      -H "Idempotency-Key: pedido-2026-0042" \
      -d '{"name":"Maria Souza","phone":"(31) 99999-0000","email":"maria@example.com","has_whatsapp":true}'
    A resposta vem com 201 e o contato em data. Daí para um orçamento enviado é um POST /quotes com "send": "link" — a URL pública volta em public_url.

Autenticação e escopos

Toda chamada leva Authorization: Bearer adm_live_… (se o seu proxy remove esse cabeçalho, X-ADM-Token também vale). Só o hash da chave fica no nosso banco; a chave vale 1 ano, pode ter uma lista de IPs permitidos e é revogável na hora.

Escopos limitam o que a chave faz. E a chave herda as permissões de quem a criou: um ajudante que não pode ver o financeiro no app não consegue criar uma chave com finance:read, e se perder uma permissão depois, as chaves dele perdem o escopo correspondente (403 owner_permission_revoked).

EscopoPermiteGrátis
contacts:readLer contatossim
contacts:writeCriar e editar contatos—
quotes:readLer orçamentossim
quotes:writeCriar e enviar orçamentos—
contracts:readLer contratos—
invoices:readLer cobrançassim
invoices:writeCriar e baixar cobranças—
appointments:readLer agenda—
appointments:writeCriar compromissos—
catalog:readLer catálogo—
catalog:writeEditar catálogo—
finance:readLer financeiro—
webhooks:manageGerenciar webhooks de saída—
account:readLer dados do negóciosim

Idioma das mensagens de erro: Accept-Language com en (padrão), pt-BR ou es. Os códigos (error.code) nunca mudam — programe contra eles, não contra o texto.

Formato e convenções

  • JSON em tudo (Content-Type: application/json); respostas { "data": …, "meta": … } e erros { "error": { "code", "message", "details" } }.
  • Campos em snake_case; ids numéricos e, quando existe, uuid ou token (o token é o da página pública).
  • Dinheiro em centavos inteiros (amount_cents: 39000 = R$ 390,00) com currency: "BRL". Percentuais de desconto de orçamento ×100 (1050 = 10,5%).
  • Datas-hora em ISO 8601 com fuso (2026-10-22T14:00:00-03:00, America/Sao_Paulo); datas sem hora em YYYY-MM-DD. Aceitamos qualquer fuso na entrada.
  • Telefones saem em E.164 (+5531999990000) e entram em qualquer formato brasileiro com DDD. CPF/CNPJ é cifrado e só volta mascarado.
  • Status e tipos usam os mesmos valores do app (aberta, paga, enviado, aceito…); veja os enum na referência.
  • Campos novos podem aparecer a qualquer momento; nenhum campo existente é renomeado ou removido dentro da v1. Toda resposta traz X-Request-Id.

Erros

json
{
    "error": {
        "code": "validation_failed",
        "message": "Validation failed. See details.",
        "details": {
            "phone": [
                "The field phone must be a Brazilian phone number with area code."
            ]
        }
    }
}
HTTPcodeQuando
400invalid_jsonCorpo não é JSON válido.
400invalid_idempotency_keyIdempotency-Key fora do formato (1–80 caracteres imprimíveis).
401unauthenticatedSem cabeçalho Authorization.
401invalid_token · token_revoked · token_expiredChave desconhecida, revogada ou vencida (1 ano).
402quota_exceededCota do plano atingida (contatos, orçamentos/mês, compromissos/mês). `details.quota` diz qual.
402plan_requiredRecurso fora do plano (ex.: webhooks no Grátis).
403insufficient_scopeA chave não tem o escopo exigido (`details.scope`).
403owner_permission_revokedQuem criou a chave perdeu a permissão correspondente na conta.
403ip_not_allowed · user_blocked · account_suspendedIP fora da lista da chave; dono bloqueado; conta suspensa.
404not_foundRecurso inexistente ou de outra conta (nunca distinguimos os dois).
409invalid_stateRegra de negócio: enviar orçamento aceito, cancelar cobrança paga, confirmar compromisso concluído…
422validation_failedCampos inválidos: `details` traz `campo → [mensagens]` no idioma pedido.
422idempotency_mismatchMesma Idempotency-Key com corpo diferente.
429rate_limitedLimite por minuto da chave. Respeite `Retry-After`.
500server_errorFalha nossa: guarde o `X-Request-Id` e fale com o suporte.

Paginação e filtros

Listas aceitam page (a partir de 1) e per_page (padrão 50, máximo 200) e devolvem meta.page, meta.per_page, meta.total e meta.last_page. Para sincronizar incrementalmente use updated_since (ISO 8601): só registros criados ou alterados a partir daquele instante, ordenados do mais recente.

http
GET https://appdomei.com/api/public/v1/contacts?updated_since=2026-10-19T00:00:00-03:00&per_page=200&page=2

Agenda e financeiro são por intervalo (from/to em YYYY-MM-DD; até 92 dias na agenda e 366 no financeiro). Filtros simples por recurso: q, status, stage, contact_id, kind, type, active.

Idempotência

Em qualquer POST, mande Idempotency-Key (até 80 caracteres, por exemplo o id do pedido no seu sistema). Se a rede cair e você repetir a chamada com a mesma chave e o mesmo corpo, devolvemos a resposta original (com o cabeçalho Idempotent-Replayed: true) por 24 horas, sem criar nada de novo. Mesma chave com corpo diferente responde 422 idempotency_mismatch. A chave é por conta.

Limites

  • Por minuto, por chave: você escolhe ao criar (padrão 120, máximo 600 no Pro/Negócio; 30 no Grátis). Cabeçalhos X-RateLimit-Limit, X-RateLimit-Remaining e X-RateLimit-Reset (segundos) em toda resposta; ao estourar, 429 com Retry-After. Janela deslizante de 60 s.
  • Cotas do plano valem na API como no app: contatos, orçamentos por mês, compromissos por mês → 402 quota_exceeded.
  • Tamanhos: listas até 200 itens; corpo JSON até 1 MB; intervalos de 92 dias (agenda) e 366 dias (financeiro, cobranças por vencimento).
  • Chaves por conta: até 10 ativas (1 no Grátis). Logs de uso ficam 30 dias e aparecem na tela de chaves.

Webhooks

Em vez de consultar de tempos em tempos, cadastre uma URL e receba um POST assinado quando algo acontecer (invoice.paid, quote.accepted, contract.signed, appointment.confirmed…). Os payloads usam exatamente os mesmos objetos desta API. Gerencie em Integrações → Webhooks ou pelos endpoints /webhooks.

Webhooks

Receba eventos do app no seu sistema

Cadastre uma URL https em Mais → Integrações → Webhooks (planos Pro e Negócio) e o App do MEI faz um POST em JSON a cada evento assinado, em até 1 minuto, com retentativas automáticas. Tudo o que o app sabe sobre o evento vai no corpo; você não precisa consultar a API depois.

Eventos

Cada webhook assina uma lista de eventos ou * (todos, inclusive os futuros).

Contatos: contact.created contato criado · contact.updated contato editado · contact.stage_changed contato mudou de etapa

Orçamentos: quote.sent orçamento enviado · quote.viewed orçamento visualizado · quote.accepted orçamento aceito · quote.declined orçamento recusado

Contratos: contract.sent contrato enviado · contract.signed contrato assinado · contract.declined contrato recusado

Cobranças: invoice.created cobrança criada · invoice.paid cobrança paga · invoice.overdue cobrança atrasada · invoice.canceled cobrança cancelada

Agenda: appointment.created compromisso criado · appointment.confirmed compromisso confirmado · appointment.canceled compromisso cancelado · appointment.done serviço concluído

Carteira: payout.paid saque pago

Notas fiscais: nfse.issued nota fiscal emitida

Mais ping, enviado pelo botão Enviar teste.

Envelope

O corpo é sempre o mesmo envelope; data é o recurso no mesmo formato da API (mais a chave object) e, quando o evento tem contexto próprio (etapa anterior, motivo da recusa, meio de pagamento), ele vem em data.event_meta.

{
  "id": "evt_1234",
  "event": "invoice.paid",
  "created_at": "2026-10-19T14:05:33-03:00",
  "api_version": "2026-10-19",
  "account": { "id": 2, "uuid": "44494753-…", "name": "Bruno Fotografia" },
  "data": {
    "object": "invoice", "id": 87, "number_label": "COB-0087", "status": "paga",
    "amount_cents": 45000, "paid_amount_cents": 45000, "paid_method": "pix_platform",
    "paid_at": "2026-10-19T14:05:20-03:00", "contact_id": 12,
    "public_url": "https://appdomei.com/pagar/…", "event_meta": { "actor": "system", "method": "pix_platform" }
  }
}

Cabeçalhos

  • Content-Type: application/json; charset=utf-8 e User-Agent: AppDoMEI-Webhooks/1.0 (+https://appdomei.com/desenvolvedores)
  • X-ADM-Event — nome do evento (invoice.paid)
  • X-ADM-Delivery — id da entrega (dlv_…). Use como chave de idempotência: após uma falha a mesma entrega chega de novo com o mesmo id.
  • X-ADM-Webhook — uuid do webhook; X-ADM-Attempt — número da tentativa (1…7)
  • X-ADM-Signature — t=<unix>,v1=<hmac> (abaixo)
  • Cabeçalhos extras que você cadastrar (ex.: Authorization exigido pelo seu destino)

Verificar a assinatura

Ao criar o webhook você recebe um segredo whsec_… (mostrado uma vez). Para cada entrega, v1 é o HMAC-SHA256 de t + "." + corpo — o corpo são os bytes crus da requisição, antes de decodificar o JSON. Recuse se t estiver a mais de 300 s do seu relógio e compare em tempo constante. O cabeçalho pode trazer mais de um v1 durante uma rotação de segredo; aceite se qualquer um bater.

// PHP
$secret = getenv('ADM_WEBHOOK_SECRET');
$body   = file_get_contents('php://input');
$parts  = [];
foreach (explode(',', $_SERVER['HTTP_X_ADM_SIGNATURE'] ?? '') as $p) { [$k, $v] = explode('=', trim($p), 2); $parts[$k] = $v; }
$ok = abs(time() - (int) $parts['t']) <= 300
   && hash_equals(hash_hmac('sha256', $parts['t'] . '.' . $body, $secret), $parts['v1'] ?? '');
if (!$ok) { http_response_code(401); exit; }
http_response_code(200);              // responda antes de processar
$event = json_decode($body, true);
// Node.js (Express com express.raw)
const crypto = require('crypto');
app.post('/webhooks/appdomei', express.raw({ type: '*/*' }), (req, res) => {
  const parts = Object.fromEntries((req.get('X-ADM-Signature') || '').split(',').map(p => p.trim().split('=')));
  const expected = crypto.createHmac('sha256', process.env.ADM_WEBHOOK_SECRET).update(`${parts.t}.${req.body}`).digest('hex');
  const fresh = Math.abs(Date.now() / 1000 - Number(parts.t)) <= 300;
  if (!fresh || expected.length !== (parts.v1 || '').length || !crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1))) return res.sendStatus(401);
  res.sendStatus(200);
  const event = JSON.parse(req.body);
});
# Python (Flask)
import hmac, hashlib, time, os
@app.post('/webhooks/appdomei')
def appdomei():
    body = request.get_data()
    parts = dict(p.strip().split('=', 1) for p in request.headers.get('X-ADM-Signature', '').split(','))
    expected = hmac.new(os.environ['ADM_WEBHOOK_SECRET'].encode(), f"{parts['t']}.".encode() + body, hashlib.sha256).hexdigest()
    if abs(time.time() - int(parts['t'])) > 300 or not hmac.compare_digest(expected, parts.get('v1', '')):
        abort(401)
    return '', 200

Retentativas e desativação

Qualquer resposta 2xx em até 10 s conta como entregue. Outra resposta, timeout ou redirecionamento (nunca seguido) agenda nova tentativa em 1 min, 5 min, 30 min, 2 h, 12 h, 24 h após cada falha (6 retentativas, ~1 dias). Esgotadas, a entrega fica como desistida e pode ser reenviada pela tela. Após 25 falhas seguidas o webhook é desativado e o dono da conta é avisado no app e por e-mail; corrigido o destino, basta ativar de novo.

Boas práticas

  • Responda 200 primeiro e processe depois (fila). Trabalho pesado dentro da requisição vira timeout e retentativa.
  • Trate entregas repetidas: guarde o X-ADM-Delivery (ou o id do evento) e ignore o que já processou.
  • Não confie só na URL secreta: verifique a assinatura. Se o seu destino não lê cabeçalhos (Google Apps Script), use um token na própria URL.
  • A ordem não é garantida entre eventos diferentes; use created_at e o estado em data.status.
  • Só https em host público (porta 443 ou 8443). Endereços internos, localhost e IPs privados são recusados no cadastro e no envio (o DNS é resolvido a cada entrega).
  • Teste com Enviar teste (evento ping) e acompanhe código, tempo e corpo da resposta na ficha do webhook.

Receitas prontas (Zapier, Make, n8n, Google Sheets) em Ajuda → Integrações. Webhooks também podem ser gerenciados pela API (escopo webhooks:manage).

Account

O negócio dono da chave, o plano e os escopos efetivos.

GET /account account:read

Dados do negócio

Devolve o negócio dono da chave, o plano e, em `meta.api_key`, o nome, o prefixo e os escopos efetivos da chave.

resposta 200 · Account

curl "https://appdomei.com/api/public/v1/account" \
  -H "Authorization: Bearer $ADM_API_KEY"
Resposta de exemplo
json
{
    "data": {
        "id": 2,
        "uuid": "2b1f6e0a-7d3c-4a9e-9b2d-6f1c3e8a5d70",
        "name": "Bruno Fotografia",
        "legal_name": null,
        "type": "mei",
        "occupation": "Fotógrafo",
        "document_masked": "***.456.789-**",
        "email": "contato@brunofoto.com.br",
        "phone": "+5531999990000",
        "whatsapp": "+5531999990000",
        "website": null,
        "address": {
            "cep": "30130010",
            "street": "Rua da Bahia",
            "number": "100",
            "complement": null,
            "district": "Centro",
            "city": "Belo Horizonte",
            "state": "MG"
        },
        "brand_color": "#0F6E56",
        "prefixes": {
            "quote": "ORC",
            "contract": "CTR",
            "invoice": "COB"
        },
        "quote_validity_days": 15,
        "timezone": "America/Sao_Paulo",
        "public_locale": "pt-BR",
        "currency": "BRL",
        "status": "ativa",
        "plan": {
            "code": "pro",
            "name": "Pro"
        },
        "created_at": "2026-09-01T10:00:00-03:00",
        "updated_at": "2026-10-19T09:12:44-03:00"
    },
    "meta": {
        "api_key": {
            "name": "Zapier",
            "prefix": "adm_live_3f9a1c2b…",
            "scopes": [
                "contacts:read",
                "quotes:write"
            ]
        }
    }
}

Contacts

Clientes e leads com funil (novo → conversa → orcamento → cliente | perdido).

GET /contacts contacts:read

Listar contatos

resposta 200 · lista de Contact

ParâmetroOndeTipoDescrição
qquerystringBusca por nome, empresa, e-mail ou telefone.
stagequerystringEtapa do funil. novo</code> <code>conversa</code> <code>orcamento</code> <code>cliente</code> <code>perdido
pagequeryintegerPágina (a partir de 1).
per_pagequeryintegerItens por página (padrão 50, máximo 200).
updated_sincequerystring (date-time)Só registros criados/alterados a partir desta data-hora (ISO 8601).
curl "https://appdomei.com/api/public/v1/contacts?q=maria&per_page=50" \
  -H "Authorization: Bearer $ADM_API_KEY"
Resposta de exemplo
json
{
    "data": [
        {
            "id": 128,
            "type": "pf",
            "name": "Maria Souza",
            "company": null,
            "email": "maria@example.com",
            "phone": "+5531999990000",
            "phone_secondary": null,
            "has_whatsapp": true,
            "document_masked": null,
            "address": {
                "cep": "30130010",
                "street": null,
                "number": null,
                "complement": null,
                "district": null,
                "city": "Belo Horizonte",
                "state": "MG"
            },
            "origin": "site",
            "tags": [
                "instagram",
                "residencial"
            ],
            "stage": "orcamento",
            "lost_reason": null,
            "locale": null,
            "lead_score": 72,
            "risk_level": "baixo",
            "next_step": "Ligar para fechar",
            "next_step_at": "2026-10-21T09:00:00-03:00",
            "birthday": null,
            "notes": null,
            "owner_user_id": 3,
            "totals": {
                "quoted_cents": 39000,
                "won_cents": 0,
                "received_cents": 0,
                "open_cents": 0
            },
            "counts": {
                "quotes": 1,
                "contracts": 0,
                "invoices": 0
            },
            "currency": "BRL",
            "became_client_at": null,
            "last_activity_at": "2026-10-19T14:02:10-03:00",
            "created_at": "2026-10-18T16:40:00-03:00",
            "updated_at": "2026-10-19T14:02:10-03:00"
        }
    ],
    "meta": {
        "page": 1,
        "per_page": 50,
        "total": 1,
        "last_page": 1
    }
}
POST /contacts contacts:write

Criar contato

Cria um contato. Telefone em qualquer formato brasileiro; `document` (CPF/CNPJ) é cifrado e só volta mascarado. Possíveis duplicatas vêm em `meta.possible_duplicates` (o contato é criado mesmo assim).

Idempotency-Key cota contacts resposta 201 · Contact

Corpo (ContactInput)
CampoTipoDescrição
namestringObrigatório na criação (2–150).
typestring pf</code> <code>pj
companystring
emailstring
phonestringQualquer formato brasileiro com DDD.
phone_secondarystring
has_whatsappboolean
documentstringCPF ou CNPJ (cifrado; volta mascarado).
originstring whatsapp</code> <code>instagram</code> <code>indicacao</code> <code>site</code> <code>formulario</code> <code>importacao</code> <code>google</code> <code>outro
tagsarray
addressobject|null
stagestring novo</code> <code>conversa</code> <code>orcamento</code> <code>cliente</code> <code>perdido
next_stepstring
next_step_atstring|nullISO 8601 com fuso (America/Sao_Paulo).
birthdaystring|nullYYYY-MM-DD
notesstring
curl -X POST "https://appdomei.com/api/public/v1/contacts" \
  -H "Authorization: Bearer $ADM_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: pedido-2026-0042" \
  -d '{"name":"Maria Souza","phone":"(31) 99999-0000","email":"maria@example.com","has_whatsapp":true,"origin":"site","tags":["instagram","residencial"],"address":{"cep":"30130-010","city":"Belo Horizonte","state":"MG"}}'
Resposta de exemplo
json
{
    "data": {
        "id": 128,
        "type": "pf",
        "name": "Maria Souza",
        "company": null,
        "email": "maria@example.com",
        "phone": "+5531999990000",
        "phone_secondary": null,
        "has_whatsapp": true,
        "document_masked": null,
        "address": {
            "cep": "30130010",
            "street": null,
            "number": null,
            "complement": null,
            "district": null,
            "city": "Belo Horizonte",
            "state": "MG"
        },
        "origin": "site",
        "tags": [
            "instagram",
            "residencial"
        ],
        "stage": "orcamento",
        "lost_reason": null,
        "locale": null,
        "lead_score": 72,
        "risk_level": "baixo",
        "next_step": "Ligar para fechar",
        "next_step_at": "2026-10-21T09:00:00-03:00",
        "birthday": null,
        "notes": null,
        "owner_user_id": 3,
        "totals": {
            "quoted_cents": 39000,
            "won_cents": 0,
            "received_cents": 0,
            "open_cents": 0
        },
        "counts": {
            "quotes": 1,
            "contracts": 0,
            "invoices": 0
        },
        "currency": "BRL",
        "became_client_at": null,
        "last_activity_at": "2026-10-19T14:02:10-03:00",
        "created_at": "2026-10-18T16:40:00-03:00",
        "updated_at": "2026-10-19T14:02:10-03:00"
    }
}
GET /contacts/{id} contacts:read

Ler contato

resposta 200 · Contact

ParâmetroOndeTipoDescrição
id *pathintegerId do contato.
curl "https://appdomei.com/api/public/v1/contacts/128" \
  -H "Authorization: Bearer $ADM_API_KEY"
Resposta de exemplo
json
{
    "data": {
        "id": 128,
        "type": "pf",
        "name": "Maria Souza",
        "company": null,
        "email": "maria@example.com",
        "phone": "+5531999990000",
        "phone_secondary": null,
        "has_whatsapp": true,
        "document_masked": null,
        "address": {
            "cep": "30130010",
            "street": null,
            "number": null,
            "complement": null,
            "district": null,
            "city": "Belo Horizonte",
            "state": "MG"
        },
        "origin": "site",
        "tags": [
            "instagram",
            "residencial"
        ],
        "stage": "orcamento",
        "lost_reason": null,
        "locale": null,
        "lead_score": 72,
        "risk_level": "baixo",
        "next_step": "Ligar para fechar",
        "next_step_at": "2026-10-21T09:00:00-03:00",
        "birthday": null,
        "notes": null,
        "owner_user_id": 3,
        "totals": {
            "quoted_cents": 39000,
            "won_cents": 0,
            "received_cents": 0,
            "open_cents": 0
        },
        "counts": {
            "quotes": 1,
            "contracts": 0,
            "invoices": 0
        },
        "currency": "BRL",
        "became_client_at": null,
        "last_activity_at": "2026-10-19T14:02:10-03:00",
        "created_at": "2026-10-18T16:40:00-03:00",
        "updated_at": "2026-10-19T14:02:10-03:00"
    }
}
PATCH /contacts/{id} contacts:write

Editar contato (parcial)

Só os campos enviados mudam. Enviar `stage` aqui equivale a chamar `/stage`.

resposta 200 · Contact

ParâmetroOndeTipoDescrição
id *pathintegerId do contato.
Corpo (ContactInput)
CampoTipoDescrição
namestringObrigatório na criação (2–150).
typestring pf</code> <code>pj
companystring
emailstring
phonestringQualquer formato brasileiro com DDD.
phone_secondarystring
has_whatsappboolean
documentstringCPF ou CNPJ (cifrado; volta mascarado).
originstring whatsapp</code> <code>instagram</code> <code>indicacao</code> <code>site</code> <code>formulario</code> <code>importacao</code> <code>google</code> <code>outro
tagsarray
addressobject|null
stagestring novo</code> <code>conversa</code> <code>orcamento</code> <code>cliente</code> <code>perdido
next_stepstring
next_step_atstring|nullISO 8601 com fuso (America/Sao_Paulo).
birthdaystring|nullYYYY-MM-DD
notesstring
curl -X PATCH "https://appdomei.com/api/public/v1/contacts/128" \
  -H "Authorization: Bearer $ADM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"next_step":"Ligar para fechar","next_step_at":"2026-10-21T09:00:00-03:00"}'
Resposta de exemplo
json
{
    "data": {
        "id": 128,
        "type": "pf",
        "name": "Maria Souza",
        "company": null,
        "email": "maria@example.com",
        "phone": "+5531999990000",
        "phone_secondary": null,
        "has_whatsapp": true,
        "document_masked": null,
        "address": {
            "cep": "30130010",
            "street": null,
            "number": null,
            "complement": null,
            "district": null,
            "city": "Belo Horizonte",
            "state": "MG"
        },
        "origin": "site",
        "tags": [
            "instagram",
            "residencial"
        ],
        "stage": "orcamento",
        "lost_reason": null,
        "locale": null,
        "lead_score": 72,
        "risk_level": "baixo",
        "next_step": "Ligar para fechar",
        "next_step_at": "2026-10-21T09:00:00-03:00",
        "birthday": null,
        "notes": null,
        "owner_user_id": 3,
        "totals": {
            "quoted_cents": 39000,
            "won_cents": 0,
            "received_cents": 0,
            "open_cents": 0
        },
        "counts": {
            "quotes": 1,
            "contracts": 0,
            "invoices": 0
        },
        "currency": "BRL",
        "became_client_at": null,
        "last_activity_at": "2026-10-19T14:02:10-03:00",
        "created_at": "2026-10-18T16:40:00-03:00",
        "updated_at": "2026-10-19T14:02:10-03:00"
    }
}
POST /contacts/{id}/stage contacts:write

Mudar etapa do funil

resposta 200 · Contact

ParâmetroOndeTipoDescrição
id *pathintegerId do contato.
Corpo (StageInput)
CampoTipoDescrição
stage *string novo</code> <code>conversa</code> <code>orcamento</code> <code>cliente</code> <code>perdido
reasonstringMotivo (quando perdido).
curl -X POST "https://appdomei.com/api/public/v1/contacts/128/stage" \
  -H "Authorization: Bearer $ADM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"stage":"perdido","reason":"Fechou com outro"}'
Resposta de exemplo
json
{
    "data": {
        "id": 128,
        "type": "pf",
        "name": "Maria Souza",
        "company": null,
        "email": "maria@example.com",
        "phone": "+5531999990000",
        "phone_secondary": null,
        "has_whatsapp": true,
        "document_masked": null,
        "address": {
            "cep": "30130010",
            "street": null,
            "number": null,
            "complement": null,
            "district": null,
            "city": "Belo Horizonte",
            "state": "MG"
        },
        "origin": "site",
        "tags": [
            "instagram",
            "residencial"
        ],
        "stage": "perdido",
        "lost_reason": "Fechou com outro",
        "locale": null,
        "lead_score": 72,
        "risk_level": "baixo",
        "next_step": "Ligar para fechar",
        "next_step_at": "2026-10-21T09:00:00-03:00",
        "birthday": null,
        "notes": null,
        "owner_user_id": 3,
        "totals": {
            "quoted_cents": 39000,
            "won_cents": 0,
            "received_cents": 0,
            "open_cents": 0
        },
        "counts": {
            "quotes": 1,
            "contracts": 0,
            "invoices": 0
        },
        "currency": "BRL",
        "became_client_at": null,
        "last_activity_at": "2026-10-19T14:02:10-03:00",
        "created_at": "2026-10-18T16:40:00-03:00",
        "updated_at": "2026-10-19T14:02:10-03:00"
    }
}

Quotes

Orçamentos com itens; totais calculados no servidor. Enviar gera o PDF e a página pública /p/{token}.

GET /quotes quotes:read

Listar orçamentos

Na lista os itens não vêm; use GET /quotes/{id}.

resposta 200 · lista de Quote

ParâmetroOndeTipoDescrição
statusquerystring`open` = enviado ou visto. open</code> <code>rascunho</code> <code>enviado</code> <code>visto</code> <code>aceito</code> <code>recusado</code> <code>expirado</code> <code>cancelado
contact_idqueryinteger
qquerystringTítulo, nome do contato ou número.
pagequeryintegerPágina (a partir de 1).
per_pagequeryintegerItens por página (padrão 50, máximo 200).
updated_sincequerystring (date-time)Só registros criados/alterados a partir desta data-hora (ISO 8601).
curl "https://appdomei.com/api/public/v1/quotes?status=open&per_page=50" \
  -H "Authorization: Bearer $ADM_API_KEY"
Resposta de exemplo
json
{
    "data": [
        {
            "id": 77,
            "token": "k3j9d0s2mf8a1b7c4e5n6p",
            "number": 42,
            "number_label": "ORC-0042",
            "version": 1,
            "parent_id": null,
            "contact_id": 128,
            "contact_name": "Maria Souza",
            "title": "Instalação elétrica — sala",
            "status": "rascunho",
            "valid_until": "2026-11-05",
            "subtotal_cents": 24000,
            "discount": {
                "type": "percent",
                "value": 500,
                "cents": 1200
            },
            "total_cents": 22800,
            "currency": "BRL",
            "payment_terms": "50% na aprovação, 50% na entrega",
            "notes": null,
            "public_url": "https://appdomei.com/p/k3j9d0s2mf8a1b7c4e5n6p",
            "pdf_hash": null,
            "sent_at": null,
            "sent_via": null,
            "viewed_at": null,
            "view_count": 0,
            "accepted_at": null,
            "accepted_name": null,
            "declined_at": null,
            "decline_reason": null,
            "client_comment": null,
            "created_at": "2026-10-19T14:05:00-03:00",
            "updated_at": "2026-10-19T14:05:00-03:00"
        }
    ],
    "meta": {
        "page": 1,
        "per_page": 50,
        "total": 1,
        "last_page": 1
    }
}
POST /quotes quotes:write

Criar orçamento

Informe `contact_id` ou um `contact` novo (exige também `contacts:write`). Preços em centavos; o total é calculado no servidor. `send: "link"` já envia e devolve `public_url`.

Idempotency-Key cota quotes_month resposta 201 · Quote

Corpo (QuoteInput)
CampoTipoDescrição
contact_idinteger
contactContactInput
titlestring
valid_untilstring|nullPadrão: validade configurada na conta.
items *array de QuoteItemInput
discountobject
payment_termsstring
notesstringObservações visíveis ao cliente.
internal_notesstring
sendstringJá envia ao criar. link</code> <code>email
curl -X POST "https://appdomei.com/api/public/v1/quotes" \
  -H "Authorization: Bearer $ADM_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: pedido-2026-0042" \
  -d '{"contact_id":128,"title":"Instalação elétrica — sala","valid_until":"2026-11-05","items":[{"description":"Ponto de tomada","quantity":3,"unit":"un","unit_price_cents":8000},{"description":"Material","quantity":1,"unit_price_cents":15000,"optional":true}],"discount":{"type":"percent","value":500},"payment_terms":"50% na aprovação, 50% na entrega","send":"link"}'
Resposta de exemplo
json
{
    "data": {
        "id": 77,
        "token": "k3j9d0s2mf8a1b7c4e5n6p",
        "number": 42,
        "number_label": "ORC-0042",
        "version": 1,
        "parent_id": null,
        "contact_id": 128,
        "contact_name": "Maria Souza",
        "title": "Instalação elétrica — sala",
        "status": "rascunho",
        "valid_until": "2026-11-05",
        "subtotal_cents": 24000,
        "discount": {
            "type": "percent",
            "value": 500,
            "cents": 1200
        },
        "total_cents": 22800,
        "currency": "BRL",
        "payment_terms": "50% na aprovação, 50% na entrega",
        "notes": null,
        "public_url": "https://appdomei.com/p/k3j9d0s2mf8a1b7c4e5n6p",
        "pdf_hash": null,
        "sent_at": null,
        "sent_via": null,
        "viewed_at": null,
        "view_count": 0,
        "accepted_at": null,
        "accepted_name": null,
        "declined_at": null,
        "decline_reason": null,
        "client_comment": null,
        "created_at": "2026-10-19T14:05:00-03:00",
        "updated_at": "2026-10-19T14:05:00-03:00",
        "items": [
            {
                "id": 501,
                "catalog_item_id": 12,
                "description": "Ponto de tomada",
                "details": null,
                "quantity": 3,
                "unit": "un",
                "unit_price_cents": 8000,
                "discount_cents": 0,
                "total_cents": 24000,
                "optional": false,
                "sort": 0
            }
        ]
    }
}
GET /quotes/{id} quotes:read

Ler orçamento com itens

resposta 200 · Quote

ParâmetroOndeTipoDescrição
id *pathintegerId do orçamento.
curl "https://appdomei.com/api/public/v1/quotes/128" \
  -H "Authorization: Bearer $ADM_API_KEY"
Resposta de exemplo
json
{
    "data": {
        "id": 77,
        "token": "k3j9d0s2mf8a1b7c4e5n6p",
        "number": 42,
        "number_label": "ORC-0042",
        "version": 1,
        "parent_id": null,
        "contact_id": 128,
        "contact_name": "Maria Souza",
        "title": "Instalação elétrica — sala",
        "status": "rascunho",
        "valid_until": "2026-11-05",
        "subtotal_cents": 24000,
        "discount": {
            "type": "percent",
            "value": 500,
            "cents": 1200
        },
        "total_cents": 22800,
        "currency": "BRL",
        "payment_terms": "50% na aprovação, 50% na entrega",
        "notes": null,
        "public_url": "https://appdomei.com/p/k3j9d0s2mf8a1b7c4e5n6p",
        "pdf_hash": null,
        "sent_at": null,
        "sent_via": null,
        "viewed_at": null,
        "view_count": 0,
        "accepted_at": null,
        "accepted_name": null,
        "declined_at": null,
        "decline_reason": null,
        "client_comment": null,
        "created_at": "2026-10-19T14:05:00-03:00",
        "updated_at": "2026-10-19T14:05:00-03:00",
        "items": [
            {
                "id": 501,
                "catalog_item_id": 12,
                "description": "Ponto de tomada",
                "details": null,
                "quantity": 3,
                "unit": "un",
                "unit_price_cents": 8000,
                "discount_cents": 0,
                "total_cents": 24000,
                "optional": false,
                "sort": 0
            }
        ]
    }
}
POST /quotes/{id}/send quotes:write

Enviar (gera link e PDF)

`via: link` marca como enviado e devolve a URL pública em `meta.public_url`; `via: email` também enfileira o e-mail ao contato (precisa ter e-mail). Só rascunho/enviado/visto.

resposta 200 · Quote

ParâmetroOndeTipoDescrição
id *pathintegerId do orçamento.
Corpo (SendInput)
CampoTipoDescrição
viastringPadrão: link. link</code> <code>email
curl -X POST "https://appdomei.com/api/public/v1/quotes/128/send" \
  -H "Authorization: Bearer $ADM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"via":"link"}'
Resposta de exemplo
json
{
    "data": {
        "id": 77,
        "token": "k3j9d0s2mf8a1b7c4e5n6p",
        "number": 42,
        "number_label": "ORC-0042",
        "version": 1,
        "parent_id": null,
        "contact_id": 128,
        "contact_name": "Maria Souza",
        "title": "Instalação elétrica — sala",
        "status": "enviado",
        "valid_until": "2026-11-05",
        "subtotal_cents": 24000,
        "discount": {
            "type": "percent",
            "value": 500,
            "cents": 1200
        },
        "total_cents": 22800,
        "currency": "BRL",
        "payment_terms": "50% na aprovação, 50% na entrega",
        "notes": null,
        "public_url": "https://appdomei.com/p/k3j9d0s2mf8a1b7c4e5n6p",
        "pdf_hash": null,
        "sent_at": null,
        "sent_via": null,
        "viewed_at": null,
        "view_count": 0,
        "accepted_at": null,
        "accepted_name": null,
        "declined_at": null,
        "decline_reason": null,
        "client_comment": null,
        "created_at": "2026-10-19T14:05:00-03:00",
        "updated_at": "2026-10-19T14:05:00-03:00"
    },
    "meta": {
        "public_url": "https://appdomei.com/p/k3j9d0s2mf8a1b7c4e5n6p",
        "via": "link"
    }
}

Contracts

Contratos (somente leitura): status, plano de pagamento, hashes verificáveis.

GET /contracts contracts:read

Listar contratos

resposta 200 · lista de Contract

ParâmetroOndeTipoDescrição
statusquerystring open</code> <code>rascunho</code> <code>enviado</code> <code>visto</code> <code>assinado</code> <code>recusado</code> <code>expirado</code> <code>cancelado</code> <code>encerrado
contact_idqueryinteger
qquerystring
pagequeryintegerPágina (a partir de 1).
per_pagequeryintegerItens por página (padrão 50, máximo 200).
updated_sincequerystring (date-time)Só registros criados/alterados a partir desta data-hora (ISO 8601).
curl "https://appdomei.com/api/public/v1/contracts?status=open&per_page=50" \
  -H "Authorization: Bearer $ADM_API_KEY"
Resposta de exemplo
json
{
    "data": [
        {
            "id": 31,
            "token": "p0q9w8e7r6t5y4u3i2o1a9",
            "number": 12,
            "number_label": "CTR-0012",
            "version": 1,
            "contact_id": 128,
            "contact_name": "Maria Souza",
            "quote_id": 77,
            "kind": "servico",
            "title": "Prestação de serviços elétricos",
            "object": "Instalação elétrica da sala conforme orçamento ORC-0042.",
            "status": "assinado",
            "total_cents": 22800,
            "currency": "BRL",
            "recurring": false,
            "recurring_amount_cents": null,
            "recurring_day": null,
            "installments": 2,
            "payment_plan": [
                {
                    "due_date": "2026-10-25",
                    "amount_cents": 11400,
                    "description": "Sinal"
                },
                {
                    "due_date": "2026-11-10",
                    "amount_cents": 11400,
                    "description": "Entrega"
                }
            ],
            "starts_at": "2026-10-25",
            "ends_at": "2026-11-10",
            "sign_deadline": "2026-10-24",
            "signature_level": "simples",
            "signers": {
                "total": 1,
                "done": 1
            },
            "public_url": "https://appdomei.com/a/p0q9w8e7r6t5y4u3i2o1a9",
            "verify_code": "9c1e…",
            "content_hash": "5f2a…",
            "signature_hash": "9c1e…",
            "pdf_hash": "d41d…",
            "sent_at": "2026-10-19T15:00:00-03:00",
            "viewed_at": "2026-10-19T15:20:00-03:00",
            "signed_at": "2026-10-19T15:25:31-03:00",
            "signer_name": "Maria Souza",
            "declined_at": null,
            "decline_reason": null,
            "terminated_at": null,
            "next_invoice_at": null,
            "created_at": "2026-10-19T14:50:00-03:00",
            "updated_at": "2026-10-19T15:25:31-03:00"
        }
    ],
    "meta": {
        "page": 1,
        "per_page": 50,
        "total": 1,
        "last_page": 1
    }
}
GET /contracts/{id} contracts:read

Ler contrato

resposta 200 · Contract

ParâmetroOndeTipoDescrição
id *pathintegerId do contrato.
curl "https://appdomei.com/api/public/v1/contracts/128" \
  -H "Authorization: Bearer $ADM_API_KEY"
Resposta de exemplo
json
{
    "data": {
        "id": 31,
        "token": "p0q9w8e7r6t5y4u3i2o1a9",
        "number": 12,
        "number_label": "CTR-0012",
        "version": 1,
        "contact_id": 128,
        "contact_name": "Maria Souza",
        "quote_id": 77,
        "kind": "servico",
        "title": "Prestação de serviços elétricos",
        "object": "Instalação elétrica da sala conforme orçamento ORC-0042.",
        "status": "assinado",
        "total_cents": 22800,
        "currency": "BRL",
        "recurring": false,
        "recurring_amount_cents": null,
        "recurring_day": null,
        "installments": 2,
        "payment_plan": [
            {
                "due_date": "2026-10-25",
                "amount_cents": 11400,
                "description": "Sinal"
            },
            {
                "due_date": "2026-11-10",
                "amount_cents": 11400,
                "description": "Entrega"
            }
        ],
        "starts_at": "2026-10-25",
        "ends_at": "2026-11-10",
        "sign_deadline": "2026-10-24",
        "signature_level": "simples",
        "signers": {
            "total": 1,
            "done": 1
        },
        "public_url": "https://appdomei.com/a/p0q9w8e7r6t5y4u3i2o1a9",
        "verify_code": "9c1e…",
        "content_hash": "5f2a…",
        "signature_hash": "9c1e…",
        "pdf_hash": "d41d…",
        "sent_at": "2026-10-19T15:00:00-03:00",
        "viewed_at": "2026-10-19T15:20:00-03:00",
        "signed_at": "2026-10-19T15:25:31-03:00",
        "signer_name": "Maria Souza",
        "declined_at": null,
        "decline_reason": null,
        "terminated_at": null,
        "next_invoice_at": null,
        "created_at": "2026-10-19T14:50:00-03:00",
        "updated_at": "2026-10-19T15:25:31-03:00"
    }
}

Invoices

Cobranças ao cliente final: criar, baixar manualmente (Pix direto/dinheiro) e cancelar. Pagamento pela plataforma continua pelo link público /pagar/{token}.

GET /invoices invoices:read

Listar cobranças

resposta 200 · lista de Invoice

ParâmetroOndeTipoDescrição
statusquerystring open</code> <code>aberta</code> <code>atrasada</code> <code>paga</code> <code>cancelada</code> <code>estornada
contact_idqueryinteger
contract_idqueryinteger
fromquerystring (date)Vencimento a partir de.
toquerystring (date)Vencimento até.
qquerystring
pagequeryintegerPágina (a partir de 1).
per_pagequeryintegerItens por página (padrão 50, máximo 200).
updated_sincequerystring (date-time)Só registros criados/alterados a partir desta data-hora (ISO 8601).
curl "https://appdomei.com/api/public/v1/invoices?status=open&per_page=50" \
  -H "Authorization: Bearer $ADM_API_KEY"
Resposta de exemplo
json
{
    "data": [
        {
            "id": 912,
            "uuid": "6a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
            "token": "z1x2c3v4b5n6m7a8s9d0f1",
            "number": 42,
            "number_label": "COB-0042",
            "installment": null,
            "contact_id": 128,
            "contact_name": "Maria Souza",
            "contract_id": null,
            "quote_id": 77,
            "description": "Instalação elétrica — sala",
            "notes": null,
            "amount_cents": 39000,
            "discount_cents": 0,
            "currency": "BRL",
            "late_fee_percent": 2,
            "late_interest_percent": 1,
            "due_date": "2026-10-30",
            "status": "aberta",
            "methods": [
                "pix_platform",
                "pix_direct"
            ],
            "paid": null,
            "receipt": null,
            "public_url": "https://appdomei.com/pagar/z1x2c3v4b5n6m7a8s9d0f1",
            "reminders": true,
            "canceled_at": null,
            "cancel_reason": null,
            "refunded_at": null,
            "refunded_cents": null,
            "client_claimed_paid_at": null,
            "nfse_id": null,
            "sent_at": null,
            "viewed_at": null,
            "created_at": "2026-10-19T14:10:00-03:00",
            "updated_at": "2026-10-19T14:10:00-03:00"
        }
    ],
    "meta": {
        "page": 1,
        "per_page": 50,
        "total": 1,
        "last_page": 1
    }
}
POST /invoices invoices:write

Criar cobrança

Cria uma cobrança em aberto com link público `/pagar/{token}`. `installments` > 1 divide em parcelas mensais (devolve uma lista). Meios: pix_platform, card, pix_direct, manual (padrão: configuração da conta).

Idempotency-Key resposta 201 · Invoice

Corpo (InvoiceInput)
CampoTipoDescrição
contact_idinteger
contactContactInput
description *stringAté 190 caracteres.
amount_cents *integerValor em centavos (BRL).
discount_centsintegerDesconto se pagar até o vencimento.
due_datestring|nullPadrão: +7 dias.
methodsarray
late_fee_percentnumber
late_interest_percentnumber
installmentsinteger1–60; > 1 cria parcelas mensais.
remindersbooleanRégua de lembretes (padrão true).
notesstring
contract_idinteger
quote_idinteger
curl -X POST "https://appdomei.com/api/public/v1/invoices" \
  -H "Authorization: Bearer $ADM_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: pedido-2026-0042" \
  -d '{"contact_id":128,"description":"Instalação elétrica — sala","amount_cents":39000,"due_date":"2026-10-30","methods":["pix_platform","pix_direct"]}'
Resposta de exemplo
json
{
    "data": {
        "id": 912,
        "uuid": "6a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
        "token": "z1x2c3v4b5n6m7a8s9d0f1",
        "number": 42,
        "number_label": "COB-0042",
        "installment": null,
        "contact_id": 128,
        "contact_name": "Maria Souza",
        "contract_id": null,
        "quote_id": 77,
        "description": "Instalação elétrica — sala",
        "notes": null,
        "amount_cents": 39000,
        "discount_cents": 0,
        "currency": "BRL",
        "late_fee_percent": 2,
        "late_interest_percent": 1,
        "due_date": "2026-10-30",
        "status": "aberta",
        "methods": [
            "pix_platform",
            "pix_direct"
        ],
        "paid": null,
        "receipt": null,
        "public_url": "https://appdomei.com/pagar/z1x2c3v4b5n6m7a8s9d0f1",
        "reminders": true,
        "canceled_at": null,
        "cancel_reason": null,
        "refunded_at": null,
        "refunded_cents": null,
        "client_claimed_paid_at": null,
        "nfse_id": null,
        "sent_at": null,
        "viewed_at": null,
        "created_at": "2026-10-19T14:10:00-03:00",
        "updated_at": "2026-10-19T14:10:00-03:00"
    }
}
GET /invoices/{id} invoices:read

Ler cobrança

resposta 200 · Invoice

ParâmetroOndeTipoDescrição
id *pathintegerId da cobrança.
curl "https://appdomei.com/api/public/v1/invoices/128" \
  -H "Authorization: Bearer $ADM_API_KEY"
Resposta de exemplo
json
{
    "data": {
        "id": 912,
        "uuid": "6a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
        "token": "z1x2c3v4b5n6m7a8s9d0f1",
        "number": 42,
        "number_label": "COB-0042",
        "installment": null,
        "contact_id": 128,
        "contact_name": "Maria Souza",
        "contract_id": null,
        "quote_id": 77,
        "description": "Instalação elétrica — sala",
        "notes": null,
        "amount_cents": 39000,
        "discount_cents": 0,
        "currency": "BRL",
        "late_fee_percent": 2,
        "late_interest_percent": 1,
        "due_date": "2026-10-30",
        "status": "aberta",
        "methods": [
            "pix_platform",
            "pix_direct"
        ],
        "paid": null,
        "receipt": null,
        "public_url": "https://appdomei.com/pagar/z1x2c3v4b5n6m7a8s9d0f1",
        "reminders": true,
        "canceled_at": null,
        "cancel_reason": null,
        "refunded_at": null,
        "refunded_cents": null,
        "client_claimed_paid_at": null,
        "nfse_id": null,
        "sent_at": null,
        "viewed_at": null,
        "created_at": "2026-10-19T14:10:00-03:00",
        "updated_at": "2026-10-19T14:10:00-03:00"
    }
}
POST /invoices/{id}/mark-paid invoices:write

Baixar como paga

Só `pix_direct` e `manual` (pagamentos fora da plataforma). Gera recibo e lançamento no financeiro. Já paga: devolve a cobrança com `meta.already_paid`.

resposta 200 · Invoice

ParâmetroOndeTipoDescrição
id *pathintegerId da cobrança.
Corpo (MarkPaidInput)
CampoTipoDescrição
method *string pix_direct</code> <code>manual
amount_centsintegerPadrão: total devido na data.
paid_atstring|nullPadrão: agora.
e2e_idstringIdentificador Pix (E2E).
notestring
curl -X POST "https://appdomei.com/api/public/v1/invoices/128/mark-paid" \
  -H "Authorization: Bearer $ADM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"method":"pix_direct","amount_cents":39000,"paid_at":"2026-10-28T14:30:00-03:00","e2e_id":"E12345678202610281430abcdef"}'
Resposta de exemplo
json
{
    "data": {
        "id": 912,
        "uuid": "6a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
        "token": "z1x2c3v4b5n6m7a8s9d0f1",
        "number": 42,
        "number_label": "COB-0042",
        "installment": null,
        "contact_id": 128,
        "contact_name": "Maria Souza",
        "contract_id": null,
        "quote_id": 77,
        "description": "Instalação elétrica — sala",
        "notes": null,
        "amount_cents": 39000,
        "discount_cents": 0,
        "currency": "BRL",
        "late_fee_percent": 2,
        "late_interest_percent": 1,
        "due_date": "2026-10-30",
        "status": "paga",
        "methods": [
            "pix_platform",
            "pix_direct"
        ],
        "paid": {
            "method": "pix_direct",
            "at": "2026-10-28T14:30:00-03:00",
            "amount_cents": 39000,
            "fee_cents": 0,
            "net_cents": 39000,
            "e2e_id": "E12345678202610281430abcdef",
            "note": null
        },
        "receipt": null,
        "public_url": "https://appdomei.com/pagar/z1x2c3v4b5n6m7a8s9d0f1",
        "reminders": true,
        "canceled_at": null,
        "cancel_reason": null,
        "refunded_at": null,
        "refunded_cents": null,
        "client_claimed_paid_at": null,
        "nfse_id": null,
        "sent_at": null,
        "viewed_at": null,
        "created_at": "2026-10-19T14:10:00-03:00",
        "updated_at": "2026-10-19T14:10:00-03:00"
    }
}
POST /invoices/{id}/cancel invoices:write

Cancelar cobrança

Só cobranças em aberto (aberta/atrasada).

resposta 200 · Invoice

ParâmetroOndeTipoDescrição
id *pathintegerId da cobrança.
Corpo (CancelInput)
CampoTipoDescrição
reasonstring
curl -X POST "https://appdomei.com/api/public/v1/invoices/128/cancel" \
  -H "Authorization: Bearer $ADM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"reason":"Serviço cancelado pelo cliente"}'
Resposta de exemplo
json
{
    "data": {
        "id": 912,
        "uuid": "6a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
        "token": "z1x2c3v4b5n6m7a8s9d0f1",
        "number": 42,
        "number_label": "COB-0042",
        "installment": null,
        "contact_id": 128,
        "contact_name": "Maria Souza",
        "contract_id": null,
        "quote_id": 77,
        "description": "Instalação elétrica — sala",
        "notes": null,
        "amount_cents": 39000,
        "discount_cents": 0,
        "currency": "BRL",
        "late_fee_percent": 2,
        "late_interest_percent": 1,
        "due_date": "2026-10-30",
        "status": "cancelada",
        "methods": [
            "pix_platform",
            "pix_direct"
        ],
        "paid": null,
        "receipt": null,
        "public_url": "https://appdomei.com/pagar/z1x2c3v4b5n6m7a8s9d0f1",
        "reminders": true,
        "canceled_at": "2026-10-20T10:00:00-03:00",
        "cancel_reason": "Serviço cancelado pelo cliente",
        "refunded_at": null,
        "refunded_cents": null,
        "client_claimed_paid_at": null,
        "nfse_id": null,
        "sent_at": null,
        "viewed_at": null,
        "created_at": "2026-10-19T14:10:00-03:00",
        "updated_at": "2026-10-19T14:10:00-03:00"
    }
}

Appointments

Agenda: compromissos por intervalo, criação e mudança de status.

GET /appointments appointments:read

Listar compromissos por intervalo

resposta 200 · lista de Appointment

ParâmetroOndeTipoDescrição
fromquerystring (date)Início do intervalo (padrão: 30 dias atrás).
toquerystring (date)Fim (máximo 92 dias após `from`).
statusquerystring agendado</code> <code>confirmado</code> <code>concluido</code> <code>cancelado</code> <code>faltou
kindquerystring servico</code> <code>reuniao</code> <code>visita</code> <code>bloqueio</code> <code>pessoal
contact_idqueryinteger
pagequeryintegerPágina (a partir de 1).
per_pagequeryintegerItens por página (padrão 50, máximo 200).
updated_sincequerystring (date-time)Só registros criados/alterados a partir desta data-hora (ISO 8601).
curl "https://appdomei.com/api/public/v1/appointments?from=2026-10-19&per_page=50" \
  -H "Authorization: Bearer $ADM_API_KEY"
Resposta de exemplo
json
{
    "data": [
        {
            "id": 55,
            "uuid": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
            "token": "m9n8b7v6c5x4z3l2k1j0h9",
            "contact_id": 128,
            "contact_name": "Maria Souza",
            "contract_id": null,
            "invoice_id": null,
            "quote_id": null,
            "catalog_item_id": null,
            "user_id": 3,
            "kind": "visita",
            "title": "Visita técnica",
            "starts_at": "2026-10-22T14:00:00-03:00",
            "ends_at": "2026-10-22T15:00:00-03:00",
            "all_day": false,
            "location": "Rua A, 100",
            "address": null,
            "notes": null,
            "client_notes": null,
            "price_cents": null,
            "currency": "BRL",
            "status": "agendado",
            "source": "user",
            "confirmed_at": null,
            "canceled_at": null,
            "canceled_by": null,
            "cancel_reason": null,
            "recurrence": null,
            "recurrence_until": null,
            "recurrence_parent_id": null,
            "public_url": "https://appdomei.com/compromisso/m9n8b7v6c5x4z3l2k1j0h9",
            "created_at": "2026-10-19T14:20:00-03:00",
            "updated_at": "2026-10-19T14:20:00-03:00"
        }
    ],
    "meta": {
        "page": 1,
        "per_page": 50,
        "total": 1,
        "last_page": 1,
        "from": "2026-10-01",
        "to": "2026-10-31"
    }
}
POST /appointments appointments:write

Criar compromisso

`starts_at` em ISO 8601; `ends_at` ou `duration_minutes` (padrão da conta). Conflito com outro compromisso vira aviso em `meta.conflict_warning`; horário bloqueado recusa com 409.

Idempotency-Key cota appointments_month resposta 201 · Appointment

Corpo (AppointmentInput)
CampoTipoDescrição
titlestringPadrão: nome do item do catálogo ou "Tipo com Cliente".
kindstring servico</code> <code>reuniao</code> <code>visita</code> <code>bloqueio</code> <code>pessoal
starts_at *string
ends_atstring
duration_minutesintegerUsado quando não há ends_at.
all_dayboolean
contact_idinteger
contactContactInput
contract_idinteger
invoice_idinteger
quote_idinteger
catalog_item_idinteger
user_idinteger
locationstring
notesstring
client_notesstringVisível ao cliente.
price_centsintegerValor em centavos (BRL).
colorstring#RRGGBB
recurrencestringweekly, biweekly, monthly…
recurrence_untilstring|nullYYYY-MM-DD
curl -X POST "https://appdomei.com/api/public/v1/appointments" \
  -H "Authorization: Bearer $ADM_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: pedido-2026-0042" \
  -d '{"title":"Visita técnica","kind":"visita","starts_at":"2026-10-22T14:00:00-03:00","duration_minutes":60,"contact_id":128,"location":"Rua A, 100"}'
Resposta de exemplo
json
{
    "data": {
        "id": 55,
        "uuid": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
        "token": "m9n8b7v6c5x4z3l2k1j0h9",
        "contact_id": 128,
        "contact_name": "Maria Souza",
        "contract_id": null,
        "invoice_id": null,
        "quote_id": null,
        "catalog_item_id": null,
        "user_id": 3,
        "kind": "visita",
        "title": "Visita técnica",
        "starts_at": "2026-10-22T14:00:00-03:00",
        "ends_at": "2026-10-22T15:00:00-03:00",
        "all_day": false,
        "location": "Rua A, 100",
        "address": null,
        "notes": null,
        "client_notes": null,
        "price_cents": null,
        "currency": "BRL",
        "status": "agendado",
        "source": "user",
        "confirmed_at": null,
        "canceled_at": null,
        "canceled_by": null,
        "cancel_reason": null,
        "recurrence": null,
        "recurrence_until": null,
        "recurrence_parent_id": null,
        "public_url": "https://appdomei.com/compromisso/m9n8b7v6c5x4z3l2k1j0h9",
        "created_at": "2026-10-19T14:20:00-03:00",
        "updated_at": "2026-10-19T14:20:00-03:00"
    }
}
GET /appointments/{id} appointments:read

Ler compromisso

resposta 200 · Appointment

ParâmetroOndeTipoDescrição
id *pathintegerId do compromisso.
curl "https://appdomei.com/api/public/v1/appointments/128" \
  -H "Authorization: Bearer $ADM_API_KEY"
Resposta de exemplo
json
{
    "data": {
        "id": 55,
        "uuid": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
        "token": "m9n8b7v6c5x4z3l2k1j0h9",
        "contact_id": 128,
        "contact_name": "Maria Souza",
        "contract_id": null,
        "invoice_id": null,
        "quote_id": null,
        "catalog_item_id": null,
        "user_id": 3,
        "kind": "visita",
        "title": "Visita técnica",
        "starts_at": "2026-10-22T14:00:00-03:00",
        "ends_at": "2026-10-22T15:00:00-03:00",
        "all_day": false,
        "location": "Rua A, 100",
        "address": null,
        "notes": null,
        "client_notes": null,
        "price_cents": null,
        "currency": "BRL",
        "status": "agendado",
        "source": "user",
        "confirmed_at": null,
        "canceled_at": null,
        "canceled_by": null,
        "cancel_reason": null,
        "recurrence": null,
        "recurrence_until": null,
        "recurrence_parent_id": null,
        "public_url": "https://appdomei.com/compromisso/m9n8b7v6c5x4z3l2k1j0h9",
        "created_at": "2026-10-19T14:20:00-03:00",
        "updated_at": "2026-10-19T14:20:00-03:00"
    }
}
POST /appointments/{id}/status appointments:write

Mudar status

`confirmado` (só de agendado), `concluido` (opcional `create_invoice` + `amount_cents`), `cancelado` (`reason`, `series`), `faltou`, `agendado` (reabrir).

resposta 200 · Appointment

ParâmetroOndeTipoDescrição
id *pathintegerId do compromisso.
Corpo (AppointmentStatusInput)
CampoTipoDescrição
status *string agendado</code> <code>confirmado</code> <code>concluido</code> <code>cancelado</code> <code>faltou
reasonstring
seriesbooleanCancelar toda a série recorrente.
create_invoicebooleanAo concluir, cria a cobrança.
amount_centsintegerValor em centavos (BRL).
due_datestring|nullYYYY-MM-DD
curl -X POST "https://appdomei.com/api/public/v1/appointments/128/status" \
  -H "Authorization: Bearer $ADM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"status":"concluido","create_invoice":true,"amount_cents":25000}'
Resposta de exemplo
json
{
    "data": {
        "id": 55,
        "uuid": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
        "token": "m9n8b7v6c5x4z3l2k1j0h9",
        "contact_id": 128,
        "contact_name": "Maria Souza",
        "contract_id": null,
        "invoice_id": null,
        "quote_id": null,
        "catalog_item_id": null,
        "user_id": 3,
        "kind": "visita",
        "title": "Visita técnica",
        "starts_at": "2026-10-22T14:00:00-03:00",
        "ends_at": "2026-10-22T15:00:00-03:00",
        "all_day": false,
        "location": "Rua A, 100",
        "address": null,
        "notes": null,
        "client_notes": null,
        "price_cents": null,
        "currency": "BRL",
        "status": "concluido",
        "source": "user",
        "confirmed_at": null,
        "canceled_at": null,
        "canceled_by": null,
        "cancel_reason": null,
        "recurrence": null,
        "recurrence_until": null,
        "recurrence_parent_id": null,
        "public_url": "https://appdomei.com/compromisso/m9n8b7v6c5x4z3l2k1j0h9",
        "created_at": "2026-10-19T14:20:00-03:00",
        "updated_at": "2026-10-19T14:20:00-03:00"
    },
    "meta": {
        "invoice_id": 912
    }
}

Catalog

Itens de serviço/produto usados nos orçamentos.

GET /catalog catalog:read

Listar itens do catálogo

resposta 200 · lista de CatalogItem

ParâmetroOndeTipoDescrição
qquerystring
typequerystring servico</code> <code>produto
activequeryboolean
pagequeryintegerPágina (a partir de 1).
per_pagequeryintegerItens por página (padrão 50, máximo 200).
updated_sincequerystring (date-time)Só registros criados/alterados a partir desta data-hora (ISO 8601).
curl "https://appdomei.com/api/public/v1/catalog?q=maria&per_page=50" \
  -H "Authorization: Bearer $ADM_API_KEY"
Resposta de exemplo
json
{
    "data": [
        {
            "id": 12,
            "type": "servico",
            "name": "Ponto de tomada",
            "description": "Instalação de ponto de tomada 10A/20A",
            "unit": "un",
            "price_cents": 8000,
            "cost_cents": 2500,
            "currency": "BRL",
            "service_code": null,
            "active": true,
            "sort": 1,
            "usage_count": 14,
            "created_at": "2026-09-02T09:00:00-03:00",
            "updated_at": "2026-10-01T11:30:00-03:00"
        }
    ],
    "meta": {
        "page": 1,
        "per_page": 50,
        "total": 1,
        "last_page": 1
    }
}
POST /catalog catalog:write

Criar item

Idempotency-Key resposta 201 · CatalogItem

Corpo (CatalogItemInput)
CampoTipoDescrição
typestring servico</code> <code>produto
namestringObrigatório na criação.
descriptionstring
unitstring un</code> <code>h</code> <code>dia</code> <code>m2</code> <code>m</code> <code>km</code> <code>kg</code> <code>mes</code> <code>pacote</code> <code>visita
price_centsintegerValor em centavos (BRL).
cost_centsintegerValor em centavos (BRL).
service_codestring
activeboolean
curl -X POST "https://appdomei.com/api/public/v1/catalog" \
  -H "Authorization: Bearer $ADM_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: pedido-2026-0042" \
  -d '{"type":"servico","name":"Ponto de tomada","unit":"un","price_cents":8000}'
Resposta de exemplo
json
{
    "data": {
        "id": 12,
        "type": "servico",
        "name": "Ponto de tomada",
        "description": "Instalação de ponto de tomada 10A/20A",
        "unit": "un",
        "price_cents": 8000,
        "cost_cents": 2500,
        "currency": "BRL",
        "service_code": null,
        "active": true,
        "sort": 1,
        "usage_count": 14,
        "created_at": "2026-09-02T09:00:00-03:00",
        "updated_at": "2026-10-01T11:30:00-03:00"
    }
}
PATCH /catalog/{id} catalog:write

Editar item (parcial)

resposta 200 · CatalogItem

ParâmetroOndeTipoDescrição
id *pathintegerId do item.
Corpo (CatalogItemInput)
CampoTipoDescrição
typestring servico</code> <code>produto
namestringObrigatório na criação.
descriptionstring
unitstring un</code> <code>h</code> <code>dia</code> <code>m2</code> <code>m</code> <code>km</code> <code>kg</code> <code>mes</code> <code>pacote</code> <code>visita
price_centsintegerValor em centavos (BRL).
cost_centsintegerValor em centavos (BRL).
service_codestring
activeboolean
curl -X PATCH "https://appdomei.com/api/public/v1/catalog/128" \
  -H "Authorization: Bearer $ADM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"price_cents":9000,"active":true}'
Resposta de exemplo
json
{
    "data": {
        "id": 12,
        "type": "servico",
        "name": "Ponto de tomada",
        "description": "Instalação de ponto de tomada 10A/20A",
        "unit": "un",
        "price_cents": 9000,
        "cost_cents": 2500,
        "currency": "BRL",
        "service_code": null,
        "active": true,
        "sort": 1,
        "usage_count": 14,
        "created_at": "2026-09-02T09:00:00-03:00",
        "updated_at": "2026-10-01T11:30:00-03:00"
    }
}

Finance

Lançamentos do financeiro por período (somente leitura).

GET /finance/entries finance:read

Lançamentos por período

Em `meta.sums` vêm os totais do filtro (centavos).

resposta 200 · lista de FinanceEntry

ParâmetroOndeTipoDescrição
fromquerystring (date)Padrão: 30 dias atrás. Máximo 366 dias.
toquerystring (date)
kindquerystring entrada</code> <code>saida</code> <code>transferencia
statusquerystringSem filtro: tudo menos cancelado. previsto</code> <code>pago</code> <code>cancelado
contact_idqueryinteger
invoice_idqueryinteger
category_idqueryinteger
qquerystring
pagequeryintegerPágina (a partir de 1).
per_pagequeryintegerItens por página (padrão 50, máximo 200).
curl "https://appdomei.com/api/public/v1/finance/entries?from=2026-10-19&per_page=50" \
  -H "Authorization: Bearer $ADM_API_KEY"
Resposta de exemplo
json
{
    "data": [
        {
            "id": 4021,
            "kind": "entrada",
            "description": "Cobrança COB-0042 — Maria Souza",
            "amount_cents": 39000,
            "currency": "BRL",
            "date": "2026-10-28",
            "paid_at": "2026-10-28",
            "status": "pago",
            "category": {
                "id": 3,
                "name": "Serviços"
            },
            "finance_account": {
                "id": 1,
                "name": "Caixa"
            },
            "transfer_to_account_id": null,
            "contact_id": 128,
            "invoice_id": 912,
            "appointment_id": null,
            "recurrence_id": null,
            "tags": [],
            "notes": null,
            "deductible": false,
            "reconciled_at": null,
            "created_at": "2026-10-28T15:00:00-03:00",
            "updated_at": "2026-10-28T15:00:00-03:00"
        }
    ],
    "meta": {
        "page": 1,
        "per_page": 50,
        "total": 1,
        "last_page": 1,
        "from": "2026-10-01",
        "to": "2026-10-31",
        "sums": {
            "in_paid_cents": 39000,
            "out_paid_cents": 12000,
            "result_cents": 27000,
            "in_planned_cents": 0,
            "out_planned_cents": 0,
            "currency": "BRL"
        }
    }
}

Webhooks

Webhooks de saída: a plataforma chama a sua URL quando algo acontece (assinatura HMAC em X-ADM-Signature).

GET /webhooks webhooks:manage

Listar webhooks de saída

resposta 200 · lista de Webhook

curl "https://appdomei.com/api/public/v1/webhooks" \
  -H "Authorization: Bearer $ADM_API_KEY"
Resposta de exemplo
json
{
    "data": [
        {
            "id": 7,
            "uuid": "c3d4e5f6-a7b8-4c9d-8e0f-1a2b3c4d5e6f",
            "name": "Zapier",
            "url": "https://hooks.zapier.com/hooks/catch/123/abc",
            "events": [
                "invoice.paid",
                "quote.accepted"
            ],
            "secret_prefix": "whsec_9f1c",
            "active": true,
            "failures": 0,
            "disabled_at": null,
            "disabled_reason": null,
            "last_delivery_at": null,
            "last_status": null,
            "created_at": "2026-10-19T16:00:00-03:00",
            "updated_at": "2026-10-19T16:00:00-03:00"
        }
    ],
    "meta": {
        "total": 1,
        "events": [
            "contact.created",
            "quote.accepted",
            "invoice.paid"
        ]
    }
}
POST /webhooks webhooks:manage

Criar webhook

URL https pública (IPs privados são recusados). O `secret` para validar `X-ADM-Signature` só aparece nesta resposta. Planos Pro e Negócio.

Idempotency-Key resposta 201 · Webhook

Corpo (WebhookInput)
CampoTipoDescrição
name *string
url *stringhttps obrigatório; sem IPs privados.
events *arrayEventos ou ["*"] para todos.
headersobjectCabeçalhos extras enviados ao destino (até 5).
activeboolean
curl -X POST "https://appdomei.com/api/public/v1/webhooks" \
  -H "Authorization: Bearer $ADM_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: pedido-2026-0042" \
  -d '{"name":"Zapier","url":"https://hooks.zapier.com/hooks/catch/123/abc","events":["invoice.paid","quote.accepted"]}'
Resposta de exemplo
json
{
    "data": {
        "id": 7,
        "uuid": "c3d4e5f6-a7b8-4c9d-8e0f-1a2b3c4d5e6f",
        "name": "Zapier",
        "url": "https://hooks.zapier.com/hooks/catch/123/abc",
        "events": [
            "invoice.paid",
            "quote.accepted"
        ],
        "secret_prefix": "whsec_9f1c",
        "active": true,
        "failures": 0,
        "disabled_at": null,
        "disabled_reason": null,
        "last_delivery_at": null,
        "last_status": null,
        "created_at": "2026-10-19T16:00:00-03:00",
        "updated_at": "2026-10-19T16:00:00-03:00",
        "secret": "whsec_9f1c2d3e4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d"
    }
}
DELETE /webhooks/{id} webhooks:manage

Excluir webhook

resposta 200 · object

ParâmetroOndeTipoDescrição
id *pathintegerId do webhook.
curl -X DELETE "https://appdomei.com/api/public/v1/webhooks/128" \
  -H "Authorization: Bearer $ADM_API_KEY"
Resposta de exemplo
json
{
    "data": {
        "id": 7,
        "deleted": true
    }
}

Meta

Especificação e utilidades.

GET /openapi público

Especificação OpenAPI 3.1

JSON desta especificação. Público, cacheado por 1 hora. Também disponível como arquivo em /api/openapi.json.

resposta 200 · object

curl "https://appdomei.com/api/public/v1/openapi"

Objetos

Todos os campos de cada recurso, como aparecem em data. A fonte da verdade é o OpenAPI.

Account
CampoTipoDescrição
idinteger
uuidstring
namestringNome fantasia.
legal_namestring|null
typestring mei</code> <code>autonomo</code> <code>me
occupationstring|null
document_maskedstring|nullCPF/CNPJ mascarado.
emailstring|null
phonestring|nullE.164 (+55…).
whatsappstring|null
websitestring|null
addressobject|null
brand_colorstring|null
prefixesobject
quote_validity_daysinteger
timezonestring
public_localestring
currencystring = BRL
statusstring
planobject
created_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
updated_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
Contact
CampoTipoDescrição
idinteger
typestring pf</code> <code>pj
namestring
companystring|null
emailstring|null
phonestring|nullE.164 (+55…).
phone_secondarystring|null
has_whatsappboolean
document_maskedstring|null
addressobject|null
originstring|null
tagsarray
stagestring novo</code> <code>conversa</code> <code>orcamento</code> <code>cliente</code> <code>perdido
lost_reasonstring|null
localestring|null
lead_scoreinteger|null0–100 (assistente).
risk_levelstring|null
next_stepstring|null
next_step_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
birthdaystring|null (date)YYYY-MM-DD
notesstring|null
owner_user_idinteger|null
totalsobject
countsobject
currencystring = BRL
became_client_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
last_activity_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
created_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
updated_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
Quote
CampoTipoDescrição
idinteger
tokenstringToken da página pública.
numberinteger
number_labelstring|nullEx.: ORC-0042
versioninteger
parent_idinteger|null
contact_idinteger
contact_namestring|null
titlestring|null
statusstring rascunho</code> <code>enviado</code> <code>visto</code> <code>aceito</code> <code>recusado</code> <code>expirado</code> <code>cancelado
valid_untilstring|null (date)YYYY-MM-DD
subtotal_centsintegerValor em centavos (BRL).
discountobject
total_centsintegerValor em centavos (BRL).
currencystring = BRL
payment_termsstring|null
notesstring|null
public_urlstring|null
pdf_hashstring|nullsha256 do PDF (verificável em /verificar).
sent_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
sent_viastring|null
viewed_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
view_countinteger
accepted_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
accepted_namestring|null
declined_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
decline_reasonstring|null
client_commentstring|null
itemsarray de QuoteItemSó em GET /quotes/{id} e nas respostas de POST.
created_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
updated_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
QuoteItem
CampoTipoDescrição
idinteger
catalog_item_idinteger|null
descriptionstring
detailsstring|null
quantitynumber
unitstring
unit_price_centsintegerValor em centavos (BRL).
discount_centsintegerDesconto do item em centavos.
total_centsintegerValor em centavos (BRL).
optionalbooleanItem opcional não entra no subtotal.
sortinteger
Contract
CampoTipoDescrição
idinteger
tokenstring
numberinteger
number_labelstring|null
versioninteger
contact_idinteger
contact_namestring|null
quote_idinteger|null
kindstring servico</code> <code>empreitada</code> <code>mensalidade</code> <code>aula</code> <code>outro
titlestring
objectstring|null
statusstring rascunho</code> <code>enviado</code> <code>visto</code> <code>assinado</code> <code>recusado</code> <code>expirado</code> <code>cancelado</code> <code>encerrado
total_centsintegerValor em centavos (BRL).
currencystring = BRL
recurringboolean
recurring_amount_centsinteger|null
recurring_dayinteger|null
installmentsinteger|null
payment_planarray
starts_atstring|null (date)YYYY-MM-DD
ends_atstring|null (date)YYYY-MM-DD
sign_deadlinestring|null (date)YYYY-MM-DD
signature_levelstring simples</code> <code>avancada
signersobject
public_urlstring|null
verify_codestring|null
content_hashstring|null
signature_hashstring|null
pdf_hashstring|null
sent_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
viewed_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
signed_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
signer_namestring|null
declined_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
decline_reasonstring|null
terminated_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
next_invoice_atstring|null (date)YYYY-MM-DD
created_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
updated_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
Invoice
CampoTipoDescrição
idinteger
uuidstring
tokenstring
numberinteger
number_labelstring|nullEx.: COB-0042
installmentobject|null
contact_idinteger
contact_namestring|null
contract_idinteger|null
quote_idinteger|null
descriptionstring
notesstring|null
amount_centsintegerValor em centavos (BRL).
discount_centsintegerDesconto até o vencimento.
currencystring = BRL
late_fee_percentnumber
late_interest_percentnumberAo mês.
due_datestring|null (date)YYYY-MM-DD
statusstring aberta</code> <code>atrasada</code> <code>paga</code> <code>cancelada</code> <code>estornada
methodsarray
paidobject|null
receiptobject|null
public_urlstring|nullPágina de pagamento /pagar/{token}.
remindersboolean
canceled_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
cancel_reasonstring|null
refunded_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
refunded_centsinteger|null
client_claimed_paid_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
nfse_idinteger|null
sent_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
viewed_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
created_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
updated_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
Appointment
CampoTipoDescrição
idinteger
uuidstring
tokenstring
contact_idinteger|null
contact_namestring|null
contract_idinteger|null
invoice_idinteger|null
quote_idinteger|null
catalog_item_idinteger|null
user_idinteger|nullResponsável.
kindstring servico</code> <code>reuniao</code> <code>visita</code> <code>bloqueio</code> <code>pessoal
titlestring
starts_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
ends_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
all_dayboolean
locationstring|null
addressobject|null
notesstring|null
client_notesstring|null
price_centsinteger|nullCentavos.
currencystring = BRL
statusstring agendado</code> <code>confirmado</code> <code>concluido</code> <code>cancelado</code> <code>faltou
sourcestring user</code> <code>online</code> <code>automation</code> <code>portal
confirmed_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
canceled_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
canceled_bystring|null
cancel_reasonstring|null
recurrencestring|null
recurrence_untilstring|null (date)YYYY-MM-DD
recurrence_parent_idinteger|null
public_urlstring|nullPágina /compromisso/{token} para o cliente confirmar.
created_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
updated_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
CatalogItem
CampoTipoDescrição
idinteger
typestring servico</code> <code>produto
namestring
descriptionstring|null
unitstring
price_centsintegerValor em centavos (BRL).
cost_centsinteger|null
currencystring = BRL
service_codestring|nullCódigo do serviço (NFS-e).
activeboolean
sortinteger
usage_countinteger
created_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
updated_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
FinanceEntry
CampoTipoDescrição
idinteger
kindstring entrada</code> <code>saida</code> <code>transferencia
descriptionstring
amount_centsintegerValor em centavos (BRL).
currencystring = BRL
datestring|null (date)YYYY-MM-DD
paid_atstring|null (date)YYYY-MM-DD
statusstring previsto</code> <code>pago</code> <code>cancelado
categoryobject|null
finance_accountobject|null
transfer_to_account_idinteger|null
contact_idinteger|null
invoice_idinteger|null
appointment_idinteger|null
recurrence_idinteger|null
tagsarray
notesstring|null
deductibleboolean
reconciled_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
created_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
updated_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
Webhook
CampoTipoDescrição
idinteger
uuidstring
namestring
urlstring
eventsarray
secret_prefixstring|null
secretstring|nullSó na resposta do POST.
activeboolean
failuresintegerFalhas consecutivas.
disabled_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
disabled_reasonstring|null
last_delivery_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
last_statusinteger|null
created_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).
updated_atstring|null (date-time)ISO 8601 com fuso (America/Sao_Paulo).

Changelog

  • 19/10/2026 — v1.0.0 — lançamento: contatos, orçamentos, contratos (leitura), cobranças, agenda, catálogo, financeiro (leitura), webhooks de saída e OpenAPI 3.1. Chaves por conta com escopos, limite por minuto, IPs permitidos, Idempotency-Key e mensagens em en/pt-BR/es.

Ajuda

Dúvidas, bugs ou um campo que falta: escreva para suporte@appdomei.com com o X-Request-Id da chamada. Receitas prontas de Zapier, Make, n8n e planilhas estão na Central de ajuda. Ao usar a API você concorda com os Termos de uso.