Construct a POST request to https://integrations.expensify.com/Integration-Server/ExpensifyIntegrations with a requestJobDescription JSON string parameter (not body) containing type 'export', credentials (partnerUserID and partnerUserSecret), and an outputSettings block.
Set the outputSettings to specify the file format (e.g., CSV or JSON), the report filter (e.g., all approved reports, or a specific reportIDList), and template fields if using Freemarker template export.
For a file-based export, also include a fileName in outputSettings; the API will return a jobID rather than data directly.
Poll https://integrations.expensify.com/Integration-Server/ExpensifyIntegrations with a type 'download' request and the jobID to retrieve the exported file once the job completes.
Parse the downloaded content; for accounting exports, focus on report-level fields (total, status, submittedTo) and expense-level fields (amount, category, merchant, reimbursable).
Use the Expensify Freemarker template system to control exactly which fields and format are included in the export output.
Known gotchas
Expensify uses a form-parameter-encoded requestJobDescription field, not a JSON body; sending JSON as the request body (not as a form field) will result in errors.
Export jobs are asynchronous; the initial API call returns a jobID and the data is only available after polling confirms completion—do not assume data is immediately available.
partnerUserID and partnerUserSecret are account-level credentials, not per-user; all API calls from an integration share a single credential pair and are subject to rate limits.
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp