Browse documentation

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.

GET/api/finance/profile

Read issuer profile

Access: Workspace member · Success: 200

Default profile uses workspace name until configured.

No request body is required.

Response

Use FinanceProfile.

Request shape (illustrative)
curl --request GET \
  --url 'https://app.drykraft.com/api/finance/profile' \
  --cookie 'drykraft_session=<YOUR_SESSION_TOKEN>'
PUT/api/finance/profile

Save issuer profile

Access: Owner or admin · Success: 200

Issued invoices keep their issuer snapshot.

JSON request

Use FinanceProfile.

Response

Use FinanceProfile.

Request shape (illustrative)
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>"
}'
GET/api/finance/summary

Read 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[].

Request shape (illustrative)
curl --request GET \
  --url 'https://app.drykraft.com/api/finance/summary' \
  --cookie 'drykraft_session=<YOUR_SESSION_TOKEN>'
POST/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.

Request shape (illustrative)
curl --request POST \
  --url 'https://app.drykraft.com/api/finance/templates/won-deal' \
  --cookie 'drykraft_session=<YOUR_SESSION_TOKEN>'
POST/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

FieldTypeRequiredDetails
dataInvoiceData or ExpenseDataYes

Response

Use Record.

Request shape (illustrative)
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"
      }
    ]
  }
}'
PUT/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

FieldTypeRequiredDetails
dataInvoiceData or ExpenseDataYes
versionintegerYesPositive optimistic version returned by the latest read. Refresh on 409; do not overwrite stale changes. Min 1.

Response

Use Record.

Request shape (illustrative)
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
}'
GET/api/finance/{key}/{id}/entries

Read 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

Request shape (illustrative)
curl --request GET \
  --url 'https://app.drykraft.com/api/finance/invoices/00000000-0000-4000-8000-000000000001/entries' \
  --cookie 'drykraft_session=<YOUR_SESSION_TOKEN>'
POST/api/finance/{key}/{id}/action

Move 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

FieldTypeRequiredDetails
actionissue | void | submit | approve | reject | reopenYesState transition
versionintegerYesPositive optimistic version returned by the latest read. Refresh on 409; do not overwrite stale changes. Min 1.
notestringNoReason or note, default empty Max 2000 characters.

Response

Use Record.

Request shape (illustrative)
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
}'
POST/api/finance/{key}/{id}/payments

Record 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.

Request shape (illustrative)
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>"
}'
GET/api/finance/invoices/{id}/pdf

Download 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.

Request shape (illustrative)
curl --request GET \
  --url 'https://app.drykraft.com/api/finance/invoices/00000000-0000-4000-8000-000000000001/pdf' \
  --cookie 'drykraft_session=<YOUR_SESSION_TOKEN>'