Skip to content

Money: invoices, quotes, retainers

Invoices and quotes built from the work that produced them, recurring agreements, the payment provider that settles them and the bookkeeping package they end up in.

106 endpoints across 4 groups. A permission written module.resource.action:own is scoped: :own covers rows that are yours, :any covers everyone’s, and :any satisfies a check for :own.

EndpointPermission
GET /invoicing/invoicesinvoicing.invoice.read
POST /invoicing/invoicesinvoicing.invoice.write
GET /invoicing/invoices/{invoice_id}invoicing.invoice.read
PATCH /invoicing/invoices/{invoice_id}invoicing.invoice.write
DELETE /invoicing/invoices/{invoice_id}invoicing.invoice.delete
POST /invoicing/invoices/{invoice_id}/cancelinvoicing.invoice.write
POST /invoicing/invoices/{invoice_id}/creditinvoicing.invoice.write
POST /invoicing/invoices/{invoice_id}/exportinvoicing.invoice.write
POST /invoicing/invoices/{invoice_id}/issueinvoicing.invoice.write
GET /invoicing/invoices/{invoice_id}/payment-intentsinvoicing.invoice.read
POST /invoicing/invoices/{invoice_id}/payment-intentsinvoicing.payment.link
POST /invoicing/invoices/{invoice_id}/payment-intents/{intent_id}/syncinvoicing.payment.link:any
POST /invoicing/invoices/{invoice_id}/payment-intents/refreshinvoicing.payment.link
POST /invoicing/invoices/{invoice_id}/paymentsinvoicing.payment.write
DELETE /invoicing/invoices/{invoice_id}/payments/{payment_id}invoicing.payment.write
GET /invoicing/invoices/{invoice_id}/pdfinvoicing.invoice.read
GET /invoicing/invoices/{invoice_id}/previewinvoicing.invoice.read
GET /invoicing/invoices/{invoice_id}/refsinvoicing.invoice.read:any
POST /invoicing/invoices/{invoice_id}/remindinvoicing.invoice.send
POST /invoicing/invoices/{invoice_id}/sendinvoicing.invoice.send
GET /invoicing/invoices/{invoice_id}/ublinvoicing.invoice.read
POST /invoicing/invoices/from-timeinvoicing.invoice.write
GET /invoicing/invoices/pdfinvoicing.invoice.read
GET /invoicing/outstandinginvoicing.invoice.write
GET /invoicing/payment-accountsinvoicing.payment.link:any
POST /invoicing/payments/webhook/{provider}/{token}Deliberately open
GET /invoicing/productsinvoicing.invoice.read:any
POST /invoicing/productsinvoicing.settings.manage
PATCH /invoicing/products/{product_id}invoicing.settings.manage
DELETE /invoicing/products/{product_id}invoicing.settings.manage
GET /invoicing/providersinvoicing.settings.manage
GET /invoicing/public/invoices/{token}Deliberately open
POST /invoicing/public/invoices/{token}/payment-intentsDeliberately open
GET /invoicing/public/invoices/{token}/pdfDeliberately open
GET /invoicing/public/invoices/{token}/previewDeliberately open
POST /invoicing/public/invoices/{token}/refreshDeliberately open
GET /invoicing/quotesinvoicing.quote.read
POST /invoicing/quotesinvoicing.quote.write
GET /invoicing/quotes/{quote_id}invoicing.quote.read
PATCH /invoicing/quotes/{quote_id}invoicing.quote.write
DELETE /invoicing/quotes/{quote_id}invoicing.quote.delete
POST /invoicing/quotes/{quote_id}/acceptinvoicing.quote.write
POST /invoicing/quotes/{quote_id}/convertinvoicing.quote.write
POST /invoicing/quotes/{quote_id}/issueinvoicing.quote.write
GET /invoicing/quotes/{quote_id}/pdfinvoicing.quote.read
GET /invoicing/quotes/{quote_id}/previewinvoicing.quote.read
POST /invoicing/quotes/{quote_id}/rejectinvoicing.quote.write
POST /invoicing/quotes/{quote_id}/sendinvoicing.quote.send
GET /invoicing/recurring-backloginvoicing.invoice.read:any
GET /invoicing/settingsinvoicing.invoice.read:any
PUT /invoicing/settingsinvoicing.settings.manage
GET /invoicing/summaryinvoicing.invoice.read
GET /invoicing/tax-ratesinvoicing.invoice.read:any
POST /invoicing/tax-ratesinvoicing.settings.manage
PATCH /invoicing/tax-rates/{tax_rate_id}invoicing.settings.manage
DELETE /invoicing/tax-rates/{tax_rate_id}invoicing.settings.manage
GET /invoicing/template-blocksinvoicing.settings.manage
GET /invoicing/template-blocks/{design}/sourceinvoicing.template.author
GET /invoicing/templatesinvoicing.invoice.read:any
POST /invoicing/templatesinvoicing.settings.manage
PATCH /invoicing/templates/{template_id}invoicing.settings.manage
DELETE /invoicing/templates/{template_id}invoicing.settings.manage
POST /invoicing/templates/previewinvoicing.settings.manage
POST /invoicing/templates/qr-previewinvoicing.settings.manage
GET /invoicing/unbilledinvoicing.invoice.write
GET /invoicing/uninvoicedinvoicing.invoice.read:any
Parameters and schemas per endpoint

List Invoices

Permission: invoicing.invoice.read

Query parameters:

NameTypeMeaning
limitinteger(default 100)
offsetinteger(default 0)
statusstringdraft | open | paid | cancelled
company_idstring
kindstringinvoice | credit_note
overduebooleanonly open invoices past their due date (default false)
qstringmatches number and reference
sortstringnumber | status | issue_date | due_date | total | created_at
linesbooleanInclude each row’s lines and tax groups. False for list views (#290). (default true)

Returns: 200 · Page_InvoiceRead_

Create Invoice

Permission: invoicing.invoice.write

Request body: InvoiceCreate

Returns: 201 · InvoiceRead

GET /api/v1/invoicing/invoices/{invoice_id}

Section titled “GET /api/v1/invoicing/invoices/{invoice_id}”

Get Invoice

Permission: invoicing.invoice.read

Path parameters: invoice_id

Returns: 200 · InvoiceRead

PATCH /api/v1/invoicing/invoices/{invoice_id}

Section titled “PATCH /api/v1/invoicing/invoices/{invoice_id}”

Update Invoice

Permission: invoicing.invoice.write

Path parameters: invoice_id

Request body: InvoiceUpdate

Returns: 200 · InvoiceRead

DELETE /api/v1/invoicing/invoices/{invoice_id}

Section titled “DELETE /api/v1/invoicing/invoices/{invoice_id}”

Delete Invoice

Permission: invoicing.invoice.delete

Path parameters: invoice_id

Returns: 204

POST /api/v1/invoicing/invoices/{invoice_id}/cancel

Section titled “POST /api/v1/invoicing/invoices/{invoice_id}/cancel”

Cancel Invoice

Permission: invoicing.invoice.write

Path parameters: invoice_id

Returns: 200 · InvoiceRead

POST /api/v1/invoicing/invoices/{invoice_id}/credit

Section titled “POST /api/v1/invoicing/invoices/{invoice_id}/credit”

Credit Invoice — Draft credit note mirroring this invoice with negated prices.

Permission: invoicing.invoice.write

Path parameters: invoice_id

Returns: 201 · InvoiceRead

POST /api/v1/invoicing/invoices/{invoice_id}/export

Section titled “POST /api/v1/invoicing/invoices/{invoice_id}/export”

Export Invoice — Push this invoice to a live accounting provider (#31). Until an adapter module is installed the registry is empty and this reports the provider as unknown — UBL download is the always-available path.

Permission: invoicing.invoice.write

Path parameters: invoice_id

Query parameters:

NameTypeMeaning
providerstring · requireda registered accounting provider key

Returns: 200 · ExternalRefRead

POST /api/v1/invoicing/invoices/{invoice_id}/issue

Section titled “POST /api/v1/invoicing/invoices/{invoice_id}/issue”

Issue Invoice — Assign the number, freeze the bill-to, open the invoice.

Permission: invoicing.invoice.write

Path parameters: invoice_id

Request body: InvoiceIssue

Returns: 200 · InvoiceRead

GET /api/v1/invoicing/invoices/{invoice_id}/payment-intents

Section titled “GET /api/v1/invoicing/invoices/{invoice_id}/payment-intents”

List Payment Intents — This invoice’s payment attempts. _READ’s floor, not _MODULE: a client must be able to see the state of the payment they just made.

Permission: invoicing.invoice.read

Path parameters: invoice_id

Returns: 200 · InvoicePaymentIntentRead[]

POST /api/v1/invoicing/invoices/{invoice_id}/payment-intents

Section titled “POST /api/v1/invoicing/invoices/{invoice_id}/payment-intents”

Start Payment — Open a hosted checkout for this invoice’s outstanding balance.

Permission: invoicing.payment.link

Path parameters: invoice_id

Request body: InvoicePaymentIntentCreate

Returns: 200 · InvoicePaymentIntentRead

POST /api/v1/invoicing/invoices/{invoice_id}/payment-intents/{intent_id}/sync

Section titled “POST /api/v1/invoicing/invoices/{invoice_id}/payment-intents/{intent_id}/sync”

Sync Payment Intent — Re-ask the provider about one attempt, by hand.

Permission: invoicing.payment.link:any

Path parameters: invoice_id, intent_id

Returns: 200 · InvoicePaymentIntentRead

POST /api/v1/invoicing/invoices/{invoice_id}/payment-intents/refresh

Section titled “POST /api/v1/invoicing/invoices/{invoice_id}/payment-intents/refresh”

Refresh Payments — “Did my payment land?” — asked by the page a payer returns to (#304).

Permission: invoicing.payment.link

Path parameters: invoice_id

Returns: 200 · InvoicePaymentRefresh

POST /api/v1/invoicing/invoices/{invoice_id}/payments

Section titled “POST /api/v1/invoicing/invoices/{invoice_id}/payments”

Add Payment

Permission: invoicing.payment.write

Path parameters: invoice_id

Request body: PaymentWrite

Returns: 200 · InvoiceRead

DELETE /api/v1/invoicing/invoices/{invoice_id}/payments/{payment_id}

Section titled “DELETE /api/v1/invoicing/invoices/{invoice_id}/payments/{payment_id}”

Delete Payment

Permission: invoicing.payment.write

Path parameters: invoice_id, payment_id

Returns: 200 · InvoiceRead

GET /api/v1/invoicing/invoices/{invoice_id}/pdf

Section titled “GET /api/v1/invoicing/invoices/{invoice_id}/pdf”

Download Invoice Pdf — The rendered invoice document (owner feedback): the same PDF the send path attaches.

Permission: invoicing.invoice.read

Path parameters: invoice_id

Returns: 200

GET /api/v1/invoicing/invoices/{invoice_id}/preview

Section titled “GET /api/v1/invoicing/invoices/{invoice_id}/preview”

Preview Invoice — The invoice as HTML — the same artefact /pdf prints.

Permission: invoicing.invoice.read

Path parameters: invoice_id

Returns: 200

GET /api/v1/invoicing/invoices/{invoice_id}/refs

Section titled “GET /api/v1/invoicing/invoices/{invoice_id}/refs”

Invoice Refs — What accounting packages know about this invoice (the #31 sync bookkeeping).

Permission: invoicing.invoice.read:any

Path parameters: invoice_id

Returns: 200 · ExternalRefRead[]

POST /api/v1/invoicing/invoices/{invoice_id}/remind

Section titled “POST /api/v1/invoicing/invoices/{invoice_id}/remind”

Remind Invoice — A payment reminder on demand — same mail, same bookkeeping as the daily cron.

Permission: invoicing.invoice.send

Path parameters: invoice_id

Returns: 200 · InvoiceRead

POST /api/v1/invoicing/invoices/{invoice_id}/send

Section titled “POST /api/v1/invoicing/invoices/{invoice_id}/send”

Send Invoice

Permission: invoicing.invoice.send

Path parameters: invoice_id

Request body: DocumentSend

Returns: 200 · InvoiceRead

GET /api/v1/invoicing/invoices/{invoice_id}/ubl

Section titled “GET /api/v1/invoicing/invoices/{invoice_id}/ubl”

Download Ubl — UBL 2.1 XML — importable by Exact Online, SnelStart, Moneybird, e-Boekhouden.

Permission: invoicing.invoice.read

Path parameters: invoice_id

Returns: 200

Invoice From Time — Draft invoice from unbilled approved billable time; stamps the entries invoiced.

Permission: invoicing.invoice.write

Request body: InvoiceFromTime

Returns: 201 · InvoiceRead

Download Invoices Zip — A selection of invoices as one zip of PDFs — the bulk half of /{invoice_id}/pdf.

Permission: invoicing.invoice.read

Query parameters:

NameTypeMeaning
idsstring[] · requiredThe invoices to pack, by id — the list screen’s ✎ selection (#307).

Returns: 200

Outstanding — Everything a client still has to be invoiced for: hours, agreement periods, renewals.

Permission: invoicing.invoice.write

Query parameters:

NameTypeMeaning
company_idstring · required

Returns: 200 · OutstandingRead

List Payment Accounts — Which payment credentials this org has connected, across every enabled provider module.

Permission: invoicing.payment.link:any

Returns: 200 · InvoicePaymentAccountRead[]

POST /api/v1/invoicing/payments/webhook/{provider}/{token}

Section titled “POST /api/v1/invoicing/payments/webhook/{provider}/{token}”

Payment Webhook — The provider’s callback. Returns bare statuses and no body, by design.

Permission: Deliberately open

Path parameters: provider, token

Returns: 200

List Products

Permission: invoicing.invoice.read:any

Query parameters:

NameTypeMeaning
include_inactiveboolean(default false)

Returns: 200 · ProductRead[]

Create Product

Permission: invoicing.settings.manage

Request body: ProductCreate

Returns: 201 · ProductRead

PATCH /api/v1/invoicing/products/{product_id}

Section titled “PATCH /api/v1/invoicing/products/{product_id}”

Update Product

Permission: invoicing.settings.manage

Path parameters: product_id

Request body: ProductUpdate

Returns: 200 · ProductRead

DELETE /api/v1/invoicing/products/{product_id}

Section titled “DELETE /api/v1/invoicing/products/{product_id}”

Delete Product

Permission: invoicing.settings.manage

Path parameters: product_id

Returns: 204

List Providers — The registered accounting adapters (#31). UBL export is always available and is not a provider — it’s a download, listed by the web from its own knowledge.

Permission: invoicing.settings.manage

Returns: 200 · array

GET /api/v1/invoicing/public/invoices/{token}

Section titled “GET /api/v1/invoicing/public/invoices/{token}”

Public Invoice — This invoice, as the person holding its link sees it.

Permission: Deliberately open

Path parameters: token

Returns: 200 · PublicInvoiceRead

POST /api/v1/invoicing/public/invoices/{token}/payment-intents

Section titled “POST /api/v1/invoicing/public/invoices/{token}/payment-intents”

Public Start Payment — Open a checkout for what this invoice still owes, and hand back where to go.

Permission: Deliberately open

Path parameters: token

Returns: 200 · PublicCheckout

GET /api/v1/invoicing/public/invoices/{token}/pdf

Section titled “GET /api/v1/invoicing/public/invoices/{token}/pdf”

Public Invoice Pdf — The PDF, for the client who wants it in their own bookkeeping.

Permission: Deliberately open

Path parameters: token

Returns: 200

GET /api/v1/invoicing/public/invoices/{token}/preview

Section titled “GET /api/v1/invoicing/public/invoices/{token}/preview”

Public Invoice Preview — The rendered document — the same HTML the signed-in preview and the PDF produce.

Permission: Deliberately open

Path parameters: token

Returns: 200

POST /api/v1/invoicing/public/invoices/{token}/refresh

Section titled “POST /api/v1/invoicing/public/invoices/{token}/refresh”

Public Refresh Payments — “Did my payment land?”, for the payer coming back from a checkout (#304).

Permission: Deliberately open

Path parameters: token

Returns: 200 · InvoicePaymentRefresh

List Quotes

Permission: invoicing.quote.read

Query parameters:

NameTypeMeaning
limitinteger(default 100)
offsetinteger(default 0)
statusstringdraft | open | accepted | rejected | expired | invoiced
company_idstring
qstringmatches number and reference
sortstringnumber | status | issue_date | valid_until | total | created_at
linesbooleanInclude each row’s lines and tax groups. False for list views (#290). (default true)

Returns: 200 · Page_QuoteRead_

Create Quote

Permission: invoicing.quote.write

Request body: QuoteCreate

Returns: 201 · QuoteRead

Get Quote

Permission: invoicing.quote.read

Path parameters: quote_id

Returns: 200 · QuoteRead

Update Quote

Permission: invoicing.quote.write

Path parameters: quote_id

Request body: QuoteUpdate

Returns: 200 · QuoteRead

DELETE /api/v1/invoicing/quotes/{quote_id}

Section titled “DELETE /api/v1/invoicing/quotes/{quote_id}”

Delete Quote

Permission: invoicing.quote.delete

Path parameters: quote_id

Returns: 204

POST /api/v1/invoicing/quotes/{quote_id}/accept

Section titled “POST /api/v1/invoicing/quotes/{quote_id}/accept”

Accept Quote

Permission: invoicing.quote.write

Path parameters: quote_id

Request body: QuoteDecision

Returns: 200 · QuoteRead

POST /api/v1/invoicing/quotes/{quote_id}/convert

Section titled “POST /api/v1/invoicing/quotes/{quote_id}/convert”

Convert Quote — Accepted quote → draft invoice carrying the lines at their accepted prices.

Permission: invoicing.quote.write

Path parameters: quote_id

Returns: 201 · InvoiceRead

POST /api/v1/invoicing/quotes/{quote_id}/issue

Section titled “POST /api/v1/invoicing/quotes/{quote_id}/issue”

Issue Quote

Permission: invoicing.quote.write

Path parameters: quote_id

Request body: InvoiceIssue

Returns: 200 · QuoteRead

GET /api/v1/invoicing/quotes/{quote_id}/pdf

Section titled “GET /api/v1/invoicing/quotes/{quote_id}/pdf”

Download Quote Pdf

Permission: invoicing.quote.read

Path parameters: quote_id

Returns: 200

GET /api/v1/invoicing/quotes/{quote_id}/preview

Section titled “GET /api/v1/invoicing/quotes/{quote_id}/preview”

Preview Quote

Permission: invoicing.quote.read

Path parameters: quote_id

Returns: 200

POST /api/v1/invoicing/quotes/{quote_id}/reject

Section titled “POST /api/v1/invoicing/quotes/{quote_id}/reject”

Reject Quote

Permission: invoicing.quote.write

Path parameters: quote_id

Request body: QuoteDecision

Returns: 200 · QuoteRead

POST /api/v1/invoicing/quotes/{quote_id}/send

Section titled “POST /api/v1/invoicing/quotes/{quote_id}/send”

Send Quote

Permission: invoicing.quote.send

Path parameters: quote_id

Request body: DocumentSend

Returns: 200 · QuoteRead

Recurring Backlog — Org-wide recurring work still to invoice (#302): agreement periods and domain renewals that no document claims yet.

Permission: invoicing.invoice.read:any

Query parameters:

NameTypeMeaning
groupcompany · month · sourcecompany | month | source (default company)
sourceall · subscription · domainall | subscription | domain (default all)
limitintegercap on the item detail, not the totals (default 500)

Returns: 200 · RecurringBacklogReport

Get Settings — Read by the editor too (defaults, numbering preview) — not only by admins.

Permission: invoicing.invoice.read:any

Returns: 200 · InvoicingSettingsRead

Save Settings

Permission: invoicing.settings.manage

Request body: InvoicingSettingsWrite

Returns: 200 · InvoicingSettingsRead

Summary

Permission: invoicing.invoice.read

Returns: 200 · InvoicingSummary

List Tax Rates

Permission: invoicing.invoice.read:any

Query parameters:

NameTypeMeaning
include_inactiveboolean(default false)

Returns: 200 · TaxRateRead[]

Create Tax Rate

Permission: invoicing.settings.manage

Request body: TaxRateCreate

Returns: 201 · TaxRateRead

PATCH /api/v1/invoicing/tax-rates/{tax_rate_id}

Section titled “PATCH /api/v1/invoicing/tax-rates/{tax_rate_id}”

Update Tax Rate

Permission: invoicing.settings.manage

Path parameters: tax_rate_id

Request body: TaxRateUpdate

Returns: 200 · TaxRateRead

DELETE /api/v1/invoicing/tax-rates/{tax_rate_id}

Section titled “DELETE /api/v1/invoicing/tax-rates/{tax_rate_id}”

Delete Tax Rate

Permission: invoicing.settings.manage

Path parameters: tax_rate_id

Returns: 204

Template Blocks — What a template may rearrange: the block/field catalog plus the shipped designs.

Permission: invoicing.settings.manage

Returns: 200 · TemplateCatalog

GET /api/v1/invoicing/template-blocks/{design}/source

Section titled “GET /api/v1/invoicing/template-blocks/{design}/source”

Template Source — A shipped design’s own HTML and CSS, to start a custom template from.

Permission: invoicing.template.author

Path parameters: design

Returns: 200 · TemplateSource

List Templates

Permission: invoicing.invoice.read:any

Query parameters:

NameTypeMeaning
include_inactiveboolean(default false)

Returns: 200 · app__modules__invoicing__schemas__TemplateRead[]

Create Template

Permission: invoicing.settings.manage

Request body: app__modules__invoicing__schemas__TemplateCreate

Returns: 201 · app__modules__invoicing__schemas__TemplateRead

PATCH /api/v1/invoicing/templates/{template_id}

Section titled “PATCH /api/v1/invoicing/templates/{template_id}”

Update Template

Permission: invoicing.settings.manage

Path parameters: template_id

Request body: app__modules__invoicing__schemas__TemplateUpdate

Returns: 200 · app__modules__invoicing__schemas__TemplateRead

DELETE /api/v1/invoicing/templates/{template_id}

Section titled “DELETE /api/v1/invoicing/templates/{template_id}”

Delete Template

Permission: invoicing.settings.manage

Path parameters: template_id

Returns: 204

Preview Template — Render a sample document with an unsaved config — the editor’s live preview.

Permission: invoicing.settings.manage

Request body: TemplatePreview

Returns: 200

POST /api/v1/invoicing/templates/qr-preview

Section titled “POST /api/v1/invoicing/templates/qr-preview”

Preview Template Qr — The payment QR alone, as an unsaved config would draw it (#305).

Permission: invoicing.settings.manage

Request body: TemplatePreview

Returns: 200 · QrPreview

Unbilled

Permission: invoicing.invoice.write

Query parameters:

NameTypeMeaning
company_idstring · required
project_idstring
untilstringorg-local date (YYYY-MM-DD), inclusive

Returns: 200 · UnbilledRead

Uninvoiced — Org-wide report of approved + billable + not-yet-invoiced hours (#277), bucketed server-side with exact per-group subtotals. Read-only: the per-company /unbilled stays the invoice-build preview, and building happens via /invoices/from-time.

Permission: invoicing.invoice.read:any

Query parameters:

NameTypeMeaning
groupday · week · month · year · company · project · userday | week | month | year | company | project | user (default company)
limitintegercap on the entry detail, not the totals (default 500)

Returns: 200 · UninvoicedReport

EndpointPermission
GET /subscriptionssubscriptions.subscription.read
POST /subscriptionssubscriptions.subscription.write
GET /subscriptions/{subscription_id}subscriptions.subscription.read
PATCH /subscriptions/{subscription_id}subscriptions.subscription.write
DELETE /subscriptions/{subscription_id}subscriptions.subscription.delete
GET /subscriptions/{subscription_id}/pricessubscriptions.subscription.read
POST /subscriptions/price-increasesubscriptions.subscription.write
POST /subscriptions/price-increase/previewsubscriptions.subscription.write
GET /subscriptions/summarysubscriptions.subscription.read
GET /subscriptions/templatessubscriptions.subscription.read
POST /subscriptions/templatessubscriptions.template.manage
PATCH /subscriptions/templates/{template_id}subscriptions.template.manage
DELETE /subscriptions/templates/{template_id}subscriptions.template.manage
GET /subscriptions/typessubscriptions.subscription.read
POST /subscriptions/typessubscriptions.type.manage
PATCH /subscriptions/types/{type_id}subscriptions.type.manage
DELETE /subscriptions/types/{type_id}subscriptions.type.manage
Parameters and schemas per endpoint

List Subscriptions

Permission: subscriptions.subscription.read

Query parameters:

NameTypeMeaning
limitinteger(default 100)
offsetinteger(default 0)
company_idstring
statusstring
subscription_type_idstring
sortstringname | status | next_invoice_date | start_date | company | type | amount | included_hours
entity_typestringwith entity_id: linked-entity filter
entity_idstring
usagebooleaninclude current-period usage per row (default false)

Returns: 200 · Page_SubscriptionRead_

Create Subscription

Permission: subscriptions.subscription.write

Request body: SubscriptionCreate

Returns: 201 · SubscriptionRead

GET /api/v1/subscriptions/{subscription_id}

Section titled “GET /api/v1/subscriptions/{subscription_id}”

Get Subscription

Permission: subscriptions.subscription.read

Path parameters: subscription_id

Query parameters:

NameTypeMeaning
usagebooleanInclude current-period included-hours usage (default false)

Returns: 200 · SubscriptionRead

PATCH /api/v1/subscriptions/{subscription_id}

Section titled “PATCH /api/v1/subscriptions/{subscription_id}”

Update Subscription

Permission: subscriptions.subscription.write

Path parameters: subscription_id

Request body: SubscriptionUpdate

Returns: 200 · SubscriptionRead

DELETE /api/v1/subscriptions/{subscription_id}

Section titled “DELETE /api/v1/subscriptions/{subscription_id}”

Delete Subscription

Permission: subscriptions.subscription.delete

Path parameters: subscription_id

Returns: 204

GET /api/v1/subscriptions/{subscription_id}/prices

Section titled “GET /api/v1/subscriptions/{subscription_id}/prices”

Price History — The append-only price history, newest first.

Permission: subscriptions.subscription.read

Path parameters: subscription_id

Returns: 200 · PriceRead[]

Apply Price Increase — Apply the increase: one price-history row per subscription (and optionally the matching templates’ default amounts).

Permission: subscriptions.subscription.write

Request body: PriceIncreaseRequest

Returns: 200 · PriceIncreaseResult

POST /api/v1/subscriptions/price-increase/preview

Section titled “POST /api/v1/subscriptions/price-increase/preview”

Preview Price Increase — Every in-scope subscription with its current and would-be amount — nothing written.

Permission: subscriptions.subscription.write

Request body: PriceIncreaseRequest

Returns: 200 · PriceIncreaseResult

Summary — MRR/ARR + the invoices due within a month, for Overzicht → Omzet.

Permission: subscriptions.subscription.read

Returns: 200 · SubscriptionSummary

List Subscription Templates

Permission: subscriptions.subscription.read

Returns: 200 · SubscriptionTemplateRead[]

Create Subscription Template

Permission: subscriptions.template.manage

Request body: SubscriptionTemplateCreate

Returns: 201 · SubscriptionTemplateRead

PATCH /api/v1/subscriptions/templates/{template_id}

Section titled “PATCH /api/v1/subscriptions/templates/{template_id}”

Update Subscription Template — A rename carries over to the agreements made from this preset that still bear its old name; renamed_subscriptions reports how many, so the screen can say so.

Permission: subscriptions.template.manage

Path parameters: template_id

Request body: SubscriptionTemplateUpdate

Returns: 200 · SubscriptionTemplateSaved

DELETE /api/v1/subscriptions/templates/{template_id}

Section titled “DELETE /api/v1/subscriptions/templates/{template_id}”

Delete Subscription Template

Permission: subscriptions.template.manage

Path parameters: template_id

Returns: 204

List Subscription Types

Permission: subscriptions.subscription.read

Query parameters:

NameTypeMeaning
include_inactiveboolean(default false)

Returns: 200 · SubscriptionTypeRead[]

Create Subscription Type

Permission: subscriptions.type.manage

Request body: SubscriptionTypeCreate

Returns: 201 · SubscriptionTypeRead

PATCH /api/v1/subscriptions/types/{type_id}

Section titled “PATCH /api/v1/subscriptions/types/{type_id}”

Update Subscription Type

Permission: subscriptions.type.manage

Path parameters: type_id

Request body: SubscriptionTypeUpdate

Returns: 200 · SubscriptionTypeRead

DELETE /api/v1/subscriptions/types/{type_id}

Section titled “DELETE /api/v1/subscriptions/types/{type_id}”

Delete Subscription Type

Permission: subscriptions.type.manage

Path parameters: type_id

Returns: 204

EndpointPermission
GET /mollie/accountsmollie.settings.manage
POST /mollie/accountsmollie.settings.manage
PATCH /mollie/accounts/{account_id}mollie.settings.manage
DELETE /mollie/accounts/{account_id}mollie.settings.manage
POST /mollie/accounts/{account_id}/verifymollie.settings.manage
Parameters and schemas per endpoint

List Accounts — Connected Mollie keys. The key itself is never part of the response.

Permission: mollie.settings.manage

Returns: 200 · MollieAccountRead[]

Create Account — Store a credential. Creating does not verify it — /verify is the explicit probe, so a typo is reported on the settings screen rather than as a failed save.

Permission: mollie.settings.manage

Request body: MollieAccountCreate

Returns: 201 · MollieAccountRead

PATCH /api/v1/mollie/accounts/{account_id}

Section titled “PATCH /api/v1/mollie/accounts/{account_id}”

Update Account — Rename, re-link or rotate. An omitted api_key keeps the stored one.

Permission: mollie.settings.manage

Path parameters: account_id

Request body: MollieAccountUpdate

Returns: 200 · MollieAccountRead

DELETE /api/v1/mollie/accounts/{account_id}

Section titled “DELETE /api/v1/mollie/accounts/{account_id}”

Delete Account

Permission: mollie.settings.manage

Path parameters: account_id

Returns: 204

POST /api/v1/mollie/accounts/{account_id}/verify

Section titled “POST /api/v1/mollie/accounts/{account_id}/verify”

Verify Account — Ask Mollie whether this key works, and which methods it can take.

Permission: mollie.settings.manage

Path parameters: account_id

Returns: 200 · MollieAccountVerifyResult

EndpointPermission
GET /snelstart/accountssnelstart.settings.manage
POST /snelstart/accountssnelstart.settings.manage
PATCH /snelstart/accounts/{account_id}snelstart.settings.manage
DELETE /snelstart/accounts/{account_id}snelstart.settings.manage
GET /snelstart/accounts/{account_id}/ledgerssnelstart.sync.run
POST /snelstart/accounts/{account_id}/links/{link_id}/adoptsnelstart.sync.run
POST /snelstart/accounts/{account_id}/push/articlessnelstart.ledger.write
POST /snelstart/accounts/{account_id}/push/invoicessnelstart.ledger.write, invoicing.invoice.write
POST /snelstart/accounts/{account_id}/push/invoices/{invoice_id}snelstart.ledger.write, invoicing.invoice.write
POST /snelstart/accounts/{account_id}/push/relationssnelstart.ledger.write
GET /snelstart/accounts/{account_id}/relationssnelstart.sync.run
GET /snelstart/accounts/{account_id}/runssnelstart.sync.run
POST /snelstart/accounts/{account_id}/sync/paymentssnelstart.sync.run
POST /snelstart/accounts/{account_id}/sync/referencesnelstart.sync.run
POST /snelstart/accounts/{account_id}/sync/relationssnelstart.sync.run
POST /snelstart/accounts/{account_id}/verifysnelstart.settings.manage
GET /snelstart/accounts/optionssnelstart.sync.run
POST /snelstart/coupling/callbackDeliberately open
Parameters and schemas per endpoint

List Accounts — Connected administrations. The koppelsleutel is never part of the response.

Permission: snelstart.settings.manage

Returns: 200 · SnelstartAccountRead[]

Create Account — Store a credential, or open a pending one for the activation flow to fill.

Permission: snelstart.settings.manage

Request body: SnelstartAccountCreate

Returns: 201 · SnelstartAccountRead

PATCH /api/v1/snelstart/accounts/{account_id}

Section titled “PATCH /api/v1/snelstart/accounts/{account_id}”

Update Account — Rename, rotate, or change what this connection does. An omitted key keeps the stored one.

Permission: snelstart.settings.manage

Path parameters: account_id

Request body: SnelstartAccountUpdate

Returns: 200 · SnelstartAccountRead

DELETE /api/v1/snelstart/accounts/{account_id}

Section titled “DELETE /api/v1/snelstart/accounts/{account_id}”

Delete Account

Permission: snelstart.settings.manage

Path parameters: account_id

Returns: 204

GET /api/v1/snelstart/accounts/{account_id}/ledgers

Section titled “GET /api/v1/snelstart/accounts/{account_id}/ledgers”

Ledger Options — The revenue accounts a line may book to — the picker behind the per-rate mapping.

Permission: snelstart.sync.run

Path parameters: account_id

Returns: 200 · SnelstartLedgerOption[]

POST /api/v1/snelstart/accounts/{account_id}/links/{link_id}/adopt

Section titled “POST /api/v1/snelstart/accounts/{account_id}/links/{link_id}/adopt”

Adopt Link — Pair a SnelStart row with a schakl record by hand — the reviewer’s one click.

Permission: snelstart.sync.run

Path parameters: account_id, link_id

Request body: SnelstartLinkAdopt

Returns: 200 · SnelstartLinkRead

POST /api/v1/snelstart/accounts/{account_id}/push/articles

Section titled “POST /api/v1/snelstart/accounts/{account_id}/push/articles”

Push Articles — schakl’s products into SnelStart’s article file, matched on the article code.

Permission: snelstart.ledger.write

Path parameters: account_id

Returns: 200 · SnelstartSyncRunRead

POST /api/v1/snelstart/accounts/{account_id}/push/invoices

Section titled “POST /api/v1/snelstart/accounts/{account_id}/push/invoices”

Push Invoices — Every issued invoice not yet in SnelStart, or a named selection.

Permission: snelstart.ledger.write, invoicing.invoice.write

Path parameters: account_id

Request body: Body_push_invoices_api_v1_snelstart_accounts__account_id__push_invoices_post

Returns: 200 · SnelstartSyncRunRead

POST /api/v1/snelstart/accounts/{account_id}/push/invoices/{invoice_id}

Section titled “POST /api/v1/snelstart/accounts/{account_id}/push/invoices/{invoice_id}”

Push Invoice — One invoice, from its own detail page.

Permission: snelstart.ledger.write, invoicing.invoice.write

Path parameters: account_id, invoice_id

Returns: 200 · SnelstartPushResult

POST /api/v1/snelstart/accounts/{account_id}/push/relations

Section titled “POST /api/v1/snelstart/accounts/{account_id}/push/relations”

Push Relations — Push paired and invoiced companies into SnelStart’s relation file.

Permission: snelstart.ledger.write

Path parameters: account_id

Returns: 200 · SnelstartSyncRunRead

GET /api/v1/snelstart/accounts/{account_id}/relations

Section titled “GET /api/v1/snelstart/accounts/{account_id}/relations”

Relation Candidates — Every SnelStart customer and what schakl believes it is. Writes nothing.

Permission: snelstart.sync.run

Path parameters: account_id

Returns: 200 · SnelstartRelationCandidate[]

GET /api/v1/snelstart/accounts/{account_id}/runs

Section titled “GET /api/v1/snelstart/accounts/{account_id}/runs”

List Runs — What the last syncs did, and what they could not do (#31: failures are visible).

Permission: snelstart.sync.run

Path parameters: account_id

Query parameters:

NameTypeMeaning
limitinteger(default 20)

Returns: 200 · SnelstartSyncRunRead[]

POST /api/v1/snelstart/accounts/{account_id}/sync/payments

Section titled “POST /api/v1/snelstart/accounts/{account_id}/sync/payments”

Sync Payments — Fold SnelStart’s outstanding balances back into schakl as payments.

Permission: snelstart.sync.run

Path parameters: account_id

Returns: 200 · SnelstartSyncRunRead

POST /api/v1/snelstart/accounts/{account_id}/sync/reference

Section titled “POST /api/v1/snelstart/accounts/{account_id}/sync/reference”

Sync Reference — Pull the administration’s chart of accounts, journals, countries and article groups.

Permission: snelstart.sync.run

Path parameters: account_id

Returns: 200 · SnelstartSyncRunRead

POST /api/v1/snelstart/accounts/{account_id}/sync/relations

Section titled “POST /api/v1/snelstart/accounts/{account_id}/sync/relations”

Link Relations — Adopt every SnelStart customer schakl can identify without guessing.

Permission: snelstart.sync.run

Path parameters: account_id

Returns: 200 · SnelstartSyncRunRead

POST /api/v1/snelstart/accounts/{account_id}/verify

Section titled “POST /api/v1/snelstart/accounts/{account_id}/verify”

Verify Account — Ask SnelStart which administration this key opens, and what it may do there.

Permission: snelstart.settings.manage

Path parameters: account_id

Returns: 200 · SnelstartVerifyResult

Account Options — The accounts a sync or push may run against.

Permission: snelstart.sync.run

Returns: 200 · SnelstartAccountRead[]

Coupling Callback — Receive a koppelsleutel SnelStart has just granted.

Permission: Deliberately open

Returns: 200 · object