Read PHP Point of Sale items, sales, customers and 138 reports; manage customers, items, expenses.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
WRITE: create a customer in the store. Store-account balance, credit limit and loyalty points cannot be set here. Needs a Read/Write API key. Retrying creates a duplicate (check phppos_list_customers first). The store's 'new customer' webhook, if configured, fires. POST /customers.
First name (required by PHP Point of Sale).
Postal code.
City.
Email address.
State or region.
Country.
Whether sales to this customer are taxed.
Comments.
Address line 1.
Address line 2.
Last name.
Company name.
Phone number.
Customer account number.
Internal notes (not shown to the customer).
The server marks this tool as destructive. Running it may delete or overwrite data on the server or in any account you connected with your headers.
WRITE: create a customer in the store. Store-account balance, credit limit and loyalty points cannot be set here. Needs a Read/Write API key. Retrying creates a duplicate (check phppos_list_customers first). The store's 'new customer' webhook, if configured, fires. POST /customers.
| Argument | Type | Description |
|---|---|---|
| zip | string | Postal code. |
| city | string | City. |
| string | Email address. | |
| state | string | State or region. |
| country | string | Country. |
| taxable | boolean | Whether sales to this customer are taxed. |
| comments | string | Comments. |
| address_1 | string | Address line 1. |
| address_2 | string | Address line 2. |
| last_name | string | Last name. |
| first_name* | string | First name (required by PHP Point of Sale). |
| company_name | string | Company name. |
| phone_number | string | Phone number. |
| account_number | string | Customer account number. |
| internal_notes | string | Internal notes (not shown to the customer). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"first_name"
],
"properties": {
"zip": {
"type": "string",
"maxLength": 30,
"description": "Postal code."
},
"city": {
"type": "string",
"maxLength": 100,
"description": "City."
},
"email": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"maxLength": 254,
"description": "Email address."
},
"state": {
"type": "string",
"maxLength": 100,
"description": "State or region."
},
"country": {
"type": "string",
"maxLength": 100,
"description": "Country."
},
"taxable": {
"type": "boolean",
"description": "Whether sales to this customer are taxed."
},
"comments": {
"type": "string",
"maxLength": 2000,
"description": "Comments."
},
"address_1": {
"type": "string",
"maxLength": 200,
"description": "Address line 1."
},
"address_2": {
"type": "string",
"maxLength": 200,
"description": "Address line 2."
},
"last_name": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Last name."
},
"first_name": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "First name (required by PHP Point of Sale)."
},
"company_name": {
"type": "string",
"maxLength": 200,
"description": "Company name."
},
"phone_number": {
"type": "string",
"maxLength": 40,
"minLength": 1,
"description": "Phone number."
},
"account_number": {
"type": "string",
"maxLength": 60,
"description": "Customer account number."
},
"internal_notes": {
"type": "string",
"maxLength": 4000,
"description": "Internal notes (not shown to the customer)."
}
}
}WRITE: record an expense in the store's books (description, amount and date). It affects expense and profit-and-loss reports. Needs a Read/Write API key. Retrying records it twice (check phppos_list_expenses first). POST /expenses.
| Argument | Type | Description |
|---|---|---|
| category_id | integer | Expense category id. |
| expense_tax | number | Tax amount. |
| location_id | integer | Location id - see phppos_list_locations. |
| expense_date | string | When it was incurred (yyyy-mm-dd or yyyy-mm-dd hh:mm:ss); defaults to now in the store. |
| expense_note | string | Note. |
| expense_type | string | Expense type, for example Utilities. |
| expense_amount* | number | Amount, in the store's currency, before tax. |
| expense_reason | string | Reason. |
| expense_description* |
WRITE: create an inventory item (name required). Stock quantities are not set here. Needs a Read/Write API key. Retrying creates a duplicate (search with phppos_list_items first). The store's item webhooks, if configured, fire. POST /items.
| Argument | Type | Description |
|---|---|---|
| name* | string | Item name. |
| size | string | Size. |
| tags | array | Tag names. |
| cost_price | number | Cost price. |
| is_service | boolean | True for a service (no stock tracking). |
| product_id | string | Product id / SKU. |
| unit_price | number | Selling price. |
| category_id | integer | Category id - see phppos_list_categories. |
| description | string | Short description. |
| item_number |
One customer by person id: contact details, tier, tax settings, balance, credit limit, points, notes and custom fields. GET /customers/{person_id}.
| Argument | Type | Description |
|---|---|---|
| person_id* | integer | Customer person id (find it with phppos_list_customers). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"person_id"
],
"properties": {
"person_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Customer person id (find it with phppos_list_customers).",
"exclusiveMinimum": 0
}
}
}One gift card by its card number (or id): remaining value, customer and status. GET /giftcards/{giftcard_number}.
| Argument | Type | Description |
|---|---|---|
| giftcard_number* | string | Gift card number or id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"giftcard_number"
],
"properties": {
"giftcard_number": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$",
"maxLength": 60,
"minLength": 1,
"description": "Gift card number or id."
}
}
}One inventory item by id: prices, tax settings, category, supplier, tags, attributes, variations, tier pricing and per-location settings. GET /items/{id}.
| Argument | Type | Description |
|---|---|---|
| item_id* | integer | PHP Point of Sale item id (find it with phppos_list_items). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"item_id"
],
"properties": {
"item_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "PHP Point of Sale item id (find it with phppos_list_items).",
"exclusiveMinimum": 0
}
}
}One receiving by id: supplier, items, quantities, costs and payments. GET /receivings/{id}.
| Argument | Type | Description |
|---|---|---|
| receiving_id* | integer | Receiving id (find it with phppos_list_receivings). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"receiving_id"
],
"properties": {
"receiving_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Receiving id (find it with phppos_list_receivings).",
"exclusiveMinimum": 0
}
}
}One sale by id with line items, payments, taxes, customer and employee (verbosity full by default). GET /sales/{id}.
| Argument | Type | Description |
|---|---|---|
| sale_id* | integer | PHP Point of Sale sale id (the number on the receipt; find it with phppos_list_sales). |
| verbosity | string | minimal, medium or full (default). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"sale_id"
],
"properties": {
"sale_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "PHP Point of Sale sale id (the number on the receipt; find it with phppos_list_sales).",
"exclusiveMinimum": 0
},
"verbosity": {
"enum": [
"minimal",
"medium",
"full"
],
"type": "string",
"description": "minimal, medium or full (default)."
}
}
}One supplier by person id. GET /suppliers/{person_id}.
| Argument | Type | Description |
|---|---|---|
| person_id* | integer | Supplier person id (find it with phppos_list_suppliers). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"person_id"
],
"properties": {
"person_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Supplier person id (find it with phppos_list_suppliers).",
"exclusiveMinimum": 0
}
}
}List appointments (bookings) with customer, employee, service, start and end time, optionally within a time window. GET /appointments.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Rows per page, 1-100 (default 20). |
| offset | integer | Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report). |
| search | string | Free-text search. |
| end_time | string | Only appointments ending on or before this date or date-time. |
| start_time | string | Only appointments starting on or after this date or date-time. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"description": "Rows per page, 1-100 (default 20).",
"exclusiveMinimum": 0
},
"offset": {
"type": "integer",
"maximum": 1000000,
"minimum": 0,
"description": "Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report)."
},
"search": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Free-text search."
},
"end_time": {
"type": "string",
"description": "Only appointments ending on or before this date or date-time."
},
"start_time": {
"type": "string",
"description": "Only appointments starting on or after this date or date-time."
}
}
}List item categories with their ids. Use the ids to filter items or to file a new item. GET /categories.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Rows per page, 1-100 (default 20). |
| offset | integer | Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report). |
| search | string | Free-text search. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"description": "Rows per page, 1-100 (default 20).",
"exclusiveMinimum": 0
},
"offset": {
"type": "integer",
"maximum": 1000000,
"minimum": 0,
"description": "Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report)."
},
"search": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Free-text search."
}
}
}List or search customers with contact details, tier, store-account balance, credit limit and loyalty points. Search by text or by one field (email, phone_number, first_name, last_name, account_number). GET /customers.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Rows per page, 1-100 (default 20). |
| offset | integer | Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report). |
| search | string | Free-text search. |
| sort_col | string | Column to sort by (a field name of the rows). |
| sort_dir | string | Sort direction. |
| location_id | integer | Only customers at this location id. |
| search_field | string | Limit the search to one field. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"description": "Rows per page, 1-100 (default 20).",
"exclusiveMinimum": 0
},
"offset": {
"type": "integer",
"maximum": 1000000,
"minimum": 0,
"description": "Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report)."
},
"search": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Free-text search."
},
"sort_col": {
"type": "string",
"pattern": "^[a-z][a-z0-9_]{0,60}$",
"description": "Column to sort by (a field name of the rows)."
},
"sort_dir": {
"enum": [
"asc",
"desc"
],
"type": "string",
"description": "Sort direction."
},
"location_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Only customers at this location id.",
"exclusiveMinimum": 0
},
"search_field": {
"enum": [
"first_name",
"last_name",
"email",
"phone_number",
"account_number"
],
"type": "string",
"description": "Limit the search to one field."
}
}
}List employees with name, contact details, username, hire date, manager, commission and pay rate settings and assigned locations. Passwords and the permission maps are never returned. GET /employees.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Rows per page, 1-100 (default 20). |
| offset | integer | Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report). |
| search | string | Free-text search. |
| location_id | integer | Only employees at this location id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"description": "Rows per page, 1-100 (default 20).",
"exclusiveMinimum": 0
},
"offset": {
"type": "integer",
"maximum": 1000000,
"minimum": 0,
"description": "Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report)."
},
"search": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Free-text search."
},
"location_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Only employees at this location id.",
"exclusiveMinimum": 0
}
}
}List recorded expenses with type, description, date, amount, tax, payment type, category and location. GET /expenses.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Rows per page, 1-100 (default 20). |
| offset | integer | Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report). |
| search | string | Free-text search. |
| sort_col | string | Column to sort by (a field name of the rows). |
| sort_dir | string | Sort direction. |
| location_id | integer | Only expenses at this location id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"description": "Rows per page, 1-100 (default 20).",
"exclusiveMinimum": 0
},
"offset": {
"type": "integer",
"maximum": 1000000,
"minimum": 0,
"description": "Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report)."
},
"search": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Free-text search."
},
"sort_col": {
"type": "string",
"pattern": "^[a-z][a-z0-9_]{0,60}$",
"description": "Column to sort by (a field name of the rows)."
},
"sort_dir": {
"enum": [
"asc",
"desc"
],
"type": "string",
"description": "Sort direction."
},
"location_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Only expenses at this location id.",
"exclusiveMinimum": 0
}
}
}List gift cards with number, description, remaining value, customer and whether inactive. GET /giftcards.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Rows per page, 1-100 (default 20). |
| offset | integer | Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report). |
| search | string | Free-text search. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"description": "Rows per page, 1-100 (default 20).",
"exclusiveMinimum": 0
},
"offset": {
"type": "integer",
"maximum": 1000000,
"minimum": 0,
"description": "Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report)."
},
"search": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Free-text search."
}
}
}List customer invoices (money customers owe) or supplier invoices (money the store owes) with date, due date, status and amount. GET /invoices/customer or /invoices/supplier.
| Argument | Type | Description |
|---|---|---|
| type* | string | customer = invoices to customers; supplier = invoices from suppliers. |
| limit | integer | Rows per page, 1-100 (default 20). |
| offset | integer | Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report). |
| search | string | Free-text search. |
| sort_col | string | Column to sort by (a field name of the rows). |
| sort_dir | string | Sort direction. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"type"
],
"properties": {
"type": {
"enum": [
"customer",
"supplier"
],
"type": "string",
"description": "customer = invoices to customers; supplier = invoices from suppliers."
},
"limit": {
"type": "integer",
"maximum": 100,
"description": "Rows per page, 1-100 (default 20).",
"exclusiveMinimum": 0
},
"offset": {
"type": "integer",
"maximum": 1000000,
"minimum": 0,
"description": "Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report)."
},
"search": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Free-text search."
},
"sort_col": {
"type": "string",
"pattern": "^[a-z][a-z0-9_]{0,60}$",
"description": "Column to sort by (a field name of the rows)."
},
"sort_dir": {
"enum": [
"asc",
"desc"
],
"type": "string",
"description": "Sort direction."
}
}
}List item kits (bundles of items sold together) with their prices. GET /item_kits.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Rows per page, 1-100 (default 20). |
| offset | integer | Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report). |
| search | string | Free-text search. |
| category_id | integer | Only kits in this category id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"description": "Rows per page, 1-100 (default 20).",
"exclusiveMinimum": 0
},
"offset": {
"type": "integer",
"maximum": 1000000,
"minimum": 0,
"description": "Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report)."
},
"search": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Free-text search."
},
"category_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Only kits in this category id.",
"exclusiveMinimum": 0
}
}
}List or search inventory items with name, item number, category, supplier, prices and reorder level. Search by text, or by one field (name, item_number, product_id, supplier, tag_name...). GET /items.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Rows per page, 1-1000 (default 20). |
| offset | integer | Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report). |
| search | string | Free-text search. |
| sort_col | string | Column to sort by (a field name of the rows). |
| sort_dir | string | Sort direction. |
| category_id | integer | Only items in this category id - see phppos_list_categories. |
| search_field | string | Limit the search to one field. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"maximum": 1000,
"description": "Rows per page, 1-1000 (default 20).",
"exclusiveMinimum": 0
},
"offset": {
"type": "integer",
"maximum": 1000000,
"minimum": 0,
"description": "Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report)."
},
"search": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Free-text search."
},
"sort_col": {
"type": "string",
"pattern": "^[a-z][a-z0-9_]{0,60}$",
"description": "Column to sort by (a field name of the rows)."
},
"sort_dir": {
"enum": [
"asc",
"desc"
],
"type": "string",
"description": "Sort direction."
},
"category_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Only items in this category id - see phppos_list_categories.",
"exclusiveMinimum": 0
},
"search_field": {
"enum": [
"item_id",
"item_number",
"product_id",
"name",
"description",
"size",
"cost_price",
"unit_price",
"promo_price",
"reorder_level",
"supplier",
"manufacturer_name",
"tag_name",
"ecommerce_product_id"
],
"type": "string",
"description": "Limit the search to one field."
}
}
}List the store's locations (shops/warehouses) with name, address, phone, email, time zone and default tax rates, plus each location's registers (id and name). Use the location ids to filter sales, expenses, customers and reports. Payment-processor credentials and device settings are never returned. GET /locations.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Rows per page, 1-100 (default 20). |
| offset | integer | Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report). |
| search | string | Free-text search. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"description": "Rows per page, 1-100 (default 20).",
"exclusiveMinimum": 0
},
"offset": {
"type": "integer",
"maximum": 1000000,
"minimum": 0,
"description": "Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report)."
},
"search": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Free-text search."
}
}
}List receivings (stock received from suppliers, purchase orders, transfers) with supplier, totals and items, by date range. GET /receivings.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Rows per page, 1-1000 (default 25). |
| offset | integer | Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report). |
| end_date | string | Only receivings on or before this date or date-time. |
| start_date | string | Only receivings on or after this date or date-time. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"maximum": 1000,
"description": "Rows per page, 1-1000 (default 25).",
"exclusiveMinimum": 0
},
"offset": {
"type": "integer",
"maximum": 1000000,
"minimum": 0,
"description": "Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report)."
},
"end_date": {
"type": "string",
"description": "Only receivings on or before this date or date-time."
},
"start_date": {
"type": "string",
"description": "Only receivings on or after this date or date-time."
}
}
}The catalog of the store's reports (138 of them: sales summaries, top sellers, inventory low/aging/summary, profit and loss, taxes, payments, employee, customer, supplier and store-account reports) with the inputs each accepts. Without `search` only the report keys are returned; with `search` (for example 'inventory' or 'profit') the matching reports are returned with their inputs. GET /reports.
| Argument | Type | Description |
|---|---|---|
| search | string | Only reports whose key, description or inputs contain this text. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"search": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Only reports whose key, description or inputs contain this text."
}
}
}List or search completed sales, by date range, customer (id or email) or location. verbosity: minimal (headline fields), medium (adds customer, totals, profit, location - the default here) or full (every line item, payment and tax). Suspended sales (layaways, estimates) are fetched with suspended_type. GET /sales.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Rows per page, 1-1000 (default 25). |
| offset | integer | Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report). |
| end_date | string | Only sales on or before this date or date-time. |
| verbosity | string | minimal, medium (default) or full. |
| start_date | string | Only sales on or after this date or date-time (yyyy-mm-dd or yyyy-mm-dd hh:mm:ss). |
| customer_id | integer | Only this customer's sales. |
| location_id | integer | Only sales at this location id - see phppos_list_locations. |
| email_address | string | Look the customer up by email address and return their sales. |
List or search suppliers with contact details, company, account number and balance. GET /suppliers.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Rows per page, 1-100 (default 20). |
| offset | integer | Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report). |
| search | string | Free-text search. |
| sort_col | string | Column to sort by (a field name of the rows). |
| sort_dir | string | Sort direction. |
| search_field | string | Limit the search to one field. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"description": "Rows per page, 1-100 (default 20).",
"exclusiveMinimum": 0
},
"offset": {
"type": "integer",
"maximum": 1000000,
"minimum": 0,
"description": "Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report)."
},
"search": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Free-text search."
},
"sort_col": {
"type": "string",
"pattern": "^[a-z][a-z0-9_]{0,60}$",
"description": "Column to sort by (a field name of the rows)."
},
"sort_dir": {
"enum": [
"asc",
"desc"
],
"type": "string",
"description": "Sort direction."
},
"search_field": {
"enum": [
"first_name",
"last_name",
"email",
"phone_number",
"company_name",
"account_number"
],
"type": "string",
"description": "Limit the search to one field."
}
}
}Run one of the store's reports and return it (title, summary, detail rows); `paging.next_offset` is set when more detail rows remain. Report keys and their inputs come from phppos_list_reports (for example summary_sales, top_sellers, inventory_low, summary_profit_and_loss, summary_taxes, closeout). Typical inputs go in `params`: start_date, end_date, sale_type, location_ids (array), category_id, supplier_id, customer_id, employee_id. A scoped key needs the Reports module plus that report's view permission. GET /reports/{report_key}.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Rows per page, 1-500 (default 100). |
| offset | integer | Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report). |
| params | object | The report's inputs as listed by phppos_list_reports, e.g. {"start_date":"2026-10-01","end_date":"2026-10-31","location_ids":[1]}. Do not put limit/offset here. |
| report_key* | string | Report key from phppos_list_reports (for example summary_sales or inventory_low). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"report_key"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 500,
"description": "Rows per page, 1-500 (default 100).",
"exclusiveMinimum": 0
},
"offset": {
"type": "integer",
"maximum": 1000000,
"minimum": 0,
"description": "Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report)."
},
"params": {
"type": "object",
"description": "The report's inputs as listed by phppos_list_reports, e.g. {\"start_date\":\"2026-10-01\",\"end_date\":\"2026-10-31\",\"location_ids\":[1]}. Do not put limit/offset here.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"anyOf": [
{
"type": "string",
"maxLength": 300
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "array",
"items": {
"anyOf": [
{
"type": "string",
"maxLength": 300
},
{
"type": "number"
}
]
},
"maxItems": 50
}
]
}
},
"report_key": {
"type": "string",
"pattern": "^[a-z][a-z0-9_]{0,80}$",
"description": "Report key from phppos_list_reports (for example summary_sales or inventory_low)."
}
}
}WRITE: change fields of an existing customer; only the fields you pass are sent. Overwrites the current values. Needs a Read/Write API key. The store's 'edit customer' webhook, if configured, fires. POST /customers/{person_id}.
| Argument | Type | Description |
|---|---|---|
| zip | string | Postal code. |
| city | string | City. |
| string | Email address. | |
| state | string | State or region. |
| country | string | Country. |
| taxable | boolean | Whether sales to this customer are taxed. |
| comments | string | Comments. |
| address_1 | string | Address line 1. |
| address_2 | string | Address line 2. |
| last_name | string | Last name. |
WRITE: change fields of an existing item (for example its price, category or active state); only the fields you pass are sent. Overwrites the current values, and a price change applies to the next sale. Needs a Read/Write API key. The store's 'edit item' webhook, if configured, fires. POST /items/{item_id}.
| Argument | Type | Description |
|---|---|---|
| name | string | Item name. |
| size | string | Size. |
| tags | array | Tag names. |
| item_id* | integer | Item id (find it with phppos_list_items). |
| cost_price | number | Cost price. |
| is_service | boolean | True for a service (no stock tracking). |
| product_id | string | Product id / SKU. |
| unit_price | number | Selling price. |
| category_id | integer | Category id - see phppos_list_categories. |
| string |
| What the expense was for. |
| expense_payment_type | string | Payment type, for example Cash. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"expense_description",
"expense_amount"
],
"properties": {
"category_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Expense category id.",
"exclusiveMinimum": 0
},
"expense_tax": {
"type": "number",
"maximum": 10000000000,
"minimum": 0,
"description": "Tax amount."
},
"location_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Location id - see phppos_list_locations.",
"exclusiveMinimum": 0
},
"expense_date": {
"type": "string",
"description": "When it was incurred (yyyy-mm-dd or yyyy-mm-dd hh:mm:ss); defaults to now in the store."
},
"expense_note": {
"type": "string",
"maxLength": 1000,
"description": "Note."
},
"expense_type": {
"type": "string",
"maxLength": 100,
"description": "Expense type, for example Utilities."
},
"expense_amount": {
"type": "number",
"maximum": 10000000000,
"minimum": 0,
"description": "Amount, in the store's currency, before tax."
},
"expense_reason": {
"type": "string",
"maxLength": 500,
"description": "Reason."
},
"expense_description": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "What the expense was for."
},
"expense_payment_type": {
"type": "string",
"maxLength": 60,
"description": "Payment type, for example Cash."
}
}
}| string |
| Barcode / item number (UPC). |
| promo_price | number | Promotional price. |
| supplier_id | integer | Supplier person id - see phppos_list_suppliers. |
| item_inactive | boolean | True to deactivate the item (it can no longer be sold). |
| reorder_level | number | Stock level at which the item shows as low. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "Item name."
},
"size": {
"type": "string",
"maxLength": 100,
"description": "Size."
},
"tags": {
"type": "array",
"items": {
"type": "string",
"maxLength": 60,
"minLength": 1
},
"maxItems": 20,
"description": "Tag names."
},
"cost_price": {
"type": "number",
"maximum": 10000000000,
"minimum": 0,
"description": "Cost price."
},
"is_service": {
"type": "boolean",
"description": "True for a service (no stock tracking)."
},
"product_id": {
"type": "string",
"maxLength": 100,
"description": "Product id / SKU."
},
"unit_price": {
"type": "number",
"maximum": 10000000000,
"minimum": 0,
"description": "Selling price."
},
"category_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Category id - see phppos_list_categories.",
"exclusiveMinimum": 0
},
"description": {
"type": "string",
"maxLength": 1000,
"description": "Short description."
},
"item_number": {
"type": "string",
"maxLength": 100,
"description": "Barcode / item number (UPC)."
},
"promo_price": {
"type": "number",
"maximum": 10000000000,
"minimum": 0,
"description": "Promotional price."
},
"supplier_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Supplier person id - see phppos_list_suppliers.",
"exclusiveMinimum": 0
},
"item_inactive": {
"type": "boolean",
"description": "True to deactivate the item (it can no longer be sold)."
},
"reorder_level": {
"type": "number",
"maximum": 1000000000,
"minimum": 0,
"description": "Stock level at which the item shows as low."
}
}
}| suspended_type | string | Fetch suspended sales instead of completed ones: a comma-separated list of layaway, estimate or a sale type name. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"maximum": 1000,
"description": "Rows per page, 1-1000 (default 25).",
"exclusiveMinimum": 0
},
"offset": {
"type": "integer",
"maximum": 1000000,
"minimum": 0,
"description": "Rows to skip (default 0). Pass the previous reply's next_offset (paging.next_offset for a report)."
},
"end_date": {
"type": "string",
"description": "Only sales on or before this date or date-time."
},
"verbosity": {
"enum": [
"minimal",
"medium",
"full"
],
"type": "string",
"description": "minimal, medium (default) or full."
},
"start_date": {
"type": "string",
"description": "Only sales on or after this date or date-time (yyyy-mm-dd or yyyy-mm-dd hh:mm:ss)."
},
"customer_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Only this customer's sales.",
"exclusiveMinimum": 0
},
"location_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Only sales at this location id - see phppos_list_locations.",
"exclusiveMinimum": 0
},
"email_address": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"maxLength": 254,
"description": "Look the customer up by email address and return their sales."
},
"suspended_type": {
"type": "string",
"pattern": "^[A-Za-z0-9 _.-]{1,60}(,[A-Za-z0-9 _.-]{1,60}){0,4}$",
"description": "Fetch suspended sales instead of completed ones: a comma-separated list of layaway, estimate or a sale type name."
}
}
}| person_id* | integer | Customer person id (find it with phppos_list_customers). |
| first_name | string | First name. |
| company_name | string | Company name. |
| phone_number | string | Phone number. |
| account_number | string | Customer account number. |
| internal_notes | string | Internal notes (not shown to the customer). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"person_id"
],
"properties": {
"zip": {
"type": "string",
"maxLength": 30,
"description": "Postal code."
},
"city": {
"type": "string",
"maxLength": 100,
"description": "City."
},
"email": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"maxLength": 254,
"description": "Email address."
},
"state": {
"type": "string",
"maxLength": 100,
"description": "State or region."
},
"country": {
"type": "string",
"maxLength": 100,
"description": "Country."
},
"taxable": {
"type": "boolean",
"description": "Whether sales to this customer are taxed."
},
"comments": {
"type": "string",
"maxLength": 2000,
"description": "Comments."
},
"address_1": {
"type": "string",
"maxLength": 200,
"description": "Address line 1."
},
"address_2": {
"type": "string",
"maxLength": 200,
"description": "Address line 2."
},
"last_name": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Last name."
},
"person_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Customer person id (find it with phppos_list_customers).",
"exclusiveMinimum": 0
},
"first_name": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "First name."
},
"company_name": {
"type": "string",
"maxLength": 200,
"description": "Company name."
},
"phone_number": {
"type": "string",
"maxLength": 40,
"minLength": 1,
"description": "Phone number."
},
"account_number": {
"type": "string",
"maxLength": 60,
"description": "Customer account number."
},
"internal_notes": {
"type": "string",
"maxLength": 4000,
"description": "Internal notes (not shown to the customer)."
}
}
}| description |
| string |
| Short description. |
| item_number | string | Barcode / item number (UPC). |
| promo_price | number | Promotional price. |
| supplier_id | integer | Supplier person id - see phppos_list_suppliers. |
| item_inactive | boolean | True to deactivate the item (it can no longer be sold). |
| reorder_level | number | Stock level at which the item shows as low. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"item_id"
],
"properties": {
"name": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "Item name."
},
"size": {
"type": "string",
"maxLength": 100,
"description": "Size."
},
"tags": {
"type": "array",
"items": {
"type": "string",
"maxLength": 60,
"minLength": 1
},
"maxItems": 20,
"description": "Tag names."
},
"item_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Item id (find it with phppos_list_items).",
"exclusiveMinimum": 0
},
"cost_price": {
"type": "number",
"maximum": 10000000000,
"minimum": 0,
"description": "Cost price."
},
"is_service": {
"type": "boolean",
"description": "True for a service (no stock tracking)."
},
"product_id": {
"type": "string",
"maxLength": 100,
"description": "Product id / SKU."
},
"unit_price": {
"type": "number",
"maximum": 10000000000,
"minimum": 0,
"description": "Selling price."
},
"category_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Category id - see phppos_list_categories.",
"exclusiveMinimum": 0
},
"description": {
"type": "string",
"maxLength": 1000,
"description": "Short description."
},
"item_number": {
"type": "string",
"maxLength": 100,
"description": "Barcode / item number (UPC)."
},
"promo_price": {
"type": "number",
"maximum": 10000000000,
"minimum": 0,
"description": "Promotional price."
},
"supplier_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Supplier person id - see phppos_list_suppliers.",
"exclusiveMinimum": 0
},
"item_inactive": {
"type": "boolean",
"description": "True to deactivate the item (it can no longer be sold)."
},
"reorder_level": {
"type": "number",
"maximum": 1000000000,
"minimum": 0,
"description": "Stock level at which the item shows as low."
}
}
}