[Cotlet](https://cotlet.dev/index.md) · [Integrations](https://cotlet.dev/integrations.md) · [How it works](https://cotlet.dev/how-it-works.md) · [Use cases](https://cotlet.dev/use-cases.md) · [Security](https://cotlet.dev/security.md) · [For developers](https://cotlet.dev/for-developers.md) · [For automation agencies](https://cotlet.dev/for-agencies.md) · [Blog](https://cotlet.dev/blog.md) · [API docs](https://cotlet.dev/docs.md) · [Help center](https://cotlet.dev/help.md) · [Changelog](https://cotlet.dev/changelog.md) · [Contact](https://cotlet.dev/contact.md) · [Pricing](https://cotlet.dev/pricing.md) · [Sign up](https://cotlet.dev/signup)

# Approve Expensify expense reports by your own rule

> Approve small Expensify reports that have receipts and no holds, reject the ones missing a receipt and keep the rest for you. Runs daily.

Source: https://cotlet.dev/integrations/expensify-api-mcp-server/approve-expense-reports-by-rule

As an approver you open the same Needs approval list every morning, check the receipts one report at a time and click Approve on the ones that were never in doubt.

Cotlet does it in your own Expensify account with list\_reports, get\_report, approve\_report and reject\_report, called by your AI agent, an n8n workflow or a script.

[Sign up free](https://cotlet.dev/app/signup?app=expensify) [All Expensify tools](https://cotlet.dev/integrations/expensify-api-mcp-server.md)

Hosted · nothing to install or maintain

## Can Expensify do this on its own?

Expensify has no rule that approves a report by amount or receipt, and no API job to approve one (checked 14 Oct 2026). Its Integration Server report status updater only moves Approved reports to Reimbursed, and the official MCP server is read-only. Approval happens by hand in the app.

## How you do it in Expensify today

1. Go to Home > For you, or Spend > Expense reports > Needs approval, and click a report to open it.
2. Review the receipt, amount and description of each expense.
3. Click Approve at the top of the report; if some expenses are on hold, a dialog offers to approve only the non-held amount or the full amount.
4. To send a report back, open More, select Reject, enter a comment and click Reject report.
5. Most reports pass without a question, yet each one still needs opening, so a full week of them takes a sitting.

## How to approve Expensify expense reports by your own rule

Prompt

```
Look at reports waiting for my approval in Acme Studio. Approve those under USD 200 where every expense has a receipt and no hold. Reject any with a missing receipt and a reason. Leave the rest for me.
```

1. 01  
### Read the queue  
list\_reports returns the reports waiting for you in Acme Studio with total, submitter and a held flag. Anything outside your assigned approver role is not in the list, so the agent cannot touch it.
2. 02  
### Open each candidate  
get\_report returns the expenses with amount, merchant, receipt flag and hold state. The agent checks the rule on the real lines, not on the report total alone, so a USD 180 report with one missing receipt does not pass.
3. 03  
### Approve the clear ones  
approve\_report runs only when the total is under your limit, every expense has a receipt and none is on hold. A report with held expenses never gets the partial-approval choice; it stays for you.
4. 04  
### Reject with a reason  
reject\_report sends back a report that fails on a missing receipt, with a comment naming the expense, because Expensify needs a comment to reject. The submitter sees the reason and can resubmit.
5. 05  
### Leave the judgment calls  
Over the limit, held, duplicate warnings or your own reports stay untouched, each with a one-line reason in the summary.

### What you get back

Example data

```
Reports waiting: 9
Approved 5 (all under USD 200, receipts on every expense)
Rejected 1: Marcus Lee, Lunch USD 38.00 has no receipt
Left for you 3:
- Tomas Novak, USD 1,240.00, over limit
- Ines Ortega, USD 96.00, one expense on hold
- Priya Shah, USD 410.50, over limit
```

### Other ways to ask

- Approve reports from the design team under USD 500 every day at 9:00, and list everything else.
- Show me the reports waiting for approval with their totals and receipts, but approve nothing.
- Reject any report with a Meals expense over USD 75 and no description, and ask the submitter to add one.
- Approve only reports where the submitter has not had a rejection this month.

## What Expensify allows, and what to know first

- Assigned approvers in the workflow can approve, hold, reject and unapprove; Workspace Admins can also bypass the workflow with More > Change approver > Bypass approvers.
- If Prevent Self-Approval is on, an admin cannot bypass approvers to approve their own report.
- Expensify needs a comment to reject a report, and on a multi-level workflow the approver chooses who it returns to.
- Only an Approved report can be unapproved; Paid and Done reports cannot.
- After the final approver approves, the report becomes Approved and is ready for payment; paying it is a separate step.

approve\_report and reject\_report ask for your OK by default. To run it daily without you, switch confirmation off for those tools in your dashboard.

Sources: [Expensify Help: Approve expenses](https://help.expensify.com/articles/new-expensify/reports-and-expenses/Approve-Expenses) · [Expensify Help: Understanding report statuses and actions](https://help.expensify.com/articles/new-expensify/reports-and-expenses/Understanding-Report-Statuses-and-Actions) · [Expensify Integration Server: API reference](https://integrations.expensify.com/Integration-Server/doc/)

## Call approve\_report from a script

curl

```
curl -X POST https://cotlet.dev/api/v1/expensify/reports/R10077/approve \
  -H "Authorization: Bearer $COTLET_API_KEY"
```

Example response

```
{
"report_id": "R10077",
"status": "approved",
"approved_amount": 148.2,
"currency": "USD",
"next_approver": null,
"approved_at": "2026-10-14T09:40:00+02:00"
}
```

MCP: add https://cotlet.dev/mcp/v1 with the same key; the call is expensify\_write → approve\_report. Example data.

[Schedule it in n8n, Make, Zapier or cron](https://cotlet.dev/integrations/expensify-api-mcp-server.md#automations)

## Expensify tools this automation uses

__Cotlet Expensify tools used to approve Expensify expense reports by your own rule__
| Tool | Parameters |
| --------------- | ------------------------------------------------------------ |
| list\_reports | workspace, status, needs\_my\_approval, since, limit, cursor |
| get\_report | report\_id |
| approve\_report | report\_id, approve\_held |
| reject\_report | report\_id, comment, return\_to |

[All 14 Expensify tools with descriptions](https://cotlet.dev/integrations/expensify-api-mcp-server.md#tools)

## Frequently asked questions

### Can my agent approve a report I am not the approver for?

Only as far as your Expensify account can. Assigned approvers approve their reports, and Workspace Admins can bypass the workflow. The agent never uses another person's login.

### Is it safe to connect Expensify to Cotlet?

Yes. You sign in to Expensify yourself, in your own Cloud Browser in the EU, and we never save your password. Your agents only get Expensify once you enable it, every background request is listed, and the browser profile is stored encrypted with AES-256-GCM, the cipher 1Password uses for its vaults. The AI model never sees a login, posts and messages wait for your OK, and Disable for agents cuts access in one click. Independent scanners grade cotlet.dev A+ on Qualys SSL Labs, securityheaders.com and Mozilla Observatory; live results are on https://cotlet.dev/security.

## More Expensify automations

- [Create Expensify expenses from receipts](https://cotlet.dev/integrations/expensify-api-mcp-server/create-expenses-from-receipts.md)
- [Create and submit a weekly Expensify expense report](https://cotlet.dev/integrations/expensify-api-mcp-server/submit-weekly-expense-report.md)
- [Expensify API and MCP server: every tool](https://cotlet.dev/integrations/expensify-api-mcp-server.md)
- [All use cases](https://cotlet.dev/use-cases.md)

## Give your agent access to Expensify.

Free 7-day trial with 2,000 credits, no card needed. Cotlet is independent and not affiliated with Expensify.

[Sign up free](https://cotlet.dev/app/signup?app=expensify)

---

Give your AI agents your signed-in browser.

**Product:** [Integrations](https://cotlet.dev/integrations.md) · [Use cases](https://cotlet.dev/use-cases.md) · [How it works](https://cotlet.dev/how-it-works.md) · [Pricing](https://cotlet.dev/pricing.md) · [Security](https://cotlet.dev/security.md)

**Resources:** [Blog](https://cotlet.dev/blog.md) · [API docs](https://cotlet.dev/docs.md) · [Help center](https://cotlet.dev/help.md) · [Changelog](https://cotlet.dev/changelog.md) · [GitHub](https://github.com/cotletdev/cotlet)

**Solutions:** [For developers](https://cotlet.dev/for-developers.md) · [For automation agencies](https://cotlet.dev/for-agencies.md)

**Company:** [About](https://cotlet.dev/about.md) · [AI info: company facts](https://cotlet.dev/ai-info.md) · [Contact](https://cotlet.dev/contact.md)

**Legal:** [Terms of service](https://cotlet.dev/terms) · [Privacy policy](https://cotlet.dev/privacy) · [Refund policy](https://cotlet.dev/refunds) · [Acceptable use](https://cotlet.dev/acceptable-use) · [Cookie policy](https://cotlet.dev/cookies) · [DPA](https://cotlet.dev/dpa) · [Subprocessors](https://cotlet.dev/subprocessors)

**Elsewhere:** [Status page](https://status.cotlet.dev) · [Cotlet on GitHub](https://github.com/cotletdev) · [Cotlet on X](https://x.com/cotletdev) · [Cotlet on LinkedIn](https://www.linkedin.com/company/cotletdev) · [Cotlet on Product Hunt](https://www.producthunt.com/products/cotlet) · [Cotlet on Crunchbase](https://www.crunchbase.com/organization/cotlet) · [Cotlet on SaaSHub](https://www.saashub.com/cotlet)

Cotlet is an independent service. It is not affiliated with, endorsed by or sponsored by any of the products listed on this site. Product names are trademarks of their respective owners.

## For AI agents: sign your user up

Is your user asking you to sign them up for Cotlet? You can do it for them, no account or key needed.

1. Read the fields and their allowed values: GET https://cotlet.dev/api/v1/access-requests
2. Ask the user for each value: email, apps, what you will do with them. If they leave the password to you, generate a strong one and show it to them.
3. Show the user what you will send, then POST it as JSON to https://cotlet.dev/api/v1/access-requests.

One call creates the account and sends the access request; we email the user when access is granted.
