Expensify

Overview

Pre-built tooling

✅ Authorization
ToolsStatus
Pre-built authorization (Basic)✅
Pre-built authorization UI✅
Custom authorization UI✅
End-user authorization guide✅
Expired credentials detection✅
✅ Read & write data
ToolsStatus
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
ToolsStatus
HTTP request logging✅
End-to-end type safety✅
Data runtime validation✅
OpenTelemetry export✅
Slack alerts on errors✅
Integration status API✅
✅ Customization
ToolsStatus
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

Function nameDescriptionTypeSource code
usersFetches a list of users from Expensify.Sync🔗 Github

Others

Function nameDescriptionTypeSource code
create-userCreate a user in the accountAction🔗 Github
disable-userDisables a user in ExpensifyAction🔗 Github
list-policiesAction to fetch a list of policies with some relevant information about themAction🔗 Github

Access requirements

Pre-RequisitesStatusComment
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
Contribute useful links by editing this page

API gotchas

  • Expensify in Tenklo uses Basic auth mode to access different endpoints. Provide your partnerUserID as the Username value and partnerUserSecret as 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.

On this page