Stage contracts for human review instead of creating them directly as active contracts:

  • POST /draft-contracts - Create a contract in the "draft" holding state
  • GET /draft-contracts/{id}, PUT /draft-contracts/{id}, and DELETE /draft-contracts/{id} - Retrieve, replace, or delete a draft contract
  • Compatibility: the existing /pending-contracts endpoints remain available with their current request and response shapes

Draft contracts appear in the Rillet UI under "Draft" for an operator to approve or reject.

Deduplication via external_references: to prevent duplicates on retry, attach at least one external_references entry with a stable (type, id) pair. Re-posting with any matching pair replaces the prior draft record. Draft contracts created without external_references are not deduplicated — every POST creates a new record.

Each reference's type slug must already be defined under Rillet Settings → External References for your organization. References attached at create time are preserved when the draft contract is later promoted to an active contract.

Once a draft contract is approved in the UI it becomes a regular contract.

The POST /reimbursements endpoint is now available, allowing you to programmatically create reimbursements.

Supply a payable_account_code to specify the credit-side GL account for the employee payable journal entry. All standard reimbursement fields are supported, including line items, custom fields, tax rates, service periods, and external references.

V3 and later.

The Invoice resource now includes a sent_at field on V3 endpoints, recording the timestamp an invoice was first sent to the customer from Rillet. The field is intended for downstream systems — particularly tax platforms — that need a precise, legally binding date for tax registration and similar compliance workflows.

sent_at is set the first time the invoice is sent and does not change on subsequent sends. It is null for invoices that have never been sent from Rillet, and is not populated by preview emails or payment reminders.

Available on all V3 endpoints that return an Invoice resource and on the invoice-updated webhook event.

The POST /journal-entries endpoint now accepts an optional related_entity field, allowing you to attach a customer or vendor to a journal entry at creation time.

{
  "related_entity": {
    "id": "<customer-or-vendor-uuid>",
    "type": "CUSTOMER"
  }
}

The type field accepts CUSTOMER or VENDOR. The entity ID is validated against your organization — invalid IDs will return a 400 error. V3 only.

  • Fix: Custom field assignments on revenue recognition only invoice items were not supported. The fields property is now accepted on create and update requests for revenue recognition only invoice items and is returned in GET responses.

A new endpoint to retrieve an executive profit and loss report:

  • GET /reports/executive-pl - Returns an executive P&L report with margins for a specified date range

Supports optional subsidiary_id, breakdown_by, consolidated, and currency parameters.

Full bank transaction lifecycle management:

  • POST /bank-transactions - Create a bank transaction
  • GET /bank-transactions - List all bank transactions
  • GET /bank-transactions/{bank_transaction_id} - Retrieve a bank transaction
  • PUT /bank-transactions/{bank_transaction_id} - Update a bank transaction
  • DELETE /bank-transactions/{bank_transaction_id} - Delete a bank transaction

Filter reporting journal entries by their posting date:

  • GET /reports/journal-entries?date.gte=2023-12-01&date.lte=2023-12-31 - All reporting JEs posted in December 2023

Supports date.gte and date.lte parameters, which can be combined to define a date window.

New endpoints to create and delete bank accounts:

  • POST /bank-accounts - Create a new bank account
  • DELETE /bank-accounts/{bank_account_id} - Delete a bank account

Added account mask and name fields to bank account responses.