Skip to content

Invoices

RFR bills by invoice. Two read-only endpoints let you pull those invoices into your own accounting or case-management system: one case at a time, or your whole organization as a list you can poll for changes. Payments still happen through the QuickBooks payment link on open invoices — this API does not take payments.

GET /api/v1/partner/cases/{case_ref}/invoices/ — case_ref is the numeric case id or the Jira issue key, as on every other case route. Cases filed through our intake forms (not this API) are reachable by issue key. On this route, issue keys are not case-sensitive.

{
"case": { "id": 4521, "issue_key": "RFR-40703" },
"invoices": [
{
"id": 81234,
"invoice_number": "RFR-40703",
"case": { "id": 4521, "issue_key": "RFR-40703" },
"status": "open",
"issued_on": "2026-10-01",
"due_on": "2026-10-31",
"paid_on": null,
"total_usd": "315.00",
"pay_url": "https://connect.intuit.com/portal/app/CommerceNetwork/view/scs-v1-example",
"lines": [
{ "description": "Auto: Personal Vehicle", "category": "result", "amount_usd": "210.00" },
{ "description": "Umbrella: Personal", "category": "upsell", "amount_usd": "105.00" }
],
"changed_at": "2026-10-11T14:02:11.123456Z"
}
]
}

invoices lists the case’s invoices by issue date, oldest first, and is empty until an invoice has been issued. A case can carry more than one invoice — most often when you accept an additional policy after results. A case you submitted through this API that has no Jira issue yet returns issue_key: null and an empty invoices list.

Field Type Notes
id integer Stable. Key your records on this.
invoice_number string | null The number printed on the invoice. Can change if the case moves between Jira projects.
case object { id, issue_key }. id is null for cases not submitted through this API.
status string open, paid or void (below).
issued_on date The invoice date.
due_on date | null From the invoice’s payment terms.
paid_on date | null The payment date. Null unless status is paid, and can be null on a paid invoice until the payment date has been recorded.
total_usd string Decimal, 2 places.
pay_url string | null QuickBooks payment page. Null unless status is open, and can be null on an open invoice whose payment link is not available.
lines array { description, category, amount_usd }. Always sums to total_usd.
changed_at timestamp | null When anything on this invoice you can see last changed. Null only until the invoice is first recorded for the change feed; the list below returns an invoice once it has a changed_at.
status Meaning
open Issued and not yet fully paid. A partial payment still reads open.
paid Paid in full.
void Cancelled. It stays in the list so your records can reverse it; it is never deleted.

result — a research result billed on the case: a policy found, or a priced no-hit outcome. upsell — an additional policy you accepted after results. add_on — a service such as rush or a date-of-loss review. adjustment — closes any difference between the listed lines and the total (for example a correction made on the invoice itself); it is always the last line, and it can be negative.

GET /api/v1/partner/invoices/ returns your organization’s invoices, oldest change first, a page at a time. Each page is { "next": <url or null>, "results": [<invoice>, …] }; follow next until it is null.

Parameter Meaning
case_ids Comma-separated numeric case ids, up to 100. Repeating the parameter is the same as a comma-separated list.
issue_keys Comma-separated Jira issue keys, up to 100. Not case-sensitive. Repeating the parameter is the same as a comma-separated list.
changed_since ISO-8601 date or timestamp. Returns invoices whose changed_at is at or after it. A timestamp with no time zone is read as UTC; a date alone means midnight UTC.
page_size 1–100, default 25. A larger value returns 100.
cursor Opaque. Copy it from next; never build it.

Send case_ids or issue_keys, not both. Ids or keys you cannot see are left out silently. A next link repeats the filters you sent, so follow it exactly as given. There is no previous link and no total count.

  1. Run one full sync: call with no filters and page_size=100, following next to the end.
  2. Then poll: call with changed_since set to the latest changed_at you have stored minus 5 minutes, and update each invoice by id. The overlap catches changes that were being written while you read; seeing an invoice twice is expected.
  3. If your token gains access to another organization, run a fresh full sync — that organization’s existing invoices keep their original changed_at.

There are no invoice webhooks yet; polling every few minutes to every hour is plenty.

  • Invoice state is posted on a delay, not in real time. Payments usually appear within about an hour; a void can take up to a week.
  • No balance field. A partial payment shows open until the invoice is fully paid.
  • Rate limit: the two invoice endpoints share their own 60/min limit, separate from every other endpoint. On 429, wait for Retry-After before following next.
  • Test cases are never invoiced — see Testing. Their invoices list is always empty.
  • Cases funded through a litigation-funding partner are not yet covered; their case fetch returns an empty invoices list.
  • 404 {"detail": "Case not found."} — the case does not exist or is not your organization’s.
  • 400 {"error": "invalid_filter", "detail": "..."} — a list filter to fix: both id lists, a case_ids value that is not a numeric id, more than 100 values, an empty value, an unreadable changed_since, or a cursor this API did not issue.
  • 429 — see Errors.