Overview
Supported resources
Connect setup
FreshBooks uses OAuth 2.0. You need an app registered in the FreshBooks Developer Portal.1
Create a FreshBooks app
Sign in at my.freshbooks.com/#/developer and click Create an App. Copy the Client ID and Client Secret.
2
Add the redirect URL
In your app’s Redirect URIs list, add:
3
Configure required scopes
Enable the following scopes on your app:
user:profile:readuser:account:readuser:account:writeuser:clients:readuser:clients:writeuser:invoices:readuser:invoices:writeuser:payments:readuser:payments:writeuser:expenses:readuser:expenses:writeuser:taxes:readuser:taxes:writeuser:billable_items:readuser:billable_items:writeuser:credit_notes:readuser:credit_notes:writeuser:bills:readuser:bills:writeuser:bill_vendors:readuser:bill_vendors:writeuser:bill_payments:readuser:bill_payments:writeuser:journal_entries:readuser:journal_entries:writeuser:projects:readuser:projects:writeuser:teams:readuser:reports:readuser:estimates:read
4
Connect via the widget
When your end user opens the Connect widget, they will enter the Client ID and Client Secret, then be redirected to FreshBooks to authorize the connection.
Usage
Notes
- Pass
type: "ACCOUNTS_PAYABLE"oninvoiceandpaymentcreate to dispatch to FreshBooks’s/bills/billsand/bill_payments/bill_paymentsendpoints. For vendor contacts, setis_supplier: true. AR / AP routing is encoded in the URN (urn:freshbooks:invoice:ar:<id>vsurn:freshbooks:invoice:ap:<id>). - Canonical
DELETEtranslates to a soft delete (PUTwithvis_state: 1) on most resources.projectis the exception — it uses a true hardDELETE. - Pass canonical
status: "SUBMITTED"oninvoicecreate to land it as Sent (the adapter chains anaction_mark_as_sentPUT after the initial POST). Omitstatusto leave it as Draft. addressandphone_numberids are discoverable inline oncontact.addresses[].idandcontact.phone_numbers[].id. Listing them at the top level returns 405 — read them inline from the parent or useGET /address/{urn}.