agency-time
POST /v1/agency/time/billing-runs
Bill now — turn unbilled time into a draft invoice.
Autenticação
Envie uma chave de API como um token bearer. Este endpoint não especifica uma permissão específica na documentação, portanto, conceda à sua chave o mínimo necessário e verifique a resposta em vez de assumir.
Onde vai o ID da sua organização
Este endpoint aceita org_id como um campo no corpo JSON.
O ID da sua organização está na tela de chaves de API no seu painel, ao lado da própria chave. É o mesmo ID em todas as chamadas que você fizer.
Experimente
Substitua qualquer item entre colchetes por seus próprios valores e o espaço reservado para a chave por uma chave do seu painel.
curl -X POST https://api.zinndigital.com/v1/agency/time/billing-runs \
-H "Authorization: Bearer zdk_live_…" \
-H "Content-Type: application/json" \
-d '{ "client_id": <string>, "currency": <string> }'Conectado? O console da API no seu painel preenche o ID da sua organização real e a sua própria chave, e executa a requisição contra a API de produção para que você possa ver a resposta real. Abra este endpoint no console da API
Detalhes
The owner's *"as well as sending on demand invoices"*. Claims the client's unbilled, priced work, hands it to the agency invoicing suite as a **draft**, and records what came back. ⛔ The entries are claimed in a committed transaction **before** the invoicing suite is called, so no other trigger can select them while the call is in flight. The idempotency key handed to the suite is derived from the sorted entry ids rather than minted, so a retry after a crash is given back the invoice that already exists instead of raising a second one for the same hours. `reconcile_state` is `ok` only when the invoice's total for these lines equals our own exact arithmetic. `mismatch` means do not send it.
Corpo da requisição
| Nome | Tipo | Obrigatório | O que é |
|---|---|---|---|
client_id | string | Sim | — |
currency | string | Sim | — |
until | string | Não | Bill work up to and including this date — "everything to the end of last month". |
notes | string | Não | — |
org_id | string | Não | — |
Resposta
| Nome | Tipo | Obrigatório | O que é |
|---|---|---|---|
id | string | Sim | — |
client_id | string | Não | — |
currency | string | Sim | — |
period_start | string | Não | — |
period_end | string | Não | — |
trigger | string<manual, on_log, day_of_month, threshold> | Sim | — |
status | string<claimed, invoiced, failed, released> | Sim | `claimed` is the state between claiming the time and the invoicing suite's reply — a process that dies there leaves one, and the recovery pass finishes it with the same derived… |
subtotal_minor | integer | Sim | Our own exact arithmetic, before tax. What the invoice is reconciled against. |
minutes_total | integer | Sim | — |
duration_label | string | Não | — |
entry_count | integer | Não | — |
fixed_line_count | integer | Não | — |
invoice_id | string | Não | — |
invoice_number | string | Não | — |
invoice_created | boolean | Não | FALSE means the invoicing suite's idempotency key fired and handed back an invoice an earlier attempt had already raised. Surfaced rather than hidden: it is the observable that… |
reconcile_state | string<pending, ok, mismatch, unavailable> | Não | Whether the invoice's total for these lines equals our own arithmetic **exactly**. There is no "close enough": both sides compute from the same two integers, so any difference i… |
reconcile_detail | string | Não | — |
invoiced_at | string | Não | — |
released_at | string | Não | — |
last_error | string | Não | — |
created_at | string | Sim | — |
actual | object | Não | What this run actually consumed, derived from the time entries rather than read off the run's stored columns — so a divergence is visible on the screen. |
Erros que este endpoint pode retornar
401 · 403 · 422