Skip to main content

FreeAgent

FreeAgent is a cloud-based accounting and bookkeeping platform designed for freelancers, contractors, and small businesses. It provides tools for managing invoices, expenses, bank transactions, payroll, tax filing, and financial reporting—all in one place. FreeAgent is Making Tax Digital (MTD) compliant and integrates directly with HMRC for VAT and Self Assessment submissions. Its REST API enables programmatic access to all core accounting data, including contacts, invoices, bills, expenses, timeslips, projects, and bank transactions, making it straightforward to build integrations that keep financial data synchronized across business systems.

FreeAgent icon

Power end-to-end data operations for your FreeAgent API with Nexla. Our bi-directional FreeAgent connector is purpose-built for FreeAgent, making it simple to ingest data, sync it across systems, and deliver it anywhere — all with no coding required. Nexla turns API-sourced data into ready-to-use, reusable data products and makes it easy to send data to FreeAgent or any other destination. With comprehensive monitoring, lineage tracking, and access controls, Nexla keeps your FreeAgent workflows fast, secure, and fully governed.

Features

Type: API

SourceDestination

  • Seamless API Integration: Connect to any endpoint as source or destination without coding, with automatic data product creation
  • Visual Composition & Chaining: Build complex integrations using visual templates, chain API calls, and compose workflows with data validation and filtering
  • API Proxy: Expose curated slices of your data securely with a secure and customizable API proxy that validates and transforms data on the fly
  • Request optimization with intelligent batching, retry, and caching to minimize API calls and costs

Prerequisites

FreeAgent uses OAuth 2.0 to authenticate API access. Before creating a FreeAgent credential in Nexla, you must register an application in the FreeAgent Developer Dashboard to obtain an OAuth Client ID and Client Secret.

Register an Application in the FreeAgent Developer Dashboard

  1. Sign in to the FreeAgent Developer Dashboard using your FreeAgent account credentials. If you do not yet have a developer account, create one at the same URL.

  2. Click Create App (or New App) to register a new application.

  3. Enter a descriptive name for the application in the App Name field (for example, "Nexla Integration").

  4. In the Redirect URI field, enter the OAuth callback URL provided by Nexla. This URI must exactly match a redirect URI registered in your Developer Dashboard account; mismatches will cause the authorization flow to fail.

  5. Select the Access Level appropriate for your integration. FreeAgent uses a numeric access level system (0–8) that controls which resources your app can read or write. Choose the minimum level that covers your required data — for example, read access to invoices, contacts, bank transactions, and expenses. Requesting a higher level than necessary may slow down app approval.

  6. Click Save (or Create App) to register the application.

  7. After registration, your OAuth Identifier (Client ID) and OAuth Secret (Client Secret) are displayed on the application detail page. Copy both values and store them securely — the Client Secret cannot be retrieved again after you navigate away from this page.

FreeAgent provides a sandbox environment for testing integrations without affecting live data. To test your Nexla integration before connecting to production data, sign up for a free sandbox account at https://sandbox.freeagent.com and use the sandbox API base URL (https://api.sandbox.freeagent.com/v2) during testing. For complete OAuth documentation, see the FreeAgent OAuth guide.

Authenticate

Create a credential in Nexla

  1. After selecting the data source/destination type, click the Add Credential tile to open the Add New Credential overlay.

  2. Enter a name for the credential in the Credential Name field and a short, meaningful description in the Credential Description field.

  3. Enter your FreeAgent OAuth Identifier (Client ID) in the OAuth Identifier field. This is the unique identifier for the application you registered in the FreeAgent Developer Dashboard.

  4. Enter your FreeAgent OAuth Secret (Client Secret) in the OAuth Secret field. This secret is used in combination with the Client ID to authenticate your application during the token exchange.

    Important

    Your OAuth Secret is sensitive. Treat it like a password — never share it publicly or commit it to version control. If the secret is compromised, regenerate it immediately in the FreeAgent Developer Dashboard.

  5. Click the Authorize button (or equivalent OAuth connect button) to initiate the OAuth 2.0 authorization flow. You will be redirected to FreeAgent to sign in and grant the requested permissions to the registered application.

  6. After granting access, FreeAgent will redirect you back to Nexla with an authorization code. Nexla automatically exchanges this code for an access token and refresh token.

    FreeAgent access tokens are valid for one hour. Nexla automatically uses the refresh token to obtain a new access token when needed, so re-authorization is not required for ongoing integrations. Refresh tokens are long-lived (approximately 20 years), ensuring persistent access without repeated user authorization.

  7. Click the Save button at the bottom of the overlay. The newly added credential will now appear in a tile on the Authenticate screen during data source/destination creation.

Use as a data source

To create a new data flow, navigate to the Integrate section, and click the New Data Flow button. Select the FreeAgent connector tile, then select the credential that will be used to connect to the FreeAgent instance, and click Next; or, create a new FreeAgent credential for use in this flow.

Endpoint templates

Nexla provides pre-built templates that can be used to rapidly configure data sources to ingest data from common FreeAgent endpoints. Select the endpoint from which this source will fetch data from the Endpoint pulldown menu. Available endpoint templates are listed in the expandable boxes below. Click on an endpoint to see more information about it and how to configure your data source for this endpoint.

List Users

Returns a list of all users in the FreeAgent account. Use this endpoint to retrieve user profiles, roles, and contact details for everyone who has access to the account.

  • Sends a GET request to /users; returns user records as an array at $.users[*].
  • Each record includes the user's name, email, role, and account permissions.

This endpoint requires an OAuth access token with appropriate scope for the FreeAgent account. Only users with admin-level access can view all account users.

Get Balance Sheet

Returns the balance sheet accounting report for the FreeAgent account. Use this endpoint to retrieve a point-in-time snapshot of assets, liabilities, and equity.

  • Sends a GET request to /accounting/balance_sheet; returns the full balance sheet object at $.
  • The response is a single JSON object containing categorized account balances rather than an array of records.

The balance sheet reflects the state of the account at the time the request is made. For historical balance sheet data, use FreeAgent's date query parameters if supported for your account type.

List Bank Accounts

Returns a list of all bank accounts connected to the FreeAgent account. Use this endpoint to retrieve bank account details including account names, types, and balances.

  • Sends a GET request to /bank_accounts; returns bank account records as an array at $.bank_accounts[*].
  • Each record includes the account name, currency, opening balance, and current balance.

Bank accounts returned include both manually managed accounts and accounts connected via Open Banking. Use the bank account URL from each record as a reference when fetching bank transactions for a specific account.

List Bank Transactions

Returns a list of all bank transactions in the FreeAgent account. Use this endpoint to retrieve transaction history across all connected bank accounts.

  • Sends a GET request to /bank_transactions; returns transaction records as an array at $.bank_transactions[*].
  • Each record includes the transaction date, amount, description, and reconciliation status.

FreeAgent paginates bank transaction results — by default 25 records are returned per page. Use the page and per_page query parameters to retrieve additional pages. Use date range parameters (from_date, to_date) combined with Nexla date/time macros for incremental ingestion.

List Bills

Returns a list of all bills (supplier invoices) in the FreeAgent account. Use this endpoint to track outstanding and paid supplier bills.

  • Sends a GET request to /bills; returns bill records as an array at $.bills[*].
  • Each record includes the bill reference, supplier contact, due date, total amount, and payment status.

Bills are the FreeAgent term for supplier invoices / purchase invoices. Use filter parameters such as view to narrow results to unpaid, overdue, or recently updated bills.

List Contacts

Returns a list of all contacts in the FreeAgent account. Use this endpoint to retrieve customer and supplier records including names, addresses, and contact details.

  • Sends a GET request to /contacts; returns contact records as an array at $.contacts[*].
  • Each record includes the contact name, email, phone, billing address, and contact type (customer or supplier).

FreeAgent supports filtering contacts by type using the view query parameter (e.g., ?view=clients or ?view=suppliers). Results are paginated — use page and per_page parameters for large contact lists.

List Credit Note Reconciliations

Returns a list of credit note reconciliations in the FreeAgent account. Use this endpoint to track how credit notes have been applied against invoices or other transactions.

  • Sends a GET request to /credit_note_reconciliations; returns reconciliation records as an array at $.credit_note_reconciliations[*].
  • Each record includes the credit note reference, the invoice it was applied to, and the reconciled amount.

This endpoint is useful for reconciliation reporting and auditing credit note applications across your accounts receivable ledger.

List Credit Notes

Returns a list of all credit notes in the FreeAgent account. Use this endpoint to retrieve credit note records issued to customers.

  • Sends a GET request to /credit_notes; returns credit note records as an array at $.credit_notes[*].
  • Each record includes the credit note reference, associated contact, issue date, total amount, and status.

Credit notes can be filtered by status and date range using FreeAgent's query parameters. Results are paginated — use page and per_page to retrieve additional pages.

List Estimates

Returns a list of all estimates (quotes) created in the FreeAgent account. Use this endpoint to track the status of outstanding estimates and their conversion to invoices.

  • Sends a GET request to /estimates; returns estimate records as an array at $.estimates[*].
  • Each record includes the estimate reference, associated contact, issue date, expiry date, total amount, and status.

Estimates can be filtered by status (e.g., draft, sent, accepted) using the view query parameter. Results are paginated.

List Expenses

Returns a list of all expenses recorded in the FreeAgent account. Use this endpoint to retrieve employee expense claims including amounts, categories, and reimbursement status.

  • Sends a GET request to /expenses; returns expense records as an array at $.expenses[*].
  • Each record includes the expense date, category, amount, currency, associated user, and reimbursement status.

Expenses can be filtered by date range using the from_date and to_date query parameters — combine these with Nexla date/time macros for incremental ingestion of newly submitted expenses.

List Invoices

Returns a list of all invoices in the FreeAgent account. Use this endpoint to retrieve sales invoice records including amounts, due dates, and payment status.

  • Sends a GET request to /invoices; returns invoice records as an array at $.invoices[*].
  • Each record includes the invoice reference, associated contact, issue date, due date, total amount, and payment status.

Invoices support filtering by status, date range, and contact using query parameters such as view, from_date, to_date, and contact. Results are paginated — the default is 25 per page, with a maximum of 100.

Get Company

Returns details about the company associated with the FreeAgent account. Use this endpoint to retrieve company profile information such as name, registration number, address, and VAT details.

  • Sends a GET request to /company; returns the company object at $.company.
  • The response is a single company object — not an array — containing all company profile fields.

The company record is a singleton — there is only one company per FreeAgent account. This endpoint is useful for enriching other FreeAgent data with the account owner's company details.

Get Profit & Loss Summary

Returns a profit and loss summary report for the company in FreeAgent. Use this endpoint to retrieve income, expenses, and net profit figures for reporting and financial analysis.

  • Sends a GET request to /accounting/profit_and_loss/summary; returns the profit and loss summary object at $.profit_and_loss.
  • The response is a single object containing categorized income and expense totals — not an array of records.

Use the from_date and to_date query parameters to retrieve the profit and loss summary for a specific period. FreeAgent expects dates in YYYY-MM-DD format — combine with Nexla date/time macros for rolling period reports.

List Projects

Returns a list of projects in the FreeAgent account. Use this endpoint to retrieve project details including budgets, timelines, and associated contacts.

  • Sends a GET request to /projects; returns project records as an array at $.projects[*].
  • Each record includes the project name, associated contact, status, budget, and timeline dates.

Projects can be filtered by status (active, completed, or cancelled) using the view query parameter. Project URLs returned in the response can be used to fetch related tasks or timeslips.

List Tasks

Returns a list of tasks in the FreeAgent account. Use this endpoint to retrieve task definitions including billing rates and associated projects.

  • Sends a GET request to /tasks; returns task records as an array at $.tasks[*].
  • Each record includes the task name, associated project, billing type, and hourly rate.

Tasks are linked to projects in FreeAgent and are used to categorize timeslips. Use the project URL as a filter parameter to retrieve tasks for a specific project.

List Timeslips

Returns a list of all timeslips (time entries) in the FreeAgent account. Use this endpoint to retrieve time tracking data for billing, payroll, and project management purposes.

  • Sends a GET request to /timeslips; returns timeslip records as an array at $.timeslips[*].
  • Each record includes the date, user, task, project, duration in hours, and billing status.

Timeslips support filtering by date range (from_date, to_date), user, task, and project. Use Nexla date/time macros with from_date/to_date to perform incremental ingestion of newly logged time entries. Results are paginated.

Once the selected endpoint template has been configured, click the Test button to the right of the endpoint selection menu to retrieve a sample of the data that will be fetched. Sample data will be displayed in the Endpoint Test Result panel on the right, allowing you to verify that the source is configured correctly before saving.

Manual configuration

FreeAgent data sources can also be manually configured to ingest data from any valid FreeAgent API endpoint, including endpoints not covered by the pre-built templates, chained API calls, or custom request parameters. Select the Advanced tab at the top of the configuration screen, and follow the instructions in Connect to Any API to configure the API method, endpoint URL, date/time and lookup macros, path to data, metadata, and request headers.

The FreeAgent API base URL for production is https://api.freeagent.com/v2; for sandbox testing, use https://api.sandbox.freeagent.com/v2. Results are paginated — by default 25 items are returned per page, controllable via the page and per_page query parameters (maximum 100). Combine Nexla date/time macros with the from_date/to_date query parameters (format YYYY-MM-DD) for incremental ingestion of endpoints such as invoices, expenses, bank transactions, and timeslips.

FreeAgent list responses wrap the resource array in a named JSON object — for example, $.invoices[*] for the invoices endpoint, $.contacts[*] for contacts, $.bank_transactions[*] for bank transactions, $.expenses[*] for expenses, and $.timeslips[*] for timeslips. You do not need to include the OAuth Authorization header — Nexla automatically includes the access token from your FreeAgent credential. The FreeAgent API accepts responses in both JSON and XML formats; Nexla defaults to JSON unless a specific Accept header is provided.

Once all of the relevant settings have been configured, click the Create button in the upper right corner of the screen to save and create the new FreeAgent data source. Nexla will now begin ingesting data from the configured endpoint and will organize any data that it finds into one or more Nexsets.

Use as a destination

Click the + icon on the Nexset that will be sent to the FreeAgent destination, and select the Send to Destination option from the menu. Select the FreeAgent connector from the list of available destination connectors, then select the credential that will be used to connect to the FreeAgent organization, and click Next; or, create a new FreeAgent credential for use in this flow.

Endpoint templates

Nexla provides pre-built templates that can be used to rapidly configure destinations to send data to common FreeAgent endpoints. Select the endpoint to which data will be sent from the Endpoint pulldown menu. Then, click on the template in the list below to expand it, and follow the instructions to configure additional endpoint settings.

Create Invoice

Creates a new invoice in FreeAgent. Use this endpoint to programmatically generate sales invoices from Nexset data.

  • Sends a POST request to the FreeAgent invoices endpoint; the request body must include required fields such as the contact URL, invoice items, and currency.
  • The FreeAgent API returns the newly created invoice object — including the system-assigned invoice URL and reference — in the response body. Enable the Response Webhook to capture these values for downstream flows.

FreeAgent invoice creation requires a valid contact URL (e.g., https://api.freeagent.com/v2/contacts/12345) as the contact reference. Ensure the contact exists in FreeAgent before creating invoices.

Update Invoice

Updates an existing invoice in FreeAgent identified by its ID. Use this endpoint to modify invoice details such as line items, due dates, or reference numbers.

  • Sends a PUT request to the FreeAgent invoice endpoint for the specified invoice; the invoice ID must be provided.
  • Only the fields included in the request body are updated — fields not included retain their existing values.

Configure the following parameter: Id — the FreeAgent invoice ID or URL for the invoice to be updated. Invoices in a locked accounting period cannot be modified.

Take Payment using GoCardless Direct Debit Mandate

Processes a payment for a FreeAgent invoice using a GoCardless Direct Debit mandate. Use this endpoint to trigger automated invoice payments via GoCardless from Nexla.

  • Sends a POST request to the FreeAgent GoCardless payment endpoint for the specified invoice.
  • The request initiates a direct debit collection via the GoCardless mandate associated with the invoice's contact.

Configure the following parameter: Id — the FreeAgent invoice ID for which payment should be collected. A valid GoCardless Direct Debit mandate must be in place for the invoice's contact before using this endpoint.

Create / Import a Bank Transaction

Creates or imports a bank transaction into a FreeAgent bank account. Use this endpoint to push transaction data from external sources into FreeAgent for reconciliation.

  • Sends a POST request to the FreeAgent bank transactions endpoint; the request body must include the bank account URL, transaction date, amount, and description.
  • Returns the created bank transaction object in the response — enable the Response Webhook to capture the new transaction URL for downstream reconciliation flows.

Imported transactions initially appear as unreconciled in FreeAgent. Use the Explain (reconcile) bank transaction endpoint or manual reconciliation in FreeAgent to match transactions against invoices, bills, or expenses.

Create a Supplier Bill / Purchase Invoice

Creates a supplier bill (purchase invoice) in FreeAgent. Use this endpoint to record supplier invoices from procurement or accounts payable systems into FreeAgent.

  • Sends a POST request to the FreeAgent bills endpoint; required fields include the contact URL, bill reference, dated on, due on, and at least one line item with a category and total value.
  • Returns the newly created bill object in the response, including the system-assigned bill URL.

Bills require a valid supplier contact URL. Ensure the supplier exists in FreeAgent as a contact before creating bills. Line items must include a valid FreeAgent category URL for proper ledger posting.

Create an Expense Claim

Creates an expense claim in FreeAgent. Use this endpoint to submit employee expense claims from expense management systems into FreeAgent for reimbursement processing.

  • Sends a POST request to the FreeAgent expenses endpoint; required fields include the user URL, category, dated on, total value, and currency.
  • Returns the newly created expense object in the response, including the system-assigned expense URL.

Expense claims are associated with a specific FreeAgent user. Ensure the target user URL is available in your Nexset data or use a lookup macro to reference the correct user.

Explain (Reconcile) a Bank Transaction Against an Invoice, Bill, or Expense

Reconciles (explains) a FreeAgent bank transaction against an invoice, bill, or expense. Use this endpoint to automate the matching of bank transactions to FreeAgent accounting documents.

  • Sends a POST request to the FreeAgent bank transaction explanation endpoint; the request body must reference both the bank transaction URL and the document (invoice, bill, or expense) URL to reconcile against.
  • Successfully explained transactions are marked as reconciled in FreeAgent and removed from the unreconciled transaction queue.

Both the bank transaction URL and the document URL must reference existing FreeAgent records. This endpoint is commonly used in conjunction with the List Bank Transactions source endpoint and a matching/lookup step in Nexla.

Create a New Contact (Customer or Supplier)

Creates a new contact (customer or supplier) in FreeAgent. Use this endpoint to synchronize contact records from CRM systems, e-commerce platforms, or other data sources into FreeAgent.

  • Sends a POST request to the FreeAgent contacts endpoint; required fields include the contact's first and last name (or organisation name) and at least one contact method.
  • Returns the newly created contact object in the response, including the system-assigned contact URL needed for referencing this contact in invoices, bills, and other records.

Enable the Response Webhook to capture the new contact URL from the response — this URL is required when creating invoices or bills for the contact in subsequent flow steps.

Create an Estimate / Quote

Creates an estimate (quote) in FreeAgent. Use this endpoint to generate customer-facing quotes from proposal or quoting system data.

  • Sends a POST request to the FreeAgent estimates endpoint; required fields include the contact URL, dated on, and at least one line item with a description and price.
  • Returns the newly created estimate object in the response, including the system-assigned estimate URL and reference number.

Estimates can be converted to invoices within FreeAgent once accepted. Use the Response Webhook to capture the estimate URL for downstream status tracking.

Create a Project

Creates a project in FreeAgent. Use this endpoint to push project records from project management tools into FreeAgent for time and billing tracking.

  • Sends a POST request to the FreeAgent projects endpoint; required fields include the project name and associated contact URL.
  • Returns the newly created project object in the response, including the system-assigned project URL used for associating tasks and timeslips.

Enable the Response Webhook to capture the new project URL — this is required when creating tasks or timeslips associated with the project in downstream flow steps.

Log a Timeslip (Time Entry) Against a Task/Project

Logs a timeslip (time entry) against a task or project in FreeAgent. Use this endpoint to sync time tracking data from external time management tools into FreeAgent for billing and reporting.

  • Sends a POST request to the FreeAgent timeslips endpoint; required fields include the user URL, task URL, dated on, and hours worked.
  • Returns the newly created timeslip object in the response.

Timeslips require valid URLs for both the associated user and task. Ensure both the user and task records exist in FreeAgent before creating timeslips. The timeslip date must be in YYYY-MM-DD format.

Update an Existing Contact

Updates an existing contact in FreeAgent. Use this endpoint to keep FreeAgent contact records in sync with changes from CRM or other authoritative source systems.

  • Sends a PUT request to the FreeAgent contact endpoint for the specified contact; only the fields included in the request body are updated.
  • Returns the updated contact object in the response.

Configure the following parameter: Id — the FreeAgent contact ID or URL for the contact to be updated. Ensure the contact exists in FreeAgent before attempting an update.

Create a Manual Journal Entry

Creates a manual journal entry in FreeAgent. Use this endpoint to post adjusting entries, accruals, or other manual accounting adjustments directly from Nexla.

  • Sends a POST request to the FreeAgent journal entries endpoint; the request body must include the journal entry date and at least two balanced debit/credit line items referencing valid FreeAgent ledger account URLs.
  • Returns the newly created journal entry in the response.

Journal entries must balance — total debits must equal total credits. Each line item must reference a valid FreeAgent chart-of-accounts category URL. Manual journal entries are typically used for period-end adjustments and corrections.

Once the selected endpoint template has been configured, click the Test button at the top of the Sample Payload panel, and click on a listed sample payload to expand it. Make any needed modifications directly within the sample window, then click Send Test Data to send the test payload to the FreeAgent API and verify the destination is configured correctly before activating.

Manual configuration

FreeAgent destinations can also be manually configured to send data to any valid FreeAgent API endpoint. You can also configure Nexla to automatically send the response received from the FreeAgent API after each call to a new Nexla webhook data source. Select the Advanced tab at the top of the configuration screen, and follow the instructions in Connect to Any API to configure the API method, data format, endpoint URL, request headers, attribute exclusions, record batching, and response webhooks.

The FreeAgent API base URL for production is https://api.freeagent.com/v2. Select JSON as the content format — the FreeAgent API accepts JSON request bodies for write operations. Use POST to create new resources (e.g., https://api.freeagent.com/v2/contacts), PUT to fully replace an existing resource, and include the resource ID at the end of the URL for update/upsert operations (e.g., https://api.freeagent.com/v2/contacts/{id}). You do not need to include the OAuth Authorization header — this is handled automatically by Nexla using the FreeAgent credential.

Most FreeAgent write endpoints operate on individual resources, so sending one record per call (the default) is recommended over batching. Enable the Response Webhook to capture the FreeAgent API response after each call — for example, the system-assigned resource URL and ID returned after creating an invoice, contact, or project — for use in downstream flow steps.

Save & activate

Once all endpoint settings have been configured, click the Done button in the upper right corner of the screen to save and create the destination. To send the data to the configured FreeAgent endpoint, open the destination resource menu, and select Activate.

The Nexset data will not be sent to FreeAgent until the destination is activated. Destinations can be activated immediately or at a later time, providing full control over data movement.