Navan connects to enterprise systems through multiple integration methods: direct REST API with OAuth 2.0, SCIM for user provisioning, SFTP for batch file exchange, SAML/OIDC for SSO, and webhooks for real-time events. There is no SDK — all integrations use Navan's REST endpoints or admin console configuration. This skill provides deployment checklists for the three most common integration categories: ERP expense sync, HRIS user provisioning, and identity provider SSO.
client_id and client_secret from Admin > API Settingshttps://api.navan.com/v1
Deployment Checklist:
# Fetch approved expenses ready for ERP sync
curl -s -X GET "https://api.navan.com/v1/expenses?status=approved&limit=50" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "Content-Type: application/json"
# Response includes fields for ERP mapping:
# {
# "uuid": "exp_abc123",
# "amount": 245.50,
# "currency": "USD",
# "category": "meals_entertainment",
# "cost_center": "engineering",
# "gl_code": "6200",
# "receipt_url": "https://api.navan.com/v1/receipts/exp_abc123",
# "approved_at": "2026-03-20T14:30:00Z"
# }
SCIM Provisioning Setup:
https://api.navan.com/scim/v2
| HRIS Field | Navan SCIM Attribute | Required |
|---|---|---|
userName |
Yes | |
| First Name | name.givenName |
Yes |
| Last Name | name.familyName |
Yes |
| Department | urn:navan:department |
Recommended |
| Manager | urn:navan:manager_email |
Recommended |
| Cost Center | urn:navan:cost_center |
Optional |
# Check provisioned users
curl -s "https://api.navan.com/v1/users?provisioning_source=scim&limit=10" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" | jq '.[] | {email, status, provisioned_at}'
SAML Configuration:
https://app.navan.com/saml/metadata
https://app.navan.com/saml/acs
emailAddress
email → user.email (Required)
firstName → user.firstName (Required)
lastName → user.lastName (Required)
department → user.department (Optional — enables policy routing)
Each integration deployment produces:
| HTTP Code | Meaning | Resolution |
|---|---|---|
400 |
Invalid field mapping or malformed request | Review GL code / attribute mappings |
401 |
OAuth token expired or invalid | Rotate credentials in Navan Admin |
403 |
Integration not enabled for your plan | Verify Navan plan includes this integration (Enterprise required for some) |
409 |
Duplicate user in SCIM provisioning | Check for existing user with same email |
422 |
Validation error on expense export | Verify required fields (amount, currency, category) are present |
429 |
Rate limited | Reduce sync frequency or implement exponential backoff |
Automated daily expense export to NetSuite:
#!/usr/bin/env bash
# scripts/navan-netsuite-sync.sh
set -euo pipefail
# Authenticate
TOKEN=$(curl -sf -X POST https://api.navan.com/ta-auth/oauth/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials&client_id=${NAVAN_CLIENT_ID}&client_secret=${NAVAN_CLIENT_SECRET}" \
| jq -r '.access_token')
# Fetch yesterday's approved expenses
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
curl -s "https://api.navan.com/v1/expenses?status=approved&approved_after=${YESTERDAY}T00:00:00Z" \
-H "Authorization: Bearer $TOKEN" \
-o /tmp/navan-expenses.json
EXPENSE_COUNT=$(jq length /tmp/navan-expenses.json)
echo "Exporting $EXPENSE_COUNT expenses to NetSuite"
navan-observability to monitor integration health post-deploymentnavan-webhooks-events for real-time event-driven sync instead of pollingnavan-security-basics for credential rotation and access control