API Upgrades
Upgrading API Versions
Please refer to our versioning policy to understand what we consider a breaking change.
To switch to a different version of the Rutter API, one needs to specify the X-Rutter-Version header with a valid version (e.g., 2024-08-31).
Note for our older customers: our new root URL is https://production.rutterapi.com/versioned and ends with /versioned. If you are not using this, you are likely still using our legacy root URL: https://production.rutterapi.com. The legacy root URL doesn't support the X-Rutter-Version header, as it only supports our first API version: is identical to version 2023-02-07. Note that switching to the new root URL with a version of 2023-02-07 from the legacy root URL should be completely safe.
When you are ready to upgrade API versions, you can begin by:
- Checking the changelog below for the breaking changes introduced by the new version.
- Handle the changes in request and response bodies and update the
X-Rutter-Versionrequest header.
If you are subscribed to Rutter webhooks, you can upgrade the version of your webhook payloads by
- Checking the changelog below for the breaking changes introduced by the new version.
- Update your webhook code to handle both the old and new version of each object.
- In the Rutter Dashboard, update the version of your webhook payloads sent to your Webhook URL.
We recommend that you test your webhook code first by deploying a separate test handler and registering that to subscribe to the new version of webhooks in the Rutter Dashboard.
Breaking Changes: unstable
This is the version of Rutter's API that ships a set of breaking changes on top of our latest stable API. It is not recommended for general use until we release a new stable version. Think of it as an experimental version that you can use to test new features and provide feedback.
/accounting/sales_orders
Response object for: GET /accounting/sales_orders, GET /accounting/sales_orders/:id, POST /accounting/sales_orders, and PATCH /accounting/sales_orders/:id
line_items[].item.idis now nullable. Its value will not benullexcept in the unusual case when the item could not be synced. (In previous versions it was an empty string in similar circumstances.)
/accounting/invoices
Response object for: GET /accounting/invoices, GET /accounting/invoices/:id, POST /accounting/invoices, and PATCH /accounting/invoices/:id
linked_payments[].idis now nullable. Its value will not benullexcept in the unusual case when the payment could not be synced. (In previous versions it was an empty string in similar circumstances.)linked_payments[].allocated_dateis now nullable. Its value will not benullexcept in the unusual case when the allocated date could not be synced. (In previous versions it was an empty string in similar circumstances.)
/accounting/invoice_credit_memos
Response object for: GET /accounting/invoice_credit_memos, GET /accounting/invoice_credit_memos/:id, POST /accounting/invoice_credit_memos, and PATCH /accounting/invoice_credit_memos/:id
- The
issue_datefield now returns a string inYYYY-MM-DDformat. - The
allocated_atfield has been renamed toallocated_dateand now uses theYYYY-MM-DDformat. - The
remaining_amount,total_amount, andline_items[].tax_amountfields now return numbers instead of strings. line_items[].amounthas been renamed toline_items[].total_amountand now returns a number instead of a string.- The
statusenum is now all lowercase. - The
linked_invoices[].allocated_dateis no longer optional and is now nullable. - The
line_items[].item_idfield has been removed in favor ofline_items[].item.id. - The
line_items[].quantityfield has been removed in favor ofline_items[].item.quantity. - The
line_items[].unit_amountfield has been removed in favor ofline_items[].item.unit_amount. - The
line_items[].id,line_items[].discount_amount,line_items[].discount_percentage,line_items[].sub_total,line_items[].additional_fields.rev_rec_start_date, andline_items[].additional_fields.rev_rec_end_datefields have been removed.
Breaking Changes: 2024-08-31
This API version is our most-recent and stable API version.
In this version, we respond with a HTTP 400 Bad Request error for any requests that contain unknown query parameters or request body fields. This is to help you catch mistakes in API calls as early as possible.
Note that changes in response objects affect the responses of GET, POST, and PATCH endpoints.
/accounting/accounts
Response object for: GET /accounting/accounts, GET /accounting/accounts/:id, POST /accounting/accounts, and PATCH /accounting/accounts/:id
updated_atis now nullable.
/accounting/invoices
Response object for: GET /accounting/invoices, GET /accounting/invoices/:id, POST /accounting/invoices, and PATCH /accounting/invoices/:id
issue_dateis now nullable.
/accounting/invoice_payments
Response object for: GET /accounting/invoice_payments, GET /accounting/invoice_payments/:id, POST /accounting/invoice_payments, and PATCH /accounting/invoice_payments/:id
- The
additional_fields.reference_numberfield has been removed in favor of the top-levelreferencefield.
Request object for: POST /accounting/invoice_payments
- The
additional_fields.reference_numberfield has been removed in favor of the top-levelreferencefield.
/accounting/customers
Response object for: GET /accounting/customers, GET /accounting/customers/:id, POST /accounting/customers, and PATCH /accounting/customers/:id
- The
statusenum is now all lower case andINACTIVEhas been mapped toarchived.
Breaking Changes: 2024-04-30
Note that changes in response objects affect the responses of GET, POST, and PATCH endpoints.
/accounting/company_info
Response object for: GET /accounting/company_info
created_atis now nullable.updated_atis now nullable.
/accounting/customers
Response object for: GET /accounting/customers, GET /accounting/customers/:id, POST /accounting/customers, and PATCH /accounting/customers/:id
updated_atis now nullable.
/accounting/invoices
Response object for: GET /accounting/invoices, GET /accounting/invoices/:id, POST /accounting/invoices, and PATCH /accounting/invoices/:id
account_idis now nullable.total_discounthas been renamed todiscount_amountand is now a number instead of a string.- The following fields are now numbers instead of strings:
amount_due,sub_total,tax_amount, andtotal_amount. currency_codeis now an enum.- The following fields on
line_itemshave been removed:item_id,quantity, andunit_amount. - An
itemfield has been added toline_itemswhich containsid(previouslyitem_id),quantity, andunit_amount. - The
idfield online_itemshas been removed as it contained the same value asplatform_id. Going forward, please use the value ofplatform_idinstead ofid. amountonline_itemshas been changed tototal_amountand is now a number instead of a string.- The following fields on
line_itemsare now numbers instead of strings:discount_amount,discount_percentage,sub_total, andtax_amount. amountonlinked_paymentshas been changed toallocated_amountand is now a number instead of a string.dateonlinked_paymentshas been changed toallocated_date.
/accounting/vendors
Response object for: GET /accounting/vendors, GET /accounting/vendors/:id, POST /accounting/vendors, and PATCH /accounting/vendors/:id
- The
currency_codefield has been renamed tocurrency_codesand returns an array instead of a single value.
Breaking Changes: 2023-03-14
Note that changes in response objects affect the responses of GET, POST, and PATCH endpoints.
/accounting/company_info
Response object for: GET /accounting/company_info
- The
legal_namefield is now nullable. - The
base_currency_codefield has been renamed tocurrency_codeand is now required. - The
createdAtfield has been renamed tocreated_atand is now nullable. - The
updatedAtfield has been renamed toupdated_atand is now nullable.
/accounting/accounts
Response object for: GET /accounting/accounts, GET /accounting/accounts/:id, and POST /accounting/accounts
- The
current_balancefield has been renamed tobalance. - The
updated_atfield is now nullable.
Request object for: POST /accounting/accounts
- The
currency_codefield is now required.
/accounting/vendors
Response object for: GET /accounting/vendors, GET /accounting/vendors/:id, and POST /accounting/vendors
- The
platform_idfield is now required. - The
currencyfield has been renamed tocurrency_code. - The
statusfield is now required. - The
created_atfield is now nullable. - The
updated_atfield is now nullable.
Request object for: POST /accounting/vendors
- The
currencyfield has been renamed tocurrency_code.
/accounting/journal_entries
Response object for: GET /accounting/journal_entries, GET /accounting/journal_entries/:id, and POST /accounting/journal_entries
- The following fields have been removed:
currency_rateline_items.platform_idline_items.tax_amountline_items.account_refin favor of theaccount_idfield
- The
currencyfield has been renamed tocurrency_code. - The
line_items.amountfield has been renamed toline_items.total_amount. - The
issue_datefield has been renamed totransaction_date.
Request object for: POST /accounting/journal_entries
- The
currency_codefield is now required. - The
created_atfield has been renamed totransaction_date. - The
line_items.amountfield has been renamed toline_items.total_amount.
/accounting/bills
Response object for: GET /accounting/bills, GET /accounting/bills/:id, and POST /accounting/bills
- The following fields are now nullable:
account_iddue_datecreated_atupdated_at
- The
purchase_ordersfield has been renamed tolinked_purchase_orders. - The
currencyfield has been renamed tocurrency_code. - The
line_items.idfield has been removed. - The following fields have been removed in favor of the new
line_items.itemfield:line_items.item_idline_items.unit_amountline_items.quantity
- The following fields have their types changed:
total_discountis now anumber.sub_totalis now anumber.tax_amountis now anumber.total_amountis now anumber.amount_dueis now anumber.line_items.discount_amountis now anumber.line_items.sub_totalis now anumber.line_items.tax_amountis now anumber.line_items.total_amountis now anumber.line_items.discount_percentageis now anumber.
- The
paymentsfield has been removed in favor of two new fields:- The
linked_paymentsfield contains a list of bill payments - The
linked_credit_memosfield contains a list of applied bill credits
- The
Request object for: POST /accounting/bills
- The
currencyfield has been renamed tocurrency_code. - The
line_items.amountfield has been renamed toline_items.total_amount. - The
issue_datefield is now required.
/accounting/bill_payments
Response object for: GET /accounting/bill_payments, GET /accounting/bill_payments/:id, and POST /accounting/bill_payments
- The
currencyfield has been renamed tocurrency_code. - The
total_amountfield is now anumber. - The
txn_datefield has been renamed totransaction_date. - The
line_itemsfield has been removed in favor of the newlinked_billsfield. Thelinked_billsfield contains only bills tied to the payment and unlikeline_items, does not contain any rows related to credit memos or journal entries.
Request object for: POST /accounting/bill_payments
- The
currencyfield has been renamed tocurrency_code. - The
currency_ratefield has been removed. - The
line_itemsfield has been removed in favor of the newlinked_billsfield.
/accounting/bill_credit_memos
Response object for: GET /accounting/bill_credit_memos, GET /accounting/bill_credit_memos/:id, and POST /accounting/bill_credit_memos
- The
document_numberfield is now nullable. - The following fields have their types changed:
total_discountis now anumber.remaining_amountis now anumber.linked_bills.allocated_amountis now anumber.
- The following fields are now nullable:
linked_bills.idcreated_atupdated_at
Request object for: POST /accounting/bill_credit_memos
- The
line_items.amountfield has been renamed toline_items.total_amount.
/accounting/purchase_orders
Response object for: GET /accounting/purchase_orders, GET /accounting/purchase_orders/:id
- The following fields have been removed:
vendor_nameposted_dateline_items.platform_idline_items.item_nameline_items.quantity_billline_items.quantity_receivedline_items.amount_receivedline_items.amount_billed
- The following fields have been removed in favor of the new
line_items.itemfield:line_items.item_idline_items.unit_amountline_items.quantity
- The
line_items.amountfield has been renamed toline_items.total_amountand is now anumber. - The
total_quantityfield is now anumber. - The
total_amountfield is now anumber. - The
statusfield is now an enum with the following values:openclosedunknown
/accounting/expenses
Request object for GET /accounting/expenses
- The endpoint now also returns expense refunds if the
expense_typequery parameter is set torefund. The default behavior is to return expenses only.
Response object for: GET /accounting/expenses, GET /accounting/expenses/:id
- The
account_idfield is now nullable. - The
expense_datefield has been renamed totransaction_date. - The
line_items.amountfield has been renamed toline_items.total_amountand is now anumber.
Request object for: POST /accounting/expenses
- The
expense_datefield has been renamed totransaction_date. - The new
expense_typefield is required and can be one ofexpenseorrefund. - The
line_items.amountfield has been renamed toline_items.total_amount.
/accounting/expenses/refunds
This endpoint has been removed in favor of the /accounting/expenses endpoint. To create a new expense refund, use the POST /accounting/expenses endpoint and set the expense_type field to refund.