Expensify
API actions for the Expensify integration.
Expensify
Automate expense reporting, policy management, and card reconciliation with the Expensify Integration Server API.
Create expense rule
Create an expense rule for an employee on a policy. Use policy IDs from list_policies (policies[].id).
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
policy_id | string | Yes | The policy ID. Obtainable from list_policies (policies[].id) or create_policy (policyID). |
employee_email | string | Yes | Email of the employee to create the rule for. |
tag | string | No | Tag to auto-apply to matching expenses. |
default_billable | boolean | No | Whether matching expenses should default to billable. |
Response
{
"ruleID": 42
}Create standalone expenses
Create standalone expenses in a user's account. Requires advanced permissions from Expensify. Amounts are accepted in dollars and converted to cents for the API.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
employee_email | string | Yes | Email of the employee to create expenses for. Requires advanced permissions. |
transactions | array | Yes | JSON array of expense objects. Each: {created (YYYY-MM-DD), currency, merchant, amount (in dollars)}. Optional per expense: category, tag, comment, billable, reimbursable, reportID (from export_reports), policyID (from list_policies). |
Response
[
"T001",
"T002"
]Create Expensify policy
Create a new Expensify workspace/policy.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
policy_name | string | Yes | Name for the new workspace/policy. |
plan | string | No | Policy plan type: 'team' (default) or 'corporate'. |
Response
{
"policyID": "NEW123POLICY"
}Create expense report
Create an expense report with expenses in a user's account. Requires pre-approval from Expensify (contact concierge@expensify.com). Use policy IDs from list_policies (policies[].id) or create_policy (policyID). Amounts are accepted in dollars and converted to cents for the API.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
employee_email | string | Yes | Email of the employee to create the report for. Requires domain and policy admin. |
policy_id | string | Yes | Policy ID to create the report under. Obtainable from list_policies (policies[].id) or create_policy (policyID). |
report_title | string | Yes | Title for the expense report. |
expenses | array | Yes | JSON array of expense objects. Each: {date (YYYY-MM-DD), currency, merchant, amount (in dollars)}. |
report_fields | object | No | Optional custom report field values as a JSON object. Field names obtainable from get_policy with fields=['reportFields']. |
Response
{
"reportID": "R00newreport"
}Download exported file
Download a file previously generated by export_reports or reconcile_cards. The file_name is returned by those actions.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
file_name | string | Yes | The filename to download. Obtainable from export_reports or reconcile_cards results. |
file_system | string | No | File system to download from: 'integrationServer' (default, for report exports) or 'reconciliation' (for card reconciliation files). |
Response
"file-contents-here"Export expense reports
Export expense reports from Expensify with flexible filters. Returns structured report data with nested expenses. Amounts are in dollars (not cents).
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
start_date | string | No | Start date for the export range (YYYY-MM-DD). Required unless report_id_list is provided. |
end_date | string | No | End date for the export range (YYYY-MM-DD). Date range cannot exceed one year. |
report_id_list | string | No | Comma-separated report IDs to export. Required unless start_date is provided. Report IDs obtainable from a previous export_reports call. |
report_state | string | No | Filter by report state. Comma-separated values from: OPEN, SUBMITTED, APPROVED, REIMBURSED, ARCHIVED. |
policy_id | string | No | Filter by policy/workspace ID. Obtainable from list_policies (policies[].id) or create_policy (policyID). |
limit | string | No | Maximum number of reports to export. |
file_format | string | No | Output format: json (default), csv, xls, xlsx, txt, pdf, xml. |
custom_template | string | No | Optional Freemarker template string to override the default export format. See Expensify template docs for available fields. |
Response
[
{
"currency": "USD",
"expenses": [
{
"amount": 350.0,
"category": "Travel",
"date": "2024-03-15",
"merchant": "Delta Airlines",
"transactionID": "T001"
}
],
"policyName": "Default Policy",
"reportID": "R00abc123",
"reportName": "March Travel",
"status": "Approved",
"submitter": "user@example.com",
"total": 450.75
}
]Get policy details
Retrieve detailed information about specific policies including categories, tags, report fields, tax, and employees.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
policy_id_list | array | Yes | JSON array of policy IDs to retrieve. Obtainable from list_policies (policies[].id) or create_policy (policyID). |
fields | array | Yes | JSON array of fields to retrieve. Options: categories, reportFields, tags, tax, employees. |
user_email | string | No | Optional email to retrieve policies for another user (requires third-party access grant). |
Response
{
"ABC123DEF456": {
"categories": [
{
"enabled": true,
"name": "Travel"
},
{
"enabled": true,
"name": "Meals"
}
]
}
}List domain cards
List all credit cards assigned at the domain level.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | The domain name to list cards for (e.g., 'example.com'). |
Response
[
{
"name": "Corporate Amex",
"owner": "finance@example.com"
}
]List Expensify policies
List all policies (workspaces) the authenticated user has access to.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
admin_only | boolean | No | If true, only return policies where the user is an admin. |
Response
[
{
"id": "ABC123DEF456",
"name": "Engineering Team",
"role": "admin",
"type": "corporate"
}
]Reconcile card transactions
Export card transaction data for reconciliation. Requires domain admin access. Amounts are in dollars. Uses default reconciliation template unless custom_template is provided.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | The domain to reconcile cards for (e.g., 'example.com'). Must be domain admin. |
start_date | string | Yes | Start date (YYYY-MM-DD). |
end_date | string | Yes | End date (YYYY-MM-DD). |
reconciliation_type | string | No | Type of reconciliation: 'All' (default) or 'Unreported'. |
feed | string | No | Card feed name to filter by, or 'export_all_feeds'. Feed names obtainable from list_domain_cards. |
file_format | string | No | Output format: json (default), csv, txt, xml. |
custom_template | string | No | Optional Freemarker template string to override the default reconciliation format. |
Response
[
{
"cardName": "Corporate Amex",
"cardOwner": "user@example.com",
"currency": "USD",
"originalAmount": 1250.0,
"originalMerchant": "AWS"
}
]Update employees on policy
Provision or de-provision employees on a policy using the Advanced Employee Updater. Use policy IDs from list_policies (policies[].id) or create_policy (policyID). Supports dry_run to preview changes without applying them.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
employees | array | Yes | JSON array of employee objects. Required fields per employee: employeeEmail, managerEmail, employeeID, policyID. Optional: firstName, lastName, approvalLimit, overLimitApprover, isTerminated, role (user/auditor/admin). |
dry_run | boolean | No | If true, preview changes without applying them. |
Response
{
"added": 2,
"removed": 0,
"updated": 1
}Update expense rule
Update an existing expense rule. Rule IDs obtainable from create_expense_rules (ruleID).
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
policy_id | string | Yes | The policy ID. Obtainable from list_policies (policies[].id) or create_policy (policyID). |
employee_email | string | Yes | Email of the employee the rule applies to. |
rule_id | number | Yes | ID of the rule to update. Obtainable from create_expense_rules (ruleID). |
tag | string | No | Updated tag to auto-apply. |
default_billable | boolean | No | Updated billable default. |
Response
{
"status": "success"
}Update Expensify policy
Update categories, tags, and/or report fields on a policy. Policy ID obtainable from list_policies (policies[].id) or create_policy (policyID).
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
policy_id | string | Yes | The policy ID to update. Obtainable from list_policies (policies[].id) or create_policy (policyID). |
categories | object | No | Category update object with 'action' ('merge' or 'replace') and 'data' array. Each entry: {name, enabled, glCode, payrollCode, areCommentsRequired, commentHint, maxExpenseAmount}. Existing categories obtainable from get_policy with fields=['categories']. |
tags | object | No | Tag update object. Supports single-level and multi-level tags. Existing tags obtainable from get_policy with fields=['tags']. |
report_fields | object | No | Report fields update object with 'action' ('merge' or 'replace') and 'data' array. Each entry: {name, type (text/dropdown/date), values, defaultValue}. Existing fields obtainable from get_policy with fields=['reportFields']. |
Response
{
"status": "success"
}Mark reports as reimbursed
Mark reports as reimbursed. Only Approved reports will be updated; others are skipped. Report IDs obtainable from export_reports (reports[].reportID).
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
report_id_list | string | No | Comma-separated report IDs to mark as reimbursed. Required unless start_date is provided. Obtainable from export_reports (reports[].reportID). |
start_date | string | No | Start date filter (YYYY-MM-DD). Required unless report_id_list is provided. |
end_date | string | No | End date filter (YYYY-MM-DD). |
payment_source | string | No | Optional description of the payment source (1-100 characters). |
Response
{
"reportIDsUpdated": [
"R00abc123",
"R00def456"
]
}Update tag approvers
Set approvers for individual tags on a policy. Only supports single-level tag lists. Use policy IDs from list_policies (policies[].id).
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
policy_id | string | Yes | The policy ID. Obtainable from list_policies (policies[].id) or create_policy (policyID). |
tag_approvers | array | Yes | JSON array of objects with 'name' (tag name) and 'approver' (email). Set approver to empty string to clear. Tag names obtainable from get_policy with fields=['tags']. |
Response
{
"status": "success"
}