Finance
Current release · Updated October 2, 2026
DryKraft finance API: methods, permissions, request fields, response shapes, examples and current limits. Read authentication and error handling first.
/api/finance/profileRead issuer profile
Access: Workspace member · Success: 200
Default profile uses workspace name until configured.
No request body is required.
Response
Use FinanceProfile.
curl --request GET \
--url 'https://app.drykraft.com/api/finance/profile' \
--cookie 'drykraft_session=<YOUR_SESSION_TOKEN>'/api/finance/profileSave issuer profile
Access: Owner or admin · Success: 200
Issued invoices keep their issuer snapshot.
JSON request
Use FinanceProfile.
Response
Use FinanceProfile.
curl --request PUT \
--url 'https://app.drykraft.com/api/finance/profile' \
--cookie 'drykraft_session=<YOUR_SESSION_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"business_name": "<Nonblank issuer name>"
}'/api/finance/summaryRead currency totals
Access: Workspace member · Success: 200
One row per currency. Monetary totals are decimal strings of minor units; overdue uses workspace timezone. No exchange conversion.
No request body is required.
Response
object[].
curl --request GET \
--url 'https://app.drykraft.com/api/finance/summary' \
--cookie 'drykraft_session=<YOUR_SESSION_TOKEN>'/api/finance/templates/{name}Create finance workflow draft
Access: Owner, admin or member · Success: 201
name: won-deal, expense-approval or invoice-paid. Creates an unpublished workflow; review then publish separately.
No request body is required.
Response
Use Workflow.
curl --request POST \
--url 'https://app.drykraft.com/api/finance/templates/won-deal' \
--cookie 'drykraft_session=<YOUR_SESSION_TOKEN>'/api/finance/{key}Create finance draft
Access: Owner, admin or member · Success: 201
key: invoices or expenses. Wrap InvoiceData/ExpenseData in data. Draft is server-calculated and field-validated.
JSON request
| Field | Type | Required | Details |
|---|---|---|---|
data | InvoiceData or ExpenseData | Yes |
Response
Use Record.
curl --request POST \
--url 'https://app.drykraft.com/api/finance/invoices' \
--cookie 'drykraft_session=<YOUR_SESSION_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"data": {
"name": "Example consulting invoice",
"customer_name": "Example Company",
"currency": "USD",
"issue_date": "2026-10-02",
"due_date": "2026-11-01",
"items": [
{
"description": "Consulting",
"quantity": "1",
"unit_price": "100.00",
"discount": "0",
"tax_rate": "0"
}
]
}
}'/api/finance/{key}/{id}Replace finance draft
Access: Owner, admin or member · Success: 200
key: invoices or expenses. Only current Draft can be edited. Supply complete desired draft values.
JSON request
| Field | Type | Required | Details |
|---|---|---|---|
data | InvoiceData or ExpenseData | Yes | |
version | integer | Yes | Positive optimistic version returned by the latest read. Refresh on 409; do not overwrite stale changes. Min 1. |
Response
Use Record.
curl --request PUT \
--url 'https://app.drykraft.com/api/finance/invoices/00000000-0000-4000-8000-000000000001' \
--cookie 'drykraft_session=<YOUR_SESSION_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"data": {
"name": "Example consulting invoice",
"customer_name": "Example Company",
"currency": "USD",
"issue_date": "2026-10-02",
"due_date": "2026-11-01",
"items": [
{
"description": "Consulting",
"quantity": "1",
"unit_price": "100.00",
"discount": "0",
"tax_rate": "0"
}
]
},
"version": 1
}'/api/finance/{key}/{id}/entriesRead finance payment entries
Access: Workspace member · Success: 200
Latest first. No endpoint deletes or edits payment entries.
No request body is required.
Response
object[]. id, record_id, kind, amount_minor, currency, paid_on, method, reference, actor_id, actor_name, created_at
curl --request GET \
--url 'https://app.drykraft.com/api/finance/invoices/00000000-0000-4000-8000-000000000001/entries' \
--cookie 'drykraft_session=<YOUR_SESSION_TOKEN>'/api/finance/{key}/{id}/actionMove finance state
Access: Owner, admin or member · Success: 200
Invoices: Draft → issue → Issued; unpaid Draft/Issued → void (admin, reason required). Expenses: Draft → submit → Submitted → approve/reject (admin); Rejected → reopen → Draft. Reject needs reason. Issuing requires positive total and freezes issuer/number/details.
JSON request
| Field | Type | Required | Details |
|---|---|---|---|
action | issue | void | submit | approve | reject | reopen | Yes | State transition |
version | integer | Yes | Positive optimistic version returned by the latest read. Refresh on 409; do not overwrite stale changes. Min 1. |
note | string | No | Reason or note, default empty Max 2000 characters. |
Response
Use Record.
curl --request POST \
--url 'https://app.drykraft.com/api/finance/invoices/00000000-0000-4000-8000-000000000001/action' \
--cookie 'drykraft_session=<YOUR_SESSION_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"action": "issue",
"version": 1
}'/api/finance/{key}/{id}/paymentsRecord payment
Access: Owner, admin or member · Success: 200
Invoices: positive received amount <=balance, issued/partially paid only. Expenses: admin only, Approved, exact full amount. Date cannot be in future. UUID id supports identical retry; changed content returns 409. This does not charge or transfer money.
JSON request
Use Payment.
Response
Use Record.
curl --request POST \
--url 'https://app.drykraft.com/api/finance/invoices/00000000-0000-4000-8000-000000000001/payments' \
--cookie 'drykraft_session=<YOUR_SESSION_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"id": "00000000-0000-4000-8000-000000000001",
"version": 1,
"amount": "<value>",
"paid_on": "2026-10-02",
"method": "Bank transfer",
"reference": "<Nonblank payment reference>"
}'/api/finance/invoices/{id}/pdfDownload invoice PDF
Access: Workspace member · Success: 200
Draft, issued and void documents reflect their state. Issued document uses frozen issuer. Private/no-store; attachment filename from invoice number.
No request body is required.
Response
binary.
curl --request GET \
--url 'https://app.drykraft.com/api/finance/invoices/00000000-0000-4000-8000-000000000001/pdf' \
--cookie 'drykraft_session=<YOUR_SESSION_TOKEN>'