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.
One case
Section titled “One case”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.
The invoice object
Section titled “The invoice object”| 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
Section titled “Status”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. |
Line categories
Section titled “Line categories”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.
Your organization’s invoices
Section titled “Your organization’s invoices”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.
Keeping in sync
Section titled “Keeping in sync”- Run one full sync: call with no filters and
page_size=100, followingnextto the end. - Then poll: call with
changed_sinceset to the latestchanged_atyou have stored minus 5 minutes, and update each invoice byid. The overlap catches changes that were being written while you read; seeing an invoice twice is expected. - 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.
Freshness and limits
Section titled “Freshness and limits”- 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
openuntil the invoice is fully paid. - Rate limit: the two invoice endpoints share their own
60/minlimit, separate from every other endpoint. On429, wait forRetry-Afterbefore followingnext. - Test cases are never invoiced — see Testing. Their
invoiceslist is always empty. - Cases funded through a litigation-funding partner are not yet covered; their case fetch returns an
empty
invoiceslist.
Errors
Section titled “Errors”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, acase_idsvalue that is not a numeric id, more than 100 values, an empty value, an unreadablechanged_since, or acursorthis API did not issue.429— see Errors.