Ordens de serviço
Fatura OS com pagamento já recebido fora do Cuidaro (operação estrita)
POST
/service-orders/{serviceOrder}/invoice
- Escopo services:write
- Idempotency-Key obrigatória · estrita
- Limite escrita 60/min
Registra o recebível já pago na conta escolhida pela empresa e pede a NFS-e (assíncrona). Se a nota não puder sair, a OS continua faturada e o motivo vem em meta.warnings. Quando a OS emite NFS-e integrada, o endereço completo do cliente e o city_ibge_code coerente com a UF são exigidos antes de faturar (422 com error_codes em contact.address.<campo>). Ordem das conferências: primeiro o estado da OS (já faturada, encerrada ou cancelada → 409 RESOURCE_STATE_CONFLICT, mesmo que a liberação de liquidação externa tenha sido retirada), depois a liberação da integração (422 EXTERNAL_SETTLEMENT_NOT_ALLOWED) e a conta de recebimento (422 EXTERNAL_SETTLEMENT_ACCOUNT_MISSING), depois o valor e o cadastro do cliente.
Parâmetros
Idempotency-Key
string · cabeçalho
obrigatório
Chave de idempotência — operação estrita (api.idempotent:strict): a chave "executando" nunca é retomada antes de vencer (24 h); todo reenvio com ela recebe 409 IDEMPOTENCY_KEY_IN_PROGRESS. Consulte o recurso pelo GET e, se a operação não aconteceu, reenvie com chave nova. Demais regras iguais às da operação comum.
Corpo da requisição
settlement
object
obrigatório
type
string
obrigatório
Só external nesta versão (pagamento já recebido fora do Cuidaro).
paid_at
string
obrigatório
Y-m-d, não futura.
method
string
obrigatório
gateway
string
obrigatório
gateway_reference
string
obrigatório
Id do pagamento no gateway. gateway + gateway_reference quitam uma única OS.
amount
number | string
obrigatório
Igual ao centavo ao total da OS — senão 422 SETTLEMENT_AMOUNT_MISMATCH.
Respostas
200
OS faturada (status: invoiced).
data
object
obrigatório
id
integer
obrigatório
number
string (anulável)
obrigatório
status
string
obrigatório
Vocabulário público da OS. unknown quando o estado interno não tem correspondência.
external_reference
string (anulável)
obrigatório
contact_id
integer (anulável)
obrigatório
Sem dado pessoal na OS — use GET /contacts/{contact}.
items
array de object
obrigatório
id
integer
obrigatório
service_id
integer (anulável)
obrigatório
description
string (anulável)
obrigatório
quantity
string
obrigatório
String decimal com 3 casas.
unit_price
string
obrigatório
Valor monetário em string decimal com 2 casas.
total
string
obrigatório
Valor monetário em string decimal com 2 casas.
total
string
obrigatório
Valor monetário em string decimal com 2 casas.
receivables
array de object
obrigatório
id
integer
obrigatório
status
string
obrigatório
amount
string
obrigatório
Valor monetário em string decimal com 2 casas.
amount_paid
string
obrigatório
Valor monetário em string decimal com 2 casas.
due_date
string (anulável)
obrigatório
payment_date
string (anulável)
obrigatório
settlement
object (anulável)
obrigatório
Pagamento externo informado no faturamento pela API, ou null.
type
string
obrigatório
gateway
string
obrigatório
gateway_reference
string
obrigatório
method
string
obrigatório
paid_at
string
obrigatório
amount
string
obrigatório
Valor monetário em string decimal com 2 casas.
reversed_at
string (anulável)
obrigatório
fiscal
object (anulável)
obrigatório
NFS-e mais recente da OS (somente leitura), ou null.
type
string
obrigatório
status
string
obrigatório
number
string (anulável)
obrigatório
null até o provedor informar.
issued_at
string (anulável)
obrigatório
cancellation_requested_at
string (anulável)
obrigatório
cancelled_at
string (anulável)
obrigatório
pdf_url
string (anulável)
obrigatório
Link assinado do Cuidaro, válido por 24 h; só para nota emitida ou cancelada.
xml_url
null
obrigatório
Ainda não oferecido (sempre null).
created_at
string (anulável)
obrigatório
billed_at
string (anulável)
obrigatório
updated_at
string (anulável)
obrigatório
meta
object
obrigatório
operation
string
obrigatório
warnings
array de string
obrigatório
Avisos em pt-BR (ex.: NFS-e não pôde ser iniciada).
404
Recurso inexistente, excluído ou de outra empresa/integração. Códigos possíveis: RESOURCE_NOT_FOUND.
type
string
obrigatório
https://cuidaro.com.br/errors/{slug} — ainda não é endereço navegável.
title
string
obrigatório
Título curto e estável por código (inglês).
status
integer
obrigatório
detail
string
obrigatório
Texto para pessoas, em pt-BR. Pode mudar; não use para lógica.
instance
string
obrigatório
Caminho da requisição (ex.: /api/v1/me).
code
string
obrigatório
Catálogo estável de códigos de erro (App\Enums\ApiErrorCode). Código publicado nunca é renomeado nem removido; códigos novos podem surgir — trate valor desconhecido como erro genérico do status HTTP. O status, o título e o type de cada código estão em x-cuidaro-error-catalog.
metric
string
Só em PLAN_QUOTA_EXCEEDED: métrica do plano atingida.
limit
integer (anulável)
Só em PLAN_QUOTA_EXCEEDED: limite do plano.
existing_resource_id
integer
Só em RESOURCE_ALREADY_EXISTS: id do recurso que já existe.
expected_amount
string
Só em SETTLEMENT_AMOUNT_MISMATCH: total da OS.
received_amount
string
Só em SETTLEMENT_AMOUNT_MISMATCH: valor recebido em settlement.amount.
service_order_status
string
Só no RESOURCE_STATE_CONFLICT do faturamento: status público atual da OS.
409
OS fora de in_progress/awaiting_invoice ou sem valor (traz service_order_status quando aplicável), pagamento já usado em outra OS (traz existing_resource_id) ou conflito de idempotência. Códigos possíveis: RESOURCE_STATE_CONFLICT, RESOURCE_ALREADY_EXISTS, IDEMPOTENCY_KEY_CONFLICT, IDEMPOTENCY_KEY_IN_PROGRESS.
type
string
obrigatório
https://cuidaro.com.br/errors/{slug} — ainda não é endereço navegável.
title
string
obrigatório
Título curto e estável por código (inglês).
status
integer
obrigatório
detail
string
obrigatório
Texto para pessoas, em pt-BR. Pode mudar; não use para lógica.
instance
string
obrigatório
Caminho da requisição (ex.: /api/v1/me).
code
string
obrigatório
Catálogo estável de códigos de erro (App\Enums\ApiErrorCode). Código publicado nunca é renomeado nem removido; códigos novos podem surgir — trate valor desconhecido como erro genérico do status HTTP. O status, o título e o type de cada código estão em x-cuidaro-error-catalog.
metric
string
Só em PLAN_QUOTA_EXCEEDED: métrica do plano atingida.
limit
integer (anulável)
Só em PLAN_QUOTA_EXCEEDED: limite do plano.
existing_resource_id
integer
Só em RESOURCE_ALREADY_EXISTS: id do recurso que já existe.
expected_amount
string
Só em SETTLEMENT_AMOUNT_MISMATCH: total da OS.
received_amount
string
Só em SETTLEMENT_AMOUNT_MISMATCH: valor recebido em settlement.amount.
service_order_status
string
Só no RESOURCE_STATE_CONFLICT do faturamento: status público atual da OS.
422
Dados inválidos, valor diferente do total (traz expected_amount/received_amount), integração sem permissão ou sem conta de recebimento, cadastro do cliente incompleto para a NFS-e, ou Idempotency-Key ausente/inválida. Também: SETTLEMENT_AMOUNT_MISMATCH, EXTERNAL_SETTLEMENT_NOT_ALLOWED, EXTERNAL_SETTLEMENT_ACCOUNT_MISSING, IDEMPOTENCY_KEY_MISSING, IDEMPOTENCY_KEY_INVALID.
type
string
obrigatório
https://cuidaro.com.br/errors/{slug} — ainda não é endereço navegável.
title
string
obrigatório
Título curto e estável por código (inglês).
status
integer
obrigatório
detail
string
obrigatório
Texto para pessoas, em pt-BR. Pode mudar; não use para lógica.
instance
string
obrigatório
Caminho da requisição (ex.: /api/v1/me).
code
string
obrigatório
Catálogo estável de códigos de erro (App\Enums\ApiErrorCode). Código publicado nunca é renomeado nem removido; códigos novos podem surgir — trate valor desconhecido como erro genérico do status HTTP. O status, o título e o type de cada código estão em x-cuidaro-error-catalog.
metric
string
Só em PLAN_QUOTA_EXCEEDED: métrica do plano atingida.
limit
integer (anulável)
Só em PLAN_QUOTA_EXCEEDED: limite do plano.
existing_resource_id
integer
Só em RESOURCE_ALREADY_EXISTS: id do recurso que já existe.
expected_amount
string
Só em SETTLEMENT_AMOUNT_MISMATCH: total da OS.
received_amount
string
Só em SETTLEMENT_AMOUNT_MISMATCH: valor recebido em settlement.amount.
service_order_status
string
Só no RESOURCE_STATE_CONFLICT do faturamento: status público atual da OS.
errors
object
Mensagens por campo (pt-BR).
error_codes
object
Códigos estáveis por campo: FIELD_REQUIRED, FIELD_TYPE_INVALID, FIELD_MAX_LENGTH, FIELD_ENUM_INVALID, FIELD_INVALID, WEBHOOK_URL_NOT_ALLOWED.
401
Token ausente, inválido, revogado ou expirado. Códigos: AUTH_TOKEN_MISSING, AUTH_TOKEN_INVALID, AUTH_TOKEN_EXPIRED.
type
string
obrigatório
https://cuidaro.com.br/errors/{slug} — ainda não é endereço navegável.
title
string
obrigatório
Título curto e estável por código (inglês).
status
integer
obrigatório
detail
string
obrigatório
Texto para pessoas, em pt-BR. Pode mudar; não use para lógica.
instance
string
obrigatório
Caminho da requisição (ex.: /api/v1/me).
code
string
obrigatório
Catálogo estável de códigos de erro (App\Enums\ApiErrorCode). Código publicado nunca é renomeado nem removido; códigos novos podem surgir — trate valor desconhecido como erro genérico do status HTTP. O status, o título e o type de cada código estão em x-cuidaro-error-catalog.
metric
string
Só em PLAN_QUOTA_EXCEEDED: métrica do plano atingida.
limit
integer (anulável)
Só em PLAN_QUOTA_EXCEEDED: limite do plano.
existing_resource_id
integer
Só em RESOURCE_ALREADY_EXISTS: id do recurso que já existe.
expected_amount
string
Só em SETTLEMENT_AMOUNT_MISMATCH: total da OS.
received_amount
string
Só em SETTLEMENT_AMOUNT_MISMATCH: valor recebido em settlement.amount.
service_order_status
string
Só no RESOURCE_STATE_CONFLICT do faturamento: status público atual da OS.
403
Escopo insuficiente ou empresa sem acesso à API. Códigos possíveis: AUTH_SCOPE_INSUFFICIENT, AUTH_TENANT_SUSPENDED, AUTH_TENANT_PLAN_WITHOUT_API, ACCESS_DENIED.
type
string
obrigatório
https://cuidaro.com.br/errors/{slug} — ainda não é endereço navegável.
title
string
obrigatório
Título curto e estável por código (inglês).
status
integer
obrigatório
detail
string
obrigatório
Texto para pessoas, em pt-BR. Pode mudar; não use para lógica.
instance
string
obrigatório
Caminho da requisição (ex.: /api/v1/me).
code
string
obrigatório
Catálogo estável de códigos de erro (App\Enums\ApiErrorCode). Código publicado nunca é renomeado nem removido; códigos novos podem surgir — trate valor desconhecido como erro genérico do status HTTP. O status, o título e o type de cada código estão em x-cuidaro-error-catalog.
metric
string
Só em PLAN_QUOTA_EXCEEDED: métrica do plano atingida.
limit
integer (anulável)
Só em PLAN_QUOTA_EXCEEDED: limite do plano.
existing_resource_id
integer
Só em RESOURCE_ALREADY_EXISTS: id do recurso que já existe.
expected_amount
string
Só em SETTLEMENT_AMOUNT_MISMATCH: total da OS.
received_amount
string
Só em SETTLEMENT_AMOUNT_MISMATCH: valor recebido em settlement.amount.
service_order_status
string
Só no RESOURCE_STATE_CONFLICT do faturamento: status público atual da OS.
413
Corpo acima de 512 KB. Códigos possíveis: PAYLOAD_TOO_LARGE.
type
string
obrigatório
https://cuidaro.com.br/errors/{slug} — ainda não é endereço navegável.
title
string
obrigatório
Título curto e estável por código (inglês).
status
integer
obrigatório
detail
string
obrigatório
Texto para pessoas, em pt-BR. Pode mudar; não use para lógica.
instance
string
obrigatório
Caminho da requisição (ex.: /api/v1/me).
code
string
obrigatório
Catálogo estável de códigos de erro (App\Enums\ApiErrorCode). Código publicado nunca é renomeado nem removido; códigos novos podem surgir — trate valor desconhecido como erro genérico do status HTTP. O status, o título e o type de cada código estão em x-cuidaro-error-catalog.
metric
string
Só em PLAN_QUOTA_EXCEEDED: métrica do plano atingida.
limit
integer (anulável)
Só em PLAN_QUOTA_EXCEEDED: limite do plano.
existing_resource_id
integer
Só em RESOURCE_ALREADY_EXISTS: id do recurso que já existe.
expected_amount
string
Só em SETTLEMENT_AMOUNT_MISMATCH: total da OS.
received_amount
string
Só em SETTLEMENT_AMOUNT_MISMATCH: valor recebido em settlement.amount.
service_order_status
string
Só no RESOURCE_STATE_CONFLICT do faturamento: status público atual da OS.
429
Limite de requisições excedido. Código: RATE_LIMIT_EXCEEDED.
type
string
obrigatório
https://cuidaro.com.br/errors/{slug} — ainda não é endereço navegável.
title
string
obrigatório
Título curto e estável por código (inglês).
status
integer
obrigatório
detail
string
obrigatório
Texto para pessoas, em pt-BR. Pode mudar; não use para lógica.
instance
string
obrigatório
Caminho da requisição (ex.: /api/v1/me).
code
string
obrigatório
Catálogo estável de códigos de erro (App\Enums\ApiErrorCode). Código publicado nunca é renomeado nem removido; códigos novos podem surgir — trate valor desconhecido como erro genérico do status HTTP. O status, o título e o type de cada código estão em x-cuidaro-error-catalog.
metric
string
Só em PLAN_QUOTA_EXCEEDED: métrica do plano atingida.
limit
integer (anulável)
Só em PLAN_QUOTA_EXCEEDED: limite do plano.
existing_resource_id
integer
Só em RESOURCE_ALREADY_EXISTS: id do recurso que já existe.
expected_amount
string
Só em SETTLEMENT_AMOUNT_MISMATCH: total da OS.
received_amount
string
Só em SETTLEMENT_AMOUNT_MISMATCH: valor recebido em settlement.amount.
service_order_status
string
Só no RESOURCE_STATE_CONFLICT do faturamento: status público atual da OS.
500
Erro interno, sem mensagem interna nem stack trace. Códigos possíveis: INTERNAL_ERROR.
type
string
obrigatório
https://cuidaro.com.br/errors/{slug} — ainda não é endereço navegável.
title
string
obrigatório
Título curto e estável por código (inglês).
status
integer
obrigatório
detail
string
obrigatório
Texto para pessoas, em pt-BR. Pode mudar; não use para lógica.
instance
string
obrigatório
Caminho da requisição (ex.: /api/v1/me).
code
string
obrigatório
Catálogo estável de códigos de erro (App\Enums\ApiErrorCode). Código publicado nunca é renomeado nem removido; códigos novos podem surgir — trate valor desconhecido como erro genérico do status HTTP. O status, o título e o type de cada código estão em x-cuidaro-error-catalog.
metric
string
Só em PLAN_QUOTA_EXCEEDED: métrica do plano atingida.
limit
integer (anulável)
Só em PLAN_QUOTA_EXCEEDED: limite do plano.
existing_resource_id
integer
Só em RESOURCE_ALREADY_EXISTS: id do recurso que já existe.
expected_amount
string
Só em SETTLEMENT_AMOUNT_MISMATCH: total da OS.
received_amount
string
Só em SETTLEMENT_AMOUNT_MISMATCH: valor recebido em settlement.amount.
service_order_status
string
Só no RESOURCE_STATE_CONFLICT do faturamento: status público atual da OS.