Crie orçamentos, fature e receba direto do seu código.

A API REST do Cord cria e consulta orçamentos, clientes, produtos e faturas com uma chave Bearer, e executa as mesmas ações do app: enviar, aprovar, emitir ou registrar um pagamento. Respostas JSON previsíveis, especificação OpenAPI e chaves de teste que funcionam em um ambiente isolado dos seus dados reais.

Em todos os planos. O Grátis inclui 2 chaves e 100 chamadas por mês; as chaves de teste não consomem sua cota.

POST /api/v1/cotizaciones200 OK
$ curl https://cordhq.app/api/v1/cotizaciones \
  -H "Authorization: Bearer sk_live_8f2a…" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: pedido-7781" \
  -d '{"cliente_id": "9b41c2e0-3d7a-4f12-8c55-6e0b1a2d4f90", "vigencia_dias": 15,
       "items": [{"descripcion": "Cimento Portland 94 lb",
                  "cantidad": 240, "precio_unitario": 16.4}]}'
{
  "data": {
    "id": "c2f9a1d4-7b3e-4c1a-9e55-01a6c3d8f2b7",
    "token": "q8Fz2LkP",
    "folio": "COT-0149",
    "link_publico": "https://cordhq.app/q/q8Fz2LkP",
    "needs_approval": false,
    "motivo": null
  }
}
97 ms · v1600 requisições/min por chave secreta

IDEMPOTÊNCIA

Repita a requisição sem medo de duplicar.

Uma rede instável não deveria criar dois orçamentos. Envie uma Idempotency-Key em qualquer POST, PATCH ou DELETE: se a requisição se repetir com a mesma chave e o mesmo corpo, o Cord devolve a resposta original, marcada com Idempotent-Replayed, em vez de executar duas vezes. Se o corpo mudou, a resposta é um erro explícito.

  • Funciona em todas as mutações de /api/v1
  • A resposta repetida é idêntica, byte a byte
  • Mesma chave com outro corpo: erro, nunca uma duplicata silenciosa
Nova tentativa com a mesma Idempotency-Key/api/v1
# 1ª tentativa: o orçamento é criado
POST /api/v1/cotizaciones
Idempotency-Key: pedido-7781
← 200  { "data": { "folio": "COT-0150", … } }

# 2ª tentativa (a rede caiu): mesma chave, mesmo corpo
POST /api/v1/cotizaciones
Idempotency-Key: pedido-7781
← 200  Idempotent-Replayed: true
      { "data": { "folio": "COT-0150", … } }
      # a mesma resposta, byte a byte

# mesma chave, outro corpo
← 422  { "error": "Esta clave de idempotencia ya se usó con otra petición.",
        "code": "idempotency_key_reused" }

# a primeira requisição ainda está em andamento
← 409  { "code": "idempotency_in_progress" }

RECURSOS

O que você vê no app, também pela API.

Não é uma API somente leitura. Crie um orçamento e envie, aprove ou registre como pago. Crie uma fatura como rascunho e emita, envie, registre um pagamento ou uma nota de crédito. Tudo com as mesmas permissões, validações e totais que o app usa.

  • Orçamentos, faturas, clientes, produtos, tarefas e cobrança
  • Ações com POST { "action": "send" | "approve" | "finalize" | … }
  • Paginação com limit e offset, ou com cursor em eventos e faturas
Visão geralLogsErrosEventosWebhooksShellChavesSaúde

Referência da API

34 operações. Base https://cordhq.app/api/v1 com Authorization: Bearer e sua chave.

Especificação OpenAPI ↗llms.txt (docs para IA) ↗
Exemplo
curl https://cordhq.app/api/v1/me \
  -H "Authorization: Bearer $CORD_SECRET_KEY"
Conta
GET/meOrganização e escopo da chaveTestar
Orçamentos
GET/cotizacionesListar orçamentosTestar
POST/cotizacionesCriar orçamentoTestar
GET/cotizaciones/{id}Detalhe do orçamentoTestar
POST/cotizaciones/{id}Enviar, reenviar, aprovar, recusar ou marcar como pagoTestar
DELETE/cotizaciones/{id}Excluir um rascunhoTestar
POST/cotizaciones/iaSugerir itens a partir do texto de um pedidoTestar
Clientes
GET/clientesListar clientesTestar
POST/clientesCriar clienteTestar
GET/clientes/{id}Detalhe do clienteTestar
PATCH/clientes/{id}Atualizar dados de contatoTestar
Produtos
GET/productosListar produtosTestar
POST/productosCriar produtoTestar
Faturas
GET/facturasListar faturasTestar
POST/facturasCriar fatura em rascunhoTestar
GET/facturas/{id}Detalhe da faturaTestar
POST/facturas/{id}Emitir, enviar, cancelar, registrar pagamento ou nota de créditoTestar
Cobrança
GET/cobranzaContas a receberTestar
Eventos
GET/eventsHistórico de eventosTestar
Tarefas
POST/tareasCriar tarefaTestar
Workflows
POST/workflows/{id}/invokeExecutar um workflow “Você executa” em orçamentos ou faturasTestar
Webhooks
GET/webhooksEndpoints criados por esta chave
POST/webhooksCriar endpoint (o segredo é retornado uma única vez)
DELETE/webhooks/{id}Excluir endpoint
Elements
GET/elements/configConfiguração que o Cord Elements exibeTestar
POST/elements/ai-draftItens gerados com IA, em streaming (text/event-stream)
Modo de teste
POST/test_helpers/fiscalForçar o resultado da próxima emissãoTestar
POST/test_helpers/cotizaciones/{id}Simular abertura ou vencimentoTestar
POST/test_helpers/webhooksDisparar um webhookTestar
POST/test_helpers/listenAbrir sessão do cord listen
GET/test_helpers/listen/{id}Coletar os eventos da sessão
DELETE/test_helpers/listen/{id}Encerrar sessão do cord listen
Configuração
POST/setup/plansPropor uma configuração da conta (uma pessoa a aprova em review_url)Testar
GET/setup/plans/{id}Status de uma proposta de configuraçãoTestar

EVENTOS

Sincronize sem perder nada.

GET /api/v1/events devolve o histórico do seu negócio, do mais recente ao mais antigo: orçamentos enviados, visualizados, aprovados ou pagos, faturas emitidas, clientes novos. Filtre por tipo ou por objeto e avance com next_cursor. É o complemento dos webhooks para reconstruir qualquer estado.

  • Filtros ?type=quote.approved e ?object_id=
  • Até 200 eventos por página com cursor estável
  • Os mesmos tipos que seus webhooks recebem
GET /api/v1/events?type=quote.approved&limit=1200 OK
{
  "data": [
    {
      "id": "5e0b9d42-6a1f-4c87-b3e2-9d4f1a7c0e65",
      "type": "quote.approved",
      "object": "quote",
      "object_id": "c2f9a1d4-7b3e-4c1a-9e55-01a6c3d8f2b7",
      "data": { "id": "c2f9a1d4-7b3e-4c1a-9e55-01a6c3d8f2b7", "folio": "COT-0149",
                "status": "approved", "moneda": "USD", "total": 4123.4,
                "cliente": "Ridgeline Builders LLC", "cliente_id": "9b41c2e0-3d7a-4f12-8c55-6e0b1a2d4f90",
                "link_publico": "https://cordhq.app/q/q8Fz2LkP" },
      "actor": "client",
      "created_at": "2026-09-30T22:31:08.000Z"
    }
  ],
  "meta": {
    "next_cursor": "MjAyNi0wOS0zMFQyMjozMTowOC4wMDAwMDBafDVlMGI5ZDQyLTZhMWYtNGM4Ny1iM2UyLTlkNGYxYTdjMGU2NQ"
  }
}

FERRAMENTAS

Seu backend e seu terminal, prontos para o Cord.

Dois pacotes oficiais no npm para que integrar não signifique escrever requisições à mão: um SDK tipado para o seu servidor e uma CLI para testar webhooks na sua máquina antes do deploy.

SDK DE SERVIDOR

A API, já tipada para o seu backend.

O @flouviahq/node encapsula toda a API: cria orçamentos e faturas, percorre listas completas e verifica webhooks pela assinatura e pela idade. Ele envia a mesma Idempotency-Key em cada nova tentativa e fixa a versão da API, para que uma atualização do Cord nunca mude o que você lê.

  • npm install @flouviahq/node, sem dependências
  • Roda em Node, Bun, Deno, Cloudflare Workers e Vercel
  • Erros com code, request_id e o link para a explicação
src / server.ts@flouviahq/node
  1. import { Cord, constructEvent } from '@flouviahq/node';
  2. const cord = new Cord(process.env.CORD_SECRET_KEY!, { apiVersion: '2026-10-01' });
  3. // Se a rede cair, a nova tentativa reutiliza a mesma Idempotency-Key
  4. const quote = await cord.quotes.create({
  5. cliente: { empresa: 'Ridgeline Builders LLC' },
  6. items: [{ descripcion: 'Cimento Portland 94 lb', cantidad: 240, precio_unitario: 16.4 }],
  7. });
  8. // Percorre todas as páginas; o SDK cuida do cursor
  9. for await (const invoice of cord.invoices.listAll({ estado: 'open' })) {
  10. await erp.updateBalance(invoice.numero, invoice.saldo);
  11. }
  12. // Verifica X-Cord-Signature-V1 e rejeita assinaturas com mais de 5 minutos
  13. export async function POST(req: Request) {
  14. const event = await constructEvent(await req.text(), req.headers,
  15. process.env.CORD_WEBHOOK_SECRET!);
  16. if (event.event === 'invoice.paid') {
  17. await erp.reconcile(event.data.numero, event.data.saldo);
  18. }
  19. return new Response(null, { status: 200 });
  20. }

CLI

Teste seus webhooks sem fazer deploy.

O cord listen encaminha para a sua máquina os webhooks do seu ambiente de teste, assinados exatamente como em produção. O cord trigger dispara qualquer evento, e o cord simulate provoca o que um terceiro causaria em produção, como um serviço de emissão fiscal que não responde ou um orçamento que vence.

  • npx @flouviahq/cli abre o assistente: você entra pelo navegador, sem copiar chaves, e seu projeto fica integrado
  • Só aceita chaves de teste: nada toca seus dados reais
  • cord events tail mostra os eventos conforme acontecem
erp-materiales— zshsk_test_…9c2a

$ cord listen --forward-to http://localhost:3000/api/webhooks/cord

16:41:52quote.viewedevt_2a91f0c7d34b4e8fa15c6b0d9e7f3a21→ 200 38 ms

16:42:07quote.approvedevt_8d4c2b1e07a94f63b5e1c9a0f2d7b4e8→ 200 41 ms

16:42:58payment.partialevt_c35e9a7104bd4c2e8f6a1b0d3e9c5f72→ 200 52 ms

16:43:21invoice.finalizedevt_4be07a2d4e61b3f8a05c7d92e1aa9c1f→ 500 17 ms

16:44:05quote.expiredevt_f0a6d3b9c18e4a57b2d40e6c9a1f8b35→ 200 33 ms

16:44:12invoice.paidevt_9c1f4be07a2d4e61b3f8a05c7d92e1aa→ 200 36 ms

$ cord trigger quote.approved

$ cord simulate fiscal pac_caido

$ cord simulate quote 7e3b0c91-4d2a-4f6e-b8a5-2c9d1f0e6a47 vencer

$ cord events tail --type invoice.paid

16:44:12invoice.paidf3a8d1c4-2b6e-4d90-a1c7-5e8f0b3d2a61

PERGUNTAS FREQUENTES

API REST: o que os desenvolvedores perguntam.

É uma API REST em https://cordhq.app/api/v1 que dá acesso programático a orçamentos, faturas, clientes, produtos, tarefas, cobrança e eventos do seu negócio. Ela se autentica com uma chave Bearer e responde em JSON no formato { data, meta } ou { error, code }.

Não. A API está em todos os planos, incluindo o Grátis, com 2 chaves e 100 chamadas por mês. O Starter inclui 1.000 chamadas, o Profissional 5.000, o Scale 10.000 e o Developer 50.000. As chaves de teste não consomem cota.

Com uma chave sk_test_. Ela opera em um ambiente de teste separado da sua conta, então você pode criar e excluir orçamentos sem afetar seus clientes nem seus relatórios.

Envie o header Idempotency-Key na requisição. Se você a repetir com a mesma chave e o mesmo corpo, o Cord devolve a resposta original sem executá-la de novo.

Sim: @flouviahq/node para Node, Bun, Deno, Cloudflare Workers e Vercel, e @flouviahq/cli para testar webhooks na sua máquina. Os dois estão no npm.

Não. Cada chave e cada webhook guardam a versão da API com que foram criados, e você pode fixar outra por requisição com o header Cord-Version. O Cord adapta a resposta a essa versão.

Sim. Uma chave restrita (rk_) tem permissão de leitura ou escrita por recurso, e qualquer chave secreta pode ser limitada a determinados IPs, ter data de vencimento e ser rotacionada com um período de carência.

Sim, em https://cordhq.app/openapi.yaml, além de um resumo para assistentes de IA em https://cordhq.app/llms.txt. Os dois têm link no Workbench.

Conheça o resto da plataforma para desenvolvedores.

Faça sua primeira chamada hoje.

Crie sua conta, gere uma chave de teste e chame /api/v1/me.

Saiba quanto vai pagar

Preços publicados, com a tarifa de cada cobrança sempre visível.

Informações sobre preços →

Comece a construir

Comece a operar e a enviar orçamentos no plano Grátis.

Opções de integração →