---
title: Perk API Integration on Truto
slug: perk
category: Travel
canonical: "https://truto.one/integrations/detail/perk/"
---

# Perk API Integration on Truto



**Category:** Travel  
**Status:** Beta

## MCP-ready AI tools

Truto exposes 36 tools for Perk that AI agents can call directly.

- **list_all_perk_profiles** — List all invoice profiles associated to this TravelPerk account. Returns: id, company_id, name, payment_method_type, billing_period, currency, billing_information.
- **list_all_perk_invoices** — List TravelPerk invoices with filters for profile, serial number, billing period, status, issuing and due dates, and sort order. Returns: serial_number, profile_id, profile_name, billing_information, tk_billing_address, mode, status, due_date, currency, total, and 11 more. Only invoices issued on or after January 1st 2019 are returned.
- **get_single_perk_invoice_by_id** — Get a single TravelPerk invoice by id, where id is the invoice serial number (e.g. INV-01-987654). Returns the full invoice including serial_number, profile_name, status, total, taxes_summary, lines, and pdf. Required: id.
- **list_all_perk_invoices_lines** — List all invoice lines in TravelPerk with optional filters. Returns: id, expense_date, description, quantity, unit_price, total_amount, metadata, invoice_serial_number, invoice_status, currency, and 10 more. Only invoices issued on or after January 1st 2019 are returned; network_transaction_id cannot be combined with other filters.
- **get_single_perk_invoice_pdf_by_id** — Download a TravelPerk invoice in PDF format. Returns the invoice document itself as binary PDF file content, not a JSON object. INV-01-987654). Required: id.
- **list_all_perk_trips** — List all trips in TravelPerk, returned in descending order of modified time. Returns: id, trip_name, start, start_datetime_utc, start_datetime_local, end, end_datetime_utc, end_datetime_local, status, modified, start_location, end_location, booker_id.
- **get_single_perk_trip_by_id** — Get a single TravelPerk trip by id. Returns: id, trip_name, start, start_datetime_utc, start_datetime_local, end, end_datetime_utc, end_datetime_local, status, modified, start_location, end_location, booker_id. Required: id.
- **list_all_perk_trip_custom_fields** — List all custom field values associated with a trip in TravelPerk. Returns: trip_id, created_date, custom_fields (each with name and value). Required: trip_id.
- **list_all_perk_companies** — List all companies associated to this TravelPerk account. Returns: id, name, address, tax_id, enabled, is_default. Max 50 per page.
- **list_all_perk_cost_centers** — List all cost centers in your Perk organization. Returns each cost center's id, name, type, and count_users. The type field is only present when cost object types are enabled for your organization.
- **create_a_perk_cost_center** — Create a cost center in Perk with the given name. Returns the created cost center including id, name, type, archived, approver, delegate, company scope, and owners. Required: name.
- **get_single_perk_cost_center_by_id** — Get a single Perk cost center by id. Returns the full cost center including name, type, archived, approver, delegate, assigned users, company scope, and owners. Required: id.
- **update_a_perk_cost_center_by_id** — Update a Perk cost center by id — rename it, archive or unarchive it, change approver, delegate, delegate expiry, company scope, or cost object type. Returns the updated cost center including id, name, type, archived, approver, delegate, and owners. Required: id.
- **perk_cost_centers_bulk_updates_bulk_update** — Bulk update Perk cost centers in a single request: archive or unarchive them and/or set their cost object type. Returns: updated_count. When cost object types are not enabled, archive is required; when enabled, supply at least one of archive or a non-null type (max 256 chars; fails with 400 if any listed cost…. Required: id_list.
- **perk_cost_center_users_bulk_update** — Replace all users assigned to a Perk cost center with the provided list; any users not in the list are removed from the cost center. Returns the updated cost center including id, name, users, count_users, and owners. Required: cost_center_id.
- **list_all_perk_custom_field_select_options** — List the select options of a Perk custom field, filterable by value substring and status. Returns options with id, value, and is_archived. Required: custom_field_id. Max 100 options per page.
- **create_a_perk_custom_field_select_option** — Create one or more select options on a Perk custom field, which must be a select or multi-select field with target 'BOOKING'. Returns the created or revived options with id, value, is_archived, and erp_code. Required: custom_field_id, select_options.
- **perk_custom_field_select_options_archive** — Archive or unarchive a select option on a Perk custom field. Returns the option's resulting state with id, value, and is_archived. Required: custom_field_id, option_id, archive_action. Idempotent; unarchiving is rejected if another active option on the field has the same value.
- **list_all_perk_users** — List Perk users, a read-only view of user information in the account (user management itself is handled separately via SCIM). Returns: id, attributes (the remaining user fields are not enumerated upstream).
- **list_all_perk_bookings** — List bookings in Perk trips, ordered by modified time (most recent first). Returns each booking with id, trip_id, type (flight, train, hotel, car hire), status, start/end times, references, location, and legs. MICE bookings are not supported.
- **get_single_perk_webhook_by_id** — Get a TravelPerk webhook endpoint by id. Returns the webhook subscription including id, name, url, secret, status, and its subscribed events. Required: id.
- **create_a_perk_webhook** — Create a TravelPerk webhook endpoint that subscribes to one or more events. Returns the created subscription: id, name, url, secret, status, events, and delivery stats (successfully_sent, failed_sent, error_rate). The target url must be unique for the account.
- **update_a_perk_webhook_by_id** — Update a TravelPerk webhook endpoint by id — edit its name, url, secret, status, or subscribed events. Returns the updated webhook: id, name, url, secret, status, events. The target url must be unique for the account (HTTP 409 otherwise). Required: id.
- **delete_a_perk_webhook_by_id** — Delete a TravelPerk webhook endpoint by id. Returns an empty 204 response on success. Required: id.
- **create_a_perk_scim_user** — Create a new user in Perk via SCIM. Returns the created user resource including id, userName, name, active, phoneNumbers, meta, and travel attributes (gender, dateOfBirth, travelPolicy, travelDocuments). Required: userName, name (givenName, familyName), active.
- **list_all_perk_scim_users** — List SCIM-provisioned users in Perk. Returns user records with id, userName, name, active, phoneNumbers, meta, and travel attributes (gender, dateOfBirth, travelPolicy). Filter with a SCIM expression, e.g. filter=externalId eq <id>; max 100 per page.
- **get_single_perk_scim_user_by_id** — Get a single SCIM user in Perk by id. Returns the full user resource including id, userName, name, active, phoneNumbers, meta, and travel attributes (gender, dateOfBirth, travelPolicy, travelDocuments). Required: id.
- **update_a_perk_scim_user_by_id** — Update an existing Perk SCIM user by id. Returns the updated user resource including id, userName, name, active, phoneNumbers, meta, and travel attributes (gender, dateOfBirth, travelPolicy, travelDocuments). Required: id, userName, name (givenName, familyName), active.
- **delete_a_perk_scim_user_by_id** — Delete a Perk SCIM user by id. Returns an empty 204 response on success. Required: id.
- **perk_scim_users_bulk_update** — Update attributes of an existing Perk SCIM user via a SCIM PatchOp body (add, remove, or replace operations); attributes not included stay unchanged. Returns the updated user: id, username, name, active, meta. Required: user_id, schemas, Operations. userName, name.givenName, name.familyName and active must not be null or empty.
- **list_all_perk_scim_schemas** — List the SCIM schemas available in Perk (e.g. the User schema and the perkCustomFields extension schema). Returns each schema's id (URN), name, description, attributes, and meta.
- **get_single_perk_scim_schema_by_id** — Get a Perk SCIM schema by id (the schema URN, e.g. urn:ietf:params:scim:schemas:core:2.0:User) and all its attributes. Returns: id, name, description, attributes, meta, openapi, info, servers, components, security, paths, x-readme, x-readme-fauxas. Required: id.
- **list_all_perk_suppliers** — List suppliers in Perk. Returns the collection of supplier records as served by the suppliers endpoint; the supplier fields are not enumerated in Perk's current documentation, so treat the record shape as opaque.
- **perk_cost_center_access_bulk_update** — Set the access configuration for a Perk cost center, controlling which users and user groups can access it. Returns the updated cost center including access_type, users, groups, approver, and delegate details. Required: cost_center_id, access_type.
- **create_a_perk_webhook_test** — Send a test notification to a Perk webhook endpoint. Returns the test stub payload with test set to true, which Perk fires to the webhook's target URL. Required: webhook_id.
- **list_all_perk_webhook_events** — List the webhook event types available in Perk that can be subscribed to (invoice.issued, trip.created/updated). Returns each event's model and trigger, with the trip.created/updated payload including id, trip_name, start/end datetime fields, status, modified, start_location, end_location, bookings, and booker_id.

## How it works

1. **Link your customer's Perk account.** Use Truto's frontend SDK; we handle every OAuth and API key flow so you don't need to create the OAuth app.
2. **Authentication is automatic.** Truto refreshes tokens, stores credentials securely, and injects them into every API request.
3. **Call Truto's API to reach Perk.** The Proxy API is a 1-to-1 mapping of the Perk API.
4. **Get a unified response format.** Every response uses a single shape, with cursor-based pagination and data in the `result` field.

## Use cases

- **Auto-reconcile travel expenses in your expense platform** — Expense management and corporate card SaaS can ingest TravelPerk invoices with line-level detail to automatically match transactions, eliminate manual receipt chasing, and close the books faster.
- **Sync employees and cost centers from your HRIS** — HRIS and identity platforms can push employee lifecycle changes into TravelPerk via SCIM — provisioning new hires, moving them across cost centers, and deactivating leavers so travel policy always reflects the current org.
- **Push ERP project codes into TravelPerk at booking time** — ERP and PSA platforms can inject live project or client codes as custom field options so travelers tag trips correctly, enabling automated client rebilling and accurate GL coding downstream.
- **Power carbon accounting from granular trip data** — ESG and sustainability SaaS can subscribe to trip events and pull booking-level itineraries (flights, trains, cars) to calculate Scope 3 emissions and build live sustainability dashboards for their customers.
- **Centralize travel visibility in finance and ops dashboards** — FP&A and operations tools can list trips, bookings, and suppliers to give customers a live view of upcoming travel, committed spend, and supplier concentration without logging into TravelPerk.

## What you can build

- **Real-time invoice ingestion with PDF attachments** — Subscribe to TravelPerk webhooks for issued invoices, then pull invoice lines and the compliant PDF to post fully-reconciled entries into your ledger or expense product.
- **SCIM-based employee provisioning** — Create, update, bulk-update, and deactivate TravelPerk users directly from your HRIS or IdP using the SCIM endpoints, including schema discovery for custom attributes.
- **Two-way cost center management** — Create and update TravelPerk cost centers, bulk-assign users, and manage cost center access so your customers' org structure stays mirrored between your product and TravelPerk.
- **Dynamic custom field option sync** — Push project codes, client IDs, or GL tags as custom field select options into TravelPerk — and archive stale ones — so travelers always pick from an up-to-date list at booking time.
- **Trip and booking data pipeline for analytics** — List trips, trip custom fields, and bookings to feed carbon calculators, travel analytics, or client rebilling workflows with granular itinerary data.
- **Webhook lifecycle management from your app** — Programmatically create, test, update, and delete TravelPerk webhooks per customer so each tenant gets isolated, reliable event delivery without manual setup.

## FAQs

### How do end users connect their TravelPerk account?

Truto handles the auth handshake with TravelPerk so your users connect through a flow you embed in your product. Credentials and token refresh are managed by Truto — you call the normalized tools without storing secrets.

### Can we react to TravelPerk events in real time?

Yes. TravelPerk supports webhooks for events like invoice issued and trip created/updated. You can use the webhook tools to create, test, update, and delete subscriptions per connected account, so you don't have to poll.

### What invoice data is available for reconciliation?

You can list all invoices, fetch a single invoice by ID, list invoice lines for line-level detail (taxes, unit prices, metadata), and download the invoice PDF — enough to reconcile corporate card transactions and attach compliant receipts.

### Does the integration support SCIM for user provisioning?

Yes. The SCIM tools cover create, read, update, delete, and bulk update of users, plus schema discovery, so HRIS and IdP products can run full employee lifecycle automation into TravelPerk.

### Can we sync project codes or GL tags into TravelPerk?

Yes. You can create and archive custom field select options programmatically, which is the standard way to push ERP project codes or client IDs so travelers select them at booking time.

### What trip and booking data can we pull for carbon or analytics use cases?

You can list all trips, retrieve a single trip by ID, read trip custom fields, and list bookings — giving you itinerary-level data (type, locations, suppliers) to drive emissions calculations or travel analytics.

### Can we manage cost centers and user assignments programmatically?

Yes. The integration exposes list, create, get, and update for cost centers, plus bulk update tools for cost centers, their user assignments, and cost center access permissions.
