agency-time
POST /v1/agency/time/billing-runs
Bill now — turn unbilled time into a draft invoice.
인증
Bearer 토큰으로 API 키를 전송하세요. 이 엔드포인트는 명세에 특정 권한을 명시하지 않으므로, 가정하기보다는 키에 필요한 최소한의 권한을 부여하고 응답을 확인하세요.
조직 ID가 들어가는 위치
이 엔드포인트는 JSON 본문의 필드로 org_id을(를) 받습니다.
조직 ID는 대시보드의 API 키 화면에서 키 바로 옆에 있습니다. 이는 실행하는 모든 호출에서 동일한 ID입니다.
무료 체험하기
대괄호 안에 있는 모든 내용을 사용자 지정 값으로 바꾸고, 키 플레이스홀더는 대시보드의 키로 바꾸세요.
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> }'로그인하셨나요? 대시보드의 API 콘솔이 실제 조직 ID와 본인의 키를 자동으로 채우고 라이브 API를 대상으로 요청을 실행하므로 실제 응답을 확인할 수 있습니다. API 콘솔에서 이 엔드포인트를 여세요
상세 정보
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.
요청 본문
| 이름 | 유형 | 필수 | 설명 |
|---|---|---|---|
client_id | string | 예 | — |
currency | string | 예 | — |
until | string | 아니요 | Bill work up to and including this date — "everything to the end of last month". |
notes | string | 아니요 | — |
org_id | string | 아니요 | — |
응답
| 이름 | 유형 | 필수 | 설명 |
|---|---|---|---|
id | string | 예 | — |
client_id | string | 아니요 | — |
currency | string | 예 | — |
period_start | string | 아니요 | — |
period_end | string | 아니요 | — |
trigger | string<manual, on_log, day_of_month, threshold> | 예 | — |
status | string<claimed, invoiced, failed, released> | 예 | `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 | 예 | Our own exact arithmetic, before tax. What the invoice is reconciled against. |
minutes_total | integer | 예 | — |
duration_label | string | 아니요 | — |
entry_count | integer | 아니요 | — |
fixed_line_count | integer | 아니요 | — |
invoice_id | string | 아니요 | — |
invoice_number | string | 아니요 | — |
invoice_created | boolean | 아니요 | 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> | 아니요 | 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 | 아니요 | — |
invoiced_at | string | 아니요 | — |
released_at | string | 아니요 | — |
last_error | string | 아니요 | — |
created_at | string | 예 | — |
actual | object | 아니요 | 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. |
이 엔드포인트가 반환할 수 있는 오류
401 · 403 · 422