Support multi-project invoices via the public API (invoice[project_ids][])

Hi all,

I’d like to request that the public REST API be extended so a single invoice can pull timeslips from multiple projects, matching the behaviour already available in the FreeAgent web UI.

Use case:

I occasionally bill a single client across more than one project in a single monthly invoice. In the web UI this is straightforward: When creating an invoice for a contact, I can pick a primary project and add additional projects, and the resulting invoice includes timeslips from all of them, grouped by task.

When I create a multi-project invoice in the FreeAgent web UI, the browser submits a form to the in-app endpoint with this shape (relevant fields only):

 invoice[contact_id]=<contact-id>                                                                                                                                                                                           
 invoice[project_id]=<primary-project-id>                                                                                                                                                                                   
 invoice[project_ids][]=<additional-project-id>
 invoice[project_ids][]=<another-additional-project-id>                                                                                                                                                                     
 invoice[include_timeslips]=billed_grouped_by_timeslip_task              

So the underlying data model clearly already supports an invoice referencing multiple projects.

I would love to do the same thing programmatically, but I can’t find any support for this in the public API.

Would it be possible to support this? Clearly it would need to be backwards compatible so that single-project invoices are unaffected.

Happy to test any beta/preview if helpful.

Thanks!

Came here to post the same thing, but your post actually helped me solve it! so thank you!

I had the same use case and goal, and also was hitting exactly the same problem. The documented additional_projects field in the publicAPI is silently ignored, but your inspection of the web UI form pointed me in the right direction.

It turns out project_ids already works if you pass it directly in the JSON payload to the public API!

Here’s what worked for us:

{
  "invoice": {
    "contact": "https://api.freeagent.com/v2/contacts/123",
    "project": "https://api.freeagent.com/v2/projects/456",
    "project_ids": ["456", "789", "101"],
    "dated_on": "2026-03-31",
    "payment_terms_in_days": 30,
    "include_timeslips": "billed_grouped_by_timeslip",
    "include_expenses": "billed_grouped_by_expense",
    "include_estimates": "billed_grouped_by_estimate"
  }
}

A few things worth noting:

  • project_ids should include the primary project ID as well as the additional ones
  • The IDs are the numeric part at the end of the project URL, not the full URL
  • The project field (primary project URL) still needs to be present alongside project_ids
  • Timeslips are correctly marked as billed after the invoice is created

Hope that helps! and thank you again, crazy you posted this 2 hours ago, and we were working on the same thing haha

Hey @jc_scs, that’s great thinking on using project_ids, works a charm for me too. Thanks for the heads up!