Browse the manual
Project, purchase, item and report tools
Prepare ordinary business records and read exact reports with current permissions.
On this page
For: developers connecting an HTTP or MCP client. Start with Agent API and AI clients.
AI is optional. You confirm invoice issuance in Pepper.
Customer accounts
Customer-account tools use the current staff delegate's Customer scope. They do not sign in as the customer or reveal verification codes, sessions or checkout credentials.
| MCP tool | HTTP path after /api/v1/ |
Required permission | Result |
|---|---|---|---|
customer_accounts_list |
GET customer-accounts |
customers.view |
Permitted accounts, their current Customer and sign-up source. |
customer_accounts_get |
GET customer-accounts/{id} |
customers.view |
Account details, current capabilities and the first page of possible duplicate Customers. Access and link history require account management permission. |
customer_accounts_duplicates |
GET customer-accounts/{id}/duplicates |
customers.view |
A page of active matching Customers that the delegate can read, excluding the current linked Customer. |
customer_accounts_privacy |
GET customer-accounts/{id}/privacy |
customers.accounts.manage |
Permitted email consent and deletion requests, including recorded decisions. |
List filters include customer_id, status, source_website_id and search. Account states are active and disabled.
Possible duplicates return only each Customer's id and label. Use limit, cursor, sort (created_at or name), dir and include_total for paging. Pages contain 25 records by default; limit accepts 1–100. The default order is oldest first. The account's possible_duplicates field includes the first page and its permitted total. A match grants no purchase access. Use the approved relink action to change the linked Customer.
Access changes, Customer relinking, deletion decisions and account exports use exact approval requests. Each is decided separately.
Account access never grants all purchases or invoices on its linked Customer. Relinking affects future checkout identity; earlier purchases and issued originals retain their original details.
Read Manage customer accounts for the customer and staff workflows.
Projects, purchases and items
These tools use the same records and permissions as the app. Preparation saves the stated reversible change; it does not issue or send anything.
| MCP tool | HTTP path after /api/v1/ |
Scope | Result |
|---|---|---|---|
engagements_list |
GET engagements |
engagements:read |
Permitted projects and work counts; money summaries need their own permission |
engagements_get |
GET engagements/{id} |
engagements:read |
Project, scopes, milestones and permitted linked records |
engagements_create |
POST engagements |
engagements:prepare |
Saved project; no client agreement |
engagements_milestone |
POST engagements/{id}/milestones |
engagements:prepare |
Planned milestone against an existing agreement |
engagements_close |
POST engagements/{id}/state |
engagements:prepare |
Closed or reopened project; unfinished work prevents closure |
engagements_preview_invoice |
POST engagements/{id}/invoice-preview |
engagements:read |
Exact preview of approved milestones, unbilled time or both; saves nothing |
engagements_prepare_invoice |
POST engagements/{id}/invoice-draft |
engagements:prepare |
Saved invoice draft; reserves the selected milestones and time entries once |
purchases_list |
GET purchases |
purchases:read |
Permitted purchases; totals need financial-summary permission |
purchases_get |
GET purchases/{id} |
purchases:read |
Purchase and permitted files and project links |
purchases_create |
POST purchases |
purchases:prepare |
Saved unpaid purchase with PHP-calculated totals |
purchases_update |
PUT purchases/{id} |
purchases:prepare |
Saved purchase changes; keeps existing payment details |
items_list |
GET items |
items:read |
Catalog rows with exact prices |
items_get |
GET items/{id} |
items:read |
Editor fields and current version; requires item management |
items_create |
POST items |
items:prepare |
Saved catalog item |
items_update |
PUT items/{id} |
items:prepare |
Saved changes, including archive or restore |
Lists accept limit (25, 50 or 100; default 25), cursor, sort, dir, include_total and search (100 characters maximum). A page returns data and next_cursor, and total when you ask for it.
Use view to filter projects (open, closed), purchases (recorded, unpaid, nofile, voided) or items (all, active, inactive). Purchases also accept period.
Project reads need one of customers.view, projects.use or projects.manage. Project creation, milestones and invoice previews need invoices.manage. The tool reference gives the permission of every tool. Recording a scope with its agreement and approving a milestone are on Project and time tools.
Project creation needs title, customer_id and currency_code. A milestone needs the project id, current version, title, scope_id and unit_price.
Milestones can also include tax_rate_id and due_date. Closing or reopening needs the project id, current version and closed boolean.
Invoice preview and preparation need the project id, issue_date, due_date and milestones. Map each milestone ID to its current version.
Only approved, unreserved milestones qualify. Preparing an invoice does not approve the work. Issuing still needs your approval.
Purchase reads need purchases.view or purchases.view_own. Writes also need purchases.manage and access to that purchase.
Purchase creation needs supplier_id, purchase_date, currency_code and lines. Each line needs entry_mode (net or gross) and amount.
Optional line fields are description, tax, tax_rate_id and category_id. Optional purchase fields are reference, notes and engagement_id.
Purchase updates also need id and the current integer version. The saved currency stays fixed. Recording or clearing payment details, voiding a purchase and exporting a tax period need your approval; see Approve sensitive steps.
Item lists need items.view. Item detail and writes need items.manage, because the detail contains fields from the item editor.
Item creation needs name, unit_price, currency_code and unit_type. Unit types are hour, piece, day, kg and custom.
For custom, include custom_unit. Optional fields are sku, description, tax_rate_id, category_id, is_active, price_mode and tax_class_id.
price_mode is exclusive or inclusive; a new item defaults to exclusive. tax_class_id names an existing active class or is null. A new item defaults to no class. These fields offer defaults for new sales lines. A class never turns configured tax rules on. The person selects those rules in the financial editor or tax preparation call.
Item reads return the saved basis and class with the exact price. A read-only item list omits private editor fields. A new rate or class choice must be active. Keeping an item's existing reference does not replace the tax inputs on saved document lines.
Item updates need id, the current version from items_get, name, unit_price and unit_type. The saved currency stays fixed.
Set is_active to the string "0" to archive an item or "1" to restore it. Issued originals stay unchanged.
Send API amounts as exact minor-unit strings: "12345" means EUR 123.45 or USD 123.45. "10001" means BHD 10.001. The unsigned limit is 9223372036854775807, at most 19 digits. Keep amounts above 9007199254740991 as strings; never convert them to JavaScript numbers or floats.
Every write needs an idempotency key. An identical retry returns its original receipt after current permission and record checks.
Receipts, tax periods and item changes
| MCP tool | HTTP after /api/v1/ |
Scope | What it does |
|---|---|---|---|
purchases_receipt_prepare |
POST purchases/receipts |
purchases:prepare |
Start a receipt upload: a PDF, JPEG, PNG or WebP of at most 10 MB. Send the bytes inline as content_base64, or send size and PUT the raw bytes to the returned upload_url with the same bearer token within 30 minutes. Then pass upload_id to purchases_attach_files or purchases_replace_file. |
purchases_attach_files |
POST purchases/{id}/files |
purchases:prepare |
Attach receipt uploads to a recorded purchase that is not voided; at most 10 current files per purchase. The type, size and storage quota are checked; each file keeps its hash. |
purchases_replace_file |
POST purchases/{id}/files/replace |
purchases:prepare |
Replace a receipt with a new version from an upload. The earlier version stays in the file history. |
purchases_file |
GET purchases/{id}/file |
purchases:read |
Get a single-use link (5 minutes) to a receipt of a purchase the person may open. A file whose bytes changed is refused. |
periods_get |
GET periods |
purchases:read |
Read a tax period as the Tax periods screen shows it: sales and purchase tax per currency and rate, totals, the year overview and what is missing. Exact minor-unit strings. |
views_item_bulk |
POST views/item/bulk |
items:prepare |
Run one bulk action of the item view on up to 100 records, as the view's selection bar does: archive; restore. Each record runs the ordinary action on its own; refusals are listed and do not undo the others. |
views_item_move |
POST views/item/move/{id} |
items:prepare |
Move one item to another lane of a board layout, as dragging a card does. The owning action runs and checks the move. |
Receipt to purchase: start an upload with purchases_receipt_prepare, then pass its upload_id to purchases_attach_files or purchases_replace_file. A receipt is a PDF, JPEG, PNG or WebP of at most 10 MB. See Upload and download files. An item bulk action runs each item on its own and lists what it refused.
Import and export item prices
Item imports and exports need approval. They use the same fields and row checks as the catalog CSV workflow.
items_import_prepare accepts up to 500 objects in rows. Its unit_price uses an exact dot-decimal string in currency_code, unlike minor-unit prices in items_create. For example, "100.01" means EUR 100.01. Without a currency column, the import uses the company currency.
Optional price_mode accepts exclusive or inclusive. tax_class_ref accepts a stable id:name reference or a unique active class name. Omitted columns keep the exclusive and no-class defaults. An invalid basis, inactive selection or ambiguous class becomes a row error. Pepper saves valid rows and reports refused rows; it never changes an issued original.
items_export returns a single-use CSV download after approval. Its columns end with currency_code, price_mode and tax_class. Price is a dot-decimal string at that row's currency scale. Rate, category and class references use id:name. Keep those strings intact when another program opens the file.
Reports and safe settings
Report tools require reports:read, data.export and current document access. They return exact monetary strings, with integer record counts.
| MCP tool | HTTP path after /api/v1/ |
Required inputs |
|---|---|---|
reports_aging |
GET reports/aging |
currency_code |
reports_tax |
GET reports/tax |
currency_code, start_date, end_date |
reports_customer_statement |
GET reports/customer-statement |
customer_id, currency_code, start_date, end_date |
settings_read |
GET settings/safe |
None; needs settings:read and settings.manage |
Dates use YYYY-MM-DD. Aging and statements accept page and per_page (1–100; default 50). Tax results group the chosen period by rate.
Reports keep currencies separate. They do not convert currencies, file returns or export CSV files.
Settings reads return only these named fields:
company.name,company.country,company.currency,company.timezone.localization.region,localization.overrides,localization.default_locale,localization.date_format,localization.time_format,localization.number_format,localization.week_start.invoicing.default_payment_terms,invoicing.einvoice_readiness.
Credentials, keys, tokens, mail passwords and bank details never appear in settings_read. A settings change runs only after the delegated person approves it; see Approve sensitive steps.
Assistant provider settings
These tools require a connection delegated to the active installation owner, plus settings.manage. A grant cannot make another role the owner.
| MCP tool | HTTP after /api/v1/ |
Scope | Result |
|---|---|---|---|
settings_assistant |
GET settings/assistant |
settings:read |
Selected provider, model, destination, key-present flag, limits, history, generation and today's request count; never the key |
assistant_save_prepare |
POST approvals/assistant-save |
settings:execute |
Exact proposed settings and a link for the owner's approval; saves no settings |
assistant_save |
POST approvals/{id}/assistant-save |
settings:execute |
Applies that approved change once and returns the safe settings |
Read the current generation before preparing a change. Preparation needs generation, enabled and a UUID idempotency_key. Its other inputs are:
| Input | Values and conditions |
|---|---|
provider |
anthropic, openai or openai-compatible; required when enabling |
model |
Provider model identifier, at most 128 characters; required when enabling |
base_url |
Public HTTPS API base, at most 4,096 characters; required for the compatible profile, prohibited for the other profiles |
workspace |
Optional Anthropic workspace identifier beginning wrkspc_; prohibited for other profiles |
daily_call_limit |
Integer 0–10,000; at least 1 and required when enabling |
output_token_limit |
Integer 128–4,096; required when enabling |
history_days |
0, 7 or 30; omission keeps the saved choice |
consent_version |
Use the value from settings_assistant; required when enabling |
Enabling requires a saved provider key. Enter, replace or remove it in Settings > Assistant. Neither tool accepts credential or delete_credential. Changing provider or compatible destination requires a new key in Pepper.
Show the returned review_url to the owner. After approval, execute with its approval id, nonce and a UUID idempotency_key. Changed settings invalidate the prepared generation; prepare again. Assistant setup cannot use batch approval.
Saving withdraws personal Assistant grants and pending confirmations. It preserves started actions and charged usage. No settings read, preparation or save makes a generation request. The built-in Assistant itself does not receive these owner setup tools.
More reports and settings screens
These reads return what the screen shows to the same person. Settings screens need an administrator.
| MCP tool | HTTP after /api/v1/ |
Scope | What it does |
|---|---|---|---|
reports_overview |
GET reports/overview |
reports:read |
Read the reports screen: the currency, the month calendar of due and paid invoices, the receivable lanes and the reports the person can open. Exact minor units per currency. |
reports_business |
GET reports/business |
reports:read |
Read the business view: the figures, trends and analysis of the Home overview, per currency. |
customers_workspace |
GET customers/{id}/workspace |
customers:read |
Read the hosted workspace of a customer, for the installation operator (an administrator): its state, plan history, open owner invitation and staff count. |
| MCP tool | HTTP after /api/v1/ |
Scope | What it does |
|---|---|---|---|
installation_health_refresh |
GET installation/health/refresh |
settings:read |
Run the installation health checks again and return them, as Refresh on Settings > Installation health does. No mail is sent and no repair is made. |
installation_update |
GET installation/update |
settings:read |
Read the update screen: the running version, uploaded packages and their checks. Installing stays with a person. |
backups_list |
GET backups |
settings:read |
List the backups with their date, size, kind and schedule. Downloading and restoring stay with a person. |
modules_list |
GET modules |
settings:read |
List the modules of this installation with their apps and what each one offers. |
settings_email_templates |
GET settings/email-templates |
settings:read |
Read the email templates in one language with their subject and body. A person changes them in Pepper. |
settings_bank_accounts |
GET settings/bank-accounts |
settings:read |
List the bank accounts shown on invoices, with the default. A person changes them in Pepper. |
settings_roles |
GET settings/roles |
settings:read |
List the built-in and custom roles with their permissions, what each opens and how many people hold it. |
settings_intelligence |
GET settings/intelligence |
settings:read |
Read the AI provider setup: on or off, the features, limits and today's use. Never the key. |
workspaces_plans |
GET workspaces/plans |
settings:read |
List the workspace plans of a hosting installation, for its operator. |
workspaces_plan |
GET workspaces/plans/{id} |
settings:read |
Read one workspace plan with its modules and limits. |
workspaces_plan_choices |
GET workspaces/plan-choices |
settings:read |
Find workspace plans by name for a picker. |
settings_bank_accounts lists the bank accounts that your invoices show, with each IBAN or account number shortened to its country code and last four characters, such as NL •••• 4300. It never changes an account. settings_intelligence tells whether a credential is set, never the credential. backups_list lists backups; downloading or restoring a backup stays with a person in Pepper. installation_update shows the update screen; installing an update stays with a person. installation_health_refresh runs the checks again and repairs nothing.
Installation health
Optional AI access includes the installation.health read tool (installation_health in MCP), also available at GET /api/v1/installation/health. It requires settings:read and a current active owner or administrator.
The response contains checks, checkedAt and version. Each check contains its key, label, state, lastSuccess, message and a fix with label and href. States are working, warning, failing or never_seen. No credential, customer record or filesystem path is returned.
The tool reads the same results as Installation health. It changes no settings and runs no repair. You decide what to change.
Project tasks and tracked time
Use the Project and time tools to plan tasks, log minutes, run a timer, inspect workload and prepare an invoice from unbilled time. Project creation accepts a billing mode; preview and preparation accept time sources beside milestones.
Need help with the product?
Contact support