Expensify
Overview
Pre-built tooling
✅ Authorization
| Tools | Status |
|---|---|
| Pre-built authorization (Basic) | ✅ |
| Pre-built authorization UI | ✅ |
| Custom authorization UI | ✅ |
| End-user authorization guide | ✅ |
| Expired credentials detection | ✅ |
✅ Read & write data
| Tools | Status |
|---|---|
| Pre-built integrations | ✅ |
| API unification | ✅ |
| 2-way sync | ✅ |
| Webhooks from Tenklo on data modifications | ✅ |
| Real-time webhooks from 3rd-party API | 🚫 (time to contribute: <48h) |
| Proxy requests | ✅ |
✅ Observability & data quality
| Tools | Status |
|---|---|
| HTTP request logging | ✅ |
| End-to-end type safety | ✅ |
| Data runtime validation | ✅ |
| OpenTelemetry export | ✅ |
| Slack alerts on errors | ✅ |
| Integration status API | ✅ |
✅ Customization
| Tools | Status |
|---|---|
| Create or customize use-cases | ✅ |
| Pre-configured pagination | 🚫 (time to contribute: <48h) |
| Pre-configured rate-limit handling | 🚫 (time to contribute: <48h) |
| Per-customer configurations | ✅ |
Users
Others
| Function name | Description | Type | Source code |
|---|---|---|---|
create-user | Create a user in the account | Action | 🔗 Github |
disable-user | Disables a user in Expensify | Action | 🔗 Github |
list-policies | Action to fetch a list of policies with some relevant information about them | Action | 🔗 Github |
Access requirements
| Pre-Requisites | Status | Comment |
|---|---|---|
| Paid dev account | ❓ | |
| Paid test account | ❓ | |
| Partnership | ❓ | |
| App review | ❓ | |
| Security audit | ❓ |
Setup guide
No setup guide yet.
Need help getting started? Get help in the community.
Contribute improvements to the setup guide by editing this page
Useful links
Contribute useful links by editing this page
API gotchas
- Expensify in Tenklo uses
Basicauth mode to access different endpoints. Provide yourpartnerUserIDas the Username value andpartnerUserSecretas the Password value. - After creating a connection, you can use the Basic credentials as follows;
const connection = await nango.getConnection();
let credentials: { partnerUserID?: string; partnerUserSecret?: string } = {};
if ('username' in connection.credentials && 'password' in connection.credentials) {
credentials = {
partnerUserID: connection.credentials.username,
partnerUserSecret: connection.credentials.password,
};
} else {
throw new nango.ActionError({
message: `Basic API credentials are incomplete`
});
}
const postData = 'requestJobDescription=' + encodeURIComponent(JSON.stringify({
type: input.requestJobDescription.type,
credentials: credentials,
inputSettings: {
type: input.inputSettings.type
}
}));
const resp = await nango.post({
baseUrlOverride: `https://integrations.expensify.com/Integration-Server`,
endpoint: `/ExpensifyIntegrations`,
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
data: postData,
});- You can have a look at the pre-built integrations
- Every request has to be made against the same endpoint.
- Expensify enforces a general rate limit of 50 jobs started per minute.
Contribute API gotchas by editing this page
Connect to expensify
Guide to connect to Expensify using Tenklo Connect.