Compute and verify prices from an agent, metered per call. Works keyless on a demo tenant.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Optional. A Last Price API key (lp_...). Without one, compute_price and verify_price answer from the public demo and say so, pricing_conversation can prepare inputs but not compute, and browse_catalog lists the public catalog; with one, compute_price and verify_price run on your workspace and every other tool works on it too (tools/list describes each one, including who may call it). An agent can get a sandbox key with POST https://api.last-price.ai/api/agents/register.
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.
Take the seller's standing counter: the negotiation closes as accepted at that price. This commits the buyer to the price, so call it only when you mean to buy at it. A counter past its time, a closed negotiation, or a counter the seller can no longer allow answers with a conflict and binds nothing. Needs the negotiation id and the buyer token. Public: needs no credential.
The seller's public handle, from the terms they publish.
The buyer token the first answer gave you, once. Keep it: it is the only way back into the negotiation.
The negotiation id from the first answer.
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.
Tool list last changed Oct 25, 2026.
Take the seller's standing counter: the negotiation closes as accepted at that price. This commits the buyer to the price, so call it only when you mean to buy at it. A counter past its time, a closed negotiation, or a counter the seller can no longer allow answers with a conflict and binds nothing. Needs the negotiation id and the buyer token. Public: needs no credential.
| Argument | Type | Description |
|---|---|---|
| handle* | string | The seller's public handle, from the terms they publish. |
| buyer_token* | string | The buyer token the first answer gave you, once. Keep it: it is the only way back into the negotiation. |
| negotiation_id* | string | The negotiation id from the first answer. |
{
"type": "object",
"required": [
"handle",
"negotiation_id",
"buyer_token"
],
"properties": {
"handle": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]{2,39}$",
"maxLength": 40,
"minLength": 3,
"description": "The seller's public handle, from the terms they publish."
},
"buyer_token": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "The buyer token the first answer gave you, once. Keep it: it is the only way back into the negotiation."
},
"negotiation_id": {
"type": "string",
"format": "uuid",
"description": "The negotiation id from the first answer."
}
},
"additionalProperties": false
}Activate a draft order: pass order_id. It answers 404 when the order is missing or is no longer a draft. Needs a claimed Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| order_id* | string | The order: its id, as list_orders shows it. |
{
"type": "object",
"required": [
"order_id"
],
"properties": {
"order_id": {
"type": "string",
"format": "uuid",
"description": "The order: its id, as list_orders shows it."
}
},
"additionalProperties": false
}Record one competitor price observation by hand, for the pipeline to match against your catalog: a competitor's observed price for a product. The cycle usually collects these itself. Needs a Last Price credential with commerce configure scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| raw | object | The source record, kept with the observation. |
| gtin | string | The product GTIN, used to match it to a catalog item. |
| title | string | The product title as the competitor shows it. |
| source* | string | Where the price came from, such as manual or the name of your scraper. |
| currency* | string | The currency code, such as USD. |
| competitor* | string | The competitor's name. |
| external_id | string | The competitor's own id for the product. |
| marketplace | string | Where the competitor sells it. |
| observed_at |
Add a line item to an order: pass order_id, description and unit_price, and optionally quantity (default 1) and metadata. Needs a claimed Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| metadata | object | Anything worth keeping with the record. |
| order_id* | string | The order: its id, as list_orders shows it. |
| quantity | number | How many. Defaults to 1. |
| unit_price* | number | The price of one. |
| description* | string | What the line is for. |
{
"type": "object",
"required": [
"order_id",
"description",
"unit_price"
],
"properties": {
"metadata": {
"type": "object",
"description": "Anything worth keeping with the record."
},
"order_id": {
"type": "string",
"format": "uuid",
"description": "The order: its id, as list_orders shows it."
},
"quantity": {
"type": "number",
"minimum": 0,
"description": "How many. Defaults to 1."
},
"unit_price": {
"type": "number",
"description": "The price of one.",
"exclusiveMinimum": 0
},
"description": {
"type": "string",
"maxLength": 1000,
"minLength": 1,
"description": "What the line is for."
}
},
"additionalProperties": false
}Add a DNS record to a domain your workspace registered through Last Price, to use it for more than the storefront: MX for email, TXT for SPF, DKIM, DMARC or site verification, CNAME or A for a subdomain. name is relative (blog for blog.<domain>, empty for the domain itself). Records the storefront needs cannot be replaced. Needs a Last Price credential with workspace settings write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| ttl | integer | Seconds to cache it. |
| name* | string | Relative name: blog for blog.<domain>, empty for the domain itself. |
| type* | string | The record type. |
| value* | string | The record value, such as a mail server or a target host. |
| domain_id* | string | The domain id, from list_storefronts or add_storefront_domain. |
| mx_priority | integer | MX only. Defaults to 10. |
| storefront_id* | string | The storefront id, from list_storefronts. |
Serve a storefront on a domain your company owns (white label), such as agents.yourcompany.com. Answers with two DNS records to add at your DNS provider: a TXT record proving you own the domain and the record that routes it. Then call verify_storefront_domain. Last Price domains and hosting domains are refused. Only where the workspace has storefronts switched on (else an error with code not_released). Needs a Last Price credential with workspace settings write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| domain* | string | A domain your company owns, such as agents.yourcompany.com. |
| storefront_id* | string | The storefront id, from list_storefronts. |
{
"type": "object",
"required": [
"storefront_id",
"domain"
],
"properties": {
"domain": {
"type": "string",
"maxLength": 260,
"minLength": 3,
"description": "A domain your company owns, such as agents.yourcompany.com."
},
"storefront_id": {
"type": "string",
"format": "uuid",
"description": "The storefront id, from list_storefronts."
}
},
"additionalProperties": false
}Add a person who already has a Last Price account to your workspace with a role. Only an owner can grant owner. Needs an API key sent as x-api-key that holds the team:admin scope, made by someone who is still an owner or admin of the workspace; a token or any other key is refused. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| role | string | Their role. Defaults to member. |
| user_id* | string | The person's user id: user_id on a list_team_members result. |
{
"type": "object",
"required": [
"user_id"
],
"properties": {
"role": {
"enum": [
"owner",
"admin",
"member",
"viewer",
"billing"
],
"type": "string",
"description": "Their role. Defaults to member."
},
"user_id": {
"type": "string",
"format": "uuid",
"description": "The person's user id: user_id on a list_team_members result."
}
},
"additionalProperties": false
}How should traffic be split next between price variants? Send the trials and conversions of two to ten variants and get each one's share of the next traffic by Thompson sampling: its chance of being best, with a floor so none is starved (min_weight). Exact by default; in Monte Carlo mode it samples draws times, reproducibly for a given seed. Billed as one call to the allocator function. Needs a Last Price credential with price compute scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| mode | string | Exact (the default) or Monte Carlo sampling. |
| seed | integer | Monte Carlo mode only: makes the answer repeatable. |
| draws | integer | Monte Carlo mode only: how many samples. |
| prior | object | Beta prior on the conversion rate. Defaults to a flat prior. |
| variants* | array | Two to ten variants, each with a unique id, its trials and its conversions (never more than trials). |
| min_weight | number | The least share any variant gets. |
{
"type": "object",
"required": [
"variants"
],
"properties": {
"mode": {
"enum": [
"exact",
"monte_carlo"
],
"type": "string",
"description": "Exact (the default) or Monte Carlo sampling."
},
"seed": {
"type": "integer",
"maximum": 4294967295,
"minimum": 0,
"description": "Monte Carlo mode only: makes the answer repeatable."
},
"draws": {
"type": "integer",
"maximum": 100000,
"minimum": 100,
"description": "Monte Carlo mode only: how many samples."
},
"prior": {
"type": "object",
"required": [
"alpha",
"beta"
],
"properties": {
"beta": {
"type": "number",
"maximum": 1000000,
"minimum": 1,
"description": "Prior failures."
},
"alpha": {
"type": "number",
"maximum": 1000000,
"minimum": 1,
"description": "Prior successes."
}
},
"description": "Beta prior on the conversion rate. Defaults to a flat prior.",
"additionalProperties": false
},
"variants": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"trials",
"conversions"
],
"properties": {
"id": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "A name for the variant, unique in the list."
},
"trials": {
"type": "integer",
"maximum": 100000000,
"minimum": 0,
"description": "How many times it was shown."
},
"conversions": {
"type": "integer",
"maximum": 100000000,
"minimum": 0,
"description": "How many of those converted."
}
},
"additionalProperties": false
},
"maxItems": 10,
"minItems": 2,
"description": "Two to ten variants, each with a unique id, its trials and its conversions (never more than trials)."
},
"min_weight": {
"type": "number",
"maximum": 0.5,
"minimum": 0,
"description": "The least share any variant gets."
}
},
"additionalProperties": false
}Approve and apply a proposal the pricing analyst made (an analyst.* approval, listed in get_analyst_brief and list_approvals). Its stored call runs with your own credential, so the target route checks your role and scopes; only when it succeeds is the proposal approved by you and marked applied. A refusal comes back unchanged and leaves the proposal pending. It runs once even when two applies race. Only the call the action allows runs; anything else is refused. A person, a workspace key, or the agent that owns the workspace may apply; no other agent may, and nobody applies their own request. A proposal already applied runs nothing again and says it was already applied. Needs a Last Price credential with routing write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| reason | string | Why, kept with the approval when this call approves it. Optional. |
| approval_id* | string | The proposal approval id, as get_analyst_brief or list_approvals gives it. |
{
"type": "object",
"required": [
"approval_id"
],
"properties": {
"reason": {
"type": "string",
"maxLength": 500,
"description": "Why, kept with the approval when this call approves it. Optional."
},
"approval_id": {
"type": "string",
"format": "uuid",
"description": "The proposal approval id, as get_analyst_brief or list_approvals gives it."
}
},
"additionalProperties": false
}Approve a drafted price proposal so it can be pushed to the store. proposal_id is the id from list_commerce_proposals. Deciding is for the workspace owner, a person or an agent the owner has trusted with the commerce proposal approve scope; the audit trail records who decided. Approving does not push the price: use execute_commerce_proposals. Needs a Last Price credential with commerce proposal approve scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| reason | string | Why, kept in the audit trail. Optional. |
| proposal_id* | string | The proposal id, as list_commerce_proposals gives it. |
{
"type": "object",
"required": [
"proposal_id"
],
"properties": {
"reason": {
"type": "string",
"maxLength": 500,
"description": "Why, kept in the audit trail. Optional."
},
"proposal_id": {
"type": "string",
"format": "uuid",
"description": "The proposal id, as list_commerce_proposals gives it."
}
},
"additionalProperties": false
}Approve a payout run that is awaiting approval, and pay it: one Stripe Connect transfer per connected account, each with an idempotency key so a retry never pays twice. Never by the requester: whoever requested the run (the same API key or agent, or the same person through another of their keys, their sign-in or an agent they created) is refused with 403, so a run your own credential requested needs another person, or an agent a different person created, to approve it. Refused with nothing paid: 503 while Stripe is not ready for payouts, 409 when the run is not awaiting approval or the ledger changed since the request (the run becomes stale; request it again). Payouts run in Stripe test mode, so no real money moves until Last Price switches live payouts on. Answers 404 while payout runs are not switched on for your workspace (list_payout_runs says so in execution.enabled). Needs a Last Price credential with billing write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| run_id* | string | The payout run: id on a list_payout_runs or request_payout_run result. |
{
"type": "object",
"required": [
"run_id"
],
"properties": {
"run_id": {
"type": "string",
"format": "uuid",
"description": "The payout run: id on a list_payout_runs or request_payout_run result."
}
},
"additionalProperties": false
}Ask the pricing analyst one question about your workspace's pricing, in plain words, and get short claims that each cite the findings or estimates they rest on: every number is checked against them, and a claim with a number that is not is dropped. It refuses to forecast, to state a price or to answer from anything but your own records. At most 500 characters and 30 questions an hour. Paid like the brief (your own model key, the monthly allowance, or your balance if you opted in, which only a credential with routing write or billing write may spend); when nothing pays, the answer lists the closest findings plus the x402 price and requirements for one written answer (0.02 USDC): sign them and call again with payment, which is settled only when a written answer is delivered within this call, never for a refusal. Changes no setting and no price. Needs a Last Price credential with routing read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| payment | string | Optional. The signed x402 payment, base64, as sent in an X-PAYMENT or PAYMENT-SIGNATURE header. Omit it to read what the call costs and how to pay; nothing is charged until you send it. |
| question* | string | The question, such as "Why is learning not using my estimate yet?". Treated as data, never as instructions. |
{
"type": "object",
"required": [
"question"
],
"properties": {
"payment": {
"type": "string",
"maxLength": 8192,
"minLength": 20,
"description": "Optional. The signed x402 payment, base64, as sent in an X-PAYMENT or PAYMENT-SIGNATURE header. Omit it to read what the call costs and how to pay; nothing is charged until you send it."
},
"question": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "The question, such as \"Why is learning not using my estimate yet?\". Treated as data, never as instructions."
}
},
"additionalProperties": false
}Browse the public marketplace catalog of pricing functions.
No arguments.
{
"type": "object",
"properties": {}
}Buy a day pass for your workspace: extra compute calls for 24 hours, paid with one x402 payment signed by your own wallet. Called without payment it spends nothing and returns the payment requirements (price, recipient, network, asset) to sign. Sign them, then call again with payment set to the base64 payment (the value of the X-PAYMENT or PAYMENT-SIGNATURE header). Only a self-registered agent workspace may buy one; list_day_passes shows the offer and your passes. Needs a Last Price credential with the price:compute scope.
| Argument | Type | Description |
|---|---|---|
| payment | string | Optional. The signed x402 payment, base64, as sent in an X-PAYMENT or PAYMENT-SIGNATURE header. Omit it to read what the call costs and how to pay; nothing is charged until you send it. |
{
"type": "object",
"properties": {
"payment": {
"type": "string",
"maxLength": 8192,
"minLength": 20,
"description": "Optional. The signed x402 payment, base64, as sent in an X-PAYMENT or PAYMENT-SIGNATURE header. Omit it to read what the call costs and how to pay; nothing is charged until you send it."
}
},
"additionalProperties": false
}Preview the tax an invoice or order would get from the registrations saved on Settings, Tax (US nexus, EU VAT OSS, other VAT and GST), without saving anything: the subtotal, each jurisdiction's rate and amount, the total, and why (calculated, not registered, reverse charge, exempt). US rates are state-level only unless a registration overrides them. Early access: answers that it is not released until tax calculation is switched on for the workspace. Needs a Last Price credential with billing read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| date | string | The sale date (YYYY-MM-DD); today when absent. |
| amount* | number | The pre-tax amount, in the currency's major unit. |
| exempt | boolean | True for a tax-exempt customer. |
| currency* | string | ISO 4217 code, like USD or EUR. |
| customer_id | string | A customer whose saved address and tax id to use when destination is not given. |
| destination | object | Where the customer is. |
| customer_tax_id | string |
Stop a customer's credit bundle subscription from renewing. The customer keeps the credits of the period they are in, and invoices already written stay. Cancelling one already cancelled changes nothing. Early access. Needs a Last Price credential with billing write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| subscription_id* | string | The subscription id from list_credit_bundle_subscriptions. |
{
"type": "object",
"required": [
"subscription_id"
],
"properties": {
"subscription_id": {
"type": "string",
"format": "uuid",
"description": "The subscription id from list_credit_bundle_subscriptions."
}
},
"additionalProperties": false
}Cancel a UCP checkout session: pass checkout_id. A completed session cannot be canceled, and canceling one that is already canceled changes nothing. Needs a Last Price credential with price compute scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| checkout_id* | string | The checkout session: its id, as create_ucp_checkout and list_ucp_checkouts show it. |
{
"type": "object",
"required": [
"checkout_id"
],
"properties": {
"checkout_id": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "The checkout session: its id, as create_ucp_checkout and list_ucp_checkouts show it."
}
},
"additionalProperties": false
}Change a team member's role. The last owner cannot be demoted. Needs an API key sent as x-api-key that holds the team:admin scope, made by someone who is still an owner or admin of the workspace; a token or any other key is refused. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| role* | string | The new role. |
| user_id* | string | The person's user id: user_id on a list_team_members result. |
{
"type": "object",
"required": [
"user_id",
"role"
],
"properties": {
"role": {
"enum": [
"owner",
"admin",
"member",
"viewer",
"billing"
],
"type": "string",
"description": "The new role."
},
"user_id": {
"type": "string",
"format": "uuid",
"description": "The person's user id: user_id on a list_team_members result."
}
},
"additionalProperties": false
}Run the free agent-ready check on a store: pass url, the store address. It reports whether shopping agents can check out, whether bot blocking is in the way and whether margin survives an agent's cut. It fetches the store, so it is limited per address and answers 404 while the check is not released. Public: needs no credential.
| Argument | Type | Description |
|---|---|---|
| url* | string | The store address to check. |
{
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"minLength": 1,
"description": "The store address to check."
}
},
"additionalProperties": false
}Before you pay for something, ask whether your owner's spend policy lets you pay this price to this seller. Works for any purchase, whatever wallet or checkout you pay with. Returns a decision (allow, deny or ask), a reason code and a reason. allow comes with a reservation: the amount is held against today's cap, so make the purchase, then call settle_purchase with outcome paid (and the amount paid) or failed. ask means a person approves first; once they have, send the same check again. deny means do not buy. With include_fair_price, or when the policy asks for it, the price is also judged by verify_price and its verdict and band come back with the answer. Needs a Last Price credential with price compute scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| item | string | Optional: what you are buying. |
| amount* | number | The price you are about to pay. |
| intent | object | Optional: what the buyer approved for this purchase, from an American Express intent, an AP2 intent mandate, or declared by you. A purchase that names another seller, costs more than max_amount (counting every purchase under the same intent_id), is in another currency or comes after expires_at is denied, whatever the policy allows. evidence (the token or mandate) is kept only as a hash and is not verified yet. Only where the workspace has intents switched on (else an error with code not_released). |
| pay_to | string | Optional: the wallet address (bare or CAIP-10) or merchant account id the money goes to. A person's approval is then for that account only, and confirm_purchase and settle_purchase must name the same one: another is refused with code payee_changed. Only where the workspace has payee binding switched on (else an error with code not_released). |
Is there a winner yet in a price test? Send the trials and conversions of two to ten variants and get, for each, its chance of being best, its expected loss and a 95% credible interval, and a verdict of winner, equivalent or continue. With exactly two variants, the first is the control and a sequential probability ratio test is added. Change the prior, win_probability, loss_threshold or sprt settings to be stricter or looser. Billed as one call to the significance function. Needs a Last Price credential with price compute scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| sprt | object | Sequential test settings for two variants. |
| prior | object | Beta prior on the conversion rate. Defaults to a flat prior. |
| variants* | array | Two to ten variants, each with a unique id, its trials and its conversions (never more than trials). |
| loss_threshold | number | Expected loss under which a variant is good enough. |
| win_probability | number | Chance of being best needed to call a winner. |
{
"type": "object",
"required": [
"variants"
],
"properties": {
"sprt": {
"type": "object",
"properties": {
"beta": {
"type": "number",
"description": "False negative rate.",
"exclusiveMaximum": 0.5,
"exclusiveMinimum": 0
},
"alpha": {
"type": "number",
"description": "False positive rate.",
"exclusiveMaximum": 0.5,
"exclusiveMinimum": 0
},
"minimum_detectable_effect": {
"type": "number",
"maximum": 10,
"description": "Smallest relative lift worth detecting.",
"exclusiveMinimum": 0
}
},
"description": "Sequential test settings for two variants.",
"additionalProperties": false
},
"prior": {
"type": "object",
"required": [
"alpha",
"beta"
],
"properties": {
"beta": {
"type": "number",
"maximum": 1000000,
"minimum": 1,
"description": "Prior failures."
},
"alpha": {
"type": "number",
"maximum": 1000000,
"minimum": 1,
"description": "Prior successes."
}
},
"description": "Beta prior on the conversion rate. Defaults to a flat prior.",
"additionalProperties": false
},
"variants": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"trials",
"conversions"
],
"properties": {
"id": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "A name for the variant, unique in the list."
},
"trials": {
"type": "integer",
"maximum": 100000000,
"minimum": 0,
"description": "How many times it was shown."
},
"conversions": {
"type": "integer",
"maximum": 100000000,
"minimum": 0,
"description": "How many of those converted."
}
},
"additionalProperties": false
},
"maxItems": 10,
"minItems": 2,
"description": "Two to ten variants, each with a unique id, its trials and its conversions (never more than trials)."
},
"loss_threshold": {
"type": "number",
"maximum": 1,
"description": "Expected loss under which a variant is good enough.",
"exclusiveMinimum": 0
},
"win_probability": {
"type": "number",
"description": "Chance of being best needed to call a winner.",
"exclusiveMaximum": 1,
"exclusiveMinimum": 0.5
}
},
"additionalProperties": false
}Close a session when its run of calls is done, once: what you drew counts as spent, and returned says how much of the maximum went back to today's cap. Close as soon as you are done rather than letting it lapse, so the rest of the budget is free for other purchases at once. Needs a Last Price credential with price compute scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| note | string | Optional: why the run ended. |
| session_id* | string | reservation.id from open_spend_session. |
{
"type": "object",
"required": [
"session_id"
],
"properties": {
"note": {
"type": "string",
"maxLength": 500,
"description": "Optional: why the run ended."
},
"session_id": {
"type": "string",
"format": "uuid",
"description": "reservation.id from open_spend_session."
}
},
"additionalProperties": false
}Complete a UCP checkout session: pass checkout_id. Payment processing is not configured yet, so an open session answers 501 until a payment provider is set up; a session that is already completed is returned as it is. Needs a Last Price credential with price compute scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| checkout_id* | string | The checkout session: its id, as create_ucp_checkout and list_ucp_checkouts show it. |
{
"type": "object",
"required": [
"checkout_id"
],
"properties": {
"checkout_id": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "The checkout session: its id, as create_ucp_checkout and list_ucp_checkouts show it."
}
},
"additionalProperties": false
}Compute a price for a product/context via the Last Price Pricing Compute Network. Returns the computed price, the function that produced it, token metering/cost, and a `trace` listing each stage the request passed through (cache, route, execute, fallback, constrain, meter). For a competitor offer, put competitor_price, competitor_currency and competitive_action in metadata, then supply min_price or unit_cost with target_margin_pct. Missing business inputs return an error naming them. To pay for this one call with x402 instead of a key or a balance, pass payment: a signed payment for the price it asks (call it without payment to read what it asks). Where quote expiry is switched on for the workspace, the result carries valid_until (RFC 3339): quote or charge the price only before then, and compute again after.
| Argument | Type | Description |
|---|---|---|
| geo | string | Optional geography hint, e.g. US. |
| channel | string | Optional. The sales channel the price is for, such as a shopping agent or an agent marketplace. When your workspace saved a rate for it with set_channel_rates and channel pricing is on, the price is raised so you keep the same amount after the channel's cut. |
| payment | string | Optional. The signed x402 payment, base64, as sent in an X-PAYMENT or PAYMENT-SIGNATURE header. Omit it to read what the call costs and how to pay; nothing is charged until you send it. |
| currency* | string | Three-letter ISO currency code, e.g. USD. |
| metadata | object | Optional context. For competitive pricing: competitor_price, competitor_currency and competitive_action (match or undercut); undercut requires undercut_pct. Confirm product comparability before calling. |
Price up to 100 requests in one call. Each item in requests is the same request compute_price takes: a context with a three-letter currency and optionally a product, current price, segment, geo and metadata, plus an optional function_id, routing preference, constraints and options. Every item is one metered call, drawn together from your prepaid balance, all or nothing: a balance short of the whole batch charges nothing. An item that does not price comes back as an error in its place and is given back. Send the same idempotency_key to retry safely: a repeat answers from the first answer and re-runs only the items that did not price. Needs a Last Price credential with batch price compute scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| requests* | array | The price requests, at most 100, answered in the same order. |
| idempotency_key | string | A new value for each batch you mean to run; send the same value to retry it. |
{
"type": "object",
"required": [
"requests"
],
"properties": {
"requests": {
"type": "array",
"items": {
"type": "object",
"required": [
"context"
],
"properties": {
"context": {
"type": "object",
"description": "What is being priced: currency (required, three letters), product_id, product_type, current price, customer_segment, geo, channel and metadata.",
"additionalProperties": {}
},
"options": {
"type": "object",
"description": "Optional include_explanation, include_confidence and include_alternatives.",
"additionalProperties": {}
},
"request_id": {
"type": "string",
"format": "uuid",
"description": "Optional id to match the answer to the request."
},
"constraints": {
"type": "object",
"description": "Optional min_price and max_price.",
"additionalProperties": {}
},
"function_id": {
"type": "string",
"format": "uuid",
"description": "Price with this function (see list_functions)."
},
"routing_preference": {
"enum": [
"cheapest",
"fastest",
"explicit",
"round_robin",
"weighted",
"policy",
"default"
],
"type": "string",
"description": "How to pick a function when none is named."
}
},
"additionalProperties": {}
},
"maxItems": 100,
"minItems": 1,
"description": "The price requests, at most 100, answered in the same order."
},
"idempotency_key": {
"type": "string",
"maxLength": 255,
"minLength": 8,
"description": "A new value for each batch you mean to run; send the same value to retry it."
}
},
"additionalProperties": false
}Call right before you pay for a purchase check_purchase allowed. If the workspace's owner changed the spend policy since the purchase was approved (a lower maximum, a lower daily cap, a blocked seller), it is checked again under the rules as they stand now. confirmed true: pay now. An error saying the policy changed: do not pay; the hold was released, so check the purchase again. Only while the workspace has confirming switched on (the reservation then names confirm). Needs a Last Price credential with price compute scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| pay_to | string | The account you are about to pay, when check_purchase named pay_to (then required). Another account releases the hold with code payee_changed: do not pay. |
| reservation_id* | string | reservation.id from check_purchase. |
{
"type": "object",
"required": [
"reservation_id"
],
"properties": {
"pay_to": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "The account you are about to pay, when check_purchase named pay_to (then required). Another account releases the hold with code payee_changed: do not pay."
},
"reservation_id": {
"type": "string",
"format": "uuid",
"description": "reservation.id from check_purchase."
}
},
"additionalProperties": false
}Share one observed price with the data exchange and earn 10 tokens. The data point joins the shared pool that other workspaces can read, so send only prices that are public. The same source, product and price within 24 hours is refused as a duplicate and earns nothing. Send source_url, product_name, price and a vertical such as saas. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| price* | number | The price seen, in currency units. |
| currency | string | The currency code. Defaults to USD. |
| metadata | object | Any extra detail to keep with the data point. |
| vertical* | string | The market the price belongs to, for example saas. |
| plan_name | string | The plan tier, when the product has several. |
| scraped_at | string | When the price was seen, as an ISO 8601 date-time. Defaults to now. |
| source_url* | string | The public page the price was seen on. |
| product_name* | string |
Share up to 100 observed prices with the data exchange in one call, 10 tokens for each one accepted. Each item is the same data point contribute_price_data takes. The data joins the shared pool other workspaces can read, so send only public prices. An item that repeats a source, product and price from the last 24 hours is reported as a duplicate, earns nothing and does not stop the rest. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| contributions* | array | One to 100 data points, each as contribute_price_data takes it. |
{
"type": "object",
"required": [
"contributions"
],
"properties": {
"contributions": {
"type": "array",
"items": {
"type": "object",
"required": [
"vertical",
"source_url",
"product_name",
"price"
],
"properties": {
"price": {
"type": "number",
"minimum": 0,
"description": "The price seen, in currency units."
},
"currency": {
"type": "string",
"maxLength": 8,
"minLength": 3,
"description": "The currency code. Defaults to USD."
},
"metadata": {
"type": "object",
"description": "Any extra detail to keep with the data point.",
"additionalProperties": {}
},
"vertical": {
"type": "string",
"maxLength": 128,
"minLength": 1,
"description": "The market the price belongs to, for example saas."
},
"plan_name": {
"type": "string",
"maxLength": 256,
"description": "The plan tier, when the product has several."
},
"scraped_at": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "When the price was seen, as an ISO 8601 date-time. Defaults to now."
},
"source_url": {
"type": "string",
"maxLength": 2048,
"minLength": 1,
"description": "The public page the price was seen on."
},
"product_name": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "The product or plan the price is for."
}
},
"additionalProperties": false
},
"maxItems": 100,
"minItems": 1,
"description": "One to 100 data points, each as contribute_price_data takes it."
}
},
"additionalProperties": false
}Add to your workspace's prepaid balance by card, when no crypto wallet is at hand to sign an x402 payment. amount is in US dollars with whole cents, such as "25". Nothing is charged by this call: it returns a checkout link, a card payment page for exactly that amount, and the top-up id. Give the link to the person who runs you; once they pay, the balance is credited one USDC per dollar. Poll get_card_topup with the top-up id until its status is paid. Not every workspace has card top-ups yet: a refusal lists the other ways to pay. Needs a Last Price credential with the price:compute scope.
| Argument | Type | Description |
|---|---|---|
| amount* | string | US dollars to add, with at most 2 decimals, such as "25" or "25.50". |
{
"type": "object",
"required": [
"amount"
],
"properties": {
"amount": {
"type": "string",
"pattern": "^[0-9]{1,9}(\\.[0-9]{1,2})?$",
"description": "US dollars to add, with at most 2 decimals, such as \"25\" or \"25.50\"."
}
},
"additionalProperties": false
}Link a store to the commerce pipeline: platform is one of the platforms list_commerce_connectors offers. Store credentials go in credentials; they are kept encrypted and never returned, but they do pass through this conversation, so use a key made for the purpose. The metadata also sets where competitor prices come from. Needs the owner or admin role and a Last Price credential with commerce configure scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| metadata | object | Platform settings, including where competitor prices come from. |
| platform* | string | The store platform, e.g. memory for a demo store. |
| credentials | object | The platform credentials. Write-only. |
| display_name* | string | A name for the connector. |
{
"type": "object",
"required": [
"platform",
"display_name"
],
"properties": {
"metadata": {
"type": "object",
"description": "Platform settings, including where competitor prices come from.",
"additionalProperties": {}
},
"platform": {
"type": "string",
"minLength": 1,
"description": "The store platform, e.g. memory for a demo store."
},
"credentials": {
"type": "object",
"description": "The platform credentials. Write-only.",
"additionalProperties": {}
},
"display_name": {
"type": "string",
"minLength": 1,
"description": "A name for the connector."
}
},
"additionalProperties": false
}Create a commerce pricing policy: the rules the pipeline uses to draft price proposals, with an optional floor and ceiling and an approval mode. Starts active. Needs a Last Price credential with commerce configure scope, and a claimed workspace. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| name* | string | A name for the policy. |
| rules* | array | The rules, tried in order; the first that produces a price wins. Each rule has an id, a kind and the fields its kind needs: a percent to undercut by, an amount to beat the lowest price by, a percent off the list price, a competitor to match, a fixed price, or a routing choice. The Pricing Policies section of the documentation lists them. |
| scope | object | Which items the policy covers: skus, brands and marketplaces lists. Empty covers every item. |
| is_active | boolean | Whether the pipeline applies the policy. |
| description | string | What the policy is for. |
| floor_price | number | No proposal goes below this price. |
| approval_mode | string | manual queues every proposal for a decision, auto approves small changes, shadow records proposals without acting on them. |
Add a contact to a customer: pass customer_id, name and email, and optionally external_id (unique within the customer), phone, address and metadata. Needs a claimed Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| name* | string | The contact name. |
| email* | string | The contact email. |
| phone | string | The contact phone number. |
| address | object | The contact address. |
| metadata | object | Anything worth keeping with the record. |
| customer_id* | string | The customer: its id, as list_customers shows it. |
| external_id | string | Your own id for the contact, unique within the customer. |
{
"type": "object",
"required": [
"customer_id",
"name",
"email"
],
"properties": {
"name": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "The contact name."
},
"email": {
"type": "string",
"format": "email",
"description": "The contact email."
},
"phone": {
"type": "string",
"maxLength": 64,
"description": "The contact phone number."
},
"address": {
"type": "object",
"properties": {
"city": {
"type": "string",
"maxLength": 128
},
"line1": {
"type": "string",
"maxLength": 256
},
"line2": {
"type": "string",
"maxLength": 256
},
"state": {
"type": "string",
"maxLength": 128
},
"country": {
"type": "string",
"maxLength": 128
},
"postal_code": {
"type": "string",
"maxLength": 32
}
},
"description": "The contact address.",
"additionalProperties": false
},
"metadata": {
"type": "object",
"description": "Anything worth keeping with the record."
},
"customer_id": {
"type": "string",
"format": "uuid",
"description": "The customer: its id, as list_customers shows it."
},
"external_id": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Your own id for the contact, unique within the customer."
}
},
"additionalProperties": false
}Grant a customer a prepaid credit bundle: pass customer_id and amount, and optionally currency (default USD), expires_at and metadata. The balance starts at the amount. Needs a claimed Last Price credential with billing write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| amount* | number | The amount. |
| currency | string | The currency code. Defaults to USD. |
| metadata | object | Anything worth keeping with the record. |
| expires_at | string | When the bundle expires, as an RFC 3339 date-time. |
| customer_id* | string | The customer: its id, as list_customers shows it. |
{
"type": "object",
"required": [
"customer_id",
"amount"
],
"properties": {
"amount": {
"type": "number",
"description": "The amount.",
"exclusiveMinimum": 0
},
"currency": {
"type": "string",
"maxLength": 8,
"minLength": 3,
"description": "The currency code. Defaults to USD."
},
"metadata": {
"type": "object",
"description": "Anything worth keeping with the record."
},
"expires_at": {
"type": "string",
"format": "date-time",
"description": "When the bundle expires, as an RFC 3339 date-time."
},
"customer_id": {
"type": "string",
"format": "uuid",
"description": "The customer: its id, as list_customers shows it."
}
},
"additionalProperties": false
}Create a credit bundle to sell: a name, price, billing frequency and credits (null for unlimited). status active puts it on sale now; inactive (the default) saves it to activate later. Without a code, one is made from the name. Early access. Needs a Last Price credential with billing write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| code | string | Unique in the workspace; cannot change later. |
| name* | string | |
| price* | number | |
| status | string | |
| credits* | number | null | Credits per period; null for unlimited. |
| currency* | string | ISO 4217 code in upper case; cannot change later. |
| description | string | |
| rollover_credits | number | null | Most credits that roll over; 0 for none, null for unlimited. |
| billing_frequency |
Add a customer: pass name, and optionally email, external_id (your own id for it) and metadata. Needs a claimed Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| name* | string | The customer name. |
| string | The customer email. | |
| metadata | object | Anything worth keeping with the record. |
| external_id | string | Your own id for the customer. |
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "The customer name."
},
"email": {
"type": "string",
"format": "email",
"description": "The customer email."
},
"metadata": {
"type": "object",
"description": "Anything worth keeping with the record."
},
"external_id": {
"type": "string",
"maxLength": 256,
"description": "Your own id for the customer."
}
},
"additionalProperties": false
}Open a payment dispute: pass payment_id and amount, and optionally currency (default USD), customer_id, reason, status (default open) and metadata. Workspace owners and admins are emailed and subscribed endpoints get dispute.opened. Needs a claimed Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| amount* | number | The disputed amount. |
| reason | string | Why it is disputed. |
| status | string | The dispute status. |
| currency | string | The currency code. Defaults to USD. |
| metadata | object | Anything worth keeping with the record. |
| payment_id* | string | The payment that is disputed. |
| customer_id | string | The customer who disputed it. |
{
"type": "object",
"required": [
"payment_id",
"amount"
],
"properties": {
"amount": {
"type": "number",
"description": "The disputed amount.",
"exclusiveMinimum": 0
},
"reason": {
"type": "string",
"maxLength": 2048,
"description": "Why it is disputed."
},
"status": {
"enum": [
"open",
"under_review",
"resolved",
"rejected"
],
"type": "string",
"description": "The dispute status."
},
"currency": {
"type": "string",
"maxLength": 8,
"minLength": 3,
"description": "The currency code. Defaults to USD."
},
"metadata": {
"type": "object",
"description": "Anything worth keeping with the record."
},
"payment_id": {
"type": "string",
"format": "uuid",
"description": "The payment that is disputed."
},
"customer_id": {
"type": "string",
"format": "uuid",
"description": "The customer who disputed it."
}
},
"additionalProperties": false
}Create a price experiment in draft. It needs two to ten variants, one named control, each with a price; weights are optional but must then be on every variant: relative for two variants, whole percentages adding up to 100 for more. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| key* | string | A key for the experiment: lowercase letters, digits and underscores only. |
| name* | string | A name for the experiment. |
| variants* | array | The arms to compare. |
| description | string | What the experiment tests. |
| target_sample_size | integer | How many buyers to reach before reading a winner. |
{
"type": "object",
"required": [
"key",
"name",
"variants"
],
"properties": {
"key": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "A key for the experiment: lowercase letters, digits and underscores only."
},
"name": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "A name for the experiment."
},
"variants": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"price"
],
"properties": {
"name": {
"type": "string",
"maxLength": 40,
"minLength": 1,
"description": "Lowercase letters, digits and underscores, starting with a letter."
},
"price": {
"type": "number",
"minimum": 0,
"description": "The price this arm serves."
},
"weight": {
"type": "number",
"description": "This arm's share of traffic.",
"exclusiveMinimum": 0
}
},
"additionalProperties": false
},
"maxItems": 10,
"description": "The arms to compare."
},
"description": {
"type": "string",
"maxLength": 2000,
"description": "What the experiment tests."
},
"target_sample_size": {
"type": "integer",
"minimum": 1,
"description": "How many buyers to reach before reading a winner."
}
},
"additionalProperties": false
}Register a pricing function in your workspace. execution_type is how it prices: rule based, ML model, LLM prompt, external API (your own endpoint) or composite. name is its unique lowercase id, such as acme/surge. Set is_public to list it for other workspaces. A new function starts as a draft unless status is active: make it active with update_function to have it routed to. A rule_based function prices by the rule you send (base, then steps such as margin, tiers, floor and price ending). Needs a Last Price credential with function publish scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| name* | string | Unique lowercase id: letters, digits, hyphens, underscores and slashes. |
| rule | object | For a rule based function: the rule it prices by. Its input schema is made from the rule, and a rule based function needs one before it can be active. On update null removes it. |
| tags | array | The tag list. On update it replaces the whole list. |
| status | string | draft (the default) or active, to have it routed to at once. A self-registered sandbox saves drafts only. |
| is_public | boolean | List it for other workspaces to use. Defaults to false. |
| auth_config | object | null | How to authenticate to the endpoint, such as { type: "bearer", token: "..." }. Stored encrypted and never returned: a read says only whether one is saved. On update an object replaces it and null removes it. Treat the secret as sensitive: it passes through this conversation. |
Create a hosted pricing model, with no version yet: add one with train_hosted_model or upload_hosted_model_version. A demand model outputs the chance of a sale and its price sensitivity, and the optimizer prices from that; a price model outputs a price, or a ratio of the current price. Names are unique in a workspace (409 when the name is taken). Answers 404 not_released while hosted models (the hosted-pricing-models release) are not switched on for your workspace. Needs a Last Price credential with function publish scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| kind* | string | demand: outputs a demand curve the optimizer prices from. price: outputs a price or a ratio. |
| name* | string | A name for the model, unique in your workspace. |
| description | string | What the model is for. |
| auto_promote | boolean | Make a nightly candidate active when it beats the active version on held-out quotes. Defaults to false. |
| auto_retrain | boolean | A demand model only: train a new candidate every night from your outcomes. Defaults to false. |
{
"type": "object",
"required": [
"name",
"kind"
],
"properties": {
"kind": {
"enum": [
"demand",
"price"
],
"type": "string",
"description": "demand: outputs a demand curve the optimizer prices from. price: outputs a price or a ratio."
},
"name": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "A name for the model, unique in your workspace."
},
"description": {
"type": "string",
"maxLength": 2000,
"description": "What the model is for."
},
"auto_promote": {
"type": "boolean",
"description": "Make a nightly candidate active when it beats the active version on held-out quotes. Defaults to false."
},
"auto_retrain": {
"type": "boolean",
"description": "A demand model only: train a new candidate every night from your outcomes. Defaults to false."
}
},
"additionalProperties": false
}Add an invoice for a customer: pass customer_id and amount, and optionally invoice_number, currency (default USD), due_date, status (default draft) and metadata. It does not email the customer; send_invoice does. Needs a claimed Last Price credential with billing write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| amount* | number | The amount. |
| status | string | The invoice status. |
| currency | string | The currency code. Defaults to USD. |
| due_date | string | When the invoice is due, as an RFC 3339 date-time. |
| metadata | object | Anything worth keeping with the record. |
| customer_id* | string | The customer: its id, as list_customers shows it. |
| invoice_number | string | Your number for the invoice. |
{
"type": "object",
"required": [
"customer_id",
"amount"
],
"properties": {
"amount": {
"type": "number",
"description": "The amount.",
"exclusiveMinimum": 0
},
"status": {
"enum": [
"draft",
"pending",
"sent",
"paid",
"overdue",
"cancelled"
],
"type": "string",
"description": "The invoice status."
},
"currency": {
"type": "string",
"maxLength": 8,
"minLength": 3,
"description": "The currency code. Defaults to USD."
},
"due_date": {
"type": "string",
"format": "date-time",
"description": "When the invoice is due, as an RFC 3339 date-time."
},
"metadata": {
"type": "object",
"description": "Anything worth keeping with the record."
},
"customer_id": {
"type": "string",
"format": "uuid",
"description": "The customer: its id, as list_customers shows it."
},
"invoice_number": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "Your number for the invoice."
}
},
"additionalProperties": false
}List one of your functions on the marketplace: pass function_id, and optionally is_public (default false), commission_rate (default 0.30), min_payout_threshold (default 50) and payout_currency (default USD). A listing made public is reviewed first; a function that fails the review is saved private and the refusal carries the report. Where payouts go is set by a person, not by this tool. Needs a claimed Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| is_public | boolean | List it publicly. Defaults to false. |
| function_id* | string | The pricing function UUID: id on a list_functions result. |
| commission_rate | number | The share of each sale the marketplace keeps. Defaults to 0.30. |
| payout_currency | string | The currency payouts are made in. Defaults to USD. |
| min_payout_threshold | number | The least balance that is paid out. Defaults to 50. |
{
"type": "object",
"required": [
"function_id"
],
"properties": {
"is_public": {
"type": "boolean",
"description": "List it publicly. Defaults to false."
},
"function_id": {
"type": "string",
"format": "uuid",
"description": "The pricing function UUID: id on a list_functions result."
},
"commission_rate": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "The share of each sale the marketplace keeps. Defaults to 0.30."
},
"payout_currency": {
"type": "string",
"maxLength": 3,
"minLength": 3,
"description": "The currency payouts are made in. Defaults to USD."
},
"min_payout_threshold": {
"type": "number",
"minimum": 0,
"description": "The least balance that is paid out. Defaults to 50."
}
},
"additionalProperties": false
}Add an order for a customer: pass customer_id, and optionally agent_id, billing_contact_id (a contact of that customer), status (default draft), total_amount (default 0), currency (default USD) and metadata. Needs a claimed Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| status | string | The order status. |
| agent_id | string | The agent the order is for. |
| currency | string | The currency code. Defaults to USD. |
| metadata | object | Anything worth keeping with the record. |
| customer_id* | string | The customer: its id, as list_customers shows it. |
| total_amount | number | The order total. |
| billing_contact_id | string | The contact: its id, as list_contacts shows it. |
{
"type": "object",
"required": [
"customer_id"
],
"properties": {
"status": {
"enum": [
"draft",
"pending",
"active",
"completed",
"cancelled"
],
"type": "string",
"description": "The order status."
},
"agent_id": {
"type": "string",
"format": "uuid",
"description": "The agent the order is for."
},
"currency": {
"type": "string",
"maxLength": 8,
"minLength": 3,
"description": "The currency code. Defaults to USD."
},
"metadata": {
"type": "object",
"description": "Anything worth keeping with the record."
},
"customer_id": {
"type": "string",
"format": "uuid",
"description": "The customer: its id, as list_customers shows it."
},
"total_amount": {
"type": "number",
"minimum": 0,
"description": "The order total."
},
"billing_contact_id": {
"type": "string",
"format": "uuid",
"description": "The contact: its id, as list_contacts shows it."
}
},
"additionalProperties": false
}Record a payment against a customer: pass customer_id and amount, and optionally invoice_id, currency (default USD), status (pending, completed or refunded; default pending), payment_method and metadata. It records the payment in Last Price; it does not charge anyone. Needs a claimed Last Price credential with billing write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| amount* | number | The amount. |
| status | string | The payment status. Defaults to pending. |
| currency | string | The currency code. Defaults to USD. |
| metadata | object | Anything worth keeping with the record. |
| invoice_id | string | The invoice: its id, as list_invoices shows it. |
| customer_id* | string | The customer: its id, as list_customers shows it. |
| payment_method | string | How it was paid. |
{
"type": "object",
"required": [
"customer_id",
"amount"
],
"properties": {
"amount": {
"type": "number",
"description": "The amount.",
"exclusiveMinimum": 0
},
"status": {
"enum": [
"pending",
"completed",
"refunded"
],
"type": "string",
"description": "The payment status. Defaults to pending."
},
"currency": {
"type": "string",
"maxLength": 8,
"minLength": 3,
"description": "The currency code. Defaults to USD."
},
"metadata": {
"type": "object",
"description": "Anything worth keeping with the record."
},
"invoice_id": {
"type": "string",
"format": "uuid",
"description": "The invoice: its id, as list_invoices shows it."
},
"customer_id": {
"type": "string",
"format": "uuid",
"description": "The customer: its id, as list_customers shows it."
},
"payment_method": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "How it was paid."
}
},
"additionalProperties": false
}Add a routing policy: how a price request picks a pricing function. The strategy is cheapest, fastest, explicit, round robin, weighted (needs weights with at least one above zero), policy (rules that send matching requests to a function) or default. Set is_default to make it the policy used when no function is named; that replaces the current default. Needs a Last Price credential with routing write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| name* | string | A name for the policy. |
| config | object | What the strategy needs. weights gives each function id a share (weighted). rules each send requests whose field matches to a function (policy). fallback_chain lists function ids to try in order when the strategy picks none. |
| strategy* | string | How a function is picked. |
| is_default | boolean | Make this the workspace default. Defaults to false. |
| fallback_function_id | string | null | A function to use when the strategy picks none. |
{
"type": "object",
"required": [
"name",
"strategy"
],
"properties": {
"name": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "A name for the policy."
},
"config": {
"type": "object",
"properties": {
"rules": {
"type": "array",
"items": {
"type": "object",
"required": [
"field",
"operator",
"function_id"
],
"properties": {
"field": {
"type": "string",
"minLength": 1,
"description": "The request field to test."
},
"value": {
"type": [
"string",
"number",
"boolean",
"array",
"null"
],
"description": "What to compare against; a list for in."
},
"operator": {
"enum": [
"eq",
"neq",
"gt",
"lt",
"gte",
"lte",
"in",
"contains"
],
"type": "string",
"description": "How the field is compared."
},
"function_id": {
"type": "string",
"format": "uuid",
"description": "The function to use on a match."
}
},
"additionalProperties": false
},
"description": "Checked in order; the first match picks the function."
},
"weights": {
"type": "object",
"description": "A share per function id, never negative; weighted needs at least one above zero.",
"additionalProperties": {
"type": "number",
"minimum": 0
}
},
"fallback_chain": {
"type": "array",
"items": {
"type": "string",
"format": "uuid"
},
"description": "Function ids to try in order."
},
"max_latency_ms": {
"type": "number",
"description": "The slowest answer, in milliseconds, a function may take.",
"exclusiveMinimum": 0
},
"circuit_breaker": {
"type": "object",
"required": [
"failure_threshold",
"recovery_timeout_ms",
"half_open_max_calls"
],
"properties": {
"failure_threshold": {
"type": "integer",
"minimum": 1,
"description": "Failures in a row before it opens."
},
"half_open_max_calls": {
"type": "integer",
"minimum": 1,
"description": "Trial calls while it tries again."
},
"recovery_timeout_ms": {
"type": "integer",
"minimum": 0,
"description": "Milliseconds before it tries again."
}
},
"description": "When to stop sending to a failing function.",
"additionalProperties": false
},
"max_cost_per_unit": {
"type": "number",
"minimum": 0,
"description": "The most one unit may cost, in USD."
}
},
"description": "What the strategy needs. weights gives each function id a share (weighted). rules each send requests whose field matches to a function (policy). fallback_chain lists function ids to try in order when the strategy picks none.",
"additionalProperties": false
},
"strategy": {
"enum": [
"cheapest",
"fastest",
"explicit",
"round_robin",
"weighted",
"policy",
"default"
],
"type": "string",
"description": "How a function is picked."
},
"is_default": {
"type": "boolean",
"description": "Make this the workspace default. Defaults to false."
},
"fallback_function_id": {
"type": [
"string",
"null"
],
"format": "uuid",
"description": "A function to use when the strategy picks none."
}
},
"additionalProperties": false
}Create a hosted scrape job that reads prices from one public https page with CSS selectors, on a schedule or on demand with run_scrape_job. Try the selectors first with preview_scrape_job. Hosted scraping is behind a release flag: until it is on for your workspace this answers 501 hosted_scraping_not_enabled. Runs honour robots.txt and fetch only public https pages. Needs a Last Price credential with the commerce:configure scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| url* | string | The public page to read. Must start with https://. |
| name* | string | A name for the job. |
| enabled | boolean | false pauses the schedule. |
| currency | string | Three-letter ISO 4217 code, such as USD. |
| schedule | string | How often the job runs. manual runs only with run_scrape_job. |
| vertical | string | The vertical the prices belong to, such as saas. |
| plan_selector | string | null | CSS selector for the plan name beside each price. |
| price_selector* |
Create a storefront: an agent card, llms.txt and MCP endpoint listing a selection of your public offers at <subdomain>.store.last-price.ai (and /s/<subdomain> on last-price.ai). display_name is required; the subdomain defaults to one made from it. It stays unpublished unless published is true. A workspace may run several, one per product line or audience, but each must list a different selection (offer_tags, product_ids or the kinds shown): the same offers twice is refused. Every storefront says it is powered by Last Price. Only where the workspace has storefronts switched on (else an error with code not_released). Needs a Last Price credential with workspace settings write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| tagline | string | null | One line on what it sells. |
| logo_url | string | null | An https link to your logo. |
| published | boolean | true puts it live; false takes it down. |
| subdomain | string | The <subdomain> in <subdomain>.store.last-price.ai: 3 to 40 lowercase letters, digits or hyphens. Some names are reserved. |
| offer_tags | array | Only functions with one of these tags. Empty lists every public function. |
| brand_color | string | null | A hex colour such as #0f766e. |
| contact_url |
Open a UCP checkout session: pass line_items, and optionally buyer, context, payment, signals, cart_id, fulfillment, discounts, currency, idempotency_key and agentid_token. Pass the same idempotency_key with the same body to retry safely: you get the first session back instead of a second one. Pass agentid_token to have the session record you as a verified buying agent. It answers the session with its id and status. Needs a Last Price credential with price compute scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| buyer | object | Who is buying. |
| cart_id | string | The cart this checkout comes from. |
| context | object | Where the checkout happens: locale, country, channel and the like. |
| payment | object | The payment handler and currency. |
| signals | object | Where the buyer came from: referrer, utm values and device type. |
| currency | string | The currency. Defaults to the first line item's, or USD. |
| discounts | object | Discount codes to apply. |
| line_items* | array |
Add an outbound webhook endpoint: Last Price sends a signed POST to the https url for each event you list. The answer carries the signing secret (whsec_...); keep it to verify deliveries. Events cover held agent calls awaiting approval, disputes, proposed price changes, a low balance, outcomes and changelog entries; the documentation lists their names, and an unknown name is refused. Send ping_webhook afterwards to check the endpoint answers. Needs the owner or admin role, and a key with no scope limits or a person's sign-in. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| url* | string | Where to send events. Must start with https://. |
| events* | array | The events to send, at least one, e.g. ["approval.requested","dispute.opened"]. |
| secret | string | Your own signing secret. Omit it and one is made for you. |
{
"type": "object",
"required": [
"url",
"events"
],
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "Where to send events. Must start with https://."
},
"events": {
"type": "array",
"items": {
"type": "string",
"maxLength": 64
},
"maxItems": 40,
"description": "The events to send, at least one, e.g. [\"approval.requested\",\"dispute.opened\"]."
},
"secret": {
"type": "string",
"maxLength": 256,
"minLength": 8,
"description": "Your own signing secret. Omit it and one is made for you."
}
},
"additionalProperties": false
}Approve or reject an action held for approval. Approving lets whoever asked repeat the same request once; rejecting keeps it held back for good. Deciding is for the workspace owner: a person, or the owner's own key (made without scope limits and not bound to an agent). An agent never decides its own request, and an agent-bound key or token cannot decide at all. The audit log records who decided. Needs a Last Price credential with the commerce proposal approve scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| reason | string | Why, kept with the decision. Optional. |
| decision* | string | approve or reject. |
| approval_id* | string | The approval id, as list_approvals gives it. |
{
"type": "object",
"required": [
"approval_id",
"decision"
],
"properties": {
"reason": {
"type": "string",
"maxLength": 500,
"description": "Why, kept with the decision. Optional."
},
"decision": {
"enum": [
"approve",
"reject"
],
"type": "string",
"description": "approve or reject."
},
"approval_id": {
"type": "string",
"format": "uuid",
"description": "The approval id, as list_approvals gives it."
}
},
"additionalProperties": false
}Approve or reject a learned pricing change waiting for approval (approve mode). Approving puts its estimate in force for that product, within your price guardrails; rejecting keeps the one in force, and the same estimate is not asked about again. change_id is the id from list_learned_price_changes or the webhook that announced the change. Needs a Last Price credential with routing write scope, or the key of the agent that registered an unclaimed workspace, which owns it.
| Argument | Type | Description |
|---|---|---|
| decision* | string | approve or reject. |
| change_id* | string | The change id, as list_learned_price_changes or the webhook gives it. |
{
"type": "object",
"required": [
"change_id",
"decision"
],
"properties": {
"decision": {
"enum": [
"approve",
"reject"
],
"type": "string",
"description": "approve or reject."
},
"change_id": {
"type": "string",
"format": "uuid",
"description": "The change id, as list_learned_price_changes or the webhook gives it."
}
},
"additionalProperties": false
}Approve or reject one mapping Rosetta held back, by id from list_rosetta_review. Pass action approve or reject, and reviewer to say who decided, otherwise the workspace is recorded. A decision is final: an item already decided answers 409. An agent or key that queued the item cannot decide it: that answers 403, and a person or a different agent or key decides. It sends the review-resolved webhook to the workspace's endpoints. Needs a claimed Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| id* | string | The review item id from list_rosetta_review. |
| action* | string | Approve the mapping or reject it. |
| reviewer | string | Who decided. Defaults to the workspace. |
{
"type": "object",
"required": [
"id",
"action"
],
"properties": {
"id": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "The review item id from list_rosetta_review."
},
"action": {
"enum": [
"approve",
"reject"
],
"type": "string",
"description": "Approve the mapping or reject it."
},
"reviewer": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Who decided. Defaults to the workspace."
}
},
"additionalProperties": false
}Delete a commerce pricing policy for good. To keep it but stop the pipeline using it, switch it off with update_commerce_policy. Needs a Last Price credential with commerce configure scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| policy_id* | string | The policy id, as list_commerce_policies gives it. |
{
"type": "object",
"required": [
"policy_id"
],
"properties": {
"policy_id": {
"type": "string",
"format": "uuid",
"description": "The policy id, as list_commerce_policies gives it."
}
},
"additionalProperties": false
}Delete a contact: pass contact_id. This removes the record, and it cannot be undone by another tool. Needs a claimed Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| contact_id* | string | The contact: its id, as list_contacts shows it. |
{
"type": "object",
"required": [
"contact_id"
],
"properties": {
"contact_id": {
"type": "string",
"format": "uuid",
"description": "The contact: its id, as list_contacts shows it."
}
},
"additionalProperties": false
}Delete a credit bundle and the balance left in it: pass credit_id. It cannot be undone by another tool, so check it with get_credit first. Needs a claimed Last Price credential with billing write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| credit_id* | string | The credit bundle: its id, as list_credits shows it. |
{
"type": "object",
"required": [
"credit_id"
],
"properties": {
"credit_id": {
"type": "string",
"format": "uuid",
"description": "The credit bundle: its id, as list_credits shows it."
}
},
"additionalProperties": false
}Delete a customer: pass customer_id. This removes the record, and it cannot be undone by another tool, so check it is the right one with get_customer first. Needs a claimed Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| customer_id* | string | The customer: its id, as list_customers shows it. |
{
"type": "object",
"required": [
"customer_id"
],
"properties": {
"customer_id": {
"type": "string",
"format": "uuid",
"description": "The customer: its id, as list_customers shows it."
}
},
"additionalProperties": false
}Remove your workspace's feature contract: quotes are logged without contract labels again. Needs a Last Price credential with routing write scope; from the dashboard, an owner or admin.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Delete a pricing function your workspace owns, for good. Built-in functions and other workspaces' functions cannot be deleted. To stop routing to one without losing it, set its status to inactive with update_function instead. Needs a Last Price credential with function publish scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| function_id* | string | The pricing function UUID: id on a list_functions result. |
{
"type": "object",
"required": [
"function_id"
],
"properties": {
"function_id": {
"type": "string",
"format": "uuid",
"description": "The pricing function UUID: id on a list_functions result."
}
},
"additionalProperties": false
}Delete an invoice: pass invoice_id. It cannot be undone by another tool. Needs a claimed Last Price credential with billing write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| invoice_id* | string | The invoice: its id, as list_invoices shows it. |
{
"type": "object",
"required": [
"invoice_id"
],
"properties": {
"invoice_id": {
"type": "string",
"format": "uuid",
"description": "The invoice: its id, as list_invoices shows it."
}
},
"additionalProperties": false
}Remove one of your marketplace listings: pass listing_id. The function stays; it is no longer listed. Only the owner can remove a listing. Needs a claimed Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| listing_id* | string | The marketplace listing: its id, as list_my_marketplace_listings shows it. |
{
"type": "object",
"required": [
"listing_id"
],
"properties": {
"listing_id": {
"type": "string",
"format": "uuid",
"description": "The marketplace listing: its id, as list_my_marketplace_listings shows it."
}
},
"additionalProperties": false
}Delete an order and its lines: pass order_id. Only a draft or cancelled order can be deleted; cancel it first otherwise. It cannot be undone by another tool. Needs a claimed Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| order_id* | string | The order: its id, as list_orders shows it. |
{
"type": "object",
"required": [
"order_id"
],
"properties": {
"order_id": {
"type": "string",
"format": "uuid",
"description": "The order: its id, as list_orders shows it."
}
},
"additionalProperties": false
}Remove your workspace's saved price guardrails so the defaults apply again. It answers the defaults. Read what is saved first with get_price_guardrails, because this cannot be undone by another tool. Needs a claimed Last Price credential with routing write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Delete a routing policy. This cannot be undone. Price requests that named no function stop using it. Needs a Last Price credential with routing write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| policy_id* | string | The routing policy UUID: id on a list_routing_policies result. |
{
"type": "object",
"required": [
"policy_id"
],
"properties": {
"policy_id": {
"type": "string",
"format": "uuid",
"description": "The routing policy UUID: id on a list_routing_policies result."
}
},
"additionalProperties": false
}Delete a scrape job and its run history. This cannot be undone: update_scrape_job with enabled false pauses it instead. Hosted scraping is behind a release flag: until it is on for your workspace this answers 501 hosted_scraping_not_enabled. Runs honour robots.txt and fetch only public https pages. Needs a Last Price credential with the commerce:configure scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| job_id* | string | The scrape job UUID: id on a list_scrape_jobs result. |
{
"type": "object",
"required": [
"job_id"
],
"properties": {
"job_id": {
"type": "string",
"format": "uuid",
"description": "The scrape job UUID: id on a list_scrape_jobs result."
}
},
"additionalProperties": false
}Delete a storefront and its domains. Its addresses stop answering at once. Only where the workspace has storefronts switched on (else an error with code not_released). Needs a Last Price credential with workspace settings write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| storefront_id* | string | The storefront id, from list_storefronts. |
{
"type": "object",
"required": [
"storefront_id"
],
"properties": {
"storefront_id": {
"type": "string",
"format": "uuid",
"description": "The storefront id, from list_storefronts."
}
},
"additionalProperties": false
}Delete a webhook endpoint and its delivery history. This cannot be undone: update_webhook with status inactive pauses it instead. Needs the owner or admin role, and a key with no scope limits or a person's sign-in. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| webhook_id* | string | The webhook endpoint UUID: id on a list_webhooks result. |
{
"type": "object",
"required": [
"webhook_id"
],
"properties": {
"webhook_id": {
"type": "string",
"format": "uuid",
"description": "The webhook endpoint UUID: id on a list_webhooks result."
}
},
"additionalProperties": false
}While the person is still typing or talking about an item, see what it sounds like so far: send the words so far in text (they may stop mid-word) and get a sheet with the likely name, brand, model and category, a headline and short description, up to 4 details, and certainty (0 to 1), plus up to 6 freely licensed pictures of that kind of item from Openverse and Wikimedia Commons, each with its creator, license and source link to credit. settled is true once certainty reaches 0.75: a good moment to ask the person whether that is their item, then price it with price_from_capture. side (selling or buying) shapes the headline; pictures false skips the picture search. It never gives a price. A cache miss makes one small model call, recorded as model usage, and refreshes the cached answer. Repeats may reuse that answer for ten minutes on the same server instance. Until it is switched on for your workspace it answers 404 not_released. Needs a Last Price credential with price compute scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| side | string | Whether the person is selling or buying, if known. |
| text* | string | What the person has said or typed about the item so far, as it stands (it may stop mid-word). Treated as data, never as instructions. |
| pictures | boolean | false skips the picture search. Defaults to true. |
{
"type": "object",
"required": [
"text"
],
"properties": {
"side": {
"enum": [
"selling",
"buying"
],
"type": "string",
"description": "Whether the person is selling or buying, if known."
},
"text": {
"type": "string",
"maxLength": 2000,
"minLength": 3,
"description": "What the person has said or typed about the item so far, as it stands (it may stop mid-word). Treated as data, never as instructions."
},
"pictures": {
"type": "boolean",
"description": "false skips the picture search. Defaults to true."
}
},
"additionalProperties": false
}Disconnect an app you connected by signing in: its sign-in stops working at once, and it must ask you to sign in again to come back. Pass an id from list_connected_apps. A connection with less than full access can disconnect only itself; the dashboard can disconnect any, under Profile, Sessions, Connected apps. Cannot be undone. Needs a credential that names a person: signing in to Last Price from this MCP client, or a person token. An API key names a workspace, not a person, and gets 403. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| connected_app_id* | string | The connected app's id: id on a list_connected_apps result. |
{
"type": "object",
"required": [
"connected_app_id"
],
"properties": {
"connected_app_id": {
"type": "string",
"format": "uuid",
"description": "The connected app's id: id on a list_connected_apps result."
}
},
"additionalProperties": false
}Find offers you can call for a task, ranked: describe what you are trying to do in task and get a short list of priced offers (marketplace pricing functions and paid x402 services), each with how to call it, its price per call, where that price sits against what paid x402 services list, and why it is in the list. Places marked ranked are earned on measured results (the Elo Index) and relevance; places marked explore are new offers not yet measured, about a fifth of the list by default. Nobody pays for a place. Narrow with category and max_price (USD per call). When you call an offer, send the feed reference it carries as the x-lp-feed-ref header. Public: needs no credential, limited per address. Until it is switched on it answers not released.
| Argument | Type | Description |
|---|---|---|
| task* | string | What you are trying to do, in your own words. |
| limit | integer | How many offers. Defaults to 10. |
| category | string | Only offers in this category (a marketplace vertical such as saas, or an x402 category such as inference). |
| max_price | number | Most you will pay per call, in USD. |
| explore_share | number | Share of places for new, unmeasured offers. Defaults to 0.2. |
{
"type": "object",
"required": [
"task"
],
"properties": {
"task": {
"type": "string",
"maxLength": 300,
"minLength": 3,
"description": "What you are trying to do, in your own words."
},
"limit": {
"type": "integer",
"maximum": 25,
"minimum": 1,
"description": "How many offers. Defaults to 10."
},
"category": {
"type": "string",
"maxLength": 40,
"minLength": 1,
"description": "Only offers in this category (a marketplace vertical such as saas, or an x402 category such as inference)."
},
"max_price": {
"type": "number",
"minimum": 0,
"description": "Most you will pay per call, in USD."
},
"explore_share": {
"type": "number",
"maximum": 0.5,
"minimum": 0,
"description": "Share of places for new, unmeasured offers. Defaults to 0.2."
}
},
"additionalProperties": false
}Right before you pay for one call in a session open_spend_session opened, draw the call's price from it. drawn true: pay for the call now. An error means do not pay for this call: the draws would pass the session's maximum (remaining says what is left), this one call costs more than the policy allows per purchase, your owner changed the policy and the session was closed (open a new one if it still allows), or the session is closed or expired. If the call then fails, settle_session_draw with outcome failed gives the draw back. Needs a Last Price credential with price compute scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| item | string | Optional: what this call buys. |
| note | string | Optional: a request or payment reference. |
| amount* | number | This call's price, in the session's currency. |
| pay_to | string | The account this call pays, when open_spend_session named pay_to (then required). Another account is refused with code payee_changed: do not pay; the session stays open. |
| session_id* | string | reservation.id from open_spend_session. |
{
"type": "object",
"required": [
"session_id",
"amount"
],
"properties": {
"item": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "Optional: what this call buys."
},
"note": {
"type": "string",
"maxLength": 500,
"description": "Optional: a request or payment reference."
},
"amount": {
"type": "number",
"description": "This call's price, in the session's currency.",
"exclusiveMinimum": 0
},
"pay_to": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "The account this call pays, when open_spend_session named pay_to (then required). Another account is refused with code payee_changed: do not pay; the session stays open."
},
"session_id": {
"type": "string",
"format": "uuid",
"description": "reservation.id from open_spend_session."
}
},
"additionalProperties": false
}Estimate what a task would cost to do by people across countries: pass task_description and countries (names or ISO codes), and optionally currency (default EUR), complexity (low, medium or high) and estimated_time_minutes. It makes a model call, billed to your provider key when you set one and to the platform's otherwise. Needs a claimed Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| currency | string | The currency to show costs in. Defaults to EUR. |
| countries* | array | The countries to estimate for, as names or ISO codes. |
| complexity | string | How hard the task is. |
| task_description* | string | The task to estimate. |
| estimated_time_minutes | number | How long the task takes one person, in minutes. |
{
"type": "object",
"required": [
"task_description",
"countries"
],
"properties": {
"currency": {
"type": "string",
"maxLength": 16,
"minLength": 1,
"description": "The currency to show costs in. Defaults to EUR."
},
"countries": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"maxItems": 50,
"minItems": 1,
"description": "The countries to estimate for, as names or ISO codes."
},
"complexity": {
"enum": [
"low",
"medium",
"high"
],
"type": "string",
"description": "How hard the task is."
},
"task_description": {
"type": "string",
"maxLength": 4000,
"minLength": 1,
"description": "The task to estimate."
},
"estimated_time_minutes": {
"type": "number",
"description": "How long the task takes one person, in minutes.",
"exclusiveMinimum": 0
}
},
"additionalProperties": false
}Push every approved price proposal to its connected store now. This changes live prices on the store and cannot be undone from here. Needs a Last Price credential with commerce execute scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Freeze a mapping plan into a pinned adapter: every mapping is stamped as frozen so the same input maps the same way every time with no model call. Pass plan from plan_rosetta_mapping. Returns the adapter; nothing is stored. Needs a claimed Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| plan* | object | A plan as plan_rosetta_mapping returns it. |
{
"type": "object",
"required": [
"plan"
],
"properties": {
"plan": {
"type": "object",
"required": [
"mappings"
],
"properties": {
"tier": {
"type": "string",
"maxLength": 40,
"description": "The trust tier of the suggester."
},
"notes": {
"type": "array",
"items": {
"type": "string",
"maxLength": 1000
},
"maxItems": 100,
"description": "Notes from the suggester."
},
"mappings": {
"type": "array",
"items": {
"type": "object",
"required": [
"target",
"confidence",
"origin"
],
"properties": {
"origin": {
"enum": [
"heuristic",
"llm",
"human",
"frozen"
],
"type": "string",
"description": "Where the mapping came from."
},
"reason": {
"type": "string",
"maxLength": 1000,
"description": "Why it was mapped."
},
"source": {
"type": "string",
"maxLength": 500,
"description": "The source dot path."
},
"target": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "The target dot path."
},
"transform": {
"type": "object",
"description": "The transform, for example { \"kind\": \"toString\" }.",
"additionalProperties": {}
},
"confidence": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "How sure the mapping is."
}
},
"additionalProperties": false
},
"maxItems": 500,
"minItems": 1,
"description": "The field mappings."
},
"confidence": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "The plan confidence."
},
"source_schema_id": {
"type": "string",
"maxLength": 200,
"description": "The source the plan maps from."
},
"target_schema_id": {
"type": "string",
"maxLength": 200,
"description": "The schema the plan maps onto."
}
},
"description": "A plan as plan_rosetta_mapping returns it.",
"additionalProperties": false
}
},
"additionalProperties": false
}Write the Last Price integration code for an app (Next.js, Express or FastAPI): a client that records signals, prices calls, creates customers and bills them through Stripe, plus an example, as files and one patch for git apply. Writes nothing anywhere. Early access. Needs a Last Price credential with billing read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| agent_id | string | One of your agents, filled into the code. |
| payments | boolean | Include billing through Stripe (default true). |
| customers | boolean | Include creating customers at sign-up (default true). |
| framework* | string | |
| event_name | string | The billable event the example records, like chat.completed. |
{
"type": "object",
"required": [
"framework"
],
"properties": {
"agent_id": {
"type": "string",
"format": "uuid",
"description": "One of your agents, filled into the code."
},
"payments": {
"type": "boolean",
"description": "Include billing through Stripe (default true)."
},
"customers": {
"type": "boolean",
"description": "Include creating customers at sign-up (default true)."
},
"framework": {
"enum": [
"nextjs-app",
"express",
"python-fastapi"
],
"type": "string"
},
"event_name": {
"type": "string",
"pattern": "^[a-z][a-z0-9_.-]{0,63}$",
"description": "The billable event the example records, like chat.completed."
}
},
"additionalProperties": false
}Read one behaviour test run for one of your agents, with every scenario's result. In early access: it answers released false or not_released until it is switched on for your workspace. Runs never send real mail. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| run_id* | string | The run: its id, as run_agent_behaviour_tests or get_agent_behaviour_tests returned it. |
| agent_id* | string | The agent to test: its id, as an agent shows in your workspace. An agent's own credential can name only its own agent. |
{
"type": "object",
"required": [
"agent_id",
"run_id"
],
"properties": {
"run_id": {
"type": "string",
"format": "uuid",
"description": "The run: its id, as run_agent_behaviour_tests or get_agent_behaviour_tests returned it."
},
"agent_id": {
"type": "string",
"format": "uuid",
"description": "The agent to test: its id, as an agent shows in your workspace. An agent's own credential can name only its own agent."
}
},
"additionalProperties": false
}Read what the behaviour tests offer for one of your agents: whether they are released for your workspace, the scenario pack for the agent's kind, whether your workspace's own Anthropic key is connected, the limits and the recent runs. In early access: it answers released false or not_released until it is switched on for your workspace. Runs never send real mail. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| agent_id* | string | The agent to test: its id, as an agent shows in your workspace. An agent's own credential can name only its own agent. |
{
"type": "object",
"required": [
"agent_id"
],
"properties": {
"agent_id": {
"type": "string",
"format": "uuid",
"description": "The agent to test: its id, as an agent shows in your workspace. An agent's own credential can name only its own agent."
}
},
"additionalProperties": false
}Read what one agent may do: its effective scopes with a description of each, how many approvals are pending for it, its rate limit and how idempotency keys work. Pass agent_id. Call it before a planned action to learn whether it will succeed instead of meeting a 403. An agent's own credential reads only its own agent; a workspace credential reads any agent in the workspace. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| agent_id* | string | The agent: its id, as it shows in your workspace. An agent's own credential can name only its own agent. |
{
"type": "object",
"required": [
"agent_id"
],
"properties": {
"agent_id": {
"type": "string",
"format": "uuid",
"description": "The agent: its id, as it shows in your workspace. An agent's own credential can name only its own agent."
}
},
"additionalProperties": false
}Read your Personal Agent Protocol file: the organization name and domain saved for it, whether the domain is verified, the file to publish (the poppy.json a personal agent reads to learn what you let it do) and the address to publish it at. Answers released false until agent protocol files are switched on for your workspace. Read-only. Needs a Last Price credential with routing read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Read one agent's Value Receipt, measured: its signals over the period with the human value the workspace set for each, what it cost (Last Price compute plus costs recorded in the workspace) and the return when both are known. A figure that cannot be measured is null, with the reason under missing. Pass agent_id, and start_date and end_date to choose the period (default the last 30 days, at most 366). An agent's own credential reads only its own receipt. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| agent_id* | string | The agent: its id, as it shows in your workspace. An agent's own credential can name only its own agent. |
| end_date | string | The end of the period, as an ISO 8601 date and time. |
| start_date | string | The start of the period, as an ISO 8601 date and time. |
{
"type": "object",
"required": [
"agent_id"
],
"properties": {
"agent_id": {
"type": "string",
"format": "uuid",
"description": "The agent: its id, as it shows in your workspace. An agent's own credential can name only its own agent."
},
"end_date": {
"type": "string",
"format": "date-time",
"description": "The end of the period, as an ISO 8601 date and time."
},
"start_date": {
"type": "string",
"format": "date-time",
"description": "The start of the period, as an ISO 8601 date and time."
}
},
"additionalProperties": false
}Read the latest profiling report for a model on the AITune sidecar: measured latency, throughput and memory per backend, so you can choose how to serve it. Pass the model name as model. Read-only; it does not start a run. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| model* | string | The model to read the profiling report for. |
{
"type": "object",
"required": [
"model"
],
"properties": {
"model": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "The model to read the profiling report for."
}
},
"additionalProperties": false
}Read the AITune sidecar's current GPU and CPU load: utilisation, memory and temperature. Pass history true to get the readings over the last duration_minutes (1 to 1440, default 60) instead. Read-only. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| history | boolean | Return the readings over time instead of the current ones. |
| duration_minutes | integer | How far back the history goes, in minutes. Defaults to 60. |
{
"type": "object",
"properties": {
"history": {
"type": "boolean",
"description": "Return the readings over time instead of the current ones."
},
"duration_minutes": {
"type": "integer",
"maximum": 1440,
"minimum": 1,
"description": "How far back the history goes, in minutes. Defaults to 60."
}
},
"additionalProperties": false
}Read your email alert settings for your workspace: for each alert type, whether it is on and whether it comes right away or in one daily summary, whether your role gets alerts at all, and whether alert email is switched on. The agent that owns an unclaimed workspace reads its own settings. Needs a Last Price credential with notifications read scope.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Read the latest weekly brief the pricing analyst wrote for your workspace: short claims, each citing the findings it rests on (every number checked against them), the findings themselves, and the proposals it recorded as pending approvals, each with the exact call that would apply it. The analyst never applies anything: whoever approves sends that call. brief is null before the first one. Needs a Last Price credential with routing read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Read whether the pricing analyst writes your workspace a brief, how often, whether a written brief may be paid from your Last Price balance and up to what monthly cap, whether the brief is switched on for your workspace (released), the funding terms (with the x402 price of one question), and whether the commerce cycle runs on a schedule, how often, and what its latest run drafted. Needs a Last Price credential with routing read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Read one approval: the held action, who asked, its status, the reason given and when it was decided. approval_id is the id from list_approvals or the notification that announced it. Needs a Last Price credential with audit read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| approval_id* | string | The approval id, as list_approvals gives it. |
{
"type": "object",
"required": [
"approval_id"
],
"properties": {
"approval_id": {
"type": "string",
"format": "uuid",
"description": "The approval id, as list_approvals gives it."
}
},
"additionalProperties": false
}Read your workspace's prepaid balance and billing settings: the balance in USDC, whether balance billing and outcome pricing are on, the auto top-up offer, the latest ledger rows and the terms. Needs a Last Price credential with price compute scope.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Read buyer-aware pricing for your workspace: models learned nightly from your own quotes (a contextual bandit and a boosted demand model, plus a hosted model if you promoted one) that price by the kind of buyer, such as agents versus people and the sales channel. Shows the mode (shadow logs what each model would charge; live lets the chosen model price), each model with its elasticity per kind of buyer, and the last 30 days: how often each model priced, how its price compared with the price quoted, and acceptance of live-priced quotes against the rest. Needs a Last Price credential with routing read scope.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Read one card top-up of your workspace by topup_id: pending (with its checkout link), paid (the balance holds it), expired (the payment page lapsed unpaid) or failed, with the amount in US dollars and the USDC credited. Needs a Last Price credential with the price:compute scope.
| Argument | Type | Description |
|---|---|---|
| topup_id* | string | The card top-up UUID: topup_id on a create_card_topup result. |
{
"type": "object",
"required": [
"topup_id"
],
"properties": {
"topup_id": {
"type": "string",
"format": "uuid",
"description": "The card top-up UUID: topup_id on a create_card_topup result."
}
},
"additionalProperties": false
}What changed in Last Price: the newest release notes, optionally for one feature, written for agents as well as people. Pass feature (a tag such as billing, webhooks, mcp, agent-payments, approvals) to follow one part of the product, and since (YYYY-MM-DD, for example the date you last checked) to see only newer notes. Each note has its date, title, summary, category, feature tags, a link to the full note and, when there is one, the docs section and app screen it is about. Public: needs no credential. Check it at the start of a session and before changing integration code.
| Argument | Type | Description |
|---|---|---|
| limit | integer | How many notes at most, newest first. |
| since | string | Only notes dated after this day (YYYY-MM-DD). |
| feature | string | A feature tag slug, for example billing. Omit for every feature. |
| audience | string | Only notes written for this audience. Omit for both. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"default": 10,
"maximum": 50,
"minimum": 1,
"description": "How many notes at most, newest first."
},
"since": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Only notes dated after this day (YYYY-MM-DD)."
},
"feature": {
"type": "string",
"pattern": "^[a-z][a-z0-9-]*$",
"description": "A feature tag slug, for example billing. Omit for every feature."
},
"audience": {
"enum": [
"agents",
"users"
],
"type": "string",
"description": "Only notes written for this audience. Omit for both."
}
}
}Read the channel rates saved for your workspace: what each sales channel, such as a shopping agent or an agent marketplace, keeps of a sale, and how much of that cut is added to the price. released says whether channel pricing is on for your workspace; rates are saved either way and apply only while it is on. Needs a Last Price credential with routing read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Read one commerce pricing policy: its scope and rules. policy_id is the id from list_commerce_policies. Needs a Last Price credential with commerce catalog read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| policy_id* | string | The policy id, as list_commerce_policies gives it. |
{
"type": "object",
"required": [
"policy_id"
],
"properties": {
"policy_id": {
"type": "string",
"format": "uuid",
"description": "The policy id, as list_commerce_policies gives it."
}
},
"additionalProperties": false
}Read one contact: its name, email, phone, address, external id and metadata. Pass contact_id. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| contact_id* | string | The contact: its id, as list_contacts shows it. |
{
"type": "object",
"required": [
"contact_id"
],
"properties": {
"contact_id": {
"type": "string",
"format": "uuid",
"description": "The contact: its id, as list_contacts shows it."
}
},
"additionalProperties": false
}Read one contact by the id your own system gives it: pass external_id and customer_id, because an external id is only unique within one customer. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| customer_id* | string | The customer: its id, as list_customers shows it. |
| external_id* | string | The id your own system gives the contact. |
{
"type": "object",
"required": [
"external_id",
"customer_id"
],
"properties": {
"customer_id": {
"type": "string",
"format": "uuid",
"description": "The customer: its id, as list_customers shows it."
},
"external_id": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "The id your own system gives the contact."
}
},
"additionalProperties": false
}Total the costs recorded in your workspace over a period, grouped by day (the default), week, month, agent, customer or type: count, total, average, smallest and largest amount for each group and currency, and overall totals. Pass start_date and end_date to choose the period. Read-only. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| end_date | string | The end of the period, as an ISO 8601 date and time. |
| group_by | string | How to group. Defaults to day. |
| start_date | string | The start of the period, as an ISO 8601 date and time. |
{
"type": "object",
"properties": {
"end_date": {
"type": "string",
"format": "date-time",
"description": "The end of the period, as an ISO 8601 date and time."
},
"group_by": {
"enum": [
"day",
"week",
"month",
"agent",
"customer",
"type"
],
"type": "string",
"description": "How to group. Defaults to day."
},
"start_date": {
"type": "string",
"format": "date-time",
"description": "The start of the period, as an ISO 8601 date and time."
}
},
"additionalProperties": false
}Read one prepaid credit bundle: its customer, amount bought, balance left, currency and expiry. Pass credit_id. Needs a Last Price credential with billing read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| credit_id* | string | The credit bundle: its id, as list_credits shows it. |
{
"type": "object",
"required": [
"credit_id"
],
"properties": {
"credit_id": {
"type": "string",
"format": "uuid",
"description": "The credit bundle: its id, as list_credits shows it."
}
},
"additionalProperties": false
}The credit a customer has left to spend: the total of their unexpired bundles with a balance, per currency. Needs a Last Price credential with billing read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| customer_id* | string | The customer UUID. |
{
"type": "object",
"required": [
"customer_id"
],
"properties": {
"customer_id": {
"type": "string",
"format": "uuid",
"description": "The customer UUID."
}
},
"additionalProperties": false
}Read one customer: its name, email, external id and metadata. Pass customer_id. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| customer_id* | string | The customer: its id, as list_customers shows it. |
{
"type": "object",
"required": [
"customer_id"
],
"properties": {
"customer_id": {
"type": "string",
"format": "uuid",
"description": "The customer: its id, as list_customers shows it."
}
},
"additionalProperties": false
}Read one customer by the id your own system gives it: pass external_id. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| external_id* | string | The id your own system gives the customer. |
{
"type": "object",
"required": [
"external_id"
],
"properties": {
"external_id": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "The id your own system gives the customer."
}
},
"additionalProperties": false
}Read the settings behind simulate_agent_cut: whether the cut advisor is released for your workspace, the defaults it applies and the limits on each input. Free to call; read it before simulate_agent_cut to see what it will accept. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Read one payment dispute: its payment, customer, amount, status and reason. Pass dispute_id. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| dispute_id* | string | The dispute: its id, as list_disputes shows it. |
{
"type": "object",
"required": [
"dispute_id"
],
"properties": {
"dispute_id": {
"type": "string",
"format": "uuid",
"description": "The dispute: its id, as list_disputes shows it."
}
},
"additionalProperties": false
}Read one experiment's definition: its key, name, description, status, variants with their prices and weights, target sample size and dates. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| experiment_key* | string | The experiment key: key on a list_experiments result, lowercase letters, digits and underscores. |
{
"type": "object",
"required": [
"experiment_key"
],
"properties": {
"experiment_key": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "The experiment key: key on a list_experiments result, lowercase letters, digits and underscores."
}
},
"additionalProperties": false
}Read how an experiment is doing: for each variant the views, conversions, conversion rate and revenue, and a comparison of every variant against the control. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| experiment_key* | string | The experiment key: key on a list_experiments result, lowercase letters, digits and underscores. |
{
"type": "object",
"required": [
"experiment_key"
],
"properties": {
"experiment_key": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "The experiment key: key on a list_experiments result, lowercase letters, digits and underscores."
}
},
"additionalProperties": false
}Read whether one of your stored experiments can stop: the verdict (stop, keep running, or no winner yet) with its reason and a one-line headline, from a sequential test against control that stays valid however often you look (mSPRT, adjusted for the number of arms), with each arm's chance to beat control and expected loss. Also the traffic split in force now, whether bandit allocation is on with its floors and the weights it would set now, and the weight history: every change the bandit made and every change to its settings. Answers "not enabled" until sequential testing is switched on for your workspace. Needs a Last Price credential for the workspace that owns the experiment. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| history_limit | integer | Most weight history entries to return. Defaults to 50. |
| experiment_key* | string | The experiment key, as created (lowercase letters, digits and underscores). |
{
"type": "object",
"required": [
"experiment_key"
],
"properties": {
"history_limit": {
"type": "integer",
"maximum": 200,
"minimum": 1,
"description": "Most weight history entries to return. Defaults to 50."
},
"experiment_key": {
"type": "string",
"pattern": "^[a-z0-9_]+$",
"maxLength": 200,
"minLength": 1,
"description": "The experiment key, as created (lowercase letters, digits and underscores)."
}
},
"additionalProperties": false
}Read your workspace's feature contract: which fields of a pricing request, nested metadata included, your buyer-aware pricing models learn from, each named by its path in the API, and the column each one gets in an ONNX export. While one is saved, each logged quote keeps only these labels, never raw metadata. Not available until feature contracts are switched on for your workspace. Needs a Last Price credential with routing read scope.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Read one launch kit's plan, for Last Price staff only: its checks, its steps in the order the launch runs them (marking the ones that send something outside Last Price), its go code, and the exact words the owner says to launch it ("go CODE", "go CODE at <UTC time>", or "go CODE without announcements"). Read only: it never switches, schedules or sends anything; launching needs the owner's go code through the launch command. Needs an API key holding the launches:read scope by name, made by someone who is still Last Price staff, sent as x-api-key or as Authorization: Bearer lp_...; any other credential gets 404. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| flag* | string | The release flag the kit launches, such as capability-servers: flag on a list_feature_launches result. |
{
"type": "object",
"required": [
"flag"
],
"properties": {
"flag": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "The release flag the kit launches, such as capability-servers: flag on a list_feature_launches result."
}
},
"additionalProperties": false
}Read Forge for your workspace: the pricing models the nightly job trained on your own reported quotes (for the workspace and its busiest products, the model and data window it chose and how often the market drifted), each with the rung it reached on the promotion ladder (bench, then replay on your logged quotes) and every gate's evidence; the recent runs; and the pricing experts the self-recoding coder wrote and tested on the test bench, without their source. Nothing here changes a price. Not available until Forge is switched on for your workspace. Needs a Last Price credential with routing read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| loop | string | Only candidates from this loop. |
| limit | integer | Most candidates to return. Defaults to 50. |
| stage | string | Only candidates at this rung, e.g. replay. |
{
"type": "object",
"properties": {
"loop": {
"enum": [
"self_training",
"self_recoding"
],
"type": "string",
"description": "Only candidates from this loop."
},
"limit": {
"type": "integer",
"maximum": 200,
"minimum": 1,
"description": "Most candidates to return. Defaults to 50."
},
"stage": {
"enum": [
"proposed",
"sandboxed",
"bench",
"replay",
"shadow",
"promoted",
"rejected",
"retired"
],
"type": "string",
"description": "Only candidates at this rung, e.g. replay."
}
},
"additionalProperties": false
}Read the frontier price model: one network trained on millions of simulated markets across every vertical, pricing topology, unit, buyer and channel, run inside Last Price on every request with no GPU. Shows which version runs (a stored one, or the seed that ships with Last Price), how much profit it gives up on the eval's one-look markets (lower is better) and the stored versions. Answers released: false while it is not switched on for your workspace. Read only. Needs a Last Price credential with routing read scope.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Read one pricing function your workspace can use: its name, description, status, tags, cost per unit, cost multiplier, and input and output schemas. Its owner also sees whether a credential is saved for it. Needs a Last Price credential with function read scope.
| Argument | Type | Description |
|---|---|---|
| function_id* | string | The pricing function UUID: id on a list_functions result. |
{
"type": "object",
"required": [
"function_id"
],
"properties": {
"function_id": {
"type": "string",
"format": "uuid",
"description": "The pricing function UUID: id on a list_functions result."
}
},
"additionalProperties": false
}Read the endpoint health of one of your external functions: the most recent probes, newest first, each with when it ran, whether it passed, its latency and any error, and whether the hourly probe covers the function. Pass function_id. Only the owner can read it. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| function_id* | string | The pricing function UUID: id on a list_functions result. |
{
"type": "object",
"required": [
"function_id"
],
"properties": {
"function_id": {
"type": "string",
"format": "uuid",
"description": "The pricing function UUID: id on a list_functions result."
}
},
"additionalProperties": false
}Read the latest marketplace review of one of your functions, from its listing: the report, whether the listing is public and the listing id. The review is null when the function has no listing or was never reviewed. Pass function_id. Only the owner can read it. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| function_id* | string | The pricing function UUID: id on a list_functions result. |
{
"type": "object",
"required": [
"function_id"
],
"properties": {
"function_id": {
"type": "string",
"format": "uuid",
"description": "The pricing function UUID: id on a list_functions result."
}
},
"additionalProperties": false
}Whether the workspace can open its billing code as a pull request: if that is switched on, whether the Last Price GitHub App is set up on this deployment, and which GitHub account the workspace installed it on. A person installs the App from the Monetization page, Automated tab. Early access. Needs a Last Price credential with billing read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Read one hosted pricing model and its versions, newest first: each version's number, source (trained or uploaded), status (candidate, active or retired), size, input spec, training metrics and ONNX operators. The ONNX file itself is downloaded from GET /api/hosted-models/{model_id}/versions/{version}, not through this tool. Answers 404 not_released while hosted models (the hosted-pricing-models release) are not switched on for your workspace. Needs a Last Price credential with function read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| model_id* | string | The hosted model's id: id on a list_hosted_models result. |
{
"type": "object",
"required": [
"model_id"
],
"properties": {
"model_id": {
"type": "string",
"format": "uuid",
"description": "The hosted model's id: id on a list_hosted_models result."
}
},
"additionalProperties": false
}Read one invoice: its customer, number, status, amount, currency and due date. Needs a Last Price credential with billing read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| invoice_id* | string | The invoice UUID: id on a list_invoices result. |
{
"type": "object",
"required": [
"invoice_id"
],
"properties": {
"invoice_id": {
"type": "string",
"format": "uuid",
"description": "The invoice UUID: id on a list_invoices result."
}
},
"additionalProperties": false
}Read your balance of data-exchange tokens: what you hold, what you have earned by contributing price data and what you have spent reading the shared pool. Pass history true to also get the latest token movements, with limit to say how many (up to 100). Free to call. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| limit | integer | How many movements to return with history. Defaults to 20. |
| history | boolean | Also return the latest token movements. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "How many movements to return with history. Defaults to 20."
},
"history": {
"type": "boolean",
"description": "Also return the latest token movements."
}
},
"additionalProperties": false
}See how buyers react to price, the data behind the chart on the learned pricing page: quotes with a reported outcome grouped into bins of quoted over current price (counts only), the fitted acceptance line with its 95% band, what a 10% raise does to sales by that line, and how the estimate moved over time. Covers the pooled workspace estimate, or one product with product_id. Owners and admins only. Needs a Last Price credential with routing read scope.
| Argument | Type | Description |
|---|---|---|
| product_id | string | One product. Omit for the pooled workspace estimate. |
{
"type": "object",
"properties": {
"product_id": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "One product. Omit for the pooled workspace estimate."
}
},
"additionalProperties": false
}Read learned pricing for your workspace: whether the default optimizer prices from the elasticity learned from your own quotes and their outcomes, how new estimates are applied (auto or approve, null until chosen), the mode it runs in now (off, preview, auto or approve), whether owners and admins are emailed, every estimate per product and pooled over the workspace with an example price it gives against the assumed default (also while learning is off, as a preview), progress toward what an estimate needs, and the recent changes. Needs a Last Price credential with routing read scope.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Read what learned routing has learned for one of your routing policies: for each function the policy can choose, the calls seen, the success rate, the latency and rate the reward used, the expected reward with an interval, and the share of calls it would route there now. learning says whether it decides the policy's traffic; reason says why not: it is not released for your workspace, the policy has not turned it on, the policy's strategy is not one it can stand in for, or it is still collecting data, and meanwhile the policy's own strategy decides. Read only. Leave policy_id out for your default policy. Pass strategy instead to read what it learned for compute_price calls that name that strategy and turn learned routing on (no policy). Needs a Last Price credential with routing read scope.
| Argument | Type | Description |
|---|---|---|
| strategy | string | Instead of a policy: the strategy that compute_price calls named while turning learned routing on. |
| policy_id | string | The routing policy UUID. Leave it out to read your workspace's default policy. |
{
"type": "object",
"properties": {
"strategy": {
"enum": [
"cheapest",
"fastest",
"round_robin",
"weighted"
],
"type": "string",
"description": "Instead of a policy: the strategy that compute_price calls named while turning learned routing on."
},
"policy_id": {
"type": "string",
"format": "uuid",
"description": "The routing policy UUID. Leave it out to read your workspace's default policy."
}
},
"additionalProperties": false
}See what model calls cost your workspace over a period (this month so far by default): totals, how much ran on your own provider key and how much on the platform's, and a daily series. Pass start_date and end_date to choose the period. Read-only. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| end_date | string | The end of the period, as an ISO 8601 date and time. |
| start_date | string | The start of the period, as an ISO 8601 date and time. |
{
"type": "object",
"properties": {
"end_date": {
"type": "string",
"format": "date-time",
"description": "The end of the period, as an ISO 8601 date and time."
},
"start_date": {
"type": "string",
"format": "date-time",
"description": "The start of the period, as an ISO 8601 date and time."
}
},
"additionalProperties": false
}Read the payout ledger for the functions you own on the marketplace: what each call earned, its commission and its payout status. Filter by payout_status and page with limit and offset. Read-only. Needs a Last Price credential with billing read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| limit | integer | How many to return. Defaults to 50. |
| offset | integer | How many to skip, for the next page. |
| payout_status | string | Only entries with this payout status. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "How many to return. Defaults to 50."
},
"offset": {
"type": "integer",
"minimum": 0,
"description": "How many to skip, for the next page."
},
"payout_status": {
"type": "string",
"maxLength": 32,
"minLength": 1,
"description": "Only entries with this payout status."
}
},
"additionalProperties": false
}Read your own negotiation with a seller: its status, the rounds used and left, the standing counter, the agreed price and the history. Needs the negotiation id and the buyer token the negotiation opened with, not an account. A wrong token and a missing negotiation answer the same not found. Public: needs no credential.
| Argument | Type | Description |
|---|---|---|
| handle* | string | The seller's public handle, from the terms they publish. |
| buyer_token* | string | The buyer token the first answer gave you, once. Keep it: it is the only way back into the negotiation. |
| negotiation_id* | string | The negotiation id from the first answer. |
{
"type": "object",
"required": [
"handle",
"negotiation_id",
"buyer_token"
],
"properties": {
"handle": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]{2,39}$",
"maxLength": 40,
"minLength": 3,
"description": "The seller's public handle, from the terms they publish."
},
"buyer_token": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "The buyer token the first answer gave you, once. Keep it: it is the only way back into the negotiation."
},
"negotiation_id": {
"type": "string",
"format": "uuid",
"description": "The negotiation id from the first answer."
}
},
"additionalProperties": false
}Read how your workspace takes offers and counter-offers from buyers: whether offers are on, your public handle, the rounds, concession and expiry limits, the products open to offers with their list and floor prices, the last 30 days' negotiations, and the public URLs a buyer's agent uses. Needs a Last Price credential with routing read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Read a seller's negotiable terms by their public handle: which products are open to offers, at what list price and currency, how many offers a negotiation allows and how long a counter stands. Never the floor price. Pass product_id to narrow it to one product. Public: needs no credential. An unknown handle, a seller with offers off and a product that is off all answer not found.
| Argument | Type | Description |
|---|---|---|
| handle* | string | The seller's public handle, from the terms they publish. |
| product_id | string | The seller's id for the product. |
{
"type": "object",
"required": [
"handle"
],
"properties": {
"handle": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]{2,39}$",
"maxLength": 40,
"minLength": 3,
"description": "The seller's public handle, from the terms they publish."
},
"product_id": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "The seller's id for the product."
}
},
"additionalProperties": false
}Read one order: its customer, status, total, currency and metadata. Pass order_id. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| order_id* | string | The order: its id, as list_orders shows it. |
{
"type": "object",
"required": [
"order_id"
],
"properties": {
"order_id": {
"type": "string",
"format": "uuid",
"description": "The order: its id, as list_orders shows it."
}
},
"additionalProperties": false
}Read one payment: its invoice, customer, amount, currency, status and method. Needs a Last Price credential with billing read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| payment_id* | string | The payment UUID: id on a list_payments result. |
{
"type": "object",
"required": [
"payment_id"
],
"properties": {
"payment_id": {
"type": "string",
"format": "uuid",
"description": "The payment UUID: id on a list_payments result."
}
},
"additionalProperties": false
}Read one payout run with its Stripe transfers: each transfer's status (pending, processing, paid, waiting for a retry, or failed), attempts, last error, next retry time, Stripe transfer id and idempotency key. Answers 404 while payout runs are not switched on for your workspace (list_payout_runs says so in execution.enabled). Needs a Last Price credential with billing read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| run_id* | string | The payout run: id on a list_payout_runs or request_payout_run result. |
{
"type": "object",
"required": [
"run_id"
],
"properties": {
"run_id": {
"type": "string",
"format": "uuid",
"description": "The payout run: id on a list_payout_runs or request_payout_run result."
}
},
"additionalProperties": false
}Read your workspace's payout schedule: whether it is on, weekly or monthly, its run day, whether it retries transfers on its own, the next run day, the period that day will request and what the last run day did. schedule is null when none is saved. Payout schedules are part of payout runs: while those are not switched on for your workspace, execution.enabled is false and schedule is null. Needs a Last Price credential with billing read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}One check from the workspace's price history with its whole answer, as price_from_capture first gave it: the item and its condition, the price, range and confidence, the reason, prices read off tags or listings, what would make it sharper, and the listing (selling) or message to the seller (buying). check_id is the id from list_price_checks, or the check_id price_from_capture returned. The photos, files, links and text sent are never kept, only the answer. Another workspace's id, or an unknown one, is a 404. Changes nothing. Until price history is switched on for your workspace it answers 404 not_released. Needs a Last Price credential with price compute scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| check_id* | string | The check's id, from list_price_checks or the check_id price_from_capture returned. |
{
"type": "object",
"required": [
"check_id"
],
"properties": {
"check_id": {
"type": "string",
"format": "uuid",
"description": "The check's id, from list_price_checks or the check_id price_from_capture returned."
}
},
"additionalProperties": false
}Read whether your workspace explores prices: learned and optimizer prices for the same product then vary slightly from call to call, by up to the rate either way (steered toward the best price, at most 10%, once enough is learned), so Last Price can learn what buyers will pay. Never below cost and always inside your price guardrails. Shows whether it is on and why, the rate, and the bounds. Needs a Last Price credential with routing read scope.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Read the price guardrails saved for your workspace, and the defaults set_price_guardrails fills in for an omitted field. saved is false when none are saved, and then no workspace limit applies. Needs a Last Price credential with routing read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Read what your workspace's own records say about its pricing, as findings, most urgent first: learned estimates ready while learned pricing is off, estimates that cannot be used yet and exactly what each needs, whether enough quotes have a reported outcome, how often your guardrails held prices back, and approvals waiting or about to expire. Each finding states its numbers and names the call that would act on it; nothing is changed. Free, and computed without an AI model. Needs a Last Price credential with routing read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Per-prompt-class quality benchmarks across pricing functions and providers: for each kind of request (no text, code, extraction or JSON, multilingual, long form, short factual, general), how good (quality), how fast (p50 and p95 latency) and how cheap (mean cost) each function or provider is. Every cell names its source (simulated bench, recorded bench, or your workspace's own routed calls), its quality metric and its sample size; sources are never mixed. Your workspace's cells appear once a cell has min_events routed calls. Only aggregates: no prompt text is stored. Use it to choose a routing preference or function per kind of request. Needs a Last Price credential with routing read scope; answers 404 until prompt-class benchmarks are on for your workspace. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| min_events | integer | Fewest routed calls a cell of your own needs to be shown. |
| window_days | integer | Days of your routed calls to aggregate. |
{
"type": "object",
"properties": {
"min_events": {
"type": "integer",
"default": 20,
"maximum": 1000,
"minimum": 5,
"description": "Fewest routed calls a cell of your own needs to be shown."
},
"window_days": {
"type": "integer",
"default": 30,
"maximum": 90,
"minimum": 1,
"description": "Days of your routed calls to aggregate."
}
},
"additionalProperties": false
}Read the public pricing-function leaderboard: the functions the community uses most, ranked by distinct outside consumers, with their rating. Pass window as 7d, 30d, 90d or all (default all). Public: needs no credential, limited per address.
| Argument | Type | Description |
|---|---|---|
| window | string | How far back to rank. Defaults to all. |
{
"type": "object",
"properties": {
"window": {
"enum": [
"7d",
"30d",
"90d",
"all"
],
"type": "string",
"description": "How far back to rank. Defaults to all."
}
},
"additionalProperties": false
}Read one buyer intent across every check made under its intent_id: the intent as recorded (source, merchant, maximum, currency, expiry, the evidence hash, and verified, false until Last Price can check the evidence), how many checks were allowed, denied or asked about, and how much of the maximum is held, spent and left. Use it before the next purchase under the same intent. An agent key sees only its own checks. Only where the workspace has intents switched on (else an error with code not_released). Needs a Last Price credential with price compute scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| intent_id* | string | The intent_id a check_purchase carried. |
{
"type": "object",
"required": [
"intent_id"
],
"properties": {
"intent_id": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "The intent_id a check_purchase carried."
}
},
"additionalProperties": false
}Get the receipt for one of your workspace's priced calls, by its usage event id (the id list_usage_events returns and report_outcome takes): what was priced, by which function and agent, when, the amount, how it was paid, and the outcome if one was reported. Receipts are made only when you ask, never sent for every call. For CSV or a printable page, call GET /api/receipts/{id} with format=csv or format=html. Needs a Last Price credential with price compute or billing read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| usage_event_id* | string | The priced call's usage event id, as list_usage_events returns it. |
{
"type": "object",
"required": [
"usage_event_id"
],
"properties": {
"usage_event_id": {
"type": "string",
"format": "uuid",
"description": "The priced call's usage event id, as list_usage_events returns it."
}
},
"additionalProperties": false
}Run a reel live and read its transcript: each step's tool, arguments, status, time and answer, the outcome in one line, and an Ed25519 signature over the transcript checkable at /.well-known/quote-keys.json when signing is configured. Every read is a fresh run on the keyless demo, so it shows what the API answers now, not a recording. It spends your own demo allowance. Public: needs no credential. Until it is switched on it answers not released.
| Argument | Type | Description |
|---|---|---|
| reel_id* | string | Which reel to run; list_reels lists them. |
{
"type": "object",
"required": [
"reel_id"
],
"properties": {
"reel_id": {
"enum": [
"price-a-saas-seat",
"check-a-vendor-quote",
"find-an-offer-for-a-task"
],
"type": "string",
"description": "Which reel to run; list_reels lists them."
}
},
"additionalProperties": false
}Check that the Rosetta translator is up: its status, the canonical schemas it serves and the time on its clock. Public: needs no credential.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Read one routing policy: its name, strategy, config, fallback function and whether it is the default. Needs a Last Price credential with routing read scope.
| Argument | Type | Description |
|---|---|---|
| policy_id* | string | The routing policy UUID: id on a list_routing_policies result. |
{
"type": "object",
"required": [
"policy_id"
],
"properties": {
"policy_id": {
"type": "string",
"format": "uuid",
"description": "The routing policy UUID: id on a list_routing_policies result."
}
},
"additionalProperties": false
}Read the spend policies your workspace's buyer agents spend under (the most per purchase, a daily cap in UTC days, when a person approves first, which sellers and categories), the defaults a save fills in, and what today's reservations hold. An agent key sees its own policy and the workspace default. Needs a Last Price credential with routing read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| agent_id | string | Optional: also say which policy governs this agent. |
{
"type": "object",
"properties": {
"agent_id": {
"type": "string",
"format": "uuid",
"description": "Optional: also say which policy governs this agent."
}
},
"additionalProperties": false
}Read a session: whether it is open, expired or closed, its maximum, what it has drawn and what remains, and its draws, newest first, each drawn, unknown or returned. Use it to resume a run, or to find a draw to settle. Needs a Last Price credential with price compute scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| session_id* | string | reservation.id from open_spend_session. |
{
"type": "object",
"required": [
"session_id"
],
"properties": {
"session_id": {
"type": "string",
"format": "uuid",
"description": "reservation.id from open_spend_session."
}
},
"additionalProperties": false
}Read one storefront with its domains, addresses and the offers it lists right now. Only where the workspace has storefronts switched on (else an error with code not_released). Needs a Last Price credential with workspace settings read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| storefront_id* | string | The storefront id, from list_storefronts. |
{
"type": "object",
"required": [
"storefront_id"
],
"properties": {
"storefront_id": {
"type": "string",
"format": "uuid",
"description": "The storefront id, from list_storefronts."
}
},
"additionalProperties": false
}Read whether your workspace has a Stripe account connected for invoices (Connect with Stripe on the Monetization page), its account id and mode, and whether this deployment can connect one. Connecting needs a person in a browser. Early access. Needs a Last Price credential with billing read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Read one UCP checkout session: pass checkout_id. Needs a Last Price credential with price compute scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| checkout_id* | string | The checkout session: its id, as create_ucp_checkout and list_ucp_checkouts show it. |
{
"type": "object",
"required": [
"checkout_id"
],
"properties": {
"checkout_id": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "The checkout session: its id, as create_ucp_checkout and list_ucp_checkouts show it."
}
},
"additionalProperties": false
}Read Last Price's Universal Commerce Protocol business profile: the services, capabilities and payment handlers a UCP agent discovers before it shops here. Public: needs no credential.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Price a cart the UCP way: pass cart with line_items, and optionally request_id, function_id, routing_preference, currency, stage (quote, cart, checkout or order), checkout, order, payment, context and agentid_token. It routes the cart through the pricing network and answers a UCP quote. Pass agentid_token (an AgentID ID token issued for Last Price) to be recorded as a verified buying agent; the answer then names you, marked verified. Needs a Last Price credential with price compute scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| cart* | object | The cart to price. |
| order | object | Order details. |
| stage | string | Where in the funnel the quote is for. Defaults to quote. |
| context | object | Anything that shapes the price: product type, country, channel. |
| payment | object | Payment details. |
| checkout | object | Checkout details. |
| currency | string | The currency to price in. |
| request_id | string | Your id for this request. |
Total your workspace's priced calls over a period, this calendar month by default: requests, units, compute time, cost, cached and prepaid calls, and the part of this month's cost still to be billed. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| end_date | string | End of the period, ISO 8601. Defaults to now. |
| start_date | string | Start of the period, ISO 8601. Defaults to the first of this month. |
{
"type": "object",
"properties": {
"end_date": {
"type": "string",
"format": "date-time",
"description": "End of the period, ISO 8601. Defaults to now."
},
"start_date": {
"type": "string",
"format": "date-time",
"description": "Start of the period, ISO 8601. Defaults to the first of this month."
}
},
"additionalProperties": false
}See your usage grouped by pricing function: calls, spend and outcomes for each function over a period. Pass start_date and end_date to choose the period, and group_by function, the only grouping there is. Read-only. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| end_date | string | The end of the period, as an ISO 8601 date and time. |
| group_by | string | How to group. Only function is available. |
| start_date | string | The start of the period, as an ISO 8601 date and time. |
{
"type": "object",
"properties": {
"end_date": {
"type": "string",
"format": "date-time",
"description": "The end of the period, as an ISO 8601 date and time."
},
"group_by": {
"enum": [
"function"
],
"type": "string",
"description": "How to group. Only function is available."
},
"start_date": {
"type": "string",
"format": "date-time",
"description": "The start of the period, as an ISO 8601 date and time."
}
},
"additionalProperties": false
}Read the USDC a wallet holds on the network pay-per-call uses, from the chain, and what it covers: paid calls and day passes. address is the wallet that signs your x402 payments. Check it before buy_day_pass, top_up_balance or a paid compute_price. Nothing is signed and no money moves. Needs a Last Price credential with the price:compute scope.
| Argument | Type | Description |
|---|---|---|
| address* | string | The 0x wallet address that pays. |
{
"type": "object",
"required": [
"address"
],
"properties": {
"address": {
"type": "string",
"pattern": "^0x[0-9a-fA-F]{40}$",
"description": "The 0x wallet address that pays."
}
},
"additionalProperties": false
}Read your workspace settings: company name, address, email, phone, website and description, tax id, default currency, payment terms, invoice prefix and footer, whether tax is on, the tax registrations and the sales playbook. Model keys are never shown. Needs a Last Price credential with workspace settings read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Read the x402 market price band: what paid x402 services list per call in public x402 discovery catalogs, as the 10th percentile, median and 90th percentile price per call for each category and over every category, with how many services stand behind each band and the day it describes. Pass category to narrow to one, and days with it for that band per day. Use it to see what a paid call usually costs before you pay; verify_price and check_purchase use the same band. List prices only, never evidence of demand: some sellers pay themselves. Public: needs no credential, limited per address. Until it is switched on it answers not released.
| Argument | Type | Description |
|---|---|---|
| days | integer | With category: also that band for each of the last this many days. |
| category | string | Only this category, with the overall band. Leave out for every category. |
{
"type": "object",
"properties": {
"days": {
"type": "integer",
"maximum": 90,
"minimum": 1,
"description": "With category: also that band for each of the last this many days."
},
"category": {
"enum": [
"all",
"inference",
"search",
"scraping",
"markets",
"media",
"social",
"weather",
"other"
],
"type": "string",
"description": "Only this category, with the overall band. Leave out for every category."
}
},
"additionalProperties": false
}Give a customer an active credit bundle: its credits are added to their balance and, unless create_invoice is false, a draft invoice for its price is made. Unlimited bundles cannot be granted as a balance. Early access. Needs a Last Price credential with billing write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| plan_id* | string | |
| customer_id* | string | One of your customers. |
| create_invoice | boolean | Also create a draft invoice for the price (default true). |
{
"type": "object",
"required": [
"plan_id",
"customer_id"
],
"properties": {
"plan_id": {
"type": "string",
"format": "uuid"
},
"customer_id": {
"type": "string",
"format": "uuid",
"description": "One of your customers."
},
"create_invoice": {
"type": "boolean",
"description": "Also create a draft invoice for the price (default true)."
}
},
"additionalProperties": false
}Propose a feature contract from sample pricing requests: nested objects are flattened by path, lists reduced to counts, sums, maxima and has-value flags, numbers binned, and fields that identify someone left out, each with the reason. Nothing is stored; save the result with set_feature_contract. Needs a Last Price credential with routing read scope.
| Argument | Type | Description |
|---|---|---|
| opt_in | array | The customer segment and geo fields are used only when listed here, as in buyer-aware pricing. |
| buckets | integer | Bins for each number, at its quantiles. Default 4. |
| samples* | array | Sample request contexts, as sent to compute_price in context, metadata included. Not stored. |
| min_coverage | number | Share of samples a field must appear in. Default 0.05. |
{
"type": "object",
"required": [
"samples"
],
"properties": {
"opt_in": {
"type": "array",
"items": {
"enum": [
"customer_segment",
"geo"
],
"type": "string"
},
"description": "The customer segment and geo fields are used only when listed here, as in buyer-aware pricing."
},
"buckets": {
"type": "integer",
"maximum": 16,
"minimum": 2,
"description": "Bins for each number, at its quantiles. Default 4."
},
"samples": {
"type": "array",
"items": {
"type": "object"
},
"maxItems": 1000,
"minItems": 1,
"description": "Sample request contexts, as sent to compute_price in context, metadata included. Not stored."
},
"min_coverage": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "Share of samples a field must appear in. Default 0.05."
}
},
"additionalProperties": false
}Onboard a merchant feed with one call: send payload and canonical_target and Rosetta fingerprints the shape, reuses a frozen adapter when it has one and otherwise plans, freezes or queues the mapping by confidence. The status says stable, provisional or needs review. Pass samples, up to a few more payloads, to improve the guess, and merchant_id to label the integration in the audit trail. The first call for a new shape provisions and stores an adapter and may queue a review. Needs a claimed Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| payload* | object | The merchant record to translate. |
| samples | array | More payloads of the same shape, to improve the guess. |
| merchant_id | string | A label for the integration, kept in the audit trail. |
| canonical_target* | string | object | The id of a built-in schema (see list_canonical_schemas) or a whole schema with an id and fields. |
{
"type": "object",
"required": [
"canonical_target",
"payload"
],
"properties": {
"payload": {
"type": "object",
"description": "The merchant record to translate.",
"additionalProperties": {}
},
"samples": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": {}
},
"maxItems": 20,
"description": "More payloads of the same shape, to improve the guess."
},
"merchant_id": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "A label for the integration, kept in the audit trail."
},
"canonical_target": {
"type": [
"string",
"object"
],
"required": [
"id",
"fields"
],
"properties": {
"id": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "A stable id for the schema."
},
"fields": {
"type": "array",
"items": {
"type": "object",
"required": [
"path",
"type"
],
"properties": {
"enum": {
"type": "array",
"items": {},
"maxItems": 200,
"description": "The values the field may take."
},
"path": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "The dot path of the field."
},
"type": {
"type": "string",
"maxLength": 40,
"minLength": 1,
"description": "The field type, for example string, number or boolean."
},
"examples": {
"type": "array",
"items": {},
"maxItems": 10,
"description": "A few example values."
},
"required": {
"type": "boolean",
"description": "Whether the schema requires the field."
},
"description": {
"type": "string",
"maxLength": 1000,
"description": "What the field holds."
}
},
"additionalProperties": false
},
"maxItems": 500
}
},
"description": "The id of a built-in schema (see list_canonical_schemas) or a whole schema with an id and fields.",
"additionalProperties": false
}
},
"additionalProperties": false
}Invite someone by email to join your workspace with a role. The invitation link is emailed to them, never returned. Needs an API key sent as x-api-key that holds the team:admin scope, made by someone who is still an owner or admin of the workspace; a token or any other key is refused. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| role | string | Their role. Defaults to member. |
| email* | string | Who to invite. |
{
"type": "object",
"required": [
"email"
],
"properties": {
"role": {
"enum": [
"admin",
"member",
"viewer",
"billing"
],
"type": "string",
"description": "Their role. Defaults to member."
},
"email": {
"type": "string",
"maxLength": 254,
"minLength": 3,
"description": "Who to invite."
}
},
"additionalProperties": false
}Issue one of your invoices through your connected Stripe account so the customer pays on Stripe's page: returns the hosted invoice URL. send true also asks Stripe to email it. Safe to retry; an invoice is issued once. Early access. Needs a Last Price credential with billing write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| send | boolean | Also email it to the customer (default false). |
| invoice_id* | string | The invoice UUID: id on a list_invoices result. |
{
"type": "object",
"required": [
"invoice_id"
],
"properties": {
"send": {
"type": "boolean",
"description": "Also email it to the customer (default false)."
},
"invoice_id": {
"type": "string",
"format": "uuid",
"description": "The invoice UUID: id on a list_invoices result."
}
},
"additionalProperties": false
}List the inference backends the AITune sidecar offers your workspace and the state of each one: which are available, which are loaded and why one is not. Read-only. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}List the actions held for approval in your workspace, newest first: what was asked, who asked (agent or key), its status (pending, approved, rejected or expired) and when it expires. status pending lists what waits for a decision; pass its id to decide_approval. Needs a Last Price credential with audit read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Most approvals to return. Defaults to 50. |
| status | string | Only approvals with this status, e.g. pending. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 200,
"minimum": 1,
"description": "Most approvals to return. Defaults to 50."
},
"status": {
"enum": [
"pending",
"approved",
"rejected",
"expired"
],
"type": "string",
"description": "Only approvals with this status, e.g. pending."
}
},
"additionalProperties": false
}Read the workspace audit log, newest first: who did what and when, including who decided each approval. Filter by action, subject_kind and subject_id, agent_id or since; pass the returned cursor to page on. The team's own rows are for owners and admins. Needs a Last Price credential with audit read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Most events to return. Defaults to 50. |
| since | string | Only events at or after this time. |
| action | string | Only events with this action, e.g. approval.approve. |
| cursor | string | The cursor a previous page returned. |
| agent_id | string | Only events caused by this agent. |
| subject_id | string | Only events about this subject id. |
| subject_kind | string | Only events about this kind of subject. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 200,
"minimum": 1,
"description": "Most events to return. Defaults to 50."
},
"since": {
"type": "string",
"format": "date-time",
"description": "Only events at or after this time."
},
"action": {
"type": "string",
"description": "Only events with this action, e.g. approval.approve."
},
"cursor": {
"type": "string",
"description": "The cursor a previous page returned."
},
"agent_id": {
"type": "string",
"description": "Only events caused by this agent."
},
"subject_id": {
"type": "string",
"description": "Only events about this subject id."
},
"subject_kind": {
"type": "string",
"description": "Only events about this kind of subject."
}
},
"additionalProperties": false
}List the canonical schemas the Rosetta translator maps any vendor's data onto: product, offer, observation, match and action, with each one's id and fields. Use it to learn which canonical targets exist before you map a source. Public: needs no credential.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Read the commerce audit trail for your workspace: what the pipeline drafted, approved, rejected and executed. This is the commerce trail, separate from list_audit_events. Filter by subject_kind and subject_id, for example proposal and a proposal id. Needs a Last Price credential with commerce catalog read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Most rows to return. Defaults to 100. |
| subject_id | string | Only events about this subject id. |
| subject_kind | string | Only events about this kind of subject, e.g. proposal. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 500,
"minimum": 1,
"description": "Most rows to return. Defaults to 100."
},
"subject_id": {
"type": "string",
"description": "Only events about this subject id."
},
"subject_kind": {
"type": "string",
"description": "Only events about this kind of subject, e.g. proposal."
}
},
"additionalProperties": false
}List the catalog items the commerce pipeline tracks for your workspace: each product the cycle prices, with its current price and source. Needs a Last Price credential with commerce catalog read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Most rows to return. Defaults to 100. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 500,
"minimum": 1,
"description": "Most rows to return. Defaults to 100."
}
},
"additionalProperties": false
}List the store connectors linked to your workspace (credentials are never shown) and the platforms you can connect. Needs a Last Price credential with commerce catalog read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}List the recent competitor price observations the commerce pipeline collected: source, competitor, observed price and time. Needs a Last Price credential with commerce catalog read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Most rows to return. Defaults to 100. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 500,
"minimum": 1,
"description": "Most rows to return. Defaults to 100."
}
},
"additionalProperties": false
}List the pricing policies the commerce pipeline applies when it drafts price proposals: each policy's id, scope, rules and whether it is enabled. Needs a Last Price credential with commerce catalog read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}List the price proposals the commerce pipeline drafted, newest first, each with its status (proposed, approved, rejected, executed, failed or expired), the current and proposed price and the policy that produced it. Filter by status. Needs a Last Price credential with commerce catalog read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Most rows to return. Defaults to 100. |
| status | string | Only proposals with this status. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 500,
"minimum": 1,
"description": "Most rows to return. Defaults to 100."
},
"status": {
"enum": [
"proposed",
"approved",
"rejected",
"executed",
"failed",
"expired"
],
"type": "string",
"description": "Only proposals with this status."
}
},
"additionalProperties": false
}List the apps you connected to Last Price by signing in (Claude, ChatGPT and other MCP clients), newest first: each one's id, name, the host it returns to, the workspace, whether it has full access or which scopes, and when it was connected and last used. this_app marks the connection making this call. Read-only. Needs a credential that names a person: signing in to Last Price from this MCP client, or a person token. An API key names a workspace, not a person, and gets 403. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}List the contacts in your workspace, newest first, or only one customer's with customer_id. Page with limit and offset. Read-only. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| limit | integer | How many to return. |
| offset | integer | How many to skip, for the next page. |
| customer_id | string | The customer: its id, as list_customers shows it. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 1000,
"minimum": 1,
"description": "How many to return."
},
"offset": {
"type": "integer",
"minimum": 0,
"description": "How many to skip, for the next page."
},
"customer_id": {
"type": "string",
"format": "uuid",
"description": "The customer: its id, as list_customers shows it."
}
},
"additionalProperties": false
}List the costs recorded in your workspace, newest first: what each was for, its amount, currency and the agent or customer it belongs to. Filter by customer_id and by start_date and end_date, and page with limit and offset. Read-only. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| limit | integer | How many to return. Defaults to 100. |
| offset | integer | How many to skip, for the next page. |
| end_date | string | The end of the period, as an ISO 8601 date and time. |
| start_date | string | The start of the period, as an ISO 8601 date and time. |
| customer_id | string | The customer: its id, as it shows in your workspace. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 1000,
"minimum": 1,
"description": "How many to return. Defaults to 100."
},
"offset": {
"type": "integer",
"minimum": 0,
"description": "How many to skip, for the next page."
},
"end_date": {
"type": "string",
"format": "date-time",
"description": "The end of the period, as an ISO 8601 date and time."
},
"start_date": {
"type": "string",
"format": "date-time",
"description": "The start of the period, as an ISO 8601 date and time."
},
"customer_id": {
"type": "string",
"format": "uuid",
"description": "The customer: its id, as it shows in your workspace."
}
},
"additionalProperties": false
}List the credit bundles your workspace sells: each one's id, name, code, price, billing frequency, credits (null for unlimited), rollover and status (active, inactive or archived). Early access: answers released false with no bundles until credit bundles are switched on for the workspace. Needs a Last Price credential with billing read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| status | string | Only bundles with this status. |
{
"type": "object",
"properties": {
"status": {
"enum": [
"active",
"inactive",
"archived"
],
"type": "string",
"description": "Only bundles with this status."
}
},
"additionalProperties": false
}List the customers on a recurring credit bundle (monthly, quarterly or annually), newest first: each subscription's customer, status, current period and when it renews, and why it was cancelled. Granting a recurring bundle starts one; each period end renews it with the bundle's credits plus the rollover. Early access. Needs a Last Price credential with billing read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Page size, 100 by default. |
| offset | integer | Rows to skip. |
| status | string | Only subscriptions with this status. |
| plan_id* | string | The bundle id from list_credit_bundle_plans. |
{
"type": "object",
"required": [
"plan_id"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 1000,
"minimum": 1,
"description": "Page size, 100 by default."
},
"offset": {
"type": "integer",
"minimum": 0,
"description": "Rows to skip."
},
"status": {
"enum": [
"active",
"cancelled"
],
"type": "string",
"description": "Only subscriptions with this status."
},
"plan_id": {
"type": "string",
"format": "uuid",
"description": "The bundle id from list_credit_bundle_plans."
}
},
"additionalProperties": false
}List your workspace's prepaid credit bundles for the customers you bill, newest first: each one's id, customer, amount bought, balance left, currency and expiry. Pass customer_id for one customer. Needs a Last Price credential with billing read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| limit | integer | How many rows to return. Defaults to 100. |
| offset | integer | How many rows to skip, for the next page. Defaults to 0. |
| customer_id | string | Only this customer's rows: the customer UUID. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 1000,
"minimum": 1,
"description": "How many rows to return. Defaults to 100."
},
"offset": {
"type": "integer",
"minimum": 0,
"description": "How many rows to skip, for the next page. Defaults to 0."
},
"customer_id": {
"type": "string",
"format": "uuid",
"description": "Only this customer's rows: the customer UUID."
}
},
"additionalProperties": false
}List the customers in your workspace, newest first. Page with limit and offset. Read-only. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| limit | integer | How many to return. |
| offset | integer | How many to skip, for the next page. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 1000,
"minimum": 1,
"description": "How many to return."
},
"offset": {
"type": "integer",
"minimum": 0,
"description": "How many to skip, for the next page."
}
},
"additionalProperties": false
}Read your workspace's day passes, newest first: for each, the calls left and when it ends, plus the total calls left and what a new pass costs now. A day pass is extra compute calls for 24 hours that a self-registered agent workspace buys with one x402 payment: buy_day_pass buys one. Needs a Last Price credential with the price:compute scope.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}List the demo apps Last Price ships, each with its name, description, the experiment it runs and, once the demo workspace is seeded, that experiment's status, views and conversions. Read-only. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}List the payment disputes in your workspace, newest first. Filter by status (open, under review, resolved or rejected) and page with limit and offset. Read-only. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| limit | integer | How many to return. |
| offset | integer | How many to skip, for the next page. |
| status | string | The dispute status. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 1000,
"minimum": 1,
"description": "How many to return."
},
"offset": {
"type": "integer",
"minimum": 0,
"description": "How many to skip, for the next page."
},
"status": {
"enum": [
"open",
"under_review",
"resolved",
"rejected"
],
"type": "string",
"description": "The dispute status."
}
},
"additionalProperties": false
}List your workspace's price experiments: each one's key, name, status, variants (arms) and target sample size. Pass status to see only drafts, active, paused or completed ones. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| status | string | Only experiments in this state. |
{
"type": "object",
"properties": {
"status": {
"enum": [
"draft",
"active",
"paused",
"completed"
],
"type": "string",
"description": "Only experiments in this state."
}
},
"additionalProperties": false
}List every launch kit for a feature built behind a release flag, for Last Price staff only: the flag's state, readiness (how many checks pass, warn and fail, and what blocks), the go code, what is scheduled, whether the launcher is on, and the release flags that have no kit yet. Read only: it never switches, schedules or sends anything; launching needs the owner's go code through the launch command. Needs an API key holding the launches:read scope by name, made by someone who is still Last Price staff, sent as x-api-key or as Authorization: Bearer lp_...; any other credential gets 404. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}List the pricing functions registered for the authenticated tenant.
No arguments.
{
"type": "object",
"properties": {}
}List your workspace's hosted pricing models: models Last Price stores and runs for you, trained here on your quote outcomes or uploaded as ONNX. Each one has its id, name, kind (demand or price), active and latest version, and whether it retrains and promotes itself nightly. The answer also gives the limits, the ONNX operators the hosted runtime runs and the request fields a model can read. A pricing function of the ML model type runs a model when its inference config is {"provider": "last-price", "model": "<model id>"}. While hosted models (the hosted-pricing-models release) are not switched on for your workspace, this answers released: false with no models, and every other hosted model tool answers 404 not_released. Needs a Last Price credential with function read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}See which model providers your workspace has connected for pricing functions that run on a model, and whether key storage is available. Status only: the keys are write-only and never returned. Needs a Last Price credential with workspace settings read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}List the invitations still waiting to be accepted: email, role and when each was sent. Needs an API key sent as x-api-key that holds the team:admin scope, made by someone who is still an owner or admin of the workspace; a token or any other key is refused. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}List your workspace's invoices, newest first: each one's id, customer, number, status, amount, currency and due date. Pass customer_id for one customer. Needs a Last Price credential with billing read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| limit | integer | How many rows to return. Defaults to 100. |
| offset | integer | How many rows to skip, for the next page. Defaults to 0. |
| customer_id | string | Only this customer's rows: the customer UUID. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 1000,
"minimum": 1,
"description": "How many rows to return. Defaults to 100."
},
"offset": {
"type": "integer",
"minimum": 0,
"description": "How many rows to skip, for the next page. Defaults to 0."
},
"customer_id": {
"type": "string",
"format": "uuid",
"description": "Only this customer's rows: the customer UUID."
}
},
"additionalProperties": false
}List the price data points your workspace has contributed to the shared data exchange, newest first: each one's vertical, source, product, price, currency, quality score, status and the tokens it earned. Filter by status or vertical and page with limit and offset. Free to call. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| limit | integer | How many to return. Defaults to 50. |
| offset | integer | How many to skip, for the next page. |
| status | string | Only contributions with this status, for example validated. |
| vertical | string | Only contributions in this vertical. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "How many to return. Defaults to 50."
},
"offset": {
"type": "integer",
"minimum": 0,
"description": "How many to skip, for the next page."
},
"status": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "Only contributions with this status, for example validated."
},
"vertical": {
"type": "string",
"maxLength": 128,
"minLength": 1,
"description": "Only contributions in this vertical."
}
},
"additionalProperties": false
}List the changes learned pricing recorded for your workspace, newest first: for each product (or all products), the elasticity before and after, an example price before and after, and its status. status pending lists what waits for your decision; pass its id to decide_learned_price_change. A signed webhook announces each one as it happens, with its id. Needs a Last Price credential with routing read scope.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Most changes to return. Defaults to 50. |
| status | string | Only changes with this status, e.g. pending. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 200,
"minimum": 1,
"description": "Most changes to return. Defaults to 50."
},
"status": {
"enum": [
"applied",
"pending",
"approved",
"rejected",
"superseded",
"preview"
],
"type": "string",
"description": "Only changes with this status, e.g. pending."
}
},
"additionalProperties": false
}List the individual model calls behind get_llm_usage, newest first: what each was for, its provider and model, tokens and cost. Filter by operation and by start_date and end_date, and page with limit and offset. Read-only. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| limit | integer | How many to return. Defaults to 50. |
| offset | integer | How many to skip, for the next page. |
| end_date | string | The end of the period, as an ISO 8601 date and time. |
| operation | string | Only calls made for this operation. |
| start_date | string | The start of the period, as an ISO 8601 date and time. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "How many to return. Defaults to 50."
},
"offset": {
"type": "integer",
"minimum": 0,
"description": "How many to skip, for the next page."
},
"end_date": {
"type": "string",
"format": "date-time",
"description": "The end of the period, as an ISO 8601 date and time."
},
"operation": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Only calls made for this operation."
},
"start_date": {
"type": "string",
"format": "date-time",
"description": "The start of the period, as an ISO 8601 date and time."
}
},
"additionalProperties": false
}Browse the public marketplace: the pricing functions their owners listed for anyone to use, each cut to its public fields, with usage and rating. Page with limit and offset. Public: needs no credential, limited per address.
| Argument | Type | Description |
|---|---|---|
| limit | integer | How many to return. |
| offset | integer | How many to skip, for the next page. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 1000,
"minimum": 1,
"description": "How many to return."
},
"offset": {
"type": "integer",
"minimum": 0,
"description": "How many to skip, for the next page."
}
},
"additionalProperties": false
}List your own marketplace listings, public or not. Page with limit and offset. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| limit | integer | How many to return. |
| offset | integer | How many to skip, for the next page. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 1000,
"minimum": 1,
"description": "How many to return."
},
"offset": {
"type": "integer",
"minimum": 0,
"description": "How many to skip, for the next page."
}
},
"additionalProperties": false
}Your workspace's negotiations, newest first: what a buyer sees plus the floor and asking price each one opened with. Use it to honour an accepted price at checkout: find the negotiation and charge its agreed price. Needs a Last Price credential with routing read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| limit | integer | How many to return. Defaults to 50. |
| status | string | Only negotiations in this state. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"default": 50,
"maximum": 200,
"minimum": 1,
"description": "How many to return. Defaults to 50."
},
"status": {
"enum": [
"open",
"accepted",
"rejected",
"expired"
],
"type": "string",
"description": "Only negotiations in this state."
}
},
"additionalProperties": false
}List your workspace's notifications, newest first, with the unread count: approval requests, disputes, price proposals, email to agent inboxes and, for the agent that owns the workspace, failed webhook deliveries. Pass the next cursor a page returns back as cursor for the next page. Unread is per reader: an agent has one read state for all its keys and tokens, a plain key has its own. Needs a Last Price credential with notifications read scope; the agent that owns the workspace needs none.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Page size. Defaults to 50. |
| cursor | string | The next cursor from the previous page, unchanged. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size. Defaults to 50."
},
"cursor": {
"type": "string",
"maxLength": 400,
"minLength": 1,
"description": "The next cursor from the previous page, unchanged."
}
},
"additionalProperties": false
}List the line items on an order, oldest first: pass order_id. Read-only. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| order_id* | string | The order: its id, as list_orders shows it. |
{
"type": "object",
"required": [
"order_id"
],
"properties": {
"order_id": {
"type": "string",
"format": "uuid",
"description": "The order: its id, as list_orders shows it."
}
},
"additionalProperties": false
}List the orders in your workspace, newest first, or only one customer's with customer_id. Page with limit and offset. Read-only. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| limit | integer | How many to return. |
| offset | integer | How many to skip, for the next page. |
| customer_id | string | The customer: its id, as list_customers shows it. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 1000,
"minimum": 1,
"description": "How many to return."
},
"offset": {
"type": "integer",
"minimum": 0,
"description": "How many to skip, for the next page."
},
"customer_id": {
"type": "string",
"format": "uuid",
"description": "The customer: its id, as list_customers shows it."
}
},
"additionalProperties": false
}Read your workspace's outcome pricing: whether it is on, its terms, counts of open, accepted and rejected windows with the total refunded, and the windows themselves, newest first. Needs a Last Price credential with price compute scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Most windows to return. Defaults to 50. |
| status | string | Only open windows, or only decided ones. Both by default. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 200,
"minimum": 1,
"description": "Most windows to return. Defaults to 50."
},
"status": {
"enum": [
"open",
"decided"
],
"type": "string",
"description": "Only open windows, or only decided ones. Both by default."
}
},
"additionalProperties": false
}List your workspace's payments, newest first: each one's id, invoice, customer, amount, currency, status and method. Pass customer_id for one customer, or status for pending, completed or refunded payments. Needs a Last Price credential with billing read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| limit | integer | How many rows to return. Defaults to 100. |
| offset | integer | How many rows to skip, for the next page. Defaults to 0. |
| status | string | Only payments in this state. |
| customer_id | string | Only this customer's rows: the customer UUID. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 1000,
"minimum": 1,
"description": "How many rows to return. Defaults to 100."
},
"offset": {
"type": "integer",
"minimum": 0,
"description": "How many rows to skip, for the next page. Defaults to 0."
},
"status": {
"enum": [
"pending",
"completed",
"refunded"
],
"type": "string",
"description": "Only payments in this state."
},
"customer_id": {
"type": "string",
"format": "uuid",
"description": "Only this customer's rows: the customer UUID."
}
},
"additionalProperties": false
}List your workspace's marketplace payout runs, newest first: each run's id, status (a dry run, awaiting approval, rejected, stale, approved, processing, partial, paid or failed), period, total, Stripe mode, the transfers it plans and the entries it skips, who requested it and who decided it. execution says whether payout runs are switched on for your workspace and whether Stripe is ready. They are not switched on for every workspace yet: while they are off for yours, execution.enabled is false and no runs are listed. Needs a Last Price credential with billing read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| limit | integer | How many runs at most, newest first. Defaults to 20. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"default": 20,
"maximum": 100,
"minimum": 1,
"description": "How many runs at most, newest first. Defaults to 20."
}
},
"additionalProperties": false
}The workspace's price history: every price from a photo, link, PDF or text, newest first, whichever way it was asked (surface app for the phone app or website, api, or mcp for a chat app such as ChatGPT or Claude). Each check has its id, created_at, the item, side (selling or buying), the price with its low to high range and currency, confidence (0 to 1) and share_url. Use it to know what the person has already priced, for example to answer "what did I price last week" or before pricing the same thing again. q finds checks by words in the item's name; limit (1 to 100, default 20) sets the page size, and before takes the next_before of the last page for older checks (next_before is null on the last page). get_price_check gives one check's whole answer. Changes nothing. Until price history is switched on for your workspace it answers 404 not_released. Needs a Last Price credential with price compute scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| q | string | Words in the item's name, for example "lamp" or "iphone". |
| limit | integer | How many checks, 1 to 100. Defaults to 20. |
| before | string | The next_before of the last page, for older checks. |
{
"type": "object",
"properties": {
"q": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Words in the item's name, for example \"lamp\" or \"iphone\"."
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "How many checks, 1 to 100. Defaults to 20."
},
"before": {
"type": "string",
"format": "date-time",
"description": "The next_before of the last page, for older checks."
}
},
"additionalProperties": false
}See the multi-step pricing pipelines Last Price publishes and the stages they are built from: for each reference pipeline its name, what it is for, its topology, latency and cost ceilings, the consent it needs and the trust zones it may run in, and the stage catalogue with each stage's layer and tags. To run one without a key, use run_reference_pipeline once it is switched on (until then it answers 501 pipeline_execution_unavailable rather than a simulated price). To price an item from photos use price_from_capture; to price from numbers use compute_price, or run_pricing_chain for a chain you define. Public: needs no credential.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}List your workspace's products with the category confirmed or suggested for each, the category tree, and per category how many outcomes your own products in it have toward the 30 an estimate needs (an inferred outcome counts half). A suggestion comes from the product's name and is not stored until confirmed with set_product_category. Only your workspace's own data is read or shown. Needs a Last Price credential with routing read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Get receipts for many of your workspace's priced calls at once, as one statement with totals: name up to 50 usage event ids, or a period (this calendar month by default, at most 366 days), optionally for one function or agent. A period statement also counts, for each agent, the value signals set up in Settings, Value receipts. Receipts are made only when you ask. For CSV or a printable page, call GET /api/receipts with format=csv or format=html. Needs a Last Price credential with price compute or billing read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| ids | string | Up to 50 usage event ids, comma separated. Send ids or a period, not both. |
| limit | integer | Receipts per page for a period. Defaults to 100. |
| offset | integer | Receipts to skip for a period. Defaults to 0, at most 1000000. |
| agent_id | string | Only calls made by this agent. A key bound to an agent always gets only its own calls. |
| end_date | string | End of the period, ISO 8601. Defaults to now. |
| start_date | string | Start of the period, ISO 8601. Defaults to the first of this month (UTC). |
| function_id |
List the reels: short recipes for real tasks done with Last Price (price a SaaS seat, check a vendor quote, find an offer for a task), with the tools each one calls. A reel is the agent-readable alternative to a demo video: read one with get_reel and it runs live. Public: needs no credential. Until it is switched on it answers not released.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}List the mappings Rosetta held back for a person or agent to approve: each one's source, proposed canonical field, confidence and status. Pass status pending, approved or rejected to filter; with none you get all of them. Read-only. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| status | string | Only mappings with this status. |
{
"type": "object",
"properties": {
"status": {
"enum": [
"pending",
"approved",
"rejected"
],
"type": "string",
"description": "Only mappings with this status."
}
},
"additionalProperties": false
}List your workspace's routing policies: each one's id, name, strategy, config, fallback function, and whether it is the default. Only the default policy is used when a price is computed without naming a function. Needs a Last Price credential with routing read scope.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}List the runs of one scrape job, newest first: when each ran, its status and the prices it found. Hosted scraping is behind a release flag: until it is on for your workspace this answers 501 hosted_scraping_not_enabled. Runs honour robots.txt and fetch only public https pages. Needs a Last Price credential with the commerce:catalog:read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Most runs to return. Defaults to 20. |
| job_id* | string | The scrape job UUID: id on a list_scrape_jobs result. |
{
"type": "object",
"required": [
"job_id"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Most runs to return. Defaults to 20."
},
"job_id": {
"type": "string",
"format": "uuid",
"description": "The scrape job UUID: id on a list_scrape_jobs result."
}
},
"additionalProperties": false
}List your workspace's hosted price scrape jobs: each one's id, name, page url, selectors, schedule and whether it is enabled. Hosted scraping is behind a release flag: until it is on for your workspace this answers 501 hosted_scraping_not_enabled. Runs honour robots.txt and fetch only public https pages. Needs a Last Price credential with the commerce:catalog:read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}List the DNS records of a domain your workspace registered through Last Price. locked marks the records the storefront needs. A domain bought elsewhere is refused: manage its DNS where it was bought. Needs a Last Price credential with workspace settings read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| domain_id* | string | The domain id, from list_storefronts or add_storefront_domain. |
| storefront_id* | string | The storefront id, from list_storefronts. |
{
"type": "object",
"required": [
"storefront_id",
"domain_id"
],
"properties": {
"domain_id": {
"type": "string",
"format": "uuid",
"description": "The domain id, from list_storefronts or add_storefront_domain."
},
"storefront_id": {
"type": "string",
"format": "uuid",
"description": "The storefront id, from list_storefronts."
}
},
"additionalProperties": false
}List a storefront's domain quotes and registrations: domain, years, price, and quoted, ordered, failed or expired. Needs a Last Price credential with workspace settings read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| storefront_id* | string | The storefront id, from list_storefronts. |
{
"type": "object",
"required": [
"storefront_id"
],
"properties": {
"storefront_id": {
"type": "string",
"format": "uuid",
"description": "The storefront id, from list_storefronts."
}
},
"additionalProperties": false
}List your workspace's storefronts: each one's subdomain, name, whether it is published, what it lists (functions, products open to offers, tag and product filters), its own domains with their DNS records and status, and the addresses agents use (page, agent card, llms.txt, MCP). Also the limits and a suggested subdomain. A storefront is your own front door for agents at <subdomain>.store.last-price.ai or a domain you own. Only where the workspace has storefronts switched on (else an error with code not_released). Needs a Last Price credential with workspace settings read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}List the people in your workspace and their roles. Needs an API key sent as x-api-key that holds the team:admin scope, made by someone who is still an owner or admin of the workspace; a token or any other key is refused. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}List your workspace's UCP checkout sessions, with each one's id, status and totals. Read-only. Needs a Last Price credential with price compute scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}List your workspace's priced calls, newest first: each one's id (what report_outcome takes to report it), function, cost, the price given and the inputs it was given for, and who sent it. Pass buyer_agent verified for only the calls whose buying agent proved who it was with an AgentID token. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Page size. Defaults to 50. |
| offset | integer | Calls to skip. Defaults to 0, at most 1000000. |
| end_date | string | Only calls up to this time, ISO 8601. |
| start_date | string | Only calls from this time on, ISO 8601. |
| buyer_agent | string | verified: only calls whose buying agent proved who it was with an AgentID token. Defaults to all. |
| function_id | string | Only calls priced by this function. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size. Defaults to 50."
},
"offset": {
"type": "integer",
"maximum": 1000000,
"minimum": 0,
"description": "Calls to skip. Defaults to 0, at most 1000000."
},
"end_date": {
"type": "string",
"format": "date-time",
"description": "Only calls up to this time, ISO 8601."
},
"start_date": {
"type": "string",
"format": "date-time",
"description": "Only calls from this time on, ISO 8601."
},
"buyer_agent": {
"enum": [
"all",
"verified"
],
"type": "string",
"description": "verified: only calls whose buying agent proved who it was with an AgentID token. Defaults to all."
},
"function_id": {
"type": "string",
"format": "uuid",
"description": "Only calls priced by this function."
}
},
"additionalProperties": false
}See which outside pricing engines (vendor adapters, such as Pricefx and Prisync) this deployment has switched on. Each one lists its function name, its vendor and whether it is ready; one that is not says whether the adapters are off or that adapter is not configured. Read only: it never shows a setting value. A ready adapter is priced through by naming its function when computing a price, never by automatic routing. Needs a Last Price credential with function read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}List what a price verification can stand on: the verdicts it can give (fair, too high, too low or unknown) and the evidence strategies a verdict is checked against. Use it at planning time, before you call verify_price. Public: needs no credential.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}List recent delivery attempts across your workspace's webhook endpoints, newest first: the event, the status your endpoint answered with and when. Use it to find an endpoint that is failing. Needs a key with no scope limits or a person's sign-in. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Most deliveries to return. Defaults to 50. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 200,
"minimum": 1,
"description": "Most deliveries to return. Defaults to 50."
}
},
"additionalProperties": false
}List your workspace's outbound webhook endpoints: each one's id, url, events, status and signing secret (whsec_...; the secret is how you verify the x-lastprice-signature header on what it receives). Needs the owner or admin role, and a key with no scope limits or a person's sign-in. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Name a price for a seller's product and get the answer: accept, counter or reject, with the price and the reason. The first offer opens a negotiation and returns a buyer token, once: keep it. To make the next offer in the same negotiation, pass negotiation_id and buyer_token too. buyer_ref is an optional opaque reference for the seller and never a name or email. The seller's floor is never breached or shown. Public: needs no credential, and it is limited per address and by the rounds the seller allows.
| Argument | Type | Description |
|---|---|---|
| handle* | string | The seller's public handle, from the terms they publish. |
| buyer_ref | string | An opaque reference for the seller's bookkeeping. Never a name or email. |
| product_id* | string | The seller's id for the product. |
| buyer_token | string | The buyer token the first answer gave you, once. Keep it: it is the only way back into the negotiation. |
| offered_price* | number | The price you offer, in the seller's currency. |
| negotiation_id | string | The negotiation id from the first answer. |
{
"type": "object",
"required": [
"handle",
"product_id",
"offered_price"
],
"properties": {
"handle": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]{2,39}$",
"maxLength": 40,
"minLength": 3,
"description": "The seller's public handle, from the terms they publish."
},
"buyer_ref": {
"type": "string",
"pattern": "^[A-Za-z0-9._:@/+-]+$",
"maxLength": 200,
"minLength": 1,
"description": "An opaque reference for the seller's bookkeeping. Never a name or email."
},
"product_id": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "The seller's id for the product."
},
"buyer_token": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "The buyer token the first answer gave you, once. Keep it: it is the only way back into the negotiation."
},
"offered_price": {
"type": "number",
"maximum": 1000000000,
"description": "The price you offer, in the seller's currency.",
"exclusiveMinimum": 0
},
"negotiation_id": {
"type": "string",
"format": "uuid",
"description": "The negotiation id from the first answer."
}
},
"additionalProperties": false
}Mark your workspace's notifications read for this reader only (your agent, or your key), up to read_through (default now). Send the creation time of the newest item you handled so anything newer stays unread. Needs a Last Price credential with notifications write scope; the agent that owns the workspace needs none.
| Argument | Type | Description |
|---|---|---|
| read_through | string | Mark everything created at or before this time read, ISO 8601. Defaults to now. |
{
"type": "object",
"properties": {
"read_through": {
"type": "string",
"format": "date-time",
"description": "Mark everything created at or before this time read, ISO 8601. Defaults to now."
}
},
"additionalProperties": false
}Turn a vendor's response into the canonical shape using a plan from plan_rosetta_mapping: returns the canonical record, the fields that were missing, the lossy conversions and what passed through unmapped. Pass plan and vendor_response. Read-only. Needs a claimed Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| plan* | object | A plan as plan_rosetta_mapping returns it. |
| vendor_response* | object | The vendor response to normalize. |
{
"type": "object",
"required": [
"plan",
"vendor_response"
],
"properties": {
"plan": {
"type": "object",
"required": [
"mappings"
],
"properties": {
"tier": {
"type": "string",
"maxLength": 40,
"description": "The trust tier of the suggester."
},
"notes": {
"type": "array",
"items": {
"type": "string",
"maxLength": 1000
},
"maxItems": 100,
"description": "Notes from the suggester."
},
"mappings": {
"type": "array",
"items": {
"type": "object",
"required": [
"target",
"confidence",
"origin"
],
"properties": {
"origin": {
"enum": [
"heuristic",
"llm",
"human",
"frozen"
],
"type": "string",
"description": "Where the mapping came from."
},
"reason": {
"type": "string",
"maxLength": 1000,
"description": "Why it was mapped."
},
"source": {
"type": "string",
"maxLength": 500,
"description": "The source dot path."
},
"target": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "The target dot path."
},
"transform": {
"type": "object",
"description": "The transform, for example { \"kind\": \"toString\" }.",
"additionalProperties": {}
},
"confidence": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "How sure the mapping is."
}
},
"additionalProperties": false
},
"maxItems": 500,
"minItems": 1,
"description": "The field mappings."
},
"confidence": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "The plan confidence."
},
"source_schema_id": {
"type": "string",
"maxLength": 200,
"description": "The source the plan maps from."
},
"target_schema_id": {
"type": "string",
"maxLength": 200,
"description": "The schema the plan maps onto."
}
},
"description": "A plan as plan_rosetta_mapping returns it.",
"additionalProperties": false
},
"vendor_response": {
"type": "object",
"description": "The vendor response to normalize.",
"additionalProperties": {}
}
},
"additionalProperties": false
}Open the Last Price integration code (the files generate_monetization_code writes) as a pull request in one of the workspace's own GitHub repositories, through the installed Last Price GitHub App. Commits to a new branch (last-price/billing-setup unless branch is given) and opens a pull request against base or the default branch; never merges, and refuses a branch that exists. Early access. Needs a Last Price credential with billing write scope and the App installed (get_github_app_connection). Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| base | string | Branch to open the pull request against; the default branch when absent. |
| title | string | Pull request title. |
| branch | string | New branch for the commit; last-price/billing-setup when absent. |
| agent_id | string | One of your agents, filled into the code. |
| payments | boolean | Include billing through Stripe (default true). |
| customers | boolean | Include creating customers at sign-up (default true). |
| framework* | string | |
| event_name |
Before a run of small paid calls to one seller (a stream of x402 calls at a cent each, say), open one budget for the run instead of checking every call. Your owner's spend policy judges the session like a purchase of max_amount: allow holds that maximum against today's cap and returns reservation.id, the session id; ask means a person approves the budget first, then send the same request again; deny means do not start. Then call draw_session_spend right before paying each call, and close_spend_session when done, which gives back what you did not draw. A session left open gives its remainder back when it expires. Only where the workspace has sessions switched on (else an error with code not_released: use check_purchase per purchase). Needs a Last Price credential with price compute scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| item | string | Optional: what the calls buy. |
| intent | object | Optional: what the buyer approved for this purchase, from an American Express intent, an AP2 intent mandate, or declared by you. A purchase that names another seller, costs more than max_amount (counting every purchase under the same intent_id), is in another currency or comes after expires_at is denied, whatever the policy allows. evidence (the token or mandate) is kept only as a hash and is not verified yet. Only where the workspace has intents switched on (else an error with code not_released). |
| pay_to | string | Optional: the wallet address (bare or CAIP-10) or merchant account id the calls pay. Every draw_session_spend must then name the same one: another is refused with code payee_changed. Only where the workspace has payee binding switched on (else an error with code not_released). |
| seller |
Send one signed webhook.test event to an active endpoint now and record the result as a delivery, so you can check it receives and verifies events. Read the outcome with list_webhook_deliveries. Needs a key with no scope limits or a person's sign-in. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| webhook_id* | string | The webhook endpoint UUID: id on a list_webhooks result. |
{
"type": "object",
"required": [
"webhook_id"
],
"properties": {
"webhook_id": {
"type": "string",
"format": "uuid",
"description": "The webhook endpoint UUID: id on a list_webhooks result."
}
},
"additionalProperties": false
}Ask Rosetta how a source schema maps onto a canonical one: for each source field the target field, the transform, a confidence and where the mapping came from, with a plan confidence and tier. Pass source_schema (an id and its fields, each a path and type) and canonical_schema (the id of a built-in schema from list_canonical_schemas, or a whole schema). A plan below the confidence bar is queued for review and the answer says so; list_rosetta_review shows the queue. Needs a claimed Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| source_schema* | object | The source: an id for it and its fields. |
| canonical_schema* | string | object | The id of a built-in schema (see list_canonical_schemas) or a whole schema with an id and fields. |
{
"type": "object",
"required": [
"source_schema",
"canonical_schema"
],
"properties": {
"source_schema": {
"type": "object",
"required": [
"id",
"fields"
],
"properties": {
"id": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "A stable id for the source."
},
"fields": {
"type": "array",
"items": {
"type": "object",
"required": [
"path",
"type"
],
"properties": {
"enum": {
"type": "array",
"items": {},
"maxItems": 200,
"description": "The values the field may take."
},
"path": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "The dot path of the field."
},
"type": {
"type": "string",
"maxLength": 40,
"minLength": 1,
"description": "The field type, for example string, number or boolean."
},
"examples": {
"type": "array",
"items": {},
"maxItems": 10,
"description": "A few example values."
},
"required": {
"type": "boolean",
"description": "Whether the schema requires the field."
},
"description": {
"type": "string",
"maxLength": 1000,
"description": "What the field holds."
}
},
"additionalProperties": false
},
"maxItems": 500
}
},
"description": "The source: an id for it and its fields.",
"additionalProperties": false
},
"canonical_schema": {
"type": [
"string",
"object"
],
"required": [
"id",
"fields"
],
"properties": {
"id": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "A stable id for the schema."
},
"fields": {
"type": "array",
"items": {
"type": "object",
"required": [
"path",
"type"
],
"properties": {
"enum": {
"type": "array",
"items": {},
"maxItems": 200,
"description": "The values the field may take."
},
"path": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "The dot path of the field."
},
"type": {
"type": "string",
"maxLength": 40,
"minLength": 1,
"description": "The field type, for example string, number or boolean."
},
"examples": {
"type": "array",
"items": {},
"maxItems": 10,
"description": "A few example values."
},
"required": {
"type": "boolean",
"description": "Whether the schema requires the field."
},
"description": {
"type": "string",
"maxLength": 1000,
"description": "What the field holds."
}
},
"additionalProperties": false
},
"maxItems": 500
}
},
"description": "The id of a built-in schema (see list_canonical_schemas) or a whole schema with an id and fields.",
"additionalProperties": false
}
},
"additionalProperties": false
}Try a hosted model on a request context before (or after) promoting a version: the price it would give, and what the model said (a demand model's chance of a sale and elasticity, or a price model's output). Uses the active version unless version names another, and 409 when there is none. Nothing is metered or logged as a quote. Answers 404 not_released while hosted models (the hosted-pricing-models release) are not switched on for your workspace. Needs a Last Price credential with function test scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| context* | object | The request context to price, as compute_price takes it. current_price is required. |
| version | integer | The version to try. Defaults to the active one. |
| model_id* | string | The hosted model's id: id on a list_hosted_models result. |
| constraints | object | Optional limits on the price. |
{
"type": "object",
"required": [
"model_id",
"context"
],
"properties": {
"context": {
"type": "object",
"required": [
"current_price"
],
"properties": {
"geo": {
"type": [
"string",
"null"
],
"maxLength": 200,
"description": "Optional geography, e.g. eu."
},
"channel": {
"type": "string",
"maxLength": 200,
"description": "Optional sales channel."
},
"currency": {
"type": "string",
"maxLength": 8,
"description": "Optional ISO currency code, e.g. USD."
},
"metadata": {
"type": "object",
"description": "Optional extra fields a model can read as metadata.<key>, such as unit_cost.",
"additionalProperties": {
"type": [
"string",
"number",
"boolean",
"null"
]
}
},
"buyer_type": {
"enum": [
"agent",
"person"
],
"type": "string",
"description": "Optional: whether the buyer is an agent or a person."
},
"product_id": {
"type": "string",
"maxLength": 200,
"description": "Optional product id."
},
"product_type": {
"type": "string",
"maxLength": 64,
"description": "Optional product type."
},
"current_price": {
"type": "number",
"description": "The current price; a ratio model and a demand model price from it.",
"exclusiveMinimum": 0
},
"customer_segment": {
"type": [
"string",
"null"
],
"maxLength": 200,
"description": "Optional segment, e.g. enterprise."
}
},
"description": "The request context to price, as compute_price takes it. current_price is required."
},
"version": {
"type": "integer",
"minimum": 1,
"description": "The version to try. Defaults to the active one."
},
"model_id": {
"type": "string",
"format": "uuid",
"description": "The hosted model's id: id on a list_hosted_models result."
},
"constraints": {
"type": "object",
"properties": {
"max_price": {
"type": "number",
"description": "The price is at most this.",
"exclusiveMinimum": 0
},
"min_price": {
"type": "number",
"minimum": 0,
"description": "The price is at least this."
}
},
"description": "Optional limits on the price."
}
},
"additionalProperties": false
}Try an offer against one of your own products and see the answer a buyer would get (accept, counter or reject), with the limits behind it. Nothing is recorded and nobody is bound, and it works while offers are off, so you can check your terms first. Needs a Last Price credential with price compute scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| round | integer | Which round of the negotiation this is. Defaults to 1. |
| product_id* | string | Your own id for the product, as buyers name it in an offer. |
| offered_price* | number | The price the pretend buyer offers. |
| previous_counter | number | The counter you made in the round before, if any. |
{
"type": "object",
"required": [
"product_id",
"offered_price"
],
"properties": {
"round": {
"type": "integer",
"maximum": 10,
"minimum": 1,
"description": "Which round of the negotiation this is. Defaults to 1."
},
"product_id": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Your own id for the product, as buyers name it in an offer."
},
"offered_price": {
"type": "number",
"maximum": 1000000000,
"description": "The price the pretend buyer offers.",
"exclusiveMinimum": 0
},
"previous_counter": {
"type": "number",
"maximum": 1000000000,
"description": "The counter you made in the round before, if any.",
"exclusiveMinimum": 0
}
},
"additionalProperties": false
}Try a page and selectors without saving a job: fetch the page once and answer the prices the selectors find, with the page's HTTP status. Nothing is stored. Hosted scraping is behind a release flag: until it is on for your workspace this answers 501 hosted_scraping_not_enabled. Runs honour robots.txt and fetch only public https pages. Needs a Last Price credential with the commerce:configure scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| url* | string | The public page to read. Must start with https://. |
| name | string | A name for the job. |
| currency | string | Three-letter ISO 4217 code, such as USD. |
| plan_selector | string | null | CSS selector for the plan name beside each price. |
| price_selector* | string | CSS selector for the price elements. |
{
"type": "object",
"required": [
"url",
"price_selector"
],
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "The public page to read. Must start with https://."
},
"name": {
"type": "string",
"maxLength": 120,
"minLength": 1,
"description": "A name for the job."
},
"currency": {
"type": "string",
"description": "Three-letter ISO 4217 code, such as USD."
},
"plan_selector": {
"type": [
"string",
"null"
],
"maxLength": 500,
"minLength": 1,
"description": "CSS selector for the plan name beside each price."
},
"price_selector": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "CSS selector for the price elements."
}
},
"additionalProperties": false
}Price an item from what you have about it, the way a person would look at it: send photos, screenshots, PDFs, product page links, a description or a barcode in artifacts and get one price with its range, what the item is and its condition, any prices read off the attachments, and a write-up for your side of the sale: a listing to post with the price when selling, or a message to the seller with your opening offer filled in when buying. side says which (selling by default); the value is the same either way, and the range reads as quick sale to top of range for a seller and opening offer to most to pay for a buyer. current_price is the price you have in mind: it is compared with the estimate, never used as it. No item recognized means no price (computed_price null, confidence 0), never a guess. With a price, share_url is a public link to a card showing it, to send to the person or post with the listing. check_id is its place in the workspace's price history (list_price_checks, get_price_check) where that is kept. A photo or PDF goes as base64 with its mime_type, or as a public http or https link to the file; the hosted MCP endpoint takes requests up to 64 KB, so send larger photos as links. A photo on disk with no link: with a shell, upload it in one command instead, with the same answer: curl -X POST https://api.last-price.ai/api/price-router/pipelines -H "x-api-key: YOUR_KEY" -F [email protected], adding -F [email protected], -F [email protected], -F text="...", -F side=buying or -F current_price=120 as needed (about 4 MB per request in all). In a chat app that hands attached files to tools (ChatGPT), a photo or PDF the person attached goes in photo or file as it arrives. One model call reads everything (your workspace's own Anthropic key when it has one), so allow up to 30 seconds; it is recorded as model usage, not drawn from your balance, and changes no price or setting. Until it is switched on for your workspace it answers 501. Needs a Last Price credential with price compute scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| file | object | A PDF (or another photo) the person attached in the chat, passed the same way as photo. |
Ask Last Price what pricing inputs are missing. Start with request: {}, return its questions to the caller, then send continuation.request and answers. Prepare is free and does not compute. When ready, action compute uses the existing authenticated pricing API; configure a credential first. Never invent answers or treat a continuation as authorization.
| Argument | Type | Description |
|---|---|---|
| action | string | |
| answers | object | |
| request | object | Partial REST PricingComputeRequest, including nested context, constraints, an explicit function selection and options. Reuse continuation.request on subsequent calls. |
{
"type": "object",
"properties": {
"action": {
"enum": [
"prepare",
"compute"
],
"type": "string",
"default": "prepare"
},
"answers": {
"type": "object",
"properties": {
"currency": {
"type": "string",
"pattern": "^[A-Z]{3}$"
},
"max_price": {
"type": "number",
"minimum": 0
},
"min_price": {
"type": "number",
"minimum": 0
},
"unit_cost": {
"type": "number",
"minimum": 0
},
"current_price": {
"type": "number",
"minimum": 0
},
"target_margin_pct": {
"type": "number",
"maximum": 95,
"minimum": 0
}
},
"additionalProperties": false
},
"request": {
"type": "object",
"description": "Partial REST PricingComputeRequest, including nested context, constraints, an explicit function selection and options. Reuse continuation.request on subsequent calls."
}
},
"additionalProperties": false
}Make a version of a hosted model the active one: the next call to every function that runs this model uses it, with no change to callers. The version that was active is retired and stays available to roll back to. Answers 404 not_released while hosted models (the hosted-pricing-models release) are not switched on for your workspace. Needs a Last Price credential with function publish scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| version* | integer | The version number: version on a get_hosted_model result. |
| model_id* | string | The hosted model's id: id on a list_hosted_models result. |
{
"type": "object",
"required": [
"model_id",
"version"
],
"properties": {
"version": {
"type": "integer",
"minimum": 1,
"description": "The version number: version on a get_hosted_model result."
},
"model_id": {
"type": "string",
"format": "uuid",
"description": "The hosted model's id: id on a list_hosted_models result."
}
},
"additionalProperties": false
}Add one price arm to an existing experiment: pass experiment_key and the price, optionally label (otherwise the next variant_N is used) and metadata. The experiment must split traffic evenly and have room for another arm (ten at most); one whose arms carry weights refuses, so the author has to say how traffic is reshared. This changes the experiment, so a running one starts serving the new price to its share of buyers. Needs a claimed Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| label | string | The arm's name. Defaults to the next variant_N. |
| price* | number | The price the new arm serves. |
| metadata | object | Anything to keep with the arm. |
| experiment_key* | string | The experiment key: key on a list_experiments result, lowercase letters, digits and underscores. |
{
"type": "object",
"required": [
"experiment_key",
"price"
],
"properties": {
"label": {
"type": "string",
"maxLength": 40,
"minLength": 1,
"description": "The arm's name. Defaults to the next variant_N."
},
"price": {
"type": "number",
"description": "The price the new arm serves.",
"exclusiveMinimum": 0
},
"metadata": {
"type": "object",
"description": "Anything to keep with the arm.",
"additionalProperties": {}
},
"experiment_key": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "The experiment key: key on a list_experiments result, lowercase letters, digits and underscores."
}
},
"additionalProperties": false
}Read price data other workspaces have shared in the data exchange: the newest data points, optionally for one vertical, with how many contributors back each and how fresh it is. Each query spends 5 tokens; below 5 tokens it is refused with your balance, and you earn tokens with contribute_price_data. Page with limit and offset. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| limit | integer | How many to return. Defaults to 50. |
| offset | integer | How many to skip, for the next page. |
| vertical | string | Only data points in this vertical. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "How many to return. Defaults to 50."
},
"offset": {
"type": "integer",
"minimum": 0,
"description": "How many to skip, for the next page."
},
"vertical": {
"type": "string",
"maxLength": 128,
"minLength": 1,
"description": "Only data points in this vertical."
}
},
"additionalProperties": false
}Get a price for registering a domain for a storefront, held for 15 minutes. A quote costs nothing and registers nothing: only the workspace owner can buy it, in the dashboard. Only where domain search is switched on (else an error with code not_released). Needs a Last Price credential with workspace settings write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| years | integer | Years to register. Defaults to 1. |
| domain* | string | The domain to price, such as acme.ai. |
| storefront_id* | string | The storefront id, from list_storefronts. |
{
"type": "object",
"required": [
"storefront_id",
"domain"
],
"properties": {
"years": {
"type": "integer",
"maximum": 10,
"minimum": 1,
"description": "Years to register. Defaults to 1."
},
"domain": {
"type": "string",
"maxLength": 260,
"minLength": 3,
"description": "The domain to price, such as acme.ai."
},
"storefront_id": {
"type": "string",
"format": "uuid",
"description": "The storefront id, from list_storefronts."
}
},
"additionalProperties": false
}Read the newest messages in your own agent inbox: the inbox of the agent your key or token is bound to, and no other. Answers live from the mail provider when it is reachable, otherwise from the mail Last Price stored (source says which). Needs an agent key, or a token exchanged from one.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Messages to return. Defaults to 25. |
| cursor | string | The cursor the previous page returned, for live mail only. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Messages to return. Defaults to 25."
},
"cursor": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "The cursor the previous page returned, for live mail only."
}
},
"additionalProperties": false
}Read a buyer's reply to a quote you sent: does it accept, say the price is too high, counter, ask a question, or decline? Send text, with quoted_price and currency when known. Returns accept, too_high, counter, question, decline or unclear, confidence, option probabilities (null for keyword rules), and counter_price when found. The existing decision model reads the reply, falling back to keyword rules when unavailable; source says model or rules. The reply may be sent to the model provider and the evaluation may incur model usage cost. Last Price does not retain the reply text; analytics records the decision without that text. This call does not accept a deal or change a price. Answers 404 not_released while unavailable for the workspace. Needs a Last Price credential with pcn:routing:read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| text* | string | The buyer's reply, as written. |
| currency | string | null | Three-character currency of the quoted price, echoed in uppercase. |
| quoted_price | number | null | The price you quoted, when known. A counter equal to it is not read as a counter price. |
{
"type": "object",
"required": [
"text"
],
"properties": {
"text": {
"type": "string",
"maxLength": 4000,
"minLength": 1,
"description": "The buyer's reply, as written."
},
"currency": {
"type": [
"string",
"null"
],
"maxLength": 3,
"minLength": 3,
"description": "Three-character currency of the quoted price, echoed in uppercase."
},
"quoted_price": {
"type": [
"number",
"null"
],
"maximum": 1000000000,
"description": "The price you quoted, when known. A counter equal to it is not read as a counter price.",
"exclusiveMinimum": 0
}
},
"additionalProperties": false
}Ask Jale for the price to run next in one of your experiments: it simulates each candidate price against the experiment's results so far and returns the best one for your objective with its expected effect and how confident it is. Pass experiment_id. Optionally pass objective (revenue, conversion, profit or market share, default revenue), candidates (the prices to compare, otherwise a grid is chosen) and lookback_days. It recommends only; it changes no price. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| objective | string | What to optimise for. Defaults to revenue. |
| candidates | array | The prices to compare. Otherwise a grid is chosen. |
| experiment_id* | string | The experiment to recommend a price for. |
| lookback_days | integer | How many days of results to learn from. |
{
"type": "object",
"required": [
"experiment_id"
],
"properties": {
"objective": {
"enum": [
"revenue",
"conversion",
"profit",
"market_share"
],
"type": "string",
"description": "What to optimise for. Defaults to revenue."
},
"candidates": {
"type": "array",
"items": {
"type": "number",
"exclusiveMinimum": 0
},
"maxItems": 50,
"minItems": 1,
"description": "The prices to compare. Otherwise a grid is chosen."
},
"experiment_id": {
"type": "string",
"maxLength": 128,
"minLength": 1,
"description": "The experiment to recommend a price for."
},
"lookback_days": {
"type": "integer",
"maximum": 365,
"minimum": 1,
"description": "How many days of results to learn from."
}
},
"additionalProperties": false
}Close a reservation whose outcome you reported unknown with settle_purchase, once, from what you checked (the processor's record, the wallet, the seller's order). Paid counts it at the amount paid. Not paid gives the amount back to today's budget, so only the workspace's owner may say so: a workspace-wide key with routing write scope, never an agent's own key. Needs a Last Price credential with price compute scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| note* | string | Required: what you checked, e.g. the processor reference. |
| amount | number | With paid: what was actually paid, if less than reserved. |
| outcome* | string | Whether the money moved. |
| reservation_id* | string | reservation.id from check_purchase. |
{
"type": "object",
"required": [
"reservation_id",
"outcome",
"note"
],
"properties": {
"note": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "Required: what you checked, e.g. the processor reference."
},
"amount": {
"type": "number",
"minimum": 0,
"description": "With paid: what was actually paid, if less than reserved."
},
"outcome": {
"enum": [
"paid",
"not_paid"
],
"type": "string",
"description": "Whether the money moved."
},
"reservation_id": {
"type": "string",
"format": "uuid",
"description": "reservation.id from check_purchase."
}
},
"additionalProperties": false
}Record a cost in your workspace, such as a vendor or infrastructure cost, so the Value Receipt and the cost analytics count it: pass amount, and optionally currency (default USD), cost_type (default usage), agent_id, customer_id and metadata. This writes a record that is not undone by another tool, so record what was really spent. Needs a claimed Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| amount* | number | What it cost, in the currency. |
| agent_id | string | The agent: its id, as it shows in your workspace. An agent's own credential can name only its own agent. |
| currency | string | The currency code. Defaults to USD. |
| metadata | object | Anything worth keeping with the record. |
| cost_type | string | What kind of cost it is. Defaults to usage. |
| customer_id | string | The customer: its id, as it shows in your workspace. |
{
"type": "object",
"required": [
"amount"
],
"properties": {
"amount": {
"type": "number",
"minimum": 0,
"description": "What it cost, in the currency."
},
"agent_id": {
"type": "string",
"format": "uuid",
"description": "The agent: its id, as it shows in your workspace. An agent's own credential can name only its own agent."
},
"currency": {
"type": "string",
"maxLength": 8,
"minLength": 3,
"description": "The currency code. Defaults to USD."
},
"metadata": {
"type": "object",
"description": "Anything worth keeping with the record."
},
"cost_type": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "What kind of cost it is. Defaults to usage."
},
"customer_id": {
"type": "string",
"format": "uuid",
"description": "The customer: its id, as it shows in your workspace."
}
},
"additionalProperties": false
}Mark a payment refunded: pass payment_id, and optionally amount (up to the payment amount; the whole payment otherwise) and reason. It records the refund in Last Price, and answers 400 when the payment is already refunded. Needs a claimed Last Price credential with billing write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| amount | number | How much to refund. Defaults to the whole payment. |
| reason | string | Why it was refunded. |
| payment_id* | string | The payment: its id, as list_payments shows it. |
{
"type": "object",
"required": [
"payment_id"
],
"properties": {
"amount": {
"type": "number",
"description": "How much to refund. Defaults to the whole payment.",
"exclusiveMinimum": 0
},
"reason": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "Why it was refunded."
},
"payment_id": {
"type": "string",
"format": "uuid",
"description": "The payment: its id, as list_payments shows it."
}
},
"additionalProperties": false
}Sign up with no key and no human: creates a sandbox workspace of your own and returns its API key (shown once), its daily limits and a claim link a person can open to take the workspace into their account. Pass name (2 to 64 characters, such as your-system/role-name), and optionally contact_email and intended_use. On the hosted MCP server this session goes on using the new key, so the tools that need a credential work at once with no header to add; elsewhere send the returned key as the x-api-key header. Public: needs no credential.
| Argument | Type | Description |
|---|---|---|
| name* | string | What to call this agent, such as your-system/role-name: letters, digits, spaces and . _ : @ / + - |
| intended_use | string | What the agent will price, in a sentence. |
| contact_email | string | Where a person can reach whoever runs this agent. Never used to send mail until a person claims the workspace. |
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"pattern": "^[A-Za-z0-9][A-Za-z0-9 ._:@/+-]{1,63}$",
"maxLength": 64,
"minLength": 2,
"description": "What to call this agent, such as your-system/role-name: letters, digits, spaces and . _ : @ / + -"
},
"intended_use": {
"type": "string",
"maxLength": 500,
"description": "What the agent will price, in a sentence."
},
"contact_email": {
"type": "string",
"maxLength": 254,
"description": "Where a person can reach whoever runs this agent. Never used to send mail until a person claims the workspace."
}
},
"additionalProperties": false
}Reject a drafted price proposal. A reason is required and kept in the audit trail. proposal_id is the id from list_commerce_proposals. Needs a Last Price credential with commerce proposal reject scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| reason* | string | Why it is rejected. |
| proposal_id* | string | The proposal id, as list_commerce_proposals gives it. |
{
"type": "object",
"required": [
"proposal_id",
"reason"
],
"properties": {
"reason": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "Why it is rejected."
},
"proposal_id": {
"type": "string",
"format": "uuid",
"description": "The proposal id, as list_commerce_proposals gives it."
}
},
"additionalProperties": false
}Reject one of your workspace's Forge candidates: it stops climbing the promotion ladder and keeps its evidence, with your reason added. candidate_id is an id from get_forge_status; a candidate already rejected, retired or promoted cannot be. Needs a Last Price credential with routing write scope; from the dashboard, an owner or admin. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| reason | string | Why, kept with its evidence; not blank. |
| candidate_id* | string | The candidate id, as get_forge_status gives it. |
{
"type": "object",
"required": [
"candidate_id"
],
"properties": {
"reason": {
"type": "string",
"pattern": "\\S",
"maxLength": 500,
"minLength": 1,
"description": "Why, kept with its evidence; not blank."
},
"candidate_id": {
"type": "string",
"format": "uuid",
"description": "The candidate id, as get_forge_status gives it."
}
},
"additionalProperties": false
}Reject a payout run that is awaiting approval: nothing is paid and the ledger stays as it was. The requester may reject their own request to withdraw it. 409 when the run is not awaiting approval. Answers 404 while payout runs are not switched on for your workspace (list_payout_runs says so in execution.enabled). Needs a Last Price credential with billing write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| run_id* | string | The payout run: id on a list_payout_runs or request_payout_run result. |
{
"type": "object",
"required": [
"run_id"
],
"properties": {
"run_id": {
"type": "string",
"format": "uuid",
"description": "The payout run: id on a list_payout_runs or request_payout_run result."
}
},
"additionalProperties": false
}Take a product off offers. Negotiations already open on it stop, because a product that is not listed answers buyers with not found. Needs a Last Price credential with routing write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| product_id* | string | Your own id for the product, as buyers name it in an offer. |
{
"type": "object",
"required": [
"product_id"
],
"properties": {
"product_id": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Your own id for the product, as buyers name it in an offer."
}
},
"additionalProperties": false
}Remove a DNS record from a domain your workspace registered through Last Price. Records the storefront needs cannot be removed. Needs a Last Price credential with workspace settings write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| domain_id* | string | The domain id, from list_storefronts or add_storefront_domain. |
| record_id* | string | The record id, from list_storefront_dns_records. |
| storefront_id* | string | The storefront id, from list_storefronts. |
{
"type": "object",
"required": [
"storefront_id",
"domain_id",
"record_id"
],
"properties": {
"domain_id": {
"type": "string",
"format": "uuid",
"description": "The domain id, from list_storefronts or add_storefront_domain."
},
"record_id": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "The record id, from list_storefront_dns_records."
},
"storefront_id": {
"type": "string",
"format": "uuid",
"description": "The storefront id, from list_storefronts."
}
},
"additionalProperties": false
}Stop serving a storefront on one of your domains. Only where the workspace has storefronts switched on (else an error with code not_released). Needs a Last Price credential with workspace settings write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| domain_id* | string | The domain id, from list_storefronts or add_storefront_domain. |
| storefront_id* | string | The storefront id, from list_storefronts. |
{
"type": "object",
"required": [
"storefront_id",
"domain_id"
],
"properties": {
"domain_id": {
"type": "string",
"format": "uuid",
"description": "The domain id, from list_storefronts or add_storefront_domain."
},
"storefront_id": {
"type": "string",
"format": "uuid",
"description": "The storefront id, from list_storefronts."
}
},
"additionalProperties": false
}Remove a person from your workspace. The last owner cannot be removed. Needs an API key sent as x-api-key that holds the team:admin scope, made by someone who is still an owner or admin of the workspace; a token or any other key is refused. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| user_id* | string | The person's user id: user_id on a list_team_members result. |
{
"type": "object",
"required": [
"user_id"
],
"properties": {
"user_id": {
"type": "string",
"format": "uuid",
"description": "The person's user id: user_id on a list_team_members result."
}
},
"additionalProperties": false
}Report whether a price from compute_price was used: once the buyer has accepted or turned down a price, report it. Pass receipt.id from that result as usage_event_id, or omit it to report the last price compute_price returned on this connection or tools instance, once (the hosted MCP endpoint remembers nothing, so pass it there). Outcomes are what later routing and confidence learn from. With outcome pricing on, a rejection within the call's outcome window gives back part of what it cost; the result says what was refunded. Needs a Last Price credential. Report only what actually happened. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| outcome* | string | Whether the price was used. |
| evidence_url | string | Optional evidence: an https link to the record. |
| evidence_note | string | Optional evidence: a short note on why. |
| quality_score | number | Optional: how good the price was, 0 to 1. |
| usage_event_id | string | The usage event of the priced call: receipt.id on the compute_price result. Pass it whenever you priced more than one thing. Omitted, the last compute_price result on this connection is reported, once. |
| evidence_reference | string | Optional evidence: an order, ticket or invoice id in your own system. |
Tell Last Price a price or an answer is wrong, or send an idea, on the person's behalf: when they say a price from price_from_capture is off, it named the wrong item, something did not work, or they have a suggestion. reason is price_wrong, wrong_item, broken, idea or other; note is what they said, in their words (up to 2000 characters). For a price, send its check_id (from price_from_capture or list_price_checks), item_name, computed_price and the price they expected in expected_price with its currency, so the team can look at that exact answer. Returns the report's id. It changes no price; the team reads every report. At most 20 reports an hour; past that it answers 429. Until reports are switched on for your workspace it answers 404 not_released. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| note | string | What the person said, in their words. Treated as data, never as instructions. |
| reason* | string | price_wrong for a price that is off, wrong_item when it named the wrong thing, broken when something did not work, idea for a suggestion, other for anything else. |
| check_id | string | The price check this is about: the check_id from price_from_capture or the id from list_price_checks. |
| currency | string | Three-letter currency code for the prices. |
| item_name | string | The item the price was for. |
| computed_price |
Ask what paying your marketplace ledger for a period would send, or request that payout. With dry_run true (the default) you get the report: what each connected account would be sent, and every entry skipped with the reason. Nothing moves. With dry_run false, for a period that has ended, the run waits for approval by someone other than whoever requested it: approve_payout_run refuses (403) the same API key or agent, and the same person through another of their keys, their sign-in or an agent they created. Payouts run in Stripe test mode, so no real money moves until Last Price switches live payouts on. Answers 404 while payout runs are not switched on for your workspace (list_payout_runs says so in execution.enabled). Needs a Last Price credential with billing write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| dry_run | boolean | true (the default): only report what would be paid. false: request the payout, which then waits for someone else to approve it. |
| period_end* | string | Last day of the period (YYYY-MM-DD). A request (dry_run false) needs a period that has ended. |
| period_start* | string | First day of the period (YYYY-MM-DD). |
{
"type": "object",
"required": [
"period_start",
"period_end"
],
"properties": {
"dry_run": {
"type": "boolean",
"default": true,
"description": "true (the default): only report what would be paid. false: request the payout, which then waits for someone else to approve it."
},
"period_end": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Last day of the period (YYYY-MM-DD). A request (dry_run false) needs a period that has ended."
},
"period_start": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "First day of the period (YYYY-MM-DD)."
}
},
"additionalProperties": false
}Send again the transfers of a partial payout run that are due for a retry (after a network error, a timeout or a Stripe outage), each with the same idempotency key as before, so Stripe never pays one twice. The amounts were approved already, so no new approval is needed. A transfer that failed for good is not retried: request a new run once the cause is fixed. 409 when nothing is due yet (the error's details say when the next retry is), 503 while Stripe is not ready. Answers 404 while payout runs are not switched on for your workspace (list_payout_runs says so in execution.enabled). Needs a Last Price credential with billing write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| run_id* | string | The payout run: id on a list_payout_runs or request_payout_run result. |
{
"type": "object",
"required": [
"run_id"
],
"properties": {
"run_id": {
"type": "string",
"format": "uuid",
"description": "The payout run: id on a list_payout_runs or request_payout_run result."
}
},
"additionalProperties": false
}Withdraw a pending invitation: invitation_id on a list_invitations result. Needs an API key sent as x-api-key that holds the team:admin scope, made by someone who is still an owner or admin of the workspace; a token or any other key is refused. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| invitation_id* | string | The invitation to withdraw. |
{
"type": "object",
"required": [
"invitation_id"
],
"properties": {
"invitation_id": {
"type": "string",
"format": "uuid",
"description": "The invitation to withdraw."
}
},
"additionalProperties": false
}Make the version of a hosted model that was active before the current one active again. Answers 409 when no version was active before. Answers 404 not_released while hosted models (the hosted-pricing-models release) are not switched on for your workspace. Needs a Last Price credential with function publish scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| model_id* | string | The hosted model's id: id on a list_hosted_models result. |
{
"type": "object",
"required": [
"model_id"
],
"properties": {
"model_id": {
"type": "string",
"format": "uuid",
"description": "The hosted model's id: id on a list_hosted_models result."
}
},
"additionalProperties": false
}Run the behaviour test scenarios against one of your agents and answer the stored run with every scenario's result. It uses your workspace's own Anthropic key, so the model calls are billed to that key, and it is limited to 20 runs a day. Pass scenario_ids to run only some scenarios, or system_prompt_override to test a draft prompt. In early access: it answers released false or not_released until it is switched on for your workspace. Runs never send real mail. Needs a Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| agent_id* | string | The agent to test: its id, as an agent shows in your workspace. An agent's own credential can name only its own agent. |
| scenario_ids | array | Run only these scenarios: ids from get_agent_behaviour_tests. Omit to run the whole pack. |
| private_terms | array | Words or phrases the agent must never repeat in its replies, such as a floor price or a cost. |
| approved_recipients | array | Email addresses the agent is allowed to write to during the run. |
| system_prompt_override | string | Test this draft system prompt instead of the agent's saved one. |
| scenario_timeout_seconds | integer | Seconds each scenario may take before it counts as an error. Defaults to 22 here, so a run answers inside this tool's 30 second limit. |
Run the commerce pipeline once: pull catalogs and competitor prices, match them, apply the policies and draft price proposals. By default it is a dry run that drafts proposals and pushes nothing to a store. With execute true it also pushes approved proposals to the connected store, which changes live prices and needs the commerce execute scope as well. Needs a Last Price credential with commerce proposal draft scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| execute | boolean | Push approved proposals to the store. Defaults to false. |
| expires_in_seconds | number | How long drafted proposals stay open, up to 30 days. |
{
"type": "object",
"properties": {
"execute": {
"type": "boolean",
"description": "Push approved proposals to the store. Defaults to false."
},
"expires_in_seconds": {
"type": "number",
"maximum": 2592000,
"description": "How long drafted proposals stay open, up to 30 days.",
"exclusiveMinimum": 0
}
},
"additionalProperties": false
}Probe the endpoint of one of your external functions now: one sample call, recorded with the history and fed into the router's circuit breaker. Pass function_id. It calls your endpoint, so a function that is not active and external with an endpoint URL is refused. Read the history with get_function_health. Needs a claimed Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| function_id* | string | The pricing function UUID: id on a list_functions result. |
{
"type": "object",
"required": [
"function_id"
],
"properties": {
"function_id": {
"type": "string",
"format": "uuid",
"description": "The pricing function UUID: id on a list_functions result."
}
},
"additionalProperties": false
}Run the marketplace review of one of your functions now, as a dry run: it makes one sample call to the function, stores the report on the listing when there is one and never changes whether the listing is public. Pass function_id. The sample call spends your endpoint or provider key. Needs a claimed Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| function_id* | string | The pricing function UUID: id on a list_functions result. |
{
"type": "object",
"required": [
"function_id"
],
"properties": {
"function_id": {
"type": "string",
"format": "uuid",
"description": "The pricing function UUID: id on a list_functions result."
}
},
"additionalProperties": false
}Run a pricing chain: stages one after another, each stage's price feeding the next as current_price and its metadata carrying forward, your price guardrails applied once at the end from your own current_price. Stage kinds: function (a pricing function, with an optional fallback), clamp (holds the running price inside limits) and, where model stages are switched on for your workspace, llm (a prompt that lets a model adjust the price within max_change_pct, or only annotate it) and vision (the same, looking at a public https image_url, with image_consent true; it never analyses faces or emotions). Each stage reports its price in and out; a model stage also returns its annotation. Each function stage that prices is one metered call, each model stage that answers is one metered model call. Needs a Last Price credential with price compute scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| stages* | array | The stages, in order, at most 10. The fields that apply depend on kind. |
| context* | object | The pricing context. currency is required. |
| constraints | object | Optional limits applied at the end, with your guardrails. |
| include_explanation | boolean | If true, each stage and the chain explain their price. |
{
"type": "object",
"required": [
"stages",
"context"
],
"properties": {
"stages": {
"type": "array",
"items": {
"type": "object",
"properties": {
"kind": {
"enum": [
"function",
"clamp",
"llm",
"vision"
],
"type": "string",
"description": "The stage kind. Defaults to function."
},
"mode": {
"enum": [
"adjust",
"annotate"
],
"type": "string",
"description": "llm and vision stages: adjust (the default) may move the price; annotate only describes it."
},
"label": {
"type": "string",
"maxLength": 80,
"description": "Optional name shown in the answer."
},
"prompt": {
"type": "string",
"maxLength": 2000,
"description": "llm and vision stages: the instruction. May use {{price}}, {{currency}}, {{product_type}}, {{customer_segment}}, {{geo}}, {{channel}} and {{metadata.<key>}}."
},
"metadata": {
"type": "object",
"description": "Added to the running context for this stage and every later one."
},
"on_error": {
"enum": [
"skip",
"fail"
],
"type": "string",
"description": "function, llm and vision stages: skip (the default) passes the price through; fail stops the chain."
},
"image_url": {
"type": "string",
"maxLength": 2048,
"description": "vision stage: a public https image. Defaults to metadata image_url."
},
"max_price": {
"type": "number",
"minimum": 0,
"description": "clamp stage: lower the price to at most this."
},
"min_price": {
"type": "number",
"minimum": 0,
"description": "clamp stage: raise the price to at least this."
},
"timeout_ms": {
"type": "integer",
"maximum": 30000,
"minimum": 1000,
"description": "llm and vision stages: how long to wait for the model. Defaults to 10000."
},
"constraints": {
"type": "object",
"description": "function stage: its own min_price and max_price."
},
"function_id": {
"type": "string",
"format": "uuid",
"description": "function stage: the pricing function by UUID. Or function_name."
},
"function_name": {
"type": "string",
"description": "function stage: the pricing function by name, e.g. lastprice/cost-plus. Or function_id."
},
"image_consent": {
"enum": [
true
],
"type": "boolean",
"description": "vision stage: required, true. You confirm you may send the image to a third-party model."
},
"max_change_pct": {
"type": "number",
"maximum": 50,
"minimum": 0,
"description": "llm and vision stages: how far an adjust may move the price, in percent. Defaults to 15."
},
"fallback_function_id": {
"type": "string",
"format": "uuid",
"description": "function stage: the fallback by UUID."
},
"fallback_function_name": {
"type": "string",
"description": "function stage: tried once when the function fails."
},
"max_over_competitor_pct": {
"type": "number",
"maximum": 1000,
"minimum": 0,
"description": "clamp stage: at most this percent over metadata competitor_price."
}
}
},
"maxItems": 10,
"minItems": 1,
"description": "The stages, in order, at most 10. The fields that apply depend on kind."
},
"context": {
"type": "object",
"required": [
"currency"
],
"properties": {
"geo": {
"type": "string",
"description": "Optional geography hint, e.g. US."
},
"channel": {
"type": "string",
"maxLength": 64,
"description": "Optional sales channel; a saved rate raises the final price once."
},
"currency": {
"type": "string",
"maxLength": 3,
"minLength": 3,
"description": "Three-letter ISO currency code, e.g. USD."
},
"metadata": {
"type": "object",
"description": "Optional context every stage sees, such as unit_cost or competitor_price."
},
"product_type": {
"enum": [
"saas",
"ecommerce",
"marketplace",
"digital",
"api",
"custom"
],
"type": "string",
"description": "Optional category."
},
"current_price": {
"type": "number",
"minimum": 0,
"description": "Your current price. The guardrails measure from it; a clamp, llm or vision first stage needs it."
},
"customer_segment": {
"type": "string",
"description": "Optional segment, e.g. enterprise."
}
},
"description": "The pricing context. currency is required."
},
"constraints": {
"type": "object",
"properties": {
"max_price": {
"type": "number",
"minimum": 0,
"description": "The final price is at most this."
},
"min_price": {
"type": "number",
"minimum": 0,
"description": "The final price is at least this."
}
},
"description": "Optional limits applied at the end, with your guardrails."
},
"include_explanation": {
"type": "boolean",
"description": "If true, each stage and the chain explain their price."
}
},
"additionalProperties": false
}Run one of the seven reference pipelines on the pricing-chain engine without a key: every number in the answer is computed. Rate limited per IP (10 per hour). Answers 501 pipeline_execution_unavailable while the public-pipeline-run flag is off. Needs context.current_price or context.unit_cost. Any stage it could not run is listed under not_run, and the rest still prices. Works without a Last Price credential; list_pricing_pipelines shows the pipelines.
| Argument | Type | Description |
|---|---|---|
| context | object | The numbers to price from. Needs current_price or unit_cost. |
| product | object | What is being priced. |
| pipeline | string | Which reference pipeline to run. Defaults to fast_path. |
| image_consent | boolean | true confirms the product image may be sent to a third-party model, for the pipelines that read images. |
{
"type": "object",
"properties": {
"context": {
"type": "object",
"properties": {
"currency": {
"type": "string",
"description": "Three-letter code. Defaults to USD."
},
"unit_cost": {
"type": "number",
"maximum": 100000,
"minimum": 0
},
"current_price": {
"type": "number",
"maximum": 100000,
"minimum": 0
},
"competitor_price": {
"type": "number",
"maximum": 100000,
"minimum": 0
},
"target_margin_pct": {
"type": "number",
"maximum": 95,
"minimum": 0
}
},
"description": "The numbers to price from. Needs current_price or unit_cost.",
"additionalProperties": false
},
"product": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"vertical": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"image_url": {
"type": "string",
"maxLength": 2048,
"description": "A full https URL."
},
"description": {
"type": "string",
"maxLength": 500,
"minLength": 1
},
"product_type": {
"enum": [
"saas",
"ecommerce",
"marketplace",
"digital",
"api",
"custom"
],
"type": "string"
}
},
"description": "What is being priced.",
"additionalProperties": false
},
"pipeline": {
"enum": [
"fast_path",
"vision_first",
"reason_first",
"direct_multimodal",
"retrieval_augmented",
"fan_out_maximalist",
"cascade"
],
"type": "string",
"description": "Which reference pipeline to run. Defaults to fast_path."
},
"image_consent": {
"type": "boolean",
"description": "true confirms the product image may be sent to a third-party model, for the pipelines that read images."
}
},
"additionalProperties": false
}Run a scrape job now: fetch its page once, read the prices with its selectors and record the run. The answer is the run, with the prices found and its status. Hosted scraping is behind a release flag: until it is on for your workspace this answers 501 hosted_scraping_not_enabled. Runs honour robots.txt and fetch only public https pages. Needs a Last Price credential with the commerce:configure scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| job_id* | string | The scrape job UUID: id on a list_scrape_jobs result. |
{
"type": "object",
"required": [
"job_id"
],
"properties": {
"job_id": {
"type": "string",
"format": "uuid",
"description": "The scrape job UUID: id on a list_scrape_jobs result."
}
},
"additionalProperties": false
}Find a domain for a storefront: send query (a name, tried with .com, .ai, .io, .co, .app, .dev, .shop and .store) or domains (up to 50 exact ones) and get whether each is available and its first-year price in USD. Read-only: nothing is registered or paid. Only where the workspace has storefronts and domain search switched on (else an error with code not_released). Needs a Last Price credential with workspace settings read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| query | string | A name to try with common endings, such as acme pricing. |
| domains | array | Exact domains to ask about instead of query. |
{
"type": "object",
"properties": {
"query": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "A name to try with common endings, such as acme pricing."
},
"domains": {
"type": "array",
"items": {
"type": "string",
"maxLength": 260,
"minLength": 3
},
"maxItems": 50,
"minItems": 1,
"description": "Exact domains to ask about instead of query."
}
},
"additionalProperties": false
}Load a self-contained demo into your workspace: a memory store, a small catalog, competitor prices below it and an undercut policy in manual mode, so run_commerce_cycle drafts proposals you can approve. Safe to repeat; it reuses what it made. Needs a Last Price credential with commerce configure scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Email an invoice to the customer and mark it sent: pass invoice_id, and optionally to (an email address; the customer's own is used otherwise). This sends a real email and answers 404 once the invoice is already sent, so check it with get_invoice first. Needs a claimed Last Price credential with billing write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| to | string | The address to send it to. Defaults to the customer's own. |
| invoice_id* | string | The invoice: its id, as list_invoices shows it. |
{
"type": "object",
"required": [
"invoice_id"
],
"properties": {
"to": {
"type": "string",
"format": "email",
"description": "The address to send it to. Defaults to the customer's own."
},
"invoice_id": {
"type": "string",
"format": "uuid",
"description": "The invoice: its id, as list_invoices shows it."
}
},
"additionalProperties": false
}Save the organization name and domain your Personal Agent Protocol file carries: pass organization_name and domain (a host name such as acme-outdoor.com). A new domain gets a new verification value and has to be checked again. Returns the file to publish at https://<domain>/.well-known/poppy.json; publish it exactly as given, then call verify_agent_protocol. Answers 404 until agent protocol files are switched on for your workspace. Needs a Last Price credential with routing write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| domain* | string | The host that will serve the file, such as acme-outdoor.com. |
| organization_name* | string | The name personal agents show for you. |
{
"type": "object",
"required": [
"organization_name",
"domain"
],
"properties": {
"domain": {
"type": "string",
"maxLength": 253,
"minLength": 1,
"description": "The host that will serve the file, such as acme-outdoor.com."
},
"organization_name": {
"type": "string",
"maxLength": 120,
"minLength": 1,
"description": "The name personal agents show for you."
}
},
"additionalProperties": false
}Change the pricing analyst settings for your workspace: turn the brief on or off, choose weekly or nightly, choose whether a written brief may be paid from your Last Price balance, with a monthly cap, and schedule the commerce cycle (daily or weekly at 03:00 UTC), which only drafts price proposals for approval and never pushes a price. Only the fields sent change. Paying from the balance is never on unless you turn it on, and it needs a cap. Refused until the brief is switched on for your workspace. Needs a Last Price credential with routing write scope (and commerce proposal draft scope for the cycle fields); from the dashboard, an owner or admin. The two balance fields are the owner's choice: the agent that owns the workspace, a credential with billing write scope, or the owner on the dashboard. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| cadence | string | weekly (Monday) or nightly. |
| enabled | boolean | true writes your workspace a brief; false stops it. |
| cycle_cadence | string | daily, or weekly on Monday, both at 03:00 UTC. |
| cycle_enabled | boolean | true runs your commerce cycle on a schedule with execute false: it drafts price proposals and never pushes a price. |
| balance_opt_in | boolean | true lets a written brief be paid from your Last Price balance once the monthly allowance is spent. Needs balance_monthly_cap_usd, sent now or already saved. |
Set buyer-aware pricing for your workspace: the mode (off, shadow or live), which model prices in live mode, and which request fields the models may read. Live changes the prices your buyers are quoted, always inside the exploration band, never below cost and inside your price guardrails. A field left out keeps its saved value; null goes back to the default. Needs a Last Price credential with routing write scope; from the dashboard, an owner or admin.
| Argument | Type | Description |
|---|---|---|
| mode | string | null | shadow: each buyer model prices quotes on the side and only logs its price (the default); live: the chosen model prices learned and optimizer quotes, inside the exploration band and your guardrails; off: nothing runs. null goes back to shadow. |
| model | string | null | Which model prices in live mode: auto (a promoted hosted model, else the contextual bandit, else the boosted model), bandit, boosted or hosted. null goes back to auto. |
| features | array | null | The request fields the models may read. Default buyer type and channel. Customer segment and geo are off unless you add them: in the EU, pricing consumers by location is restricted and personalised prices must be disclosed. null goes back to the default. |
{
"type": "object",
"properties": {
"mode": {
"enum": [
"off",
"shadow",
"live",
null
],
"type": [
"string",
"null"
],
"description": "shadow: each buyer model prices quotes on the side and only logs its price (the default); live: the chosen model prices learned and optimizer quotes, inside the exploration band and your guardrails; off: nothing runs. null goes back to shadow."
},
"model": {
"enum": [
"auto",
"bandit",
"boosted",
"hosted",
null
],
"type": [
"string",
"null"
],
"description": "Which model prices in live mode: auto (a promoted hosted model, else the contextual bandit, else the boosted model), bandit, boosted or hosted. null goes back to auto."
},
"features": {
"type": [
"array",
"null"
],
"items": {
"enum": [
"buyer_type",
"channel",
"customer_segment",
"geo"
],
"type": "string"
},
"maxItems": 4,
"minItems": 1,
"description": "The request fields the models may read. Default buyer type and channel. Customer segment and geo are off unless you add them: in the EU, pricing consumers by location is restricted and personalised prices must be disclosed. null goes back to the default."
}
},
"additionalProperties": false
}Save the channel rates for your workspace. A price request that names a saved channel (the channel argument of compute_price) is raised so you keep the same amount after the channel's cut. Your price guardrails still hold the raised price. This replaces the whole list: a channel left out is removed, so read get_channel_rates first and send every channel you want to keep. An empty list removes them all. Needs a Last Price credential with routing write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| rates* | array | Every channel to keep, at most 25. Each channel name appears once. |
{
"type": "object",
"required": [
"rates"
],
"properties": {
"rates": {
"type": "array",
"items": {
"type": "object",
"required": [
"channel",
"cut_pct"
],
"properties": {
"channel": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "The channel name, as sent in compute_price: letters, digits, _ and -, starting with a letter or digit. Matched case-insensitively."
},
"cut_pct": {
"type": "number",
"maximum": 60,
"minimum": 0,
"description": "What the channel keeps of the sale, in percent, from 0 to 60."
},
"passed_on_pct": {
"type": "number",
"default": 100,
"maximum": 100,
"minimum": 0,
"description": "How much of that cut is added to the price, in percent. 100 (the default) keeps your amount whole; 0 leaves the price as it is."
}
},
"additionalProperties": false
},
"maxItems": 25,
"description": "Every channel to keep, at most 25. Each channel name appears once."
}
},
"additionalProperties": false
}Pause or resume a linked store. A paused connector is skipped by the cycle and by execution. connector_id is the id from list_commerce_connectors. Needs the owner or admin role and a Last Price credential with commerce configure scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| active* | boolean | true to resume, false to pause. |
| connector_id* | string | The connector id, as list_commerce_connectors gives it. |
{
"type": "object",
"required": [
"connector_id",
"active"
],
"properties": {
"active": {
"type": "boolean",
"description": "true to resume, false to pause."
},
"connector_id": {
"type": "string",
"format": "uuid",
"description": "The connector id, as list_commerce_connectors gives it."
}
},
"additionalProperties": false
}Switch bandit allocation on or off for one of your stored experiments, and set its floors: pass experiment_key and bandit_enabled, and optionally min_weight_pct (1 to 50, the least traffic any arm keeps) and control_min_weight_pct (1 to 90, the least control keeps). The floors have to fit the number of arms. Read the result with get_experiment_stopping. Answers "not enabled" until sequential testing is switched on for your workspace. Needs a claimed Last Price credential for the workspace that owns the experiment. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| bandit_enabled* | boolean | Whether bandit allocation is on. |
| experiment_key* | string | The experiment key, as created (lowercase letters, digits and underscores). |
| min_weight_pct | integer | The least traffic any arm keeps, in percent. |
| control_min_weight_pct | integer | The least traffic control keeps, in percent. |
{
"type": "object",
"required": [
"experiment_key",
"bandit_enabled"
],
"properties": {
"bandit_enabled": {
"type": "boolean",
"description": "Whether bandit allocation is on."
},
"experiment_key": {
"type": "string",
"pattern": "^[a-z0-9_]+$",
"maxLength": 200,
"minLength": 1,
"description": "The experiment key, as created (lowercase letters, digits and underscores)."
},
"min_weight_pct": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "The least traffic any arm keeps, in percent."
},
"control_min_weight_pct": {
"type": "integer",
"maximum": 90,
"minimum": 1,
"description": "The least traffic control keeps, in percent."
}
},
"additionalProperties": false
}Save your workspace's feature contract, replacing the one saved: the request fields, by API path, your buyer-aware pricing models learn from, and how each becomes a label (a category, a numeric bin or a flag). Fields that identify a person are refused. Needs a Last Price credential with routing write scope; from the dashboard, an owner or admin.
| Argument | Type | Description |
|---|---|---|
| opt_in | array | The customer segment and geo fields are used only when listed here, as in buyer-aware pricing. |
| contract* | object | The contract: { inputs: [...] } in model column order, at most 64. Each input has a name, the field's path in the pricing request context (a top-level field such as the buyer type or channel, or metadata.<path> such as metadata.device.type; a list is read through [] and reduced, as in metadata.items[]:count, metadata.items[].price:sum or metadata.items[].kind:has=hdmi), and a type: category (with vocabulary, 1 to 50 values), bucket (with edges, rising numbers) or flag. infer_feature_contract proposes one from sample requests. |
{
"type": "object",
"required": [
"contract"
],
"properties": {
"opt_in": {
"type": "array",
"items": {
"enum": [
"customer_segment",
"geo"
],
"type": "string"
},
"description": "The customer segment and geo fields are used only when listed here, as in buyer-aware pricing."
},
"contract": {
"type": "object",
"required": [
"inputs"
],
"properties": {
"inputs": {
"type": "array",
"items": {
"type": "object"
},
"maxItems": 64,
"minItems": 1
}
},
"description": "The contract: { inputs: [...] } in model column order, at most 64. Each input has a name, the field's path in the pricing request context (a top-level field such as the buyer type or channel, or metadata.<path> such as metadata.device.type; a list is read through [] and reduced, as in metadata.items[]:count, metadata.items[].price:sum or metadata.items[].kind:has=hdmi), and a type: category (with vocabulary, 1 to 50 values), bucket (with edges, rising numbers) or flag. infer_feature_contract proposes one from sample requests."
}
},
"additionalProperties": false
}Turn learned pricing on or off, choose how new estimates are applied, or turn its email on or off. Only the fields you send change. apply_mode is optional: turning it on without one keeps the saved mode, or else runs in preview (changes recorded, no price moves) until the automatic default is released; mode in the answer says which. auto applies each new estimate at once and announces every change; approve keeps pricing on the last approved estimate until you approve each change with decide_learned_price_change. enabled false keeps the saved mode. Needs a Last Price credential with routing write scope, or the key of the agent that registered an unclaimed workspace, which owns it.
| Argument | Type | Description |
|---|---|---|
| enabled | boolean | Price from the learned elasticity. True without apply_mode keeps the saved mode, else runs in preview. |
| apply_mode | string | auto: each new estimate prices at once. approve: each change waits for decide_learned_price_change. |
| email_notifications | boolean | Email owners, admins and admin agents with an inbox about changes. |
{
"type": "object",
"properties": {
"enabled": {
"type": "boolean",
"description": "Price from the learned elasticity. True without apply_mode keeps the saved mode, else runs in preview."
},
"apply_mode": {
"enum": [
"auto",
"approve"
],
"type": "string",
"description": "auto: each new estimate prices at once. approve: each change waits for decide_learned_price_change."
},
"email_notifications": {
"type": "boolean",
"description": "Email owners, admins and admin agents with an inbox about changes."
}
},
"additionalProperties": false
}Open one product to offers, or change it: this saves the product whole (create or replace). Buyers see the list price and never the floor price, which is never breached; the floor cannot exceed the list price. Each product has its own switch, off unless you set enabled. Needs a Last Price credential with routing write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| title | string | null | A name for your own reference. |
| enabled* | boolean | Whether buyers can make offers on this product. |
| currency | string | A three letter ISO 4217 code. Defaults to USD. |
| unit_cost | number | null | Your cost per unit, read by the margin and cost guardrails. |
| list_price* | number | The asking price buyers see. |
| max_rounds | integer | null | Rounds for this product, instead of the workspace setting. |
| product_id* | string | Your own id for the product, as buyers name it in an offer. |
Turn offers and counter-offers on or off for your workspace and set the schedule every negotiation runs on. Omitted fields keep their saved value, or the default. A handle another workspace holds is refused. Needs a Last Price credential with routing write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| handle | string | Your public handle: 3 to 40 lowercase letters, digits or hyphens. |
| enabled* | boolean | Whether buyers can make offers to your workspace at all. Off by default. |
| max_rounds | integer | Most offers a buyer may make in one negotiation. |
| concession_rate | number | How far each counter moves toward the buyer, between 0 and 1. |
| min_offer_ratio | number | Offers below this share of the list price are rejected outright. |
| offer_ttl_minutes | integer | How long a counter stands before it expires, in minutes. |
| daily_negotiation_cap | integer | Most new negotiations a day. |
Save your workspace's payout schedule whole. On each run day (UTC) a payout run of every unpaid ledger entry whose billing period has ended is requested in the name of whoever saved the schedule, so it still waits for approval by someone else, never by that saver; while a request is still waiting, the next run day requests nothing new. Turning it on needs a person behind the credential: a signed-in user, or a key or agent a person created. Answers 404 while payout runs are not switched on for your workspace (list_payout_runs says so in execution.enabled). Needs a Last Price credential with billing write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| cadence* | string | weekly or monthly. |
| enabled* | boolean | true to request payouts on each run day, false to stop. |
| run_day* | integer | weekly: 1 (Monday) to 7 (Sunday). monthly: 1 to 28, so every month has it. |
| auto_retry | boolean | Re-send transfers waiting for a retry each hour, with the same idempotency keys. Defaults to true. |
{
"type": "object",
"required": [
"enabled",
"cadence",
"run_day"
],
"properties": {
"cadence": {
"enum": [
"weekly",
"monthly"
],
"type": "string",
"description": "weekly or monthly."
},
"enabled": {
"type": "boolean",
"description": "true to request payouts on each run day, false to stop."
},
"run_day": {
"type": "integer",
"maximum": 28,
"minimum": 1,
"description": "weekly: 1 (Monday) to 7 (Sunday). monthly: 1 to 28, so every month has it."
},
"auto_retry": {
"type": "boolean",
"description": "Re-send transfers waiting for a retry each hour, with the same idempotency keys. Defaults to true."
}
},
"additionalProperties": false
}Turn price exploration on or off for your workspace, set its rate (at most 10% either way), or set how far past the prices already tried the optimizer may go (beyond_pct, 1 to 10%, default 5). It is on by default while learned pricing is on; turning it off gives every learned price exactly as computed. A field left out keeps its saved value. Needs a Last Price credential with routing write scope; from the dashboard, an owner or admin.
| Argument | Type | Description |
|---|---|---|
| rate | number | null | The most a price may vary either way, as a fraction from 0.005 to 0.1: 0.03 is up to 3%. null goes back to 0.1, the default. |
| enabled | boolean | null | true turns price exploration on, false turns it off; null goes back to the default, which is on while learned pricing sets live prices (automatic or approve). |
| beyond_pct | number | null | How far past the lowest and highest prices a learned estimate was measured at the optimizer may price, in percent from 1 to 10 in steps of 0.5; null goes back to 5, the default. Refused until the pricing analyst is switched on for your workspace. |
{
"type": "object",
"properties": {
"rate": {
"type": [
"number",
"null"
],
"maximum": 0.1,
"minimum": 0.005,
"description": "The most a price may vary either way, as a fraction from 0.005 to 0.1: 0.03 is up to 3%. null goes back to 0.1, the default."
},
"enabled": {
"type": [
"boolean",
"null"
],
"description": "true turns price exploration on, false turns it off; null goes back to the default, which is on while learned pricing sets live prices (automatic or approve)."
},
"beyond_pct": {
"type": [
"number",
"null"
],
"maximum": 10,
"minimum": 1,
"multipleOf": 0.5,
"description": "How far past the lowest and highest prices a learned estimate was measured at the optimizer may price, in percent from 1 to 10 in steps of 0.5; null goes back to 5, the default. Refused until the pricing analyst is switched on for your workspace."
}
},
"additionalProperties": false
}Save the price guardrails for your workspace. max_change_pct, min_margin_pct and never_below_cost hold every final price your workspace is given, from compute_price and every other pricing call. band_lower_ratio and band_upper_ratio are only the range the optimizer and elasticity functions search when a call sends no minimum or maximum. This replaces the whole saved set: an omitted field takes its default, so read get_price_guardrails first and send every rule you want to keep. Needs a Last Price credential with routing write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| max_change_pct | number | null | Most a final price may move from the current price, up or down, in percent. Null (the default) for no limit. |
| min_margin_pct | number | null | Least margin over the unit cost a call sends, in percent of the price. Null (the default) for no minimum. |
| band_lower_ratio | number | Lowest price the optimizer and elasticity functions search, as a multiple of the current price. Defaults to 0.5. |
| band_upper_ratio | number | Highest price the optimizer and elasticity functions search, as a multiple of the current price. Defaults to 2. |
| never_below_cost | boolean | Never price below the unit cost a call sends. Defaults to true. |
Confirm or change the category of one of your workspace's products: product_id is the product id your quotes send (or a store item's SKU), category_id is an id from the tree list_product_categories returns, at any level. Replaces any earlier category for that product and answers with the same body as list_product_categories. Needs a Last Price credential with routing write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| product_id* | string | The product id, as quotes send it in context.product_id, or a store item's SKU. |
| category_id* | string | A category id from the tree list_product_categories returns, for example api-metering. |
{
"type": "object",
"required": [
"product_id",
"category_id"
],
"properties": {
"product_id": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "The product id, as quotes send it in context.product_id, or a store item's SKU."
},
"category_id": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "A category id from the tree list_product_categories returns, for example api-metering."
}
},
"additionalProperties": false
}Save a spend policy whole: agent_id for one agent, or leave it out for the workspace default every other agent spends under. An omitted field takes its default, so read get_spend_policy first and send every rule you want to keep. An agent's own key cannot change the rules that bind it: use a workspace-wide key. Needs a Last Price credential with routing write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| preset | string | null | procurement switches on company buying rules in one step, filling ask_above 500, quotes_required_above 5000 and, with preferred_sellers, block_unknown_sellers for whichever you leave out. Only where get_spend_policy says procurement.available. |
| agent_id | string | null | The agent this policy governs. Null or omitted for the workspace default. |
| currency | string | Currency of every amount here; purchases in another are denied. Defaults to USD. |
| ask_above | number | null | Purchases above this wait for a person's approval. Null (the default) for never. |
| daily_cap | number | null | Most all purchases may cost in one UTC day. Null (the default) for no cap. |
| fair_price | string | When verify_price judges a price too high: off (ignore, the default), ask a person, or deny. |
Close the reservation an allowed check_purchase gave you, once: outcome paid when the purchase went through (send amount when you paid less than reserved; never more), or failed when it did not, which gives the amount back to today's budget. When you cannot tell (the payment timed out or the answer was unreadable), send outcome unknown: the amount stays held, failed is then refused, and reconcile_purchase closes it once you know. A reservation is never released by time alone, so always settle it. Needs a Last Price credential with price compute scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| note | string | Optional: an order or transaction reference, or why it failed or what you saw. |
| amount | number | With paid: what you actually paid, if less than reserved. |
| pay_to | string | With paid, when check_purchase named pay_to (then required): the account the money went to. Another account keeps the amount held as unknown, with code payee_changed, for the owner to reconcile with reconcile_purchase. A retry cannot clear the hold. |
| outcome* | string | paid: the purchase went through. failed: it did not. unknown: you cannot tell yet. |
| reservation_id* | string | reservation.id from check_purchase. |
{
"type": "object",
"required": [
"reservation_id",
"outcome"
],
"properties": {
"note": {
"type": "string",
"maxLength": 500,
"description": "Optional: an order or transaction reference, or why it failed or what you saw."
},
"amount": {
"type": "number",
"minimum": 0,
"description": "With paid: what you actually paid, if less than reserved."
},
"pay_to": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "With paid, when check_purchase named pay_to (then required): the account the money went to. Another account keeps the amount held as unknown, with code payee_changed, for the owner to reconcile with reconcile_purchase. A retry cannot clear the hold."
},
"outcome": {
"enum": [
"paid",
"failed",
"unknown"
],
"type": "string",
"description": "paid: the purchase went through. failed: it did not. unknown: you cannot tell yet."
},
"reservation_id": {
"type": "string",
"format": "uuid",
"description": "reservation.id from check_purchase."
}
},
"additionalProperties": false
}Say what happened to a call you drew for with draw_session_spend. outcome failed: the payment did not go through, so the draw goes back to the session. outcome unknown: you cannot tell (a timeout, an unreadable answer), so the draw keeps counting until it is reconciled. Then, from what you checked, outcome paid (amount when less than drawn) or not paid, each with a note. Not paid gives budget back, so only the workspace's owner may send it: a workspace-wide key with routing write scope, never an agent's own key. Needs a Last Price credential with price compute scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| note | string | What you saw or checked. Required to reconcile. |
| amount | number | With paid: what was actually paid, if less than drawn. |
| draw_id* | string | draw.id from draw_session_spend. |
| outcome* | string | failed or unknown to report the call; paid or not paid to reconcile one reported unknown. |
| session_id* | string | reservation.id from open_spend_session. |
{
"type": "object",
"required": [
"session_id",
"draw_id",
"outcome"
],
"properties": {
"note": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "What you saw or checked. Required to reconcile."
},
"amount": {
"type": "number",
"minimum": 0,
"description": "With paid: what was actually paid, if less than drawn."
},
"draw_id": {
"type": "string",
"format": "uuid",
"description": "draw.id from draw_session_spend."
},
"outcome": {
"enum": [
"failed",
"unknown",
"paid",
"not_paid"
],
"type": "string",
"description": "failed or unknown to report the call; paid or not paid to reconcile one reported unknown."
},
"session_id": {
"type": "string",
"format": "uuid",
"description": "reservation.id from open_spend_session."
}
},
"additionalProperties": false
}Simulate how much of a sale to offer an agent platform (a shopping agent or agent marketplace that charges sellers a cut) if it ranks sellers partly by the cut they pay. No platform publishes such a ranking, so this is a simulation under your assumption (visibility_per_point_pct: percent more channel sales per extra point of cut), also run at half, double and zero of it. Returns the profit at each cut, the recommended cut, the cut with the smallest worst case, the break-even, and a channel rate ready for PUT /api/channel-rates. Changes nothing. Answers 404 until the cut advisor is switched on for your workspace. Needs a Last Price credential with routing read scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| price* | number | Your own price before any channel cut. |
| channel | string | The channel name, as you save it in channel rates (e.g. instinct). |
| currency | string | ISO 4217 code of price and unit_cost, echoed back. |
| step_pct | number | Gap between the cuts tried. Defaults to 0.5. |
| unit_cost* | number | What one unit costs you, same currency. |
| base_units* | number |
Start a profiling run for a model on the AITune sidecar: pass model, and optionally batch_sizes, measurement_steps, saturation_cutoff and include_warmup to override the defaults. It uses GPU time on the sidecar; read the finished report with get_aitune_profiling. Needs a claimed Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| model* | string | The model to profile. |
| batch_sizes | array | The batch sizes to measure. |
| include_warmup | boolean | Include the warm-up run in the report. |
| measurement_steps | integer | How many steps to measure at each batch size. |
| saturation_cutoff | number | Stop growing the batch once throughput gains fall below this. |
{
"type": "object",
"required": [
"model"
],
"properties": {
"model": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "The model to profile."
},
"batch_sizes": {
"type": "array",
"items": {
"type": "integer",
"minimum": 1
},
"maxItems": 20,
"minItems": 1,
"description": "The batch sizes to measure."
},
"include_warmup": {
"type": "boolean",
"description": "Include the warm-up run in the report."
},
"measurement_steps": {
"type": "integer",
"maximum": 1000,
"minimum": 1,
"description": "How many steps to measure at each batch size."
},
"saturation_cutoff": {
"type": "number",
"maximum": 1,
"description": "Stop growing the batch once throughput gains fall below this.",
"exclusiveMinimum": 0
}
},
"additionalProperties": false
}Ask the frontier price model what it would charge for one of your products: it reads your own quotes for that product from the last 90 days (rebased onto today's price) and where the offer sits, and returns the price, the chance of a sale there and at today's price, the margin per quote when you give unit_cost, and the acceptance curve. It looks at most 10% past prices you have already quoted, inside min_price and max_price. A suggestion only: nothing is quoted, stored or learned, and no other workspace's quotes are read. Without unit_cost it maximises revenue. Answers not_released while it is not switched on for your workspace. Needs a Last Price credential with routing read scope.
| Argument | Type | Description |
|---|---|---|
| unit | string | What one unit is: item, call, token, seat-month, month, hour, gb, outcome or percent. |
| channel | string | Where it is sold, such as the web, an API, MCP or a marketplace. |
| category | string | A category id; its top-level ancestor is the vertical. |
| topology | string | How it is priced: posted, metered, per-call, seat, subscription, outcome, auction, negotiated, marketplace, bundle or dynamic. |
| max_price | number | Never suggest above this. |
| min_price | number | Never suggest below this. |
Pull the catalog from one linked store now. connector_id is the id from list_commerce_connectors. Needs a Last Price credential with commerce configure scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| connector_id* | string | The connector id, as list_commerce_connectors gives it. |
{
"type": "object",
"required": [
"connector_id"
],
"properties": {
"connector_id": {
"type": "string",
"format": "uuid",
"description": "The connector id, as list_commerce_connectors gives it."
}
},
"additionalProperties": false
}Pull recent orders from one linked store, for the store sales view. since limits it to orders after that time; the default is since the last sync, or 60 days on the first. Platforms that cannot read orders answer an error. Needs a Last Price credential with commerce configure scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| since | string | Only orders after this time. |
| connector_id* | string | The connector id, as list_commerce_connectors gives it. |
{
"type": "object",
"required": [
"connector_id"
],
"properties": {
"since": {
"type": "string",
"format": "date-time",
"description": "Only orders after this time."
},
"connector_id": {
"type": "string",
"format": "uuid",
"description": "The connector id, as list_commerce_connectors gives it."
}
},
"additionalProperties": false
}Dry-run a commerce pricing policy against an item and competitor observations you supply, and see the price it would propose and why. Nothing is saved. Needs a Last Price credential with commerce proposal draft scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| item* | object | The catalog item: its id, sku, price and attributes, as list_commerce_catalog shows one. |
| policy_id* | string | The policy id, as list_commerce_policies gives it. |
| marketplace | string | The marketplace the item is sold on, when the policy scopes by marketplace. |
| observations | array | Competitor observations for the item, as list_commerce_observations shows them. Defaults to none. |
{
"type": "object",
"required": [
"policy_id",
"item"
],
"properties": {
"item": {
"type": "object",
"description": "The catalog item: its id, sku, price and attributes, as list_commerce_catalog shows one.",
"additionalProperties": {}
},
"policy_id": {
"type": "string",
"format": "uuid",
"description": "The policy id, as list_commerce_policies gives it."
},
"marketplace": {
"type": "string",
"description": "The marketplace the item is sold on, when the policy scopes by marketplace."
},
"observations": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": {}
},
"description": "Competitor observations for the item, as list_commerce_observations shows them. Defaults to none."
}
},
"additionalProperties": false
}Test-run one pricing function with sample data and see the price, explanation, confidence and alternatives it returns, without publishing it or touching live traffic. Your own draft functions can be tested here; a function that runs on a model provider can be tested only by its owner. Send context (for example the current price), constraints or options to override the sample. Needs a Last Price credential with function test scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| context | object | Sample request context, for example the current price. Defaults to a current price of 29.99. |
| options | object | Optional compute options for the test. |
| constraints | object | Optional price limits for the test. |
| function_id* | string | The pricing function UUID: id on a list_functions result. |
{
"type": "object",
"required": [
"function_id"
],
"properties": {
"context": {
"type": "object",
"description": "Sample request context, for example the current price. Defaults to a current price of 29.99.",
"additionalProperties": {}
},
"options": {
"type": "object",
"description": "Optional compute options for the test.",
"additionalProperties": {}
},
"constraints": {
"type": "object",
"description": "Optional price limits for the test.",
"additionalProperties": {}
},
"function_id": {
"type": "string",
"format": "uuid",
"description": "The pricing function UUID: id on a list_functions result."
}
},
"additionalProperties": false
}Add USDC to your workspace's prepaid balance with one x402 payment signed by your own wallet. amount is in USDC, such as "25". Called without payment it spends nothing and returns the payment requirements to sign. Sign them, then call again with the same amount and payment set to the base64 payment (the value of the X-PAYMENT or PAYMENT-SIGNATURE header). The result gives the credited amount, any bonus and the new balance; get_billing_settings shows the terms. Needs a Last Price credential with the price:compute scope.
| Argument | Type | Description |
|---|---|---|
| amount* | string | USDC to add, with at most 6 decimals, such as "25" or "25.50". |
| payment | string | Optional. The signed x402 payment, base64, as sent in an X-PAYMENT or PAYMENT-SIGNATURE header. Omit it to read what the call costs and how to pay; nothing is charged until you send it. |
{
"type": "object",
"required": [
"amount"
],
"properties": {
"amount": {
"type": "string",
"pattern": "^[0-9]{1,9}(\\.[0-9]{1,6})?$",
"description": "USDC to add, with at most 6 decimals, such as \"25\" or \"25.50\"."
},
"payment": {
"type": "string",
"maxLength": 8192,
"minLength": 20,
"description": "Optional. The signed x402 payment, base64, as sent in an X-PAYMENT or PAYMENT-SIGNATURE header. Omit it to read what the call costs and how to pay; nothing is charged until you send it."
}
},
"additionalProperties": false
}Train a new version of a demand model on your workspace's own quote outcomes (reported, or inferred from what buyers did next). A held-out fifth of the quotes scores it against one pooled demand curve, and its metrics say by how much it did better. promote never (the default) stores it as a candidate, always makes it active, and if_better makes it active only when it beats the pooled curve and the active version. Answers 422 with the number of outcomes when there are too few to train on, and 422 for a price model. Answers 404 not_released while hosted models (the hosted-pricing-models release) are not switched on for your workspace. Needs a Last Price credential with function publish scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| promote | string | Whether the new version becomes active. Defaults to never. |
| model_id* | string | The hosted model's id: id on a list_hosted_models result. |
{
"type": "object",
"required": [
"model_id"
],
"properties": {
"promote": {
"enum": [
"never",
"always",
"if_better"
],
"type": "string",
"description": "Whether the new version becomes active. Defaults to never."
},
"model_id": {
"type": "string",
"format": "uuid",
"description": "The hosted model's id: id on a list_hosted_models result."
}
},
"additionalProperties": false
}Translate one source record into a vendor's payload in one call: Rosetta plans the mapping, compiles source_record against it and validates the result against vendor_contract (an id and the fields the vendor requires). The answer says whether the payload is ready, the plan, the payload, any skipped fields and each validation issue. Set allow_extra to let fields the contract does not list through, and extensions for vendor extensions. A plan below the confidence bar is queued for review. Needs a claimed Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| extensions | object | Vendor extensions to add to the payload. |
| allow_extra | boolean | Let fields the contract does not list through. |
| source_record* | object | The record to translate. |
| source_schema* | object | The source: an id for it and its fields. |
| vendor_contract* | object | What the vendor requires: an id and its fields. |
| canonical_schema* | string | object | The id of a built-in schema (see list_canonical_schemas) or a whole schema with an id and fields. |
Turn email alert types on or off, or choose right away or one daily summary, for yourself in your workspace. Send preferences, delivery or both, naming at least one alert type; the types are approval requested, dispute opened, webhook failing, payout update and outcomes needed. A caller that gets no alerts is refused. Needs a Last Price credential with notifications write scope; the agent that owns an unclaimed workspace needs none.
| Argument | Type | Description |
|---|---|---|
| delivery | object | Alert types to send right away or daily. |
| preferences | object | Alert types to switch on or off. |
{
"type": "object",
"properties": {
"delivery": {
"type": "object",
"properties": {
"analyst_brief": {
"enum": [
"immediate",
"daily"
],
"type": "string",
"description": "Send this alert right away or in the daily summary."
},
"payout_update": {
"enum": [
"immediate",
"daily"
],
"type": "string",
"description": "Send this alert right away or in the daily summary."
},
"dispute_opened": {
"enum": [
"immediate",
"daily"
],
"type": "string",
"description": "Send this alert right away or in the daily summary."
},
"outcomes_needed": {
"enum": [
"immediate",
"daily"
],
"type": "string",
"description": "Send this alert right away or in the daily summary."
},
"webhook_failing": {
"enum": [
"immediate",
"daily"
],
"type": "string",
"description": "Send this alert right away or in the daily summary."
},
"approval_requested": {
"enum": [
"immediate",
"daily"
],
"type": "string",
"description": "Send this alert right away or in the daily summary."
}
},
"description": "Alert types to send right away or daily.",
"additionalProperties": false
},
"preferences": {
"type": "object",
"properties": {
"analyst_brief": {
"type": "boolean",
"description": "Email when the pricing analyst brief is ready, counts and a link only (off by default)."
},
"payout_update": {
"type": "boolean",
"description": "Send this alert (on by default)."
},
"dispute_opened": {
"type": "boolean",
"description": "Send this alert (on by default)."
},
"outcomes_needed": {
"type": "boolean",
"description": "Send this alert (on by default)."
},
"webhook_failing": {
"type": "boolean",
"description": "Send this alert (on by default)."
},
"approval_requested": {
"type": "boolean",
"description": "Send this alert (on by default)."
}
},
"description": "Alert types to switch on or off.",
"additionalProperties": false
}
},
"additionalProperties": false
}Change your workspace's billing settings. Only the settings you send change. outcome_pricing turns on paying in full only when a price is used: a rejection reported with report_outcome within its window gives part back. balance_billing makes every compute call draw on the prepaid balance, and a call the balance cannot cover is refused. auto_topup is an offer, not a charge: below the threshold, results carry a top-up hint and nothing is paid automatically. A self-registered agent workspace cannot change outcome_pricing or balance_billing until it is claimed. Needs a Last Price credential with price compute scope; a person also needs the owner, admin or billing role.
| Argument | Type | Description |
|---|---|---|
| auto_topup | object | null | The auto top-up offer, or null to clear it. |
| balance_billing | boolean | Turn balance billing on or off. |
| outcome_pricing | boolean | Turn outcome pricing on or off. |
{
"type": "object",
"properties": {
"auto_topup": {
"type": [
"object",
"null"
],
"required": [
"enabled",
"threshold_usdc",
"amount_usdc"
],
"properties": {
"enabled": {
"type": "boolean",
"description": "Whether to offer a top-up below the threshold."
},
"amount_usdc": {
"type": [
"string",
"number"
],
"minimum": 0,
"maxLength": 32,
"description": "How many USDC to offer, e.g. \"25\". At least the minimum top-up."
},
"threshold_usdc": {
"type": [
"string",
"number"
],
"minimum": 0,
"maxLength": 32,
"description": "Offer a top-up when the balance falls below this many USDC, e.g. \"5\"."
}
},
"description": "The auto top-up offer, or null to clear it.",
"additionalProperties": false
},
"balance_billing": {
"type": "boolean",
"description": "Turn balance billing on or off."
},
"outcome_pricing": {
"type": "boolean",
"description": "Turn outcome pricing on or off."
}
},
"additionalProperties": false
}Change a commerce pricing policy. Only the fields you send change; rules replace the whole rule list. policy_id is the id from list_commerce_policies. Needs a Last Price credential with commerce configure scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| name | string | A name for the policy. |
| rules | array | The rules, tried in order; the first that produces a price wins. Each rule has an id, a kind and the fields its kind needs: a percent to undercut by, an amount to beat the lowest price by, a percent off the list price, a competitor to match, a fixed price, or a routing choice. The Pricing Policies section of the documentation lists them. |
| scope | object | Which items the policy covers: skus, brands and marketplaces lists. Empty covers every item. |
| is_active | boolean | Whether the pipeline applies the policy. |
| policy_id* | string | The policy id, as list_commerce_policies gives it. |
| description | string | What the policy is for. |
| floor_price | number |
Change a contact: pass contact_id and at least one of name, email, phone, address, external_id and metadata; null clears phone, address or external_id. A contact cannot be moved to another customer. Needs a claimed Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| name | string | The contact name. |
| string | The contact email. | |
| phone | string | null | The contact phone number; null clears it. |
| address | object | null | The contact address. |
| metadata | object | Anything worth keeping with the record. |
| contact_id* | string | The contact: its id, as list_contacts shows it. |
| external_id | string | null | Your own id for the contact; null clears it. |
{
"type": "object",
"required": [
"contact_id"
],
"properties": {
"name": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "The contact name."
},
"email": {
"type": "string",
"format": "email",
"description": "The contact email."
},
"phone": {
"type": [
"string",
"null"
],
"maxLength": 64,
"description": "The contact phone number; null clears it."
},
"address": {
"type": [
"object",
"null"
],
"properties": {
"city": {
"type": "string",
"maxLength": 128
},
"line1": {
"type": "string",
"maxLength": 256
},
"line2": {
"type": "string",
"maxLength": 256
},
"state": {
"type": "string",
"maxLength": 128
},
"country": {
"type": "string",
"maxLength": 128
},
"postal_code": {
"type": "string",
"maxLength": 32
}
},
"description": "The contact address.",
"additionalProperties": false
},
"metadata": {
"type": "object",
"description": "Anything worth keeping with the record."
},
"contact_id": {
"type": "string",
"format": "uuid",
"description": "The contact: its id, as list_contacts shows it."
},
"external_id": {
"type": [
"string",
"null"
],
"maxLength": 256,
"minLength": 1,
"description": "Your own id for the contact; null clears it."
}
},
"additionalProperties": false
}Change a credit bundle: activate it (status active), take it off sale (inactive), archive it, or change its name, description, price, credits or rollover. Code and currency are fixed. Early access. Needs a Last Price credential with billing write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| name | string | |
| price | number | |
| status | string | |
| credits | number | null | |
| plan_id* | string | The bundle id from list_credit_bundle_plans. |
| description | string | |
| rollover_credits | number | null |
{
"type": "object",
"required": [
"plan_id"
],
"properties": {
"name": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"price": {
"type": "number",
"minimum": 0
},
"status": {
"enum": [
"active",
"inactive",
"archived"
],
"type": "string"
},
"credits": {
"type": [
"number",
"null"
]
},
"plan_id": {
"type": "string",
"format": "uuid",
"description": "The bundle id from list_credit_bundle_plans."
},
"description": {
"type": "string",
"maxLength": 2000
},
"rollover_credits": {
"type": [
"number",
"null"
]
}
},
"additionalProperties": false
}Change a customer: pass customer_id and at least one of name, email and metadata. Needs a claimed Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| name | string | The customer name. |
| string | The customer email. | |
| metadata | object | Anything worth keeping with the record. |
| customer_id* | string | The customer: its id, as list_customers shows it. |
{
"type": "object",
"required": [
"customer_id"
],
"properties": {
"name": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "The customer name."
},
"email": {
"type": "string",
"format": "email",
"description": "The customer email."
},
"metadata": {
"type": "object",
"description": "Anything worth keeping with the record."
},
"customer_id": {
"type": "string",
"format": "uuid",
"description": "The customer: its id, as list_customers shows it."
}
},
"additionalProperties": false
}Change a payment dispute: pass dispute_id and at least one of status, reason (null clears it) and metadata. Move it to under review while you look into it and to resolved or rejected when you have decided. Needs a claimed Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| reason | string | null | Why it is disputed; null clears it. |
| status | string | The dispute status. |
| metadata | object | Anything worth keeping with the record. |
| dispute_id* | string | The dispute: its id, as list_disputes shows it. |
{
"type": "object",
"required": [
"dispute_id"
],
"properties": {
"reason": {
"type": [
"string",
"null"
],
"maxLength": 2048,
"description": "Why it is disputed; null clears it."
},
"status": {
"enum": [
"open",
"under_review",
"resolved",
"rejected"
],
"type": "string",
"description": "The dispute status."
},
"metadata": {
"type": "object",
"description": "Anything worth keeping with the record."
},
"dispute_id": {
"type": "string",
"format": "uuid",
"description": "The dispute: its id, as list_disputes shows it."
}
},
"additionalProperties": false
}Change a pricing function your workspace owns: its display name, description, status, tags, cost per unit, cost multiplier, endpoint, credential, schemas or model configuration. Only the fields you send change. Built-in functions and other workspaces' functions cannot be changed. Needs a Last Price credential with function publish scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| rule | object | null | For a rule based function: the rule it prices by. Its input schema is made from the rule, and a rule based function needs one before it can be active. On update null removes it. |
| tags | array | The tag list. On update it replaces the whole list. |
| status | string | active functions are routed to; draft, review, inactive and deprecated ones are not. |
| auth_config | object | null | How to authenticate to the endpoint, such as { type: "bearer", token: "..." }. Stored encrypted and never returned: a read says only whether one is saved. On update an object replaces it and null removes it. Treat the secret as sensitive: it passes through this conversation. |
| description | string | null | What the function does. Null clears it. |
| function_id* | string |
Change an invoice: pass invoice_id and at least one of status, amount, currency, due_date and metadata. Needs a claimed Last Price credential with billing write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| amount | number | The amount. |
| status | string | The invoice status. |
| currency | string | The currency code. |
| due_date | string | When the invoice is due, as an RFC 3339 date-time. |
| metadata | object | Anything worth keeping with the record. |
| invoice_id* | string | The invoice: its id, as list_invoices shows it. |
{
"type": "object",
"required": [
"invoice_id"
],
"properties": {
"amount": {
"type": "number",
"description": "The amount.",
"exclusiveMinimum": 0
},
"status": {
"enum": [
"draft",
"pending",
"sent",
"paid",
"overdue",
"cancelled"
],
"type": "string",
"description": "The invoice status."
},
"currency": {
"type": "string",
"maxLength": 8,
"minLength": 3,
"description": "The currency code."
},
"due_date": {
"type": "string",
"format": "date-time",
"description": "When the invoice is due, as an RFC 3339 date-time."
},
"metadata": {
"type": "object",
"description": "Anything worth keeping with the record."
},
"invoice_id": {
"type": "string",
"format": "uuid",
"description": "The invoice: its id, as list_invoices shows it."
}
},
"additionalProperties": false
}Change one of your marketplace listings: pass listing_id and at least one of is_public, commission_rate and min_payout_threshold. Making a private listing public runs the marketplace review first; a function that fails it stays as it was and the refusal carries the report. Needs a claimed Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| is_public | boolean | Whether the listing is public. |
| listing_id* | string | The marketplace listing: its id, as list_my_marketplace_listings shows it. |
| commission_rate | number | The share of each sale the marketplace keeps. |
| min_payout_threshold | number | The least balance that is paid out. |
{
"type": "object",
"required": [
"listing_id"
],
"properties": {
"is_public": {
"type": "boolean",
"description": "Whether the listing is public."
},
"listing_id": {
"type": "string",
"format": "uuid",
"description": "The marketplace listing: its id, as list_my_marketplace_listings shows it."
},
"commission_rate": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "The share of each sale the marketplace keeps."
},
"min_payout_threshold": {
"type": "number",
"minimum": 0,
"description": "The least balance that is paid out."
}
},
"additionalProperties": false
}Change an order: pass order_id and at least one of status, total_amount, currency, metadata and billing_contact_id; null clears the billing contact. An order that has left draft cannot return to it. Needs a claimed Last Price credential. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| status | string | The order status. |
| currency | string | The currency code. |
| metadata | object | Anything worth keeping with the record. |
| order_id* | string | The order: its id, as list_orders shows it. |
| total_amount | number | The order total. |
| billing_contact_id | string | null | The contact to bill, one of the order's customer; null clears it. |
{
"type": "object",
"required": [
"order_id"
],
"properties": {
"status": {
"enum": [
"draft",
"pending",
"active",
"completed",
"cancelled"
],
"type": "string",
"description": "The order status."
},
"currency": {
"type": "string",
"maxLength": 8,
"minLength": 3,
"description": "The currency code."
},
"metadata": {
"type": "object",
"description": "Anything worth keeping with the record."
},
"order_id": {
"type": "string",
"format": "uuid",
"description": "The order: its id, as list_orders shows it."
},
"total_amount": {
"type": "number",
"minimum": 0,
"description": "The order total."
},
"billing_contact_id": {
"type": [
"string",
"null"
],
"format": "uuid",
"description": "The contact to bill, one of the order's customer; null clears it."
}
},
"additionalProperties": false
}Change a routing policy. Only the fields you send change; config replaces the whole config. The strategy must still be usable with the config that results. Needs a Last Price credential with routing write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| name | string | A new name. |
| config | object | What the strategy needs. weights gives each function id a share (weighted). rules each send requests whose field matches to a function (policy). fallback_chain lists function ids to try in order when the strategy picks none. |
| strategy | string | A new strategy. |
| policy_id* | string | The routing policy UUID: id on a list_routing_policies result. |
| is_default | boolean | Make this the workspace default. |
| fallback_function_id | string | null | A function to use when the strategy picks none. Null clears it. |
{
"type": "object",
"required": [
"policy_id"
],
"properties": {
"name": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "A new name."
},
"config": {
"type": "object",
"properties": {
"rules": {
"type": "array",
"items": {
"type": "object",
"required": [
"field",
"operator",
"function_id"
],
"properties": {
"field": {
"type": "string",
"minLength": 1,
"description": "The request field to test."
},
"value": {
"type": [
"string",
"number",
"boolean",
"array",
"null"
],
"description": "What to compare against; a list for in."
},
"operator": {
"enum": [
"eq",
"neq",
"gt",
"lt",
"gte",
"lte",
"in",
"contains"
],
"type": "string",
"description": "How the field is compared."
},
"function_id": {
"type": "string",
"format": "uuid",
"description": "The function to use on a match."
}
},
"additionalProperties": false
},
"description": "Checked in order; the first match picks the function."
},
"weights": {
"type": "object",
"description": "A share per function id, never negative; weighted needs at least one above zero.",
"additionalProperties": {
"type": "number",
"minimum": 0
}
},
"fallback_chain": {
"type": "array",
"items": {
"type": "string",
"format": "uuid"
},
"description": "Function ids to try in order."
},
"max_latency_ms": {
"type": "number",
"description": "The slowest answer, in milliseconds, a function may take.",
"exclusiveMinimum": 0
},
"circuit_breaker": {
"type": "object",
"required": [
"failure_threshold",
"recovery_timeout_ms",
"half_open_max_calls"
],
"properties": {
"failure_threshold": {
"type": "integer",
"minimum": 1,
"description": "Failures in a row before it opens."
},
"half_open_max_calls": {
"type": "integer",
"minimum": 1,
"description": "Trial calls while it tries again."
},
"recovery_timeout_ms": {
"type": "integer",
"minimum": 0,
"description": "Milliseconds before it tries again."
}
},
"description": "When to stop sending to a failing function.",
"additionalProperties": false
},
"max_cost_per_unit": {
"type": "number",
"minimum": 0,
"description": "The most one unit may cost, in USD."
}
},
"description": "What the strategy needs. weights gives each function id a share (weighted). rules each send requests whose field matches to a function (policy). fallback_chain lists function ids to try in order when the strategy picks none.",
"additionalProperties": false
},
"strategy": {
"enum": [
"cheapest",
"fastest",
"explicit",
"round_robin",
"weighted",
"policy",
"default"
],
"type": "string",
"description": "A new strategy."
},
"policy_id": {
"type": "string",
"format": "uuid",
"description": "The routing policy UUID: id on a list_routing_policies result."
},
"is_default": {
"type": "boolean",
"description": "Make this the workspace default."
},
"fallback_function_id": {
"type": [
"string",
"null"
],
"format": "uuid",
"description": "A function to use when the strategy picks none. Null clears it."
}
},
"additionalProperties": false
}Change a scrape job: send job_id and only the fields you want to change, at least one. Set plan_selector to null to clear it. Hosted scraping is behind a release flag: until it is on for your workspace this answers 501 hosted_scraping_not_enabled. Runs honour robots.txt and fetch only public https pages. Needs a Last Price credential with the commerce:configure scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| url | string | The public page to read. Must start with https://. |
| name | string | A name for the job. |
| job_id* | string | The scrape job UUID: id on a list_scrape_jobs result. |
| enabled | boolean | false pauses the schedule. |
| currency | string | Three-letter ISO 4217 code, such as USD. |
| schedule | string | How often the job runs. manual runs only with run_scrape_job. |
| vertical | string | The vertical the prices belong to, such as saas. |
| plan_selector |
Change a storefront. Only the fields you send change; an empty string clears optional text. Set published to put it live or take it down. Only where the workspace has storefronts switched on (else an error with code not_released). Needs a Last Price credential with workspace settings write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| tagline | string | null | One line on what it sells. |
| logo_url | string | null | An https link to your logo. |
| published | boolean | true puts it live; false takes it down. |
| subdomain | string | The <subdomain> in <subdomain>.store.last-price.ai: 3 to 40 lowercase letters, digits or hyphens. Some names are reserved. |
| offer_tags | array | Only functions with one of these tags. Empty lists every public function. |
| brand_color | string | null | A hex colour such as #0f766e. |
| contact_url | string | null | An https link where people reach you. |
| description |
Change a UCP checkout session that is still open: pass checkout_id and at least one of line_items, buyer, context, payment, signals, fulfillment and discounts. A completed or canceled session answers 422. Needs a Last Price credential with price compute scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| buyer | object | Who is buying. |
| context | object | Where the checkout happens: locale, country, channel and the like. |
| payment | object | The payment handler and currency. |
| signals | object | Where the buyer came from: referrer, utm values and device type. |
| discounts | object | Discount codes to apply. |
| line_items | array | What is being bought. |
| checkout_id* | string | The checkout session: its id, as create_ucp_checkout and list_ucp_checkouts show it. |
| fulfillment | object | How the order is fulfilled: its methods. |
Change a webhook endpoint: its url, the events it gets, or switch it off and on with status. Only the fields you send change; events replaces the whole list. Needs the owner or admin role, and a key with no scope limits or a person's sign-in. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| url | string | Where to send events. Must start with https://. |
| events | array | Replaces the whole list of events, at least one. |
| status | string | inactive stops deliveries; active resumes them. |
| webhook_id* | string | The webhook endpoint UUID: id on a list_webhooks result. |
{
"type": "object",
"required": [
"webhook_id"
],
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "Where to send events. Must start with https://."
},
"events": {
"type": "array",
"items": {
"type": "string",
"maxLength": 64
},
"maxItems": 40,
"description": "Replaces the whole list of events, at least one."
},
"status": {
"enum": [
"active",
"inactive"
],
"type": "string",
"description": "inactive stops deliveries; active resumes them."
},
"webhook_id": {
"type": "string",
"format": "uuid",
"description": "The webhook endpoint UUID: id on a list_webhooks result."
}
},
"additionalProperties": false
}Change your workspace settings. Only the fields you send change: company details, tax id, default currency, payment terms in days, invoice prefix and footer, tax on or off, tax registrations (null clears them) and the sales playbook (null resets it). Model keys are managed in the dashboard, never here. Needs a Last Price credential with workspace settings write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| tax_id | string | null | Tax id. |
| tax_rates | array | null | Tax registrations. Null clears the list. |
| tax_enabled | boolean | Whether tax is added to invoices. |
| company_logo | string | null | Logo address. |
| company_name | string | Company name. |
| company_email | string | null | Company email. Null clears it. |
| company_phone | string | null | Company phone. Null clears it. |
| invoice_footer | string | null |
Upload a model trained anywhere as a new version of a hosted model: the ONNX file as base64 (at most 4 MiB) and the spec that maps request fields to its inputs. It is checked before it is stored: it must parse, use only operators the hosted runtime runs (scikit-learn, XGBoost and LightGBM tree ensembles, linear models, small neural networks), take as many inputs as the spec lists, and give a finite answer of the right shape on a test row; otherwise it answers 422 naming the problem. Stored as a candidate unless promote is true. The hosted MCP endpoint (/api/mcp/rpc) takes requests of at most 64 KiB, so send a larger file with the stdio server, the tool packages or POST /api/hosted-models/{model_id}/versions. Answers 404 not_released while hosted models (the hosted-pricing-models release) are not switched on for your workspace. Needs a Last Price credential with function publish scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| spec* | object | How request fields become the model's inputs. |
| notes | string | Optional notes kept with the version. |
| promote | boolean | Make it the active version at once. Defaults to false: stored as a candidate. |
| model_id* | string | The hosted model's id: id on a list_hosted_models result. |
| artifact_base64* | string | The .onnx file, base64 encoded. At most 4 MiB before encoding. |
Use a Last Price API key you already hold (a saved file, LASTPRICE_API_KEY) in this MCP connection, when it was opened without one: pass api_key. On the hosted MCP server this session then runs as that key's agent, so the tools that need a credential work at once with no header to add; it lasts until the session ends or the key is revoked or rotated. The key is checked, never echoed back. A connection that already has a credential keeps it. Public: needs no other credential.
| Argument | Type | Description |
|---|---|---|
| api_key* | string | Your Last Price API key: lp_ and 40 lowercase hex characters. |
{
"type": "object",
"required": [
"api_key"
],
"properties": {
"api_key": {
"type": "string",
"pattern": "^lp_[0-9a-f]{40}$",
"description": "Your Last Price API key: lp_ and 40 lowercase hex characters."
}
},
"additionalProperties": false
}Check the Personal Agent Protocol file you published: Last Price fetches https://<domain>/.well-known/poppy.json and compares it with the one get_agent_protocol gives. A match verifies the domain for your workspace; a failure returns reason and message saying what to fix, and a domain another workspace verified answers 409. Answers 404 until agent protocol files are switched on for your workspace. Needs a Last Price credential with routing write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Ask whether a price makes sense for its context, rather than what the price should be. Returns a verdict (fair, too_high, too_low, or unknown), the band it was judged against, a signed deviation from the reference, a confidence, and the evidence behind it. A verdict of "unknown" means the price could not be judged, which is not the same as fair. Pass quote_valid_until from the compute_price result the price came from, and where quote expiry is switched on the answer says quote_expired when that quote is stale. Where buyers' spend limits are switched on and metadata.category names a category, the evidence includes buyer_budget: what buyers' own spend checks allowed for it (buyer_envelope), reported and never counted in the verdict.
| Argument | Type | Description |
|---|---|---|
| geo | string | Optional geography hint, e.g. US. |
| channel | string | Optional. The sales channel the price is for, such as a shopping agent or an agent marketplace. When your workspace saved a rate for it with set_channel_rates and channel pricing is on, the price is raised so you keep the same amount after the channel's cut. |
| currency | string | Three-letter ISO currency code, e.g. USD. Defaults to USD. |
| metadata | object | Optional free-form context. |
| max_price | number | Optional hard ceiling. Binding: a verdict will never relax it. |
| min_price | number | Optional hard floor. Binding: a verdict will never relax it. |
Check a signed price quote you received from a seller: was it issued by Last Price, is it unaltered, and is it still valid. Pass its jws string. A quote that fails still answers: valid is false and reason says why (a forged signature, or expired, which still returns the claims). Public: needs no credential. It answers 501 while signed quotes are off on this deployment, and you can instead verify offline against the public keys at /.well-known/quote-keys.json.
| Argument | Type | Description |
|---|---|---|
| jws* | string | The jws value of the signed quote you were given. |
{
"type": "object",
"required": [
"jws"
],
"properties": {
"jws": {
"type": "string",
"maxLength": 4096,
"minLength": 1,
"description": "The jws value of the signed quote you were given."
}
},
"additionalProperties": false
}Check a storefront domain's TXT record now. verified true means the domain is proven yours and the storefront answers there once routing is in place; otherwise reason and detail say what is missing. Only where the workspace has storefronts switched on (else an error with code not_released). Needs a Last Price credential with workspace settings write scope. Needs a claimed workspace: a sandbox key from self-registration is refused (403) until a person claims the workspace.
| Argument | Type | Description |
|---|---|---|
| domain_id* | string | The domain id, from list_storefronts or add_storefront_domain. |
| storefront_id* | string | The storefront id, from list_storefronts. |
{
"type": "object",
"required": [
"storefront_id",
"domain_id"
],
"properties": {
"domain_id": {
"type": "string",
"format": "uuid",
"description": "The domain id, from list_storefronts or add_storefront_domain."
},
"storefront_id": {
"type": "string",
"format": "uuid",
"description": "The storefront id, from list_storefronts."
}
},
"additionalProperties": false
}Check a webhook signature the way Last Price signs them: pass payload (the raw body, up to 8 KB), signature and secret, and optionally encoding (hex or base64) and prefix. Answers whether it is valid. Public and limited per address; use a test secret rather than a live one when you can, because the secret travels in the request. Needs no credential.
| Argument | Type | Description |
|---|---|---|
| prefix | string | A prefix the signature carries, for example sha256=. |
| secret* | string | The signing secret. Use a test secret where you can. |
| payload* | string | The raw body the signature covers. |
| encoding | string | How the signature is encoded. Defaults to hex. |
| signature* | string | The signature to check. |
{
"type": "object",
"required": [
"payload",
"signature",
"secret"
],
"properties": {
"prefix": {
"type": "string",
"maxLength": 64,
"description": "A prefix the signature carries, for example sha256=."
},
"secret": {
"type": "string",
"maxLength": 1024,
"minLength": 1,
"description": "The signing secret. Use a test secret where you can."
},
"payload": {
"type": "string",
"maxLength": 8192,
"minLength": 1,
"description": "The raw body the signature covers."
},
"encoding": {
"enum": [
"hex",
"base64"
],
"type": "string",
"description": "How the signature is encoded. Defaults to hex."
},
"signature": {
"type": "string",
"maxLength": 1024,
"minLength": 1,
"description": "The signature to check."
}
},
"additionalProperties": false
}| string |
| When it was seen. Defaults to now. |
| observed_price* | number | The price seen. |
| source_confidence | number | How far to trust the source, 0 to 1. |
{
"type": "object",
"required": [
"source",
"competitor",
"observed_price",
"currency"
],
"properties": {
"raw": {
"type": "object",
"description": "The source record, kept with the observation.",
"additionalProperties": {}
},
"gtin": {
"type": "string",
"description": "The product GTIN, used to match it to a catalog item."
},
"title": {
"type": "string",
"description": "The product title as the competitor shows it."
},
"source": {
"type": "string",
"description": "Where the price came from, such as manual or the name of your scraper."
},
"currency": {
"type": "string",
"description": "The currency code, such as USD."
},
"competitor": {
"type": "string",
"description": "The competitor's name."
},
"external_id": {
"type": "string",
"description": "The competitor's own id for the product."
},
"marketplace": {
"type": "string",
"description": "Where the competitor sells it."
},
"observed_at": {
"type": "string",
"format": "date-time",
"description": "When it was seen. Defaults to now."
},
"observed_price": {
"type": "number",
"minimum": 0,
"description": "The price seen."
},
"source_confidence": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "How far to trust the source, 0 to 1."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"storefront_id",
"domain_id",
"name",
"type",
"value"
],
"properties": {
"ttl": {
"type": "integer",
"maximum": 86400,
"minimum": 60,
"description": "Seconds to cache it."
},
"name": {
"type": "string",
"maxLength": 200,
"description": "Relative name: blog for blog.<domain>, empty for the domain itself."
},
"type": {
"enum": [
"A",
"AAAA",
"CNAME",
"MX",
"TXT",
"CAA",
"SRV"
],
"type": "string",
"description": "The record type."
},
"value": {
"type": "string",
"maxLength": 2048,
"minLength": 1,
"description": "The record value, such as a mail server or a target host."
},
"domain_id": {
"type": "string",
"format": "uuid",
"description": "The domain id, from list_storefronts or add_storefront_domain."
},
"mx_priority": {
"type": "integer",
"maximum": 65535,
"minimum": 0,
"description": "MX only. Defaults to 10."
},
"storefront_id": {
"type": "string",
"format": "uuid",
"description": "The storefront id, from list_storefronts."
}
},
"additionalProperties": false
}| The customer's VAT or tax id; an EU business with one is reverse charged. |
{
"type": "object",
"required": [
"amount",
"currency"
],
"properties": {
"date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "The sale date (YYYY-MM-DD); today when absent."
},
"amount": {
"type": "number",
"minimum": 0,
"description": "The pre-tax amount, in the currency's major unit."
},
"exempt": {
"type": "boolean",
"description": "True for a tax-exempt customer."
},
"currency": {
"type": "string",
"maxLength": 3,
"minLength": 3,
"description": "ISO 4217 code, like USD or EUR."
},
"customer_id": {
"type": "string",
"maxLength": 128,
"description": "A customer whose saved address and tax id to use when destination is not given."
},
"destination": {
"type": "object",
"required": [
"country"
],
"properties": {
"state": {
"type": "string",
"maxLength": 60,
"description": "US state code, like CA."
},
"country": {
"type": "string",
"maxLength": 60,
"minLength": 2,
"description": "ISO country code or English name, like DE or Germany."
}
},
"description": "Where the customer is.",
"additionalProperties": false
},
"customer_tax_id": {
"type": "string",
"maxLength": 64,
"description": "The customer's VAT or tax id; an EU business with one is reverse charged."
}
},
"additionalProperties": false
}| quotes | array | Optional: competing offers for this purchase, yours among them. A procurement policy needs two above its two-quote threshold. |
| seller* | string | Who you are paying: a store, domain, API or wallet name. |
| agent_id | string | Only with a workspace-wide key: check on behalf of this agent. An agent key always checks as itself. |
| category | string | Optional: its category, when the policy limits categories. |
| currency | string | Three-letter ISO currency code. Defaults to USD. |
| agentid_token | string | Your AgentID ID token, issued for Last Price, when your owner's policy lets only verified agents spend. Sent as the AgentID-Token header. |
| include_fair_price | boolean | Also judge the price with verify_price and return its band. |
{
"type": "object",
"required": [
"seller",
"amount"
],
"properties": {
"item": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "Optional: what you are buying."
},
"amount": {
"type": "number",
"minimum": 0,
"description": "The price you are about to pay."
},
"intent": {
"type": "object",
"required": [
"source",
"intent_id"
],
"properties": {
"source": {
"enum": [
"amex_intent",
"ap2_intent_mandate",
"declared"
],
"type": "string",
"description": "Where the intent comes from."
},
"currency": {
"type": "string",
"maxLength": 3,
"minLength": 3,
"description": "The intent's currency. Never converted."
},
"evidence": {
"type": "string",
"maxLength": 20000,
"minLength": 1,
"description": "The Proof of Intent Token or the mandate; only its SHA-256 is kept."
},
"merchant": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "The merchant the buyer approved."
},
"intent_id": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "The Intent ID, or the mandate id."
},
"conditions": {
"type": "object",
"description": "Other conditions, recorded as given."
},
"expires_at": {
"type": "string",
"format": "date-time",
"description": "When the approval ends."
},
"max_amount": {
"type": "number",
"minimum": 0,
"description": "The most the buyer approved across every purchase under this intent. Needs currency."
}
},
"description": "Optional: what the buyer approved for this purchase, from an American Express intent, an AP2 intent mandate, or declared by you. A purchase that names another seller, costs more than max_amount (counting every purchase under the same intent_id), is in another currency or comes after expires_at is denied, whatever the policy allows. evidence (the token or mandate) is kept only as a hash and is not verified yet. Only where the workspace has intents switched on (else an error with code not_released).",
"additionalProperties": false
},
"pay_to": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Optional: the wallet address (bare or CAIP-10) or merchant account id the money goes to. A person's approval is then for that account only, and confirm_purchase and settle_purchase must name the same one: another is refused with code payee_changed. Only where the workspace has payee binding switched on (else an error with code not_released)."
},
"quotes": {
"type": "array",
"items": {
"type": "object",
"required": [
"seller",
"amount"
],
"properties": {
"amount": {
"type": "number",
"minimum": 0
},
"seller": {
"type": "string",
"maxLength": 200,
"minLength": 1
}
},
"additionalProperties": false
},
"maxItems": 10,
"description": "Optional: competing offers for this purchase, yours among them. A procurement policy needs two above its two-quote threshold."
},
"seller": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Who you are paying: a store, domain, API or wallet name."
},
"agent_id": {
"type": "string",
"format": "uuid",
"description": "Only with a workspace-wide key: check on behalf of this agent. An agent key always checks as itself."
},
"category": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Optional: its category, when the policy limits categories."
},
"currency": {
"type": "string",
"maxLength": 3,
"minLength": 3,
"description": "Three-letter ISO currency code. Defaults to USD."
},
"agentid_token": {
"type": "string",
"maxLength": 8192,
"minLength": 20,
"description": "Your AgentID ID token, issued for Last Price, when your owner's policy lets only verified agents spend. Sent as the AgentID-Token header."
},
"include_fair_price": {
"type": "boolean",
"description": "Also judge the price with verify_price and return its band."
}
},
"additionalProperties": false
}| max_price | number | Optional maximum acceptable price. |
| min_price | number | Optional minimum acceptable price. A competitive offer needs this or a declared unit_cost and target_margin_pct. |
| unit_cost | number | What the work costs you. It lets lastprice/cost-plus price with no current_price, which is the usual case when pricing a task you are about to run. Routing picks a function that can use it; to require cost-plus, pass its UUID from list_functions as function_id. |
| buyer_type | string | null | Optional. Who the price is for: an AI agent or a person. Recorded with the quote only. |
| no_explore | boolean | If true, give this price exactly as computed, without the small per-call variation a workspace may run so learned pricing can learn what buyers will pay (see get_price_exploration). |
| product_id | string | Optional identifier of what is being priced. |
| buyer_agent | string | null | Optional. The buying agent, e.g. chatgpt or agent.example.com. A label recorded with the quote only (while its release flag is on); never sent to the pricing function. |
| function_id | string | Optional explicit pricing function UUID to use. |
| product_type | string | Optional category. Defaults to "custom". |
| current_price | number | The current or reference price. Optional: functions that price relative to an incumbent need it, but lastprice/cost-plus prices from unit_cost instead. |
| outcome_terms | object | Optional, for a price charged per outcome. When the outcome counts as failed and what is owed then. Where outcome terms are switched on for the workspace, the result carries outcome_terms: these terms normalised, the deadline as a time, the amount owed on timeout, and which terms are missing (complete is false without success_definition, resolve_by and on_timeout). Sending it marks the price as an outcome price; so does metadata.unit "outcome". |
| idempotency_key | string | Optional. A new value (e.g. a UUID) for each call you mean to make; send the SAME value if you retry after a timeout or error you cannot interpret, and the call is computed and charged once. Ignored without a credential. |
| learned_routing | boolean | Optional. With routing_preference cheapest, fastest, round robin or weighted, let the router learn which of the functions that strategy chooses from serves your workspace best (from your own routed calls), falling back to the strategy while there is too little data. Ignored for any other preference or a function_id, and until learned routing is released for your workspace. get_learned_routing with strategy shows what it learned. |
| customer_segment | string | Optional segment, e.g. enterprise. |
| target_margin_pct | number | Margin on price for cost-plus, not markup on cost: price = unit_cost / (1 - margin). Defaults to 30. |
| routing_preference | string | How to route across pricing functions. Defaults to "default". |
| include_explanation | boolean | If true, ask for an explanation and confidence with the price. |
| include_buyer_envelope | boolean | If true, and metadata.category names a category, the result carries buyer_envelope: what buyers' own spend checks allowed in that category (p25 to p75, the median, and how often checks were refused over a limit, pooled over 5 or more buyer workspaces; no numbers below 5) and where this price sits. A limit, not a valuation: it never changes the price. Where it is not switched on for the workspace it is ignored. |
{
"type": "object",
"required": [
"currency"
],
"properties": {
"geo": {
"type": "string",
"description": "Optional geography hint, e.g. US."
},
"channel": {
"type": "string",
"maxLength": 64,
"description": "Optional. The sales channel the price is for, such as a shopping agent or an agent marketplace. When your workspace saved a rate for it with set_channel_rates and channel pricing is on, the price is raised so you keep the same amount after the channel's cut."
},
"payment": {
"type": "string",
"maxLength": 8192,
"minLength": 20,
"description": "Optional. The signed x402 payment, base64, as sent in an X-PAYMENT or PAYMENT-SIGNATURE header. Omit it to read what the call costs and how to pay; nothing is charged until you send it."
},
"currency": {
"type": "string",
"maxLength": 3,
"minLength": 3,
"description": "Three-letter ISO currency code, e.g. USD."
},
"metadata": {
"type": "object",
"description": "Optional context. For competitive pricing: competitor_price, competitor_currency and competitive_action (match or undercut); undercut requires undercut_pct. Confirm product comparability before calling."
},
"max_price": {
"type": "number",
"minimum": 0,
"description": "Optional maximum acceptable price."
},
"min_price": {
"type": "number",
"minimum": 0,
"description": "Optional minimum acceptable price. A competitive offer needs this or a declared unit_cost and target_margin_pct."
},
"unit_cost": {
"type": "number",
"minimum": 0,
"description": "What the work costs you. It lets lastprice/cost-plus price with no current_price, which is the usual case when pricing a task you are about to run. Routing picks a function that can use it; to require cost-plus, pass its UUID from list_functions as function_id."
},
"buyer_type": {
"enum": [
"agent",
"person",
null
],
"type": [
"string",
"null"
],
"description": "Optional. Who the price is for: an AI agent or a person. Recorded with the quote only."
},
"no_explore": {
"type": "boolean",
"description": "If true, give this price exactly as computed, without the small per-call variation a workspace may run so learned pricing can learn what buyers will pay (see get_price_exploration)."
},
"product_id": {
"type": "string",
"description": "Optional identifier of what is being priced."
},
"buyer_agent": {
"type": [
"string",
"null"
],
"maxLength": 100,
"description": "Optional. The buying agent, e.g. chatgpt or agent.example.com. A label recorded with the quote only (while its release flag is on); never sent to the pricing function."
},
"function_id": {
"type": "string",
"format": "uuid",
"description": "Optional explicit pricing function UUID to use."
},
"product_type": {
"enum": [
"saas",
"ecommerce",
"marketplace",
"digital",
"api",
"custom"
],
"type": "string",
"description": "Optional category. Defaults to \"custom\"."
},
"current_price": {
"type": "number",
"minimum": 0,
"description": "The current or reference price. Optional: functions that price relative to an incumbent need it, but lastprice/cost-plus prices from unit_cost instead."
},
"outcome_terms": {
"type": "object",
"properties": {
"evidence": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 10,
"description": "What proves the outcome, e.g. [\"delivery_receipt\"]."
},
"on_timeout": {
"enum": [
"no_charge",
"partial",
"full"
],
"type": "string",
"description": "What is owed when the deadline passes without success."
},
"resolve_by": {
"type": "string",
"description": "The deadline: an ISO 8601 duration from the quote (P30D, PT48H) or an RFC 3339 time. After it, with no success, the outcome has failed."
},
"timeout_share": {
"type": "number",
"description": "With on_timeout \"partial\": the fraction of the price owed, e.g. 0.3 for 30%.",
"exclusiveMaximum": 1,
"exclusiveMinimum": 0
},
"success_definition": {
"type": "string",
"maxLength": 500,
"description": "What the buyer must see for the outcome to count."
}
},
"description": "Optional, for a price charged per outcome. When the outcome counts as failed and what is owed then. Where outcome terms are switched on for the workspace, the result carries outcome_terms: these terms normalised, the deadline as a time, the amount owed on timeout, and which terms are missing (complete is false without success_definition, resolve_by and on_timeout). Sending it marks the price as an outcome price; so does metadata.unit \"outcome\"."
},
"idempotency_key": {
"type": "string",
"maxLength": 255,
"minLength": 8,
"description": "Optional. A new value (e.g. a UUID) for each call you mean to make; send the SAME value if you retry after a timeout or error you cannot interpret, and the call is computed and charged once. Ignored without a credential."
},
"learned_routing": {
"type": "boolean",
"description": "Optional. With routing_preference cheapest, fastest, round robin or weighted, let the router learn which of the functions that strategy chooses from serves your workspace best (from your own routed calls), falling back to the strategy while there is too little data. Ignored for any other preference or a function_id, and until learned routing is released for your workspace. get_learned_routing with strategy shows what it learned."
},
"customer_segment": {
"type": "string",
"description": "Optional segment, e.g. enterprise."
},
"target_margin_pct": {
"type": "number",
"maximum": 95,
"minimum": 0,
"description": "Margin on price for cost-plus, not markup on cost: price = unit_cost / (1 - margin). Defaults to 30."
},
"routing_preference": {
"enum": [
"cheapest",
"fastest",
"explicit",
"round_robin",
"weighted",
"policy",
"default"
],
"type": "string",
"description": "How to route across pricing functions. Defaults to \"default\"."
},
"include_explanation": {
"type": "boolean",
"description": "If true, ask for an explanation and confidence with the price."
},
"include_buyer_envelope": {
"type": "boolean",
"description": "If true, and metadata.category names a category, the result carries buyer_envelope: what buyers' own spend checks allowed in that category (p25 to p75, the median, and how often checks were refused over a limit, pooled over 5 or more buyer workspaces; no numbers below 5) and where this price sits. A limit, not a valuation: it never changes the price. Where it is not switched on for the workspace it is ignored."
}
}
}| The product or plan the price is for. |
{
"type": "object",
"required": [
"vertical",
"source_url",
"product_name",
"price"
],
"properties": {
"price": {
"type": "number",
"minimum": 0,
"description": "The price seen, in currency units."
},
"currency": {
"type": "string",
"maxLength": 8,
"minLength": 3,
"description": "The currency code. Defaults to USD."
},
"metadata": {
"type": "object",
"description": "Any extra detail to keep with the data point.",
"additionalProperties": {}
},
"vertical": {
"type": "string",
"maxLength": 128,
"minLength": 1,
"description": "The market the price belongs to, for example saas."
},
"plan_name": {
"type": "string",
"maxLength": 256,
"description": "The plan tier, when the product has several."
},
"scraped_at": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "When the price was seen, as an ISO 8601 date-time. Defaults to now."
},
"source_url": {
"type": "string",
"maxLength": 2048,
"minLength": 1,
"description": "The public page the price was seen on."
},
"product_name": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "The product or plan the price is for."
}
},
"additionalProperties": false
}| ceiling_price | number | No proposal goes above this price. |
| auto_approve_max_delta_pct | number | With approval_mode auto: proposals that move the price by at most this percent skip the queue. Required for auto. |
{
"type": "object",
"required": [
"name",
"rules"
],
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "A name for the policy."
},
"rules": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"kind"
],
"properties": {
"id": {
"type": "string"
},
"kind": {
"enum": [
"undercut_competitor",
"match_competitor",
"beat_lowest_by_abs",
"percent_off_msrp",
"router",
"fixed"
],
"type": "string",
"description": "Which rule this is."
}
},
"additionalProperties": {}
},
"description": "The rules, tried in order; the first that produces a price wins. Each rule has an id, a kind and the fields its kind needs: a percent to undercut by, an amount to beat the lowest price by, a percent off the list price, a competitor to match, a fixed price, or a routing choice. The Pricing Policies section of the documentation lists them."
},
"scope": {
"type": "object",
"properties": {
"skus": {
"type": "array",
"items": {
"type": "string"
}
},
"brands": {
"type": "array",
"items": {
"type": "string"
}
},
"marketplaces": {
"type": "array",
"items": {
"type": "string"
}
}
},
"description": "Which items the policy covers: skus, brands and marketplaces lists. Empty covers every item.",
"additionalProperties": false
},
"is_active": {
"type": "boolean",
"description": "Whether the pipeline applies the policy."
},
"description": {
"type": "string",
"description": "What the policy is for."
},
"floor_price": {
"type": "number",
"minimum": 0,
"description": "No proposal goes below this price."
},
"approval_mode": {
"enum": [
"manual",
"auto",
"shadow"
],
"type": "string",
"description": "manual queues every proposal for a decision, auto approves small changes, shadow records proposals without acting on them."
},
"ceiling_price": {
"type": "number",
"minimum": 0,
"description": "No proposal goes above this price."
},
"auto_approve_max_delta_pct": {
"type": "number",
"minimum": 0,
"description": "With approval_mode auto: proposals that move the price by at most this percent skip the queue. Required for auto."
}
},
"additionalProperties": false
}| string |
{
"type": "object",
"required": [
"name",
"currency",
"price",
"billing_frequency",
"credits"
],
"properties": {
"code": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9_-]{0,63}$",
"description": "Unique in the workspace; cannot change later."
},
"name": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"price": {
"type": "number",
"minimum": 0
},
"status": {
"enum": [
"active",
"inactive"
],
"type": "string"
},
"credits": {
"type": [
"number",
"null"
],
"description": "Credits per period; null for unlimited."
},
"currency": {
"type": "string",
"maxLength": 3,
"minLength": 3,
"description": "ISO 4217 code in upper case; cannot change later."
},
"description": {
"type": "string",
"maxLength": 2000
},
"rollover_credits": {
"type": [
"number",
"null"
],
"description": "Most credits that roll over; 0 for none, null for unlimited."
},
"billing_frequency": {
"enum": [
"monthly",
"quarterly",
"annually",
"one_time"
],
"type": "string"
}
},
"additionalProperties": false
}| description | string | What the function does. |
| display_name* | string | The name people and agents see. |
| endpoint_url | string | For a function that calls your own service: the https endpoint that returns the price. |
| input_schema | object | JSON Schema of what a price request supplies to the function. |
| cost_per_unit | number | What one call to the function costs, in USD. |
| output_schema | object | JSON Schema of what the function returns. |
| execution_type* | string | How the function computes a price. |
| cost_multiplier | number | Multiplies the cost of each call, for a more expensive model tier. 1 is the default; stored to 4 decimal places. |
| inference_config | object | null | For a function that runs on a model. On update an object replaces it and null removes it, so the function uses the rule-based formula. |
| quote_valid_seconds | integer | null | How long a price this function computes stays valid, in seconds (30 to 86400). Prices carry it as valid_until where quote expiry is switched on for the workspace. Omit for the default of 15 minutes; on update null returns to the default. |
{
"type": "object",
"required": [
"name",
"display_name",
"execution_type"
],
"properties": {
"name": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9_/-]*$",
"maxLength": 128,
"minLength": 1,
"description": "Unique lowercase id: letters, digits, hyphens, underscores and slashes."
},
"rule": {
"type": "object",
"required": [
"base"
],
"properties": {
"base": {
"type": "object",
"description": "Where the price starts: {\"from\":\"current_price\"}, {\"from\":\"unit_cost\"}, {\"from\":\"competitor_prices\",\"pick\":\"min\"|\"avg\"|\"max\"} or {\"from\":\"field\",\"field\":\"<context field>\"}.",
"additionalProperties": {}
},
"steps": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": {}
},
"maxItems": 20,
"description": "Applied in order: adjust_pct, margin (target_margin_pct), scale, tiers, floor, ceiling, ending (cents such as 0.99) and round. A floor or ceiling holds through every later step."
}
},
"description": "For a rule based function: the rule it prices by. Its input schema is made from the rule, and a rule based function needs one before it can be active. On update null removes it.",
"additionalProperties": false
},
"tags": {
"type": "array",
"items": {
"type": "string",
"maxLength": 64
},
"maxItems": 20,
"description": "The tag list. On update it replaces the whole list."
},
"status": {
"enum": [
"draft",
"active"
],
"type": "string",
"description": "draft (the default) or active, to have it routed to at once. A self-registered sandbox saves drafts only."
},
"is_public": {
"type": "boolean",
"description": "List it for other workspaces to use. Defaults to false."
},
"auth_config": {
"type": [
"object",
"null"
],
"description": "How to authenticate to the endpoint, such as { type: \"bearer\", token: \"...\" }. Stored encrypted and never returned: a read says only whether one is saved. On update an object replaces it and null removes it. Treat the secret as sensitive: it passes through this conversation.",
"additionalProperties": {}
},
"description": {
"type": "string",
"maxLength": 2048,
"description": "What the function does."
},
"display_name": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "The name people and agents see."
},
"endpoint_url": {
"type": "string",
"format": "uri",
"description": "For a function that calls your own service: the https endpoint that returns the price."
},
"input_schema": {
"type": "object",
"description": "JSON Schema of what a price request supplies to the function.",
"additionalProperties": {}
},
"cost_per_unit": {
"type": "number",
"minimum": 0,
"description": "What one call to the function costs, in USD."
},
"output_schema": {
"type": "object",
"description": "JSON Schema of what the function returns.",
"additionalProperties": {}
},
"execution_type": {
"enum": [
"rule_based",
"ml_model",
"llm_prompt",
"external_api",
"composite"
],
"type": "string",
"description": "How the function computes a price."
},
"cost_multiplier": {
"type": "number",
"maximum": 100,
"minimum": 0.0001,
"description": "Multiplies the cost of each call, for a more expensive model tier. 1 is the default; stored to 4 decimal places."
},
"inference_config": {
"type": [
"object",
"null"
],
"required": [
"provider"
],
"properties": {
"model": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "The model id at that provider."
},
"prompt": {
"type": "string",
"maxLength": 4000,
"minLength": 1,
"description": "Your pricing instructions for the model."
},
"provider": {
"enum": [
"openai",
"anthropic",
"openrouter",
"together-ai",
"huggingface",
"replicate",
"baseten",
"aitune"
],
"type": "string",
"description": "The model provider."
}
},
"description": "For a function that runs on a model. On update an object replaces it and null removes it, so the function uses the rule-based formula.",
"additionalProperties": false
},
"quote_valid_seconds": {
"type": [
"integer",
"null"
],
"maximum": 86400,
"minimum": 30,
"description": "How long a price this function computes stays valid, in seconds (30 to 86400). Prices carry it as valid_until where quote expiry is switched on for the workspace. Omit for the default of 15 minutes; on update null returns to the default."
}
},
"additionalProperties": false
}| string |
| CSS selector for the price elements. |
| auto_contribute | boolean | Whether run results are contributed to the shared price pool. |
| extraction_mode | string | css reads the selectors only; css_with_llm_fallback asks a model when they find nothing. |
{
"type": "object",
"required": [
"name",
"url",
"price_selector"
],
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "The public page to read. Must start with https://."
},
"name": {
"type": "string",
"maxLength": 120,
"minLength": 1,
"description": "A name for the job."
},
"enabled": {
"type": "boolean",
"description": "false pauses the schedule."
},
"currency": {
"type": "string",
"description": "Three-letter ISO 4217 code, such as USD."
},
"schedule": {
"enum": [
"manual",
"hourly",
"daily",
"weekly"
],
"type": "string",
"description": "How often the job runs. manual runs only with run_scrape_job."
},
"vertical": {
"type": "string",
"maxLength": 128,
"minLength": 1,
"description": "The vertical the prices belong to, such as saas."
},
"plan_selector": {
"type": [
"string",
"null"
],
"maxLength": 500,
"minLength": 1,
"description": "CSS selector for the plan name beside each price."
},
"price_selector": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "CSS selector for the price elements."
},
"auto_contribute": {
"type": "boolean",
"description": "Whether run results are contributed to the shared price pool."
},
"extraction_mode": {
"enum": [
"css",
"css_with_llm_fallback"
],
"type": "string",
"description": "css reads the selectors only; css_with_llm_fallback asks a model when they find nothing."
}
},
"additionalProperties": false
}| string | null |
| An https link where people reach you. |
| description | string | null | A paragraph on the seller and its offers. |
| product_ids | array | Only these products open to offers. Empty lists every one. |
| display_name* | string | The name agents see. |
| show_functions | boolean | List your public marketplace pricing functions. |
| show_negotiation | boolean | List your products open to offers. |
{
"type": "object",
"required": [
"display_name"
],
"properties": {
"tagline": {
"type": [
"string",
"null"
],
"maxLength": 140,
"description": "One line on what it sells."
},
"logo_url": {
"type": [
"string",
"null"
],
"maxLength": 500,
"description": "An https link to your logo."
},
"published": {
"type": "boolean",
"description": "true puts it live; false takes it down."
},
"subdomain": {
"type": "string",
"pattern": "^[a-z0-9]([a-z0-9-]{1,38})[a-z0-9]$",
"description": "The <subdomain> in <subdomain>.store.last-price.ai: 3 to 40 lowercase letters, digits or hyphens. Some names are reserved."
},
"offer_tags": {
"type": "array",
"items": {
"type": "string",
"maxLength": 40,
"minLength": 1
},
"maxItems": 50,
"description": "Only functions with one of these tags. Empty lists every public function."
},
"brand_color": {
"type": [
"string",
"null"
],
"pattern": "^#[0-9a-fA-F]{6}$",
"description": "A hex colour such as #0f766e."
},
"contact_url": {
"type": [
"string",
"null"
],
"maxLength": 500,
"description": "An https link where people reach you."
},
"description": {
"type": [
"string",
"null"
],
"maxLength": 1000,
"description": "A paragraph on the seller and its offers."
},
"product_ids": {
"type": "array",
"items": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"maxItems": 50,
"description": "Only these products open to offers. Empty lists every one."
},
"display_name": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "The name agents see."
},
"show_functions": {
"type": "boolean",
"description": "List your public marketplace pricing functions."
},
"show_negotiation": {
"type": "boolean",
"description": "List your products open to offers."
}
},
"additionalProperties": false
}| What is being bought. |
| fulfillment | object | How the order is fulfilled: its methods. |
| agentid_token | string | Optional: your AgentID ID token (from auth.agentid.com, issued for Last Price), sent as the AgentID-Token header so the quote records you as a verified buying agent. Leave it out to buy unverified. |
| idempotency_key | string | Your key for this checkout. Retrying with the same key and body returns the first session; the same key with a different body is refused. |
{
"type": "object",
"required": [
"line_items"
],
"properties": {
"buyer": {
"type": "object",
"properties": {
"email": {
"type": "string",
"format": "email"
},
"phone": {
"type": "string",
"maxLength": 64
},
"last_name": {
"type": "string",
"maxLength": 128
},
"first_name": {
"type": "string",
"maxLength": 128
},
"billing_address": {
"type": "object",
"properties": {
"city": {
"type": "string",
"maxLength": 128
},
"state": {
"type": "string",
"maxLength": 128
},
"postal_code": {
"type": "string",
"maxLength": 32
},
"country_code": {
"type": "string",
"maxLength": 8
},
"address_line_1": {
"type": "string",
"maxLength": 256
},
"address_line_2": {
"type": "string",
"maxLength": 256
}
},
"additionalProperties": false
},
"shipping_address": {
"type": "object",
"properties": {
"city": {
"type": "string",
"maxLength": 128
},
"state": {
"type": "string",
"maxLength": 128
},
"postal_code": {
"type": "string",
"maxLength": 32
},
"country_code": {
"type": "string",
"maxLength": 8
},
"address_line_1": {
"type": "string",
"maxLength": 256
},
"address_line_2": {
"type": "string",
"maxLength": 256
}
},
"additionalProperties": false
}
},
"description": "Who is buying.",
"additionalProperties": false
},
"cart_id": {
"type": "string",
"maxLength": 200,
"description": "The cart this checkout comes from."
},
"context": {
"type": "object",
"description": "Where the checkout happens: locale, country, channel and the like."
},
"payment": {
"type": "object",
"properties": {
"currency": {
"type": "string",
"maxLength": 8,
"minLength": 3
},
"handler_id": {
"type": "string",
"maxLength": 200
}
},
"description": "The payment handler and currency.",
"additionalProperties": false
},
"signals": {
"type": "object",
"description": "Where the buyer came from: referrer, utm values and device type."
},
"currency": {
"type": "string",
"maxLength": 8,
"minLength": 3,
"description": "The currency. Defaults to the first line item's, or USD."
},
"discounts": {
"type": "object",
"description": "Discount codes to apply."
},
"line_items": {
"type": "array",
"items": {
"type": "object",
"required": [
"product_id",
"quantity"
],
"properties": {
"id": {
"type": "string",
"maxLength": 200
},
"sku": {
"type": "string",
"maxLength": 200
},
"gtin": {
"type": "string",
"maxLength": 64
},
"title": {
"type": "string",
"maxLength": 500
},
"quantity": {
"type": "integer",
"minimum": 1
},
"attributes": {
"type": "object"
},
"product_id": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"unit_price": {
"type": "object",
"required": [
"amount",
"currency"
],
"properties": {
"amount": {
"type": "number",
"minimum": 0
},
"currency": {
"type": "string",
"maxLength": 8,
"minLength": 3
}
},
"additionalProperties": false
},
"variant_id": {
"type": "string",
"maxLength": 200
},
"description": {
"type": "string",
"maxLength": 2000
}
},
"additionalProperties": false
},
"maxItems": 100,
"minItems": 1,
"description": "What is being bought."
},
"fulfillment": {
"type": "object",
"description": "How the order is fulfilled: its methods."
},
"agentid_token": {
"type": "string",
"maxLength": 8192,
"minLength": 20,
"description": "Optional: your AgentID ID token (from auth.agentid.com, issued for Last Price), sent as the AgentID-Token header so the quote records you as a verified buying agent. Leave it out to buy unverified."
},
"idempotency_key": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "Your key for this checkout. Retrying with the same key and body returns the first session; the same key with a different body is refused."
}
},
"additionalProperties": false
}| function_id |
| string |
| The pricing function to use. |
| agentid_token | string | Optional: your AgentID ID token (from auth.agentid.com, issued for Last Price), sent as the AgentID-Token header so the quote records you as a verified buying agent. Leave it out to buy unverified. |
| routing_preference | string | How to pick a function when none is named. |
{
"type": "object",
"required": [
"cart"
],
"properties": {
"cart": {
"type": "object",
"required": [
"line_items"
],
"properties": {
"line_items": {
"type": "array",
"items": {
"type": "object",
"required": [
"product_id",
"quantity"
],
"properties": {
"id": {
"type": "string",
"maxLength": 200
},
"sku": {
"type": "string",
"maxLength": 200
},
"gtin": {
"type": "string",
"maxLength": 64
},
"title": {
"type": "string",
"maxLength": 500
},
"quantity": {
"type": "integer",
"minimum": 1
},
"attributes": {
"type": "object"
},
"product_id": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"unit_price": {
"type": "object",
"required": [
"amount",
"currency"
],
"properties": {
"amount": {
"type": "number",
"minimum": 0
},
"currency": {
"type": "string",
"maxLength": 8,
"minLength": 3
}
},
"additionalProperties": false
},
"variant_id": {
"type": "string",
"maxLength": 200
},
"description": {
"type": "string",
"maxLength": 2000
}
},
"additionalProperties": false
},
"maxItems": 100,
"minItems": 1,
"description": "What is being bought."
}
},
"description": "The cart to price.",
"additionalProperties": false
},
"order": {
"type": "object",
"description": "Order details."
},
"stage": {
"enum": [
"quote",
"cart",
"checkout",
"order"
],
"type": "string",
"description": "Where in the funnel the quote is for. Defaults to quote."
},
"context": {
"type": "object",
"description": "Anything that shapes the price: product type, country, channel."
},
"payment": {
"type": "object",
"description": "Payment details."
},
"checkout": {
"type": "object",
"description": "Checkout details."
},
"currency": {
"type": "string",
"maxLength": 8,
"minLength": 3,
"description": "The currency to price in."
},
"request_id": {
"type": "string",
"maxLength": 200,
"description": "Your id for this request."
},
"function_id": {
"type": "string",
"maxLength": 200,
"description": "The pricing function to use."
},
"agentid_token": {
"type": "string",
"maxLength": 8192,
"minLength": 20,
"description": "Optional: your AgentID ID token (from auth.agentid.com, issued for Last Price), sent as the AgentID-Token header so the quote records you as a verified buying agent. Leave it out to buy unverified."
},
"routing_preference": {
"enum": [
"cheapest",
"fastest",
"explicit",
"round_robin",
"weighted",
"policy",
"default"
],
"type": "string",
"description": "How to pick a function when none is named."
}
},
"additionalProperties": false
}| string |
| Only calls priced by this function. |
{
"type": "object",
"properties": {
"ids": {
"type": "string",
"maxLength": 1900,
"description": "Up to 50 usage event ids, comma separated. Send ids or a period, not both."
},
"limit": {
"type": "integer",
"maximum": 500,
"minimum": 1,
"description": "Receipts per page for a period. Defaults to 100."
},
"offset": {
"type": "integer",
"maximum": 1000000,
"minimum": 0,
"description": "Receipts to skip for a period. Defaults to 0, at most 1000000."
},
"agent_id": {
"type": "string",
"format": "uuid",
"description": "Only calls made by this agent. A key bound to an agent always gets only its own calls."
},
"end_date": {
"type": "string",
"format": "date-time",
"description": "End of the period, ISO 8601. Defaults to now."
},
"start_date": {
"type": "string",
"format": "date-time",
"description": "Start of the period, ISO 8601. Defaults to the first of this month (UTC)."
},
"function_id": {
"type": "string",
"format": "uuid",
"description": "Only calls priced by this function."
}
},
"additionalProperties": false
}| string |
| The billable event the example records, like chat.completed. |
| repository* | string | owner/name, like acme/agent-app; must be a repository the installation can use. |
{
"type": "object",
"required": [
"repository",
"framework"
],
"properties": {
"base": {
"type": "string",
"maxLength": 255,
"description": "Branch to open the pull request against; the default branch when absent."
},
"title": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Pull request title."
},
"branch": {
"type": "string",
"maxLength": 255,
"description": "New branch for the commit; last-price/billing-setup when absent."
},
"agent_id": {
"type": "string",
"format": "uuid",
"description": "One of your agents, filled into the code."
},
"payments": {
"type": "boolean",
"description": "Include billing through Stripe (default true)."
},
"customers": {
"type": "boolean",
"description": "Include creating customers at sign-up (default true)."
},
"framework": {
"enum": [
"nextjs-app",
"express",
"python-fastapi"
],
"type": "string"
},
"event_name": {
"type": "string",
"pattern": "^[a-z][a-z0-9_.-]{0,63}$",
"description": "The billable event the example records, like chat.completed."
},
"repository": {
"type": "string",
"maxLength": 140,
"description": "owner/name, like acme/agent-app; must be a repository the installation can use."
}
},
"additionalProperties": false
}| string |
| Who the calls pay: an API, domain or wallet name. |
| agent_id | string | Only with a workspace-wide key: open it on behalf of this agent. An agent key always acts as itself. |
| category | string | Optional: its category, when the policy limits or budgets categories. |
| currency | string | Three-letter ISO currency code. Defaults to USD. |
| max_amount* | number | The most the whole run may spend. |
| ttl_seconds | integer | How long the session stays open, in seconds. Defaults to 3600. |
| agentid_token | string | Your AgentID ID token, issued for Last Price, when your owner's policy lets only verified agents spend. Sent as the AgentID-Token header. |
{
"type": "object",
"required": [
"seller",
"max_amount"
],
"properties": {
"item": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "Optional: what the calls buy."
},
"intent": {
"type": "object",
"required": [
"source",
"intent_id"
],
"properties": {
"source": {
"enum": [
"amex_intent",
"ap2_intent_mandate",
"declared"
],
"type": "string",
"description": "Where the intent comes from."
},
"currency": {
"type": "string",
"maxLength": 3,
"minLength": 3,
"description": "The intent's currency. Never converted."
},
"evidence": {
"type": "string",
"maxLength": 20000,
"minLength": 1,
"description": "The Proof of Intent Token or the mandate; only its SHA-256 is kept."
},
"merchant": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "The merchant the buyer approved."
},
"intent_id": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "The Intent ID, or the mandate id."
},
"conditions": {
"type": "object",
"description": "Other conditions, recorded as given."
},
"expires_at": {
"type": "string",
"format": "date-time",
"description": "When the approval ends."
},
"max_amount": {
"type": "number",
"minimum": 0,
"description": "The most the buyer approved across every purchase under this intent. Needs currency."
}
},
"description": "Optional: what the buyer approved for this purchase, from an American Express intent, an AP2 intent mandate, or declared by you. A purchase that names another seller, costs more than max_amount (counting every purchase under the same intent_id), is in another currency or comes after expires_at is denied, whatever the policy allows. evidence (the token or mandate) is kept only as a hash and is not verified yet. Only where the workspace has intents switched on (else an error with code not_released).",
"additionalProperties": false
},
"pay_to": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Optional: the wallet address (bare or CAIP-10) or merchant account id the calls pay. Every draw_session_spend must then name the same one: another is refused with code payee_changed. Only where the workspace has payee binding switched on (else an error with code not_released)."
},
"seller": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Who the calls pay: an API, domain or wallet name."
},
"agent_id": {
"type": "string",
"format": "uuid",
"description": "Only with a workspace-wide key: open it on behalf of this agent. An agent key always acts as itself."
},
"category": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Optional: its category, when the policy limits or budgets categories."
},
"currency": {
"type": "string",
"maxLength": 3,
"minLength": 3,
"description": "Three-letter ISO currency code. Defaults to USD."
},
"max_amount": {
"type": "number",
"description": "The most the whole run may spend.",
"exclusiveMinimum": 0
},
"ttl_seconds": {
"type": "integer",
"maximum": 86400,
"minimum": 30,
"description": "How long the session stays open, in seconds. Defaults to 3600."
},
"agentid_token": {
"type": "string",
"maxLength": 8192,
"minLength": 20,
"description": "Your AgentID ID token, issued for Last Price, when your owner's policy lets only verified agents spend. Sent as the AgentID-Token header."
}
},
"additionalProperties": false
}| side | string | selling (the default) gets a listing; buying gets a message to the seller with your opening offer. |
| photo | object | A photo the person attached in the chat, passed by the app as a file reference (file_id and download_url). Downloaded on our side. |
| signals | object | Optional capture signals the person explicitly allowed. Only groups in consent.facets are read, while capture-signals is enabled. Never collect device or location data without their consent. |
| currency | string | Three-letter currency code for the price. Defaults to USD. |
| artifacts | array | What you have about the item, one entry each, at most 12. Needed unless photo or file is sent. |
| product_name | string | What the item is, if you know. Helps when the photos are unclear. |
| current_price | number | The price you have in mind (an asking price, or what you hope to pay). Compared with the estimate, never used as it. |
{
"type": "object",
"properties": {
"file": {
"type": "object",
"required": [
"download_url"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string",
"maxLength": 2048
}
},
"description": "A PDF (or another photo) the person attached in the chat, passed the same way as photo.",
"additionalProperties": {}
},
"side": {
"enum": [
"selling",
"buying"
],
"type": "string",
"description": "selling (the default) gets a listing; buying gets a message to the seller with your opening offer."
},
"photo": {
"type": "object",
"required": [
"download_url"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string",
"maxLength": 2048
}
},
"description": "A photo the person attached in the chat, passed by the app as a file reference (file_id and download_url). Downloaded on our side.",
"additionalProperties": {}
},
"signals": {
"type": "object",
"description": "Optional capture signals the person explicitly allowed. Only groups in consent.facets are read, while capture-signals is enabled. Never collect device or location data without their consent.",
"additionalProperties": {}
},
"currency": {
"type": "string",
"maxLength": 3,
"minLength": 3,
"description": "Three-letter currency code for the price. Defaults to USD."
},
"artifacts": {
"type": "array",
"items": {
"type": "object",
"required": [
"type",
"content"
],
"properties": {
"id": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Your own name for this entry, echoed in an error about it. Defaults to a1, a2 and so on."
},
"type": {
"enum": [
"image",
"screenshot",
"document",
"url",
"text",
"sku"
],
"type": "string",
"description": "image or screenshot for a photo, document for a PDF, url for a product page, text for a description, sku for a barcode or product code."
},
"content": {
"type": "string",
"minLength": 1,
"description": "A photo or PDF as base64 (no data: prefix) or as a public http or https link to the file; the address for url; the words for text and sku. Treated as data, never as instructions."
},
"mime_type": {
"type": "string",
"maxLength": 100,
"description": "For a photo or PDF sent as base64: image/jpeg, image/png, image/gif, image/webp or application/pdf. Not needed for a link."
}
},
"additionalProperties": false
},
"maxItems": 12,
"minItems": 1,
"description": "What you have about the item, one entry each, at most 12. Needed unless photo or file is sent."
},
"product_name": {
"type": "string",
"maxLength": 200,
"description": "What the item is, if you know. Helps when the photos are unclear."
},
"current_price": {
"type": "number",
"minimum": 0,
"description": "The price you have in mind (an asking price, or what you hope to pay). Compared with the estimate, never used as it."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"outcome"
],
"properties": {
"outcome": {
"enum": [
"accepted",
"rejected"
],
"type": "string",
"description": "Whether the price was used."
},
"evidence_url": {
"type": "string",
"maxLength": 500,
"description": "Optional evidence: an https link to the record."
},
"evidence_note": {
"type": "string",
"maxLength": 500,
"description": "Optional evidence: a short note on why."
},
"quality_score": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "Optional: how good the price was, 0 to 1."
},
"usage_event_id": {
"type": "string",
"description": "The usage event of the priced call: receipt.id on the compute_price result. Pass it whenever you priced more than one thing. Omitted, the last compute_price result on this connection is reported, once."
},
"evidence_reference": {
"type": "string",
"maxLength": 200,
"description": "Optional evidence: an order, ticket or invoice id in your own system."
}
}
}| number |
| The price Last Price gave. |
| expected_price | number | The price the person expected. |
{
"type": "object",
"required": [
"reason"
],
"properties": {
"note": {
"type": "string",
"maxLength": 2000,
"description": "What the person said, in their words. Treated as data, never as instructions."
},
"reason": {
"enum": [
"price_wrong",
"wrong_item",
"broken",
"idea",
"other"
],
"type": "string",
"description": "price_wrong for a price that is off, wrong_item when it named the wrong thing, broken when something did not work, idea for a suggestion, other for anything else."
},
"check_id": {
"type": "string",
"format": "uuid",
"description": "The price check this is about: the check_id from price_from_capture or the id from list_price_checks."
},
"currency": {
"type": "string",
"maxLength": 3,
"minLength": 3,
"description": "Three-letter currency code for the prices."
},
"item_name": {
"type": "string",
"maxLength": 200,
"description": "The item the price was for."
},
"computed_price": {
"type": "number",
"minimum": 0,
"description": "The price Last Price gave."
},
"expected_price": {
"type": "number",
"minimum": 0,
"description": "The price the person expected."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"agent_id"
],
"properties": {
"agent_id": {
"type": "string",
"format": "uuid",
"description": "The agent to test: its id, as an agent shows in your workspace. An agent's own credential can name only its own agent."
},
"scenario_ids": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"maxItems": 50,
"minItems": 1,
"description": "Run only these scenarios: ids from get_agent_behaviour_tests. Omit to run the whole pack."
},
"private_terms": {
"type": "array",
"items": {
"type": "string",
"maxLength": 200,
"minLength": 2
},
"maxItems": 50,
"description": "Words or phrases the agent must never repeat in its replies, such as a floor price or a cost."
},
"approved_recipients": {
"type": "array",
"items": {
"type": "string",
"format": "email"
},
"maxItems": 20,
"description": "Email addresses the agent is allowed to write to during the run."
},
"system_prompt_override": {
"type": "string",
"maxLength": 20000,
"description": "Test this draft system prompt instead of the agent's saved one."
},
"scenario_timeout_seconds": {
"type": "integer",
"maximum": 120,
"minimum": 5,
"description": "Seconds each scenario may take before it counts as an error. Defaults to 22 here, so a run answers inside this tool's 30 second limit."
}
},
"additionalProperties": false
}| balance_monthly_cap_usd | number | null | The most the balance may pay for briefs in one month, in US dollars, at most 100. null removes the cap (only while paying from the balance is off). |
{
"type": "object",
"properties": {
"cadence": {
"enum": [
"weekly",
"nightly"
],
"type": "string",
"description": "weekly (Monday) or nightly."
},
"enabled": {
"type": "boolean",
"description": "true writes your workspace a brief; false stops it."
},
"cycle_cadence": {
"enum": [
"daily",
"weekly"
],
"type": "string",
"description": "daily, or weekly on Monday, both at 03:00 UTC."
},
"cycle_enabled": {
"type": "boolean",
"description": "true runs your commerce cycle on a schedule with execute false: it drafts price proposals and never pushes a price."
},
"balance_opt_in": {
"type": "boolean",
"description": "true lets a written brief be paid from your Last Price balance once the monthly allowance is spent. Needs balance_monthly_cap_usd, sent now or already saved."
},
"balance_monthly_cap_usd": {
"type": [
"number",
"null"
],
"maximum": 100,
"description": "The most the balance may pay for briefs in one month, in US dollars, at most 100. null removes the cap (only while paying from the balance is off).",
"exclusiveMinimum": 0
}
},
"additionalProperties": false
}| floor_price* | number | The lowest price you will accept. Never shown to buyers. |
{
"type": "object",
"required": [
"product_id",
"enabled",
"list_price",
"floor_price"
],
"properties": {
"title": {
"type": [
"string",
"null"
],
"maxLength": 200,
"description": "A name for your own reference."
},
"enabled": {
"type": "boolean",
"description": "Whether buyers can make offers on this product."
},
"currency": {
"type": "string",
"default": "USD",
"pattern": "^[A-Z]{3}$",
"description": "A three letter ISO 4217 code. Defaults to USD."
},
"unit_cost": {
"type": [
"number",
"null"
],
"maximum": 1000000000,
"minimum": 0,
"description": "Your cost per unit, read by the margin and cost guardrails."
},
"list_price": {
"type": "number",
"maximum": 1000000000,
"description": "The asking price buyers see.",
"exclusiveMinimum": 0
},
"max_rounds": {
"type": [
"integer",
"null"
],
"maximum": 10,
"minimum": 1,
"description": "Rounds for this product, instead of the workspace setting."
},
"product_id": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Your own id for the product, as buyers name it in an offer."
},
"floor_price": {
"type": "number",
"maximum": 1000000000,
"description": "The lowest price you will accept. Never shown to buyers.",
"exclusiveMinimum": 0
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"enabled"
],
"properties": {
"handle": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]{2,39}$",
"maxLength": 40,
"minLength": 3,
"description": "Your public handle: 3 to 40 lowercase letters, digits or hyphens."
},
"enabled": {
"type": "boolean",
"description": "Whether buyers can make offers to your workspace at all. Off by default."
},
"max_rounds": {
"type": "integer",
"maximum": 10,
"minimum": 1,
"description": "Most offers a buyer may make in one negotiation."
},
"concession_rate": {
"type": "number",
"description": "How far each counter moves toward the buyer, between 0 and 1.",
"exclusiveMaximum": 1,
"exclusiveMinimum": 0
},
"min_offer_ratio": {
"type": "number",
"minimum": 0,
"description": "Offers below this share of the list price are rejected outright.",
"exclusiveMaximum": 1
},
"offer_ttl_minutes": {
"type": "integer",
"maximum": 10080,
"minimum": 5,
"description": "How long a counter stands before it expires, in minutes."
},
"daily_negotiation_cap": {
"type": "integer",
"maximum": 100000,
"minimum": 1,
"description": "Most new negotiations a day."
}
},
"additionalProperties": false
}{
"type": "object",
"properties": {
"max_change_pct": {
"type": [
"number",
"null"
],
"default": null,
"maximum": 1000,
"description": "Most a final price may move from the current price, up or down, in percent. Null (the default) for no limit.",
"exclusiveMinimum": 0
},
"min_margin_pct": {
"type": [
"number",
"null"
],
"default": null,
"minimum": 0,
"description": "Least margin over the unit cost a call sends, in percent of the price. Null (the default) for no minimum.",
"exclusiveMaximum": 100
},
"band_lower_ratio": {
"type": "number",
"default": 0.5,
"maximum": 1,
"description": "Lowest price the optimizer and elasticity functions search, as a multiple of the current price. Defaults to 0.5.",
"exclusiveMinimum": 0
},
"band_upper_ratio": {
"type": "number",
"default": 2,
"maximum": 100,
"minimum": 1,
"description": "Highest price the optimizer and elasticity functions search, as a multiple of the current price. Defaults to 2."
},
"never_below_cost": {
"type": "boolean",
"default": true,
"description": "Never price below the unit cost a call sends. Defaults to true."
}
},
"additionalProperties": false
}| hold_seconds | integer | How long an allowed purchase's reservation stays open for the purchase to start. Defaults to 900. |
| allowed_sellers | array | null | Only these sellers. Null (the default) for any. |
| blocked_sellers | array | Never these sellers. Defaults to none. |
| max_per_purchase | number | null | Most one purchase may cost. Null (the default) for no limit. |
| preferred_sellers | array | null | Vendors procurement approved. Another seller waits for a person, or is denied with block_unknown_sellers. |
| allowed_categories | array | null | Only these categories. Null (the default) for any. |
| block_unknown_sellers | boolean | Deny any seller not on preferred_sellers. Defaults to false. |
| quotes_required_above | number | null | Purchases above this need quotes from at least two sellers. |
| allowed_agent_subjects | array | null | Only these AgentIDs (the subject in their token) may spend. Null for any verified or unverified agent the other rules allow. |
| require_verified_agent | boolean | Only agents that prove who they are with an AgentID token on check_purchase may spend. Only where get_spend_policy says verified agents are available. |
| category_monthly_budgets | object | null | Most spent per category in one UTC month, e.g. {"software": 2000}. Checks must then name a category. |
{
"type": "object",
"properties": {
"preset": {
"enum": [
"procurement",
null
],
"type": [
"string",
"null"
],
"description": "procurement switches on company buying rules in one step, filling ask_above 500, quotes_required_above 5000 and, with preferred_sellers, block_unknown_sellers for whichever you leave out. Only where get_spend_policy says procurement.available."
},
"agent_id": {
"type": [
"string",
"null"
],
"format": "uuid",
"description": "The agent this policy governs. Null or omitted for the workspace default."
},
"currency": {
"type": "string",
"maxLength": 3,
"minLength": 3,
"description": "Currency of every amount here; purchases in another are denied. Defaults to USD."
},
"ask_above": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Purchases above this wait for a person's approval. Null (the default) for never."
},
"daily_cap": {
"type": [
"number",
"null"
],
"description": "Most all purchases may cost in one UTC day. Null (the default) for no cap.",
"exclusiveMinimum": 0
},
"fair_price": {
"enum": [
"off",
"ask",
"deny"
],
"type": "string",
"description": "When verify_price judges a price too high: off (ignore, the default), ask a person, or deny."
},
"hold_seconds": {
"type": "integer",
"maximum": 86400,
"minimum": 30,
"description": "How long an allowed purchase's reservation stays open for the purchase to start. Defaults to 900."
},
"allowed_sellers": {
"type": [
"array",
"null"
],
"items": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"maxItems": 100,
"description": "Only these sellers. Null (the default) for any."
},
"blocked_sellers": {
"type": "array",
"items": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"maxItems": 100,
"description": "Never these sellers. Defaults to none."
},
"max_per_purchase": {
"type": [
"number",
"null"
],
"description": "Most one purchase may cost. Null (the default) for no limit.",
"exclusiveMinimum": 0
},
"preferred_sellers": {
"type": [
"array",
"null"
],
"items": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"maxItems": 100,
"description": "Vendors procurement approved. Another seller waits for a person, or is denied with block_unknown_sellers."
},
"allowed_categories": {
"type": [
"array",
"null"
],
"items": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"maxItems": 100,
"description": "Only these categories. Null (the default) for any."
},
"block_unknown_sellers": {
"type": "boolean",
"description": "Deny any seller not on preferred_sellers. Defaults to false."
},
"quotes_required_above": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Purchases above this need quotes from at least two sellers."
},
"allowed_agent_subjects": {
"type": [
"array",
"null"
],
"items": {
"type": "string",
"maxLength": 128,
"minLength": 1
},
"maxItems": 100,
"description": "Only these AgentIDs (the subject in their token) may spend. Null for any verified or unverified agent the other rules allow."
},
"require_verified_agent": {
"type": "boolean",
"description": "Only agents that prove who they are with an AgentID token on check_purchase may spend. Only where get_spend_policy says verified agents are available."
},
"category_monthly_budgets": {
"type": [
"object",
"null"
],
"description": "Most spent per category in one UTC month, e.g. {\"software\": 2000}. Checks must then name a category.",
"additionalProperties": {
"type": "number",
"exclusiveMinimum": 0
}
}
},
"additionalProperties": false
}| Units sold through the channel per period at the current cut. |
| max_cut_pct | number | Highest cut to try. Defaults to 30 (or the current cut, if higher). |
| min_cut_pct | number | Lowest cut to try. Defaults to 2.5 (or the current cut, if lower). |
| passed_on_pct | number | How much of the cut is added to the price, in percent. Defaults to 100. |
| current_cut_pct* | number | The cut the channel takes today, in percent. |
| price_elasticity | number | How channel buyers respond to price. Defaults to -1.5. |
| visibility_per_point_pct | number | Your assumption: percent more channel sales per extra point of cut. Defaults to 2. |
| max_visibility_change_pct | number | Most ranking can move channel sales, in percent either way. Defaults to 100. |
{
"type": "object",
"required": [
"price",
"unit_cost",
"current_cut_pct",
"base_units"
],
"properties": {
"price": {
"type": "number",
"description": "Your own price before any channel cut.",
"exclusiveMinimum": 0
},
"channel": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "The channel name, as you save it in channel rates (e.g. instinct)."
},
"currency": {
"type": "string",
"maxLength": 3,
"minLength": 3,
"description": "ISO 4217 code of price and unit_cost, echoed back."
},
"step_pct": {
"type": "number",
"maximum": 10,
"minimum": 0.1,
"description": "Gap between the cuts tried. Defaults to 0.5."
},
"unit_cost": {
"type": "number",
"minimum": 0,
"description": "What one unit costs you, same currency."
},
"base_units": {
"type": "number",
"description": "Units sold through the channel per period at the current cut.",
"exclusiveMinimum": 0
},
"max_cut_pct": {
"type": "number",
"maximum": 60,
"minimum": 0,
"description": "Highest cut to try. Defaults to 30 (or the current cut, if higher)."
},
"min_cut_pct": {
"type": "number",
"maximum": 60,
"minimum": 0,
"description": "Lowest cut to try. Defaults to 2.5 (or the current cut, if lower)."
},
"passed_on_pct": {
"type": "number",
"maximum": 100,
"minimum": 0,
"description": "How much of the cut is added to the price, in percent. Defaults to 100."
},
"current_cut_pct": {
"type": "number",
"maximum": 60,
"minimum": 0,
"description": "The cut the channel takes today, in percent."
},
"price_elasticity": {
"type": "number",
"maximum": 0,
"minimum": -20,
"description": "How channel buyers respond to price. Defaults to -1.5."
},
"visibility_per_point_pct": {
"type": "number",
"maximum": 50,
"minimum": 0,
"description": "Your assumption: percent more channel sales per extra point of cut. Defaults to 2."
},
"max_visibility_change_pct": {
"type": "number",
"maximum": 1000,
"minimum": 0,
"description": "Most ranking can move channel sales, in percent either way. Defaults to 100."
}
},
"additionalProperties": false
}| unit_cost |
| number |
| What one unit costs you. Without it the suggestion maximises revenue. |
| buyer_type | string | Who is buying. |
| product_id* | string | The product, as your pricing calls name it. |
| current_price | number | Today's price. Defaults to the price of the product's latest quote. |
{
"type": "object",
"required": [
"product_id"
],
"properties": {
"unit": {
"type": "string",
"maxLength": 200,
"description": "What one unit is: item, call, token, seat-month, month, hour, gb, outcome or percent."
},
"channel": {
"type": "string",
"maxLength": 64,
"description": "Where it is sold, such as the web, an API, MCP or a marketplace."
},
"category": {
"type": "string",
"maxLength": 200,
"description": "A category id; its top-level ancestor is the vertical."
},
"topology": {
"type": "string",
"maxLength": 200,
"description": "How it is priced: posted, metered, per-call, seat, subscription, outcome, auction, negotiated, marketplace, bundle or dynamic."
},
"max_price": {
"type": "number",
"description": "Never suggest above this.",
"exclusiveMinimum": 0
},
"min_price": {
"type": "number",
"description": "Never suggest below this.",
"exclusiveMinimum": 0
},
"unit_cost": {
"type": "number",
"minimum": 0,
"description": "What one unit costs you. Without it the suggestion maximises revenue."
},
"buyer_type": {
"enum": [
"person",
"agent",
"business"
],
"type": "string",
"description": "Who is buying."
},
"product_id": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "The product, as your pricing calls name it."
},
"current_price": {
"type": "number",
"description": "Today's price. Defaults to the price of the product's latest quote.",
"exclusiveMinimum": 0
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"source_schema",
"source_record",
"canonical_schema",
"vendor_contract"
],
"properties": {
"extensions": {
"type": "object",
"description": "Vendor extensions to add to the payload.",
"additionalProperties": {}
},
"allow_extra": {
"type": "boolean",
"description": "Let fields the contract does not list through."
},
"source_record": {
"type": "object",
"description": "The record to translate.",
"additionalProperties": {}
},
"source_schema": {
"type": "object",
"required": [
"id",
"fields"
],
"properties": {
"id": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "A stable id for the source."
},
"fields": {
"type": "array",
"items": {
"type": "object",
"required": [
"path",
"type"
],
"properties": {
"enum": {
"type": "array",
"items": {},
"maxItems": 200,
"description": "The values the field may take."
},
"path": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "The dot path of the field."
},
"type": {
"type": "string",
"maxLength": 40,
"minLength": 1,
"description": "The field type, for example string, number or boolean."
},
"examples": {
"type": "array",
"items": {},
"maxItems": 10,
"description": "A few example values."
},
"required": {
"type": "boolean",
"description": "Whether the schema requires the field."
},
"description": {
"type": "string",
"maxLength": 1000,
"description": "What the field holds."
}
},
"additionalProperties": false
},
"maxItems": 500
}
},
"description": "The source: an id for it and its fields.",
"additionalProperties": false
},
"vendor_contract": {
"type": "object",
"required": [
"id",
"fields"
],
"properties": {
"id": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "The vendor or endpoint id."
},
"fields": {
"type": "array",
"items": {
"type": "object",
"required": [
"path",
"type"
],
"properties": {
"enum": {
"type": "array",
"items": {},
"maxItems": 200,
"description": "The values the field may take."
},
"path": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "The dot path of the field."
},
"type": {
"type": "string",
"maxLength": 40,
"minLength": 1,
"description": "The field type, for example string, number or boolean."
},
"examples": {
"type": "array",
"items": {},
"maxItems": 10,
"description": "A few example values."
},
"required": {
"type": "boolean",
"description": "Whether the schema requires the field."
},
"description": {
"type": "string",
"maxLength": 1000,
"description": "What the field holds."
}
},
"additionalProperties": false
},
"maxItems": 500
}
},
"description": "What the vendor requires: an id and its fields.",
"additionalProperties": false
},
"canonical_schema": {
"type": [
"string",
"object"
],
"required": [
"id",
"fields"
],
"properties": {
"id": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "A stable id for the schema."
},
"fields": {
"type": "array",
"items": {
"type": "object",
"required": [
"path",
"type"
],
"properties": {
"enum": {
"type": "array",
"items": {},
"maxItems": 200,
"description": "The values the field may take."
},
"path": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "The dot path of the field."
},
"type": {
"type": "string",
"maxLength": 40,
"minLength": 1,
"description": "The field type, for example string, number or boolean."
},
"examples": {
"type": "array",
"items": {},
"maxItems": 10,
"description": "A few example values."
},
"required": {
"type": "boolean",
"description": "Whether the schema requires the field."
},
"description": {
"type": "string",
"maxLength": 1000,
"description": "What the field holds."
}
},
"additionalProperties": false
},
"maxItems": 500
}
},
"description": "The id of a built-in schema (see list_canonical_schemas) or a whole schema with an id and fields.",
"additionalProperties": false
}
},
"additionalProperties": false
}| No proposal goes below this price. |
| approval_mode | string | manual queues every proposal for a decision, auto approves small changes, shadow records proposals without acting on them. |
| ceiling_price | number | No proposal goes above this price. |
| auto_approve_max_delta_pct | number | With approval_mode auto: proposals that move the price by at most this percent skip the queue. Required for auto. |
{
"type": "object",
"required": [
"policy_id"
],
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "A name for the policy."
},
"rules": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"kind"
],
"properties": {
"id": {
"type": "string"
},
"kind": {
"enum": [
"undercut_competitor",
"match_competitor",
"beat_lowest_by_abs",
"percent_off_msrp",
"router",
"fixed"
],
"type": "string",
"description": "Which rule this is."
}
},
"additionalProperties": {}
},
"description": "The rules, tried in order; the first that produces a price wins. Each rule has an id, a kind and the fields its kind needs: a percent to undercut by, an amount to beat the lowest price by, a percent off the list price, a competitor to match, a fixed price, or a routing choice. The Pricing Policies section of the documentation lists them."
},
"scope": {
"type": "object",
"properties": {
"skus": {
"type": "array",
"items": {
"type": "string"
}
},
"brands": {
"type": "array",
"items": {
"type": "string"
}
},
"marketplaces": {
"type": "array",
"items": {
"type": "string"
}
}
},
"description": "Which items the policy covers: skus, brands and marketplaces lists. Empty covers every item.",
"additionalProperties": false
},
"is_active": {
"type": "boolean",
"description": "Whether the pipeline applies the policy."
},
"policy_id": {
"type": "string",
"format": "uuid",
"description": "The policy id, as list_commerce_policies gives it."
},
"description": {
"type": "string",
"description": "What the policy is for."
},
"floor_price": {
"type": "number",
"minimum": 0,
"description": "No proposal goes below this price."
},
"approval_mode": {
"enum": [
"manual",
"auto",
"shadow"
],
"type": "string",
"description": "manual queues every proposal for a decision, auto approves small changes, shadow records proposals without acting on them."
},
"ceiling_price": {
"type": "number",
"minimum": 0,
"description": "No proposal goes above this price."
},
"auto_approve_max_delta_pct": {
"type": "number",
"minimum": 0,
"description": "With approval_mode auto: proposals that move the price by at most this percent skip the queue. Required for auto."
}
},
"additionalProperties": false
}| The pricing function UUID: id on a list_functions result. |
| display_name | string | The name people and agents see. |
| endpoint_url | string | For a function that calls your own service: the https endpoint that returns the price. |
| input_schema | object | JSON Schema of what a price request supplies to the function. |
| cost_per_unit | number | What one call to the function costs, in USD. |
| output_schema | object | JSON Schema of what the function returns. |
| cost_multiplier | number | Multiplies the cost of each call, for a more expensive model tier. 1 is the default; stored to 4 decimal places. |
| inference_config | object | null | For a function that runs on a model. On update an object replaces it and null removes it, so the function uses the rule-based formula. |
| quote_valid_seconds | integer | null | How long a price this function computes stays valid, in seconds (30 to 86400). Prices carry it as valid_until where quote expiry is switched on for the workspace. Omit for the default of 15 minutes; on update null returns to the default. |
{
"type": "object",
"required": [
"function_id"
],
"properties": {
"rule": {
"type": [
"object",
"null"
],
"required": [
"base"
],
"properties": {
"base": {
"type": "object",
"description": "Where the price starts: {\"from\":\"current_price\"}, {\"from\":\"unit_cost\"}, {\"from\":\"competitor_prices\",\"pick\":\"min\"|\"avg\"|\"max\"} or {\"from\":\"field\",\"field\":\"<context field>\"}.",
"additionalProperties": {}
},
"steps": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": {}
},
"maxItems": 20,
"description": "Applied in order: adjust_pct, margin (target_margin_pct), scale, tiers, floor, ceiling, ending (cents such as 0.99) and round. A floor or ceiling holds through every later step."
}
},
"description": "For a rule based function: the rule it prices by. Its input schema is made from the rule, and a rule based function needs one before it can be active. On update null removes it.",
"additionalProperties": false
},
"tags": {
"type": "array",
"items": {
"type": "string",
"maxLength": 64
},
"maxItems": 20,
"description": "The tag list. On update it replaces the whole list."
},
"status": {
"enum": [
"draft",
"review",
"active",
"inactive",
"deprecated"
],
"type": "string",
"description": "active functions are routed to; draft, review, inactive and deprecated ones are not."
},
"auth_config": {
"type": [
"object",
"null"
],
"description": "How to authenticate to the endpoint, such as { type: \"bearer\", token: \"...\" }. Stored encrypted and never returned: a read says only whether one is saved. On update an object replaces it and null removes it. Treat the secret as sensitive: it passes through this conversation.",
"additionalProperties": {}
},
"description": {
"type": [
"string",
"null"
],
"maxLength": 2048,
"description": "What the function does. Null clears it."
},
"function_id": {
"type": "string",
"format": "uuid",
"description": "The pricing function UUID: id on a list_functions result."
},
"display_name": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "The name people and agents see."
},
"endpoint_url": {
"type": "string",
"format": "uri",
"description": "For a function that calls your own service: the https endpoint that returns the price."
},
"input_schema": {
"type": "object",
"description": "JSON Schema of what a price request supplies to the function.",
"additionalProperties": {}
},
"cost_per_unit": {
"type": "number",
"minimum": 0,
"description": "What one call to the function costs, in USD."
},
"output_schema": {
"type": "object",
"description": "JSON Schema of what the function returns.",
"additionalProperties": {}
},
"cost_multiplier": {
"type": "number",
"maximum": 100,
"minimum": 0.0001,
"description": "Multiplies the cost of each call, for a more expensive model tier. 1 is the default; stored to 4 decimal places."
},
"inference_config": {
"type": [
"object",
"null"
],
"required": [
"provider"
],
"properties": {
"model": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "The model id at that provider."
},
"prompt": {
"type": "string",
"maxLength": 4000,
"minLength": 1,
"description": "Your pricing instructions for the model."
},
"provider": {
"enum": [
"openai",
"anthropic",
"openrouter",
"together-ai",
"huggingface",
"replicate",
"baseten",
"aitune"
],
"type": "string",
"description": "The model provider."
}
},
"description": "For a function that runs on a model. On update an object replaces it and null removes it, so the function uses the rule-based formula.",
"additionalProperties": false
},
"quote_valid_seconds": {
"type": [
"integer",
"null"
],
"maximum": 86400,
"minimum": 30,
"description": "How long a price this function computes stays valid, in seconds (30 to 86400). Prices carry it as valid_until where quote expiry is switched on for the workspace. Omit for the default of 15 minutes; on update null returns to the default."
}
},
"additionalProperties": false
}| string | null |
| CSS selector for the plan name beside each price. |
| price_selector | string | CSS selector for the price elements. |
| auto_contribute | boolean | Whether run results are contributed to the shared price pool. |
| extraction_mode | string | css reads the selectors only; css_with_llm_fallback asks a model when they find nothing. |
{
"type": "object",
"required": [
"job_id"
],
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "The public page to read. Must start with https://."
},
"name": {
"type": "string",
"maxLength": 120,
"minLength": 1,
"description": "A name for the job."
},
"job_id": {
"type": "string",
"format": "uuid",
"description": "The scrape job UUID: id on a list_scrape_jobs result."
},
"enabled": {
"type": "boolean",
"description": "false pauses the schedule."
},
"currency": {
"type": "string",
"description": "Three-letter ISO 4217 code, such as USD."
},
"schedule": {
"enum": [
"manual",
"hourly",
"daily",
"weekly"
],
"type": "string",
"description": "How often the job runs. manual runs only with run_scrape_job."
},
"vertical": {
"type": "string",
"maxLength": 128,
"minLength": 1,
"description": "The vertical the prices belong to, such as saas."
},
"plan_selector": {
"type": [
"string",
"null"
],
"maxLength": 500,
"minLength": 1,
"description": "CSS selector for the plan name beside each price."
},
"price_selector": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "CSS selector for the price elements."
},
"auto_contribute": {
"type": "boolean",
"description": "Whether run results are contributed to the shared price pool."
},
"extraction_mode": {
"enum": [
"css",
"css_with_llm_fallback"
],
"type": "string",
"description": "css reads the selectors only; css_with_llm_fallback asks a model when they find nothing."
}
},
"additionalProperties": false
}| string | null |
| A paragraph on the seller and its offers. |
| product_ids | array | Only these products open to offers. Empty lists every one. |
| display_name | string | The name agents see. |
| storefront_id* | string | The storefront id, from list_storefronts. |
| show_functions | boolean | List your public marketplace pricing functions. |
| show_negotiation | boolean | List your products open to offers. |
{
"type": "object",
"required": [
"storefront_id"
],
"properties": {
"tagline": {
"type": [
"string",
"null"
],
"maxLength": 140,
"description": "One line on what it sells."
},
"logo_url": {
"type": [
"string",
"null"
],
"maxLength": 500,
"description": "An https link to your logo."
},
"published": {
"type": "boolean",
"description": "true puts it live; false takes it down."
},
"subdomain": {
"type": "string",
"pattern": "^[a-z0-9]([a-z0-9-]{1,38})[a-z0-9]$",
"description": "The <subdomain> in <subdomain>.store.last-price.ai: 3 to 40 lowercase letters, digits or hyphens. Some names are reserved."
},
"offer_tags": {
"type": "array",
"items": {
"type": "string",
"maxLength": 40,
"minLength": 1
},
"maxItems": 50,
"description": "Only functions with one of these tags. Empty lists every public function."
},
"brand_color": {
"type": [
"string",
"null"
],
"pattern": "^#[0-9a-fA-F]{6}$",
"description": "A hex colour such as #0f766e."
},
"contact_url": {
"type": [
"string",
"null"
],
"maxLength": 500,
"description": "An https link where people reach you."
},
"description": {
"type": [
"string",
"null"
],
"maxLength": 1000,
"description": "A paragraph on the seller and its offers."
},
"product_ids": {
"type": "array",
"items": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"maxItems": 50,
"description": "Only these products open to offers. Empty lists every one."
},
"display_name": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "The name agents see."
},
"storefront_id": {
"type": "string",
"format": "uuid",
"description": "The storefront id, from list_storefronts."
},
"show_functions": {
"type": "boolean",
"description": "List your public marketplace pricing functions."
},
"show_negotiation": {
"type": "boolean",
"description": "List your products open to offers."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"checkout_id"
],
"properties": {
"buyer": {
"type": "object",
"properties": {
"email": {
"type": "string",
"format": "email"
},
"phone": {
"type": "string",
"maxLength": 64
},
"last_name": {
"type": "string",
"maxLength": 128
},
"first_name": {
"type": "string",
"maxLength": 128
},
"billing_address": {
"type": "object",
"properties": {
"city": {
"type": "string",
"maxLength": 128
},
"state": {
"type": "string",
"maxLength": 128
},
"postal_code": {
"type": "string",
"maxLength": 32
},
"country_code": {
"type": "string",
"maxLength": 8
},
"address_line_1": {
"type": "string",
"maxLength": 256
},
"address_line_2": {
"type": "string",
"maxLength": 256
}
},
"additionalProperties": false
},
"shipping_address": {
"type": "object",
"properties": {
"city": {
"type": "string",
"maxLength": 128
},
"state": {
"type": "string",
"maxLength": 128
},
"postal_code": {
"type": "string",
"maxLength": 32
},
"country_code": {
"type": "string",
"maxLength": 8
},
"address_line_1": {
"type": "string",
"maxLength": 256
},
"address_line_2": {
"type": "string",
"maxLength": 256
}
},
"additionalProperties": false
}
},
"description": "Who is buying.",
"additionalProperties": false
},
"context": {
"type": "object",
"description": "Where the checkout happens: locale, country, channel and the like."
},
"payment": {
"type": "object",
"properties": {
"currency": {
"type": "string",
"maxLength": 8,
"minLength": 3
},
"handler_id": {
"type": "string",
"maxLength": 200
}
},
"description": "The payment handler and currency.",
"additionalProperties": false
},
"signals": {
"type": "object",
"description": "Where the buyer came from: referrer, utm values and device type."
},
"discounts": {
"type": "object",
"description": "Discount codes to apply."
},
"line_items": {
"type": "array",
"items": {
"type": "object",
"required": [
"product_id",
"quantity"
],
"properties": {
"id": {
"type": "string",
"maxLength": 200
},
"sku": {
"type": "string",
"maxLength": 200
},
"gtin": {
"type": "string",
"maxLength": 64
},
"title": {
"type": "string",
"maxLength": 500
},
"quantity": {
"type": "integer",
"minimum": 1
},
"attributes": {
"type": "object"
},
"product_id": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"unit_price": {
"type": "object",
"required": [
"amount",
"currency"
],
"properties": {
"amount": {
"type": "number",
"minimum": 0
},
"currency": {
"type": "string",
"maxLength": 8,
"minLength": 3
}
},
"additionalProperties": false
},
"variant_id": {
"type": "string",
"maxLength": 200
},
"description": {
"type": "string",
"maxLength": 2000
}
},
"additionalProperties": false
},
"maxItems": 100,
"minItems": 1,
"description": "What is being bought."
},
"checkout_id": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "The checkout session: its id, as create_ucp_checkout and list_ucp_checkouts show it."
},
"fulfillment": {
"type": "object",
"description": "How the order is fulfilled: its methods."
}
},
"additionalProperties": false
}| Text at the foot of each invoice. |
| invoice_prefix | string | Text at the start of each invoice number. |
| sales_playbook | object | null | The sales playbook. Null resets it. |
| company_address | object | null | Address with line1, line2, city, state, zip and country, each text up to 200 characters. Null resets it. |
| company_website | string | null | Company website. Null clears it. |
| default_currency | string | Three-letter currency code, such as USD. |
| payment_terms_days | integer | Days to pay an invoice. |
| company_description | string | null | What the company does. Null clears it. |
{
"type": "object",
"properties": {
"tax_id": {
"type": [
"string",
"null"
],
"maxLength": 100,
"description": "Tax id."
},
"tax_rates": {
"type": [
"array",
"null"
],
"items": {
"type": "object",
"additionalProperties": {}
},
"description": "Tax registrations. Null clears the list."
},
"tax_enabled": {
"type": "boolean",
"description": "Whether tax is added to invoices."
},
"company_logo": {
"type": [
"string",
"null"
],
"maxLength": 2048,
"description": "Logo address."
},
"company_name": {
"type": "string",
"maxLength": 200,
"description": "Company name."
},
"company_email": {
"type": [
"string",
"null"
],
"maxLength": 200,
"description": "Company email. Null clears it."
},
"company_phone": {
"type": [
"string",
"null"
],
"maxLength": 100,
"description": "Company phone. Null clears it."
},
"invoice_footer": {
"type": [
"string",
"null"
],
"maxLength": 2000,
"description": "Text at the foot of each invoice."
},
"invoice_prefix": {
"type": "string",
"maxLength": 20,
"description": "Text at the start of each invoice number."
},
"sales_playbook": {
"type": [
"object",
"null"
],
"description": "The sales playbook. Null resets it.",
"additionalProperties": {}
},
"company_address": {
"type": [
"object",
"null"
],
"description": "Address with line1, line2, city, state, zip and country, each text up to 200 characters. Null resets it.",
"additionalProperties": {}
},
"company_website": {
"type": [
"string",
"null"
],
"maxLength": 300,
"description": "Company website. Null clears it."
},
"default_currency": {
"type": "string",
"maxLength": 3,
"minLength": 3,
"description": "Three-letter currency code, such as USD."
},
"payment_terms_days": {
"type": "integer",
"maximum": 365,
"minimum": 0,
"description": "Days to pay an invoice."
},
"company_description": {
"type": [
"string",
"null"
],
"maxLength": 2000,
"description": "What the company does. Null clears it."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"model_id",
"artifact_base64",
"spec"
],
"properties": {
"spec": {
"type": "object",
"required": [
"kind",
"inputs"
],
"properties": {
"kind": {
"enum": [
"demand",
"price"
],
"type": "string",
"description": "Must be the model's own kind."
},
"inputs": {
"type": "array",
"items": {
"type": "object",
"required": [
"source",
"type"
],
"properties": {
"type": {
"enum": [
"number",
"category"
],
"type": "string",
"description": "number feeds the value; category feeds its position in vocabulary (-1 when unknown)."
},
"source": {
"type": "string",
"maxLength": 73,
"minLength": 1,
"description": "Where the value is read from the request: current_price, unit_cost, unit_cost_ratio, customer_segment, geo, product_id, product_type, buyer_type, channel, currency, or metadata.<key>."
},
"missing": {
"type": "number",
"description": "number inputs: what to feed when the field is missing. Without it, a missing value is NaN, which tree models treat as missing."
},
"vocabulary": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 10000,
"description": "category inputs, required for one: the values in code order."
}
}
},
"maxItems": 256,
"minItems": 1,
"description": "One entry per model input column, in column order."
},
"output": {
"enum": [
"price",
"ratio"
],
"type": "string",
"description": "A price model only, and required for one: whether it outputs the price itself or a ratio of current_price."
}
},
"description": "How request fields become the model's inputs."
},
"notes": {
"type": "string",
"maxLength": 2000,
"description": "Optional notes kept with the version."
},
"promote": {
"type": "boolean",
"description": "Make it the active version at once. Defaults to false: stored as a candidate."
},
"model_id": {
"type": "string",
"format": "uuid",
"description": "The hosted model's id: id on a list_hosted_models result."
},
"artifact_base64": {
"type": "string",
"maxLength": 5592412,
"minLength": 1,
"description": "The .onnx file, base64 encoded. At most 4 MiB before encoding."
}
},
"additionalProperties": false
}| buyer_type |
| string | null |
| Optional. Who the price is for: an AI agent or a person. Recorded with the quote only. |
| product_id | string | Optional identifier of what is being priced. |
| buyer_agent | string | null | Optional. The buying agent, e.g. chatgpt or agent.example.com. A label recorded with the quote only (while its release flag is on); never sent to the pricing function. |
| product_type | string | Optional category of what is being priced. |
| current_price | number | Optional incumbent price. Not required: asking whether a price is sensible does not presuppose an existing one. |
| outcome_terms | object | Optional, for a price charged per outcome. When the outcome counts as failed and what is owed then. Where outcome terms are switched on for the workspace, the result carries outcome_terms: these terms normalised, the deadline as a time, the amount owed on timeout, and which terms are missing (complete is false without success_definition, resolve_by and on_timeout). Sending it marks the price as an outcome price; so does metadata.unit "outcome". |
| proposed_price* | number | The price to judge. This is the subject of the call. |
| customer_segment | string | Optional segment, e.g. enterprise. |
| quote_valid_until | string | Optional. The valid_until of the compute_price result this price came from (RFC 3339). Where quote expiry is switched on, a time already past is answered with quote_expired: true. |
{
"type": "object",
"required": [
"proposed_price"
],
"properties": {
"geo": {
"type": "string",
"description": "Optional geography hint, e.g. US."
},
"channel": {
"type": "string",
"maxLength": 64,
"description": "Optional. The sales channel the price is for, such as a shopping agent or an agent marketplace. When your workspace saved a rate for it with set_channel_rates and channel pricing is on, the price is raised so you keep the same amount after the channel's cut."
},
"currency": {
"type": "string",
"maxLength": 3,
"minLength": 3,
"description": "Three-letter ISO currency code, e.g. USD. Defaults to USD."
},
"metadata": {
"type": "object",
"description": "Optional free-form context."
},
"max_price": {
"type": "number",
"minimum": 0,
"description": "Optional hard ceiling. Binding: a verdict will never relax it."
},
"min_price": {
"type": "number",
"minimum": 0,
"description": "Optional hard floor. Binding: a verdict will never relax it."
},
"buyer_type": {
"enum": [
"agent",
"person",
null
],
"type": [
"string",
"null"
],
"description": "Optional. Who the price is for: an AI agent or a person. Recorded with the quote only."
},
"product_id": {
"type": "string",
"description": "Optional identifier of what is being priced."
},
"buyer_agent": {
"type": [
"string",
"null"
],
"maxLength": 100,
"description": "Optional. The buying agent, e.g. chatgpt or agent.example.com. A label recorded with the quote only (while its release flag is on); never sent to the pricing function."
},
"product_type": {
"enum": [
"saas",
"ecommerce",
"marketplace",
"digital",
"api",
"custom"
],
"type": "string",
"description": "Optional category of what is being priced."
},
"current_price": {
"type": "number",
"minimum": 0,
"description": "Optional incumbent price. Not required: asking whether a price is sensible does not presuppose an existing one."
},
"outcome_terms": {
"type": "object",
"properties": {
"evidence": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 10,
"description": "What proves the outcome, e.g. [\"delivery_receipt\"]."
},
"on_timeout": {
"enum": [
"no_charge",
"partial",
"full"
],
"type": "string",
"description": "What is owed when the deadline passes without success."
},
"resolve_by": {
"type": "string",
"description": "The deadline: an ISO 8601 duration from the quote (P30D, PT48H) or an RFC 3339 time. After it, with no success, the outcome has failed."
},
"timeout_share": {
"type": "number",
"description": "With on_timeout \"partial\": the fraction of the price owed, e.g. 0.3 for 30%.",
"exclusiveMaximum": 1,
"exclusiveMinimum": 0
},
"success_definition": {
"type": "string",
"maxLength": 500,
"description": "What the buyer must see for the outcome to count."
}
},
"description": "Optional, for a price charged per outcome. When the outcome counts as failed and what is owed then. Where outcome terms are switched on for the workspace, the result carries outcome_terms: these terms normalised, the deadline as a time, the amount owed on timeout, and which terms are missing (complete is false without success_definition, resolve_by and on_timeout). Sending it marks the price as an outcome price; so does metadata.unit \"outcome\"."
},
"proposed_price": {
"type": "number",
"minimum": 0,
"description": "The price to judge. This is the subject of the call."
},
"customer_segment": {
"type": "string",
"description": "Optional segment, e.g. enterprise."
},
"quote_valid_until": {
"type": "string",
"format": "date-time",
"description": "Optional. The valid_until of the compute_price result this price came from (RFC 3339). Where quote expiry is switched on, a time already past is answered with quote_expired: true."
}
}
}