{"name":"Last Price","description":"OpenRouter for price computation. One API, any pricing logic, token-metered.","base_url":"https://api.last-price.ai","dashboard_url":"https://app.last-price.ai","docs_url":"https://last-price.ai/docs","contact":{"email":"support@last-price.ai","support_url":"https://app.last-price.ai/support"},"access_options":[{"id":"keyless_demo","choose_when":"Just trying it: no key at all, a demo tenant, 30 calls per IP per hour. MCP at /api/mcp/rpc works without a key the same way.","method":"POST","path":"/api/public/compute/demo","human_required":false,"account_required":false,"credential":"none"},{"id":"self_registration","choose_when":"A free API key right now with no human: a sandbox workspace (25 compute calls a day, a key valid for 30 days) and a claim link for a person. Past the daily limit the same key can pay per call with x402, or buy a day pass of extra calls.","method":"POST","path":"/api/agents/register","human_required":false,"account_required":false,"credential":"API key, sent as x-api-key (also usable as OAuth client credentials)"},{"id":"oauth_dcr","choose_when":"Your OAuth client-credentials framework expects to register its own client (RFC 7591 registration, then the client_credentials grant; there is no authorization code flow). Same sandbox and claim link as self_registration; an additional option, not a replacement.","method":"POST","path":"/api/oauth/register","then":{"method":"POST","path":"/api/oauth/token","note":"grant_type=client_credentials with the returned client_id and client_secret; send the access token as Authorization: Bearer"},"human_required":false,"account_required":false,"credential":"client_id and client_secret (the secret also works as x-api-key)"},{"id":"x402","choose_when":"No account and no key: pay 0.01 USDC per call with x402. A call with no credential answers 402 with the payment requirements (see payments.x402). A self-registered agent key can pay the same way past its daily limit, and the call runs on its own workspace.","method":"POST","path":"/api/compute/price","human_required":false,"account_required":false,"credential":"a signed payment per call in X-PAYMENT (v1) or PAYMENT-SIGNATURE (v2)"},{"id":"agentid","choose_when":"A full workspace of your own, signed in with AgentID and an inbox you control, where AgentID sign-in is offered. Then create an API key in Settings.","method":null,"path":null,"url":"https://app.last-price.ai/sign-up","human_required":false,"account_required":true,"credential":"API key created in the dashboard, sent as x-api-key"},{"id":"human_account","choose_when":"A person owns the account: they sign up and create an API key, or an agent-bound key, for the agent.","method":null,"path":null,"url":"https://app.last-price.ai/sign-up","human_required":true,"account_required":true,"credential":"API key or agent-bound key, sent as x-api-key"}],"registration":{"url":"https://app.last-price.ai/sign-up","guide_url":"https://last-price.ai/agent-sign-in","approval_required":false,"agentid":{"enabled":true,"issuer":"https://auth.agentid.com","inbox_provider":"https://api.agentmail.to/v0","scopes":["openid","email","profile"],"note":"AgentID is an interactive sign-in, not open dynamic client registration. The agent authorizes the pending sign-in with its own AgentMail inbox API key (as the Bearer to the inbox provider, with provider_connect permission); never send that key to Last Price. For a key with no inbox, see self_registration or oauth."},"api_credentials":"https://app.last-price.ai/settings/api-keys","self_service":"https://api.last-price.ai/api/agents/register","note":"access_options lists every independent way in. An agent can register itself with POST /api/agents/register and get a sandbox API key immediately, with no human (see self_registration), or register an OAuth client-credentials client at POST /api/oauth/register (see oauth). Browser sign-in creates a session, which is not an API credential. Account restrictions and workspace permissions still apply."},"self_registration":{"method":"POST","path":"/api/agents/register","url":"https://api.last-price.ai/api/agents/register","auth":"none","human_required":false,"request":{"content_type":"application/json","body":{"name":"string, required, 2 to 64 characters (letters, digits, spaces, . _ : @ / + -)","contact_email":"string, optional","intended_use":"string, optional, at most 500 characters"},"example":{"name":"your-system/role-name","intended_use":"Price a SaaS catalogue"}},"response":{"status":201,"credential":"api_key.key, shown once; send it as the x-api-key header","oauth":"oauth.client_id with api_key.key as client_secret at /api/oauth/token (client_credentials)","terms":"sandbox: scopes, allowed_operations and limits","claim":"claim.claim_url: give it to a person to take the workspace into their account and lift the limits"},"workspace_type":"sandbox","scopes":["pcn:function:read","pcn:routing:read","price:compute"],"allowed_operations":["GET /api/me","POST /api/api-keys/rotate","POST /api/compute/price","POST /api/price-router","POST /api/price-router/verify","GET /api/agents/allowance","POST /api/agents/allowance","GET /api/billing/balance","PATCH /api/billing/balance","POST /api/billing/topup","GET /api/functions","GET /api/functions/catalog","GET /api/functions/{id}","GET /api/routing-policies","GET /api/routing-policies/{id}"],"limits":{"registrations_per_address_per_day":5,"registrations_shared_per_day":50,"registrations_global_per_day":200,"compute_per_day":25,"key_rotations_per_day":10,"credential_ttl_days":30,"max_body_bytes":2048,"functions":"built-in only"},"lift":{"claim":"Give claim.claim_url to a person. Once they claim the workspace, the sandbox limits are lifted for good.","pay_per_call":{"endpoints":[{"method":"POST","path":"/api/compute/price"},{"method":"POST","path":"/api/price-router"}],"header":"PAYMENT-SIGNATURE (v2) or X-PAYMENT (v1)","price":{"amount":"0.01","currency":"USDC","atomic":"10000"},"network":"base","note":"Send the same compute request with this key plus a signed x402 payment for exactly this price, for instance once the daily compute limit is reached. It runs now on this workspace and does not count against the limit. An empty payment header answers 402 with the full payment requirements. Past the limit, the 429 lists this option as the pay_per_call step of its next array, with the price and where to pay."},"day_pass":{"method":"POST","path":"/api/agents/allowance","header":"PAYMENT-SIGNATURE (v2) or X-PAYMENT (v1)","calls":500,"valid_hours":24,"price":{"amount":"2.5","currency":"USDC","atomic":"2500000"},"network":"base","list":{"method":"GET","path":"/api/agents/allowance"},"note":"A self-registered agent key (the agent_starter plan) may buy a day pass with one x402 payment: 500 extra compute calls on its own workspace for 24 hours, used only once the daily compute limit is reached. Send POST /api/agents/allowance with no payment for the 402 requirements, then again with a signed payment for exactly this price. Refused (409 sandbox_key_expiring, before any payment is read) when the workspace's key expires within 24 hours. A compute call sent with a payment header is paid per call even while a pass is live, and does not use the pass. Unused pass calls are forfeited when a person claims the workspace, since the claim lifts the daily limit the pass extends. Past the daily compute limit, the 429 lists this option as the day_pass step of its next array, with the price and where to pay."}},"oauth_equivalent":"POST /api/oauth/register (RFC 7591) creates the same sandbox and returns client_id and client_secret","claim":{"page":"https://app.last-price.ai/claim","endpoint":{"method":"POST","path":"/api/agents/claim","auth":"dashboard session"}}},"oauth":{"token_endpoint":"https://api.last-price.ai/api/oauth/token","registration_endpoint":"https://api.last-price.ai/api/oauth/register","authorization_server_metadata":"https://api.last-price.ai/.well-known/oauth-authorization-server","grant_types_supported":["client_credentials"],"token_endpoint_auth_methods_supported":["client_secret_basic","client_secret_post"],"note":"For OAuth client-credentials frameworks. An additional option beside self_registration, not a replacement: POST registration_endpoint (RFC 7591) to get a client_id and client_secret for a sandbox workspace with no human. The secret also works as x-api-key. There is no authorization endpoint and no authorization code flow."},"auth":{"methods":[{"type":"bearer","header":"Authorization","scheme":"Bearer","description":"OAuth access token (preferred for agents)"},{"type":"api_key","header":"x-api-key","description":"Long-lived API key, sent as the x-api-key header; may be bound to an agent"}]},"scopes":[{"name":"audit:read","description":"Read this tenant's audit events."},{"name":"billing:read","description":"Read invoices, payments, credits and the credit balance, and marketplace earnings and payouts."},{"name":"billing:write","description":"Create, change, send or delete invoices, record payments and refunds, and issue or delete credits."},{"name":"commerce:catalog:read","description":"Read commerce connectors (credentials redacted), catalog items, competitor observations, pricing policies, price proposals and the commerce audit trail."},{"name":"commerce:configure","description":"Create commerce connectors, sync their catalogs, ingest observations, create, change or delete pricing policies, and load sample data."},{"name":"commerce:execute","description":"Push approved proposals out through commerce connectors, alone or at the end of a pipeline cycle."},{"name":"commerce:proposal:approve","description":"Approve a pending commerce proposal."},{"name":"commerce:proposal:draft","description":"Run a commerce pipeline cycle that drafts proposals without approving them, or dry-run a pricing policy."},{"name":"commerce:proposal:reject","description":"Reject a pending commerce proposal."},{"name":"pcn:function:publish","description":"Publish or version a PCN pricing function."},{"name":"pcn:function:read","description":"List and inspect PCN pricing functions."},{"name":"pcn:function:test","description":"Test-run a PCN pricing function without publishing."},{"name":"pcn:routing:read","description":"Read routing policy configuration."},{"name":"pcn:routing:write","description":"Create or update routing policy configuration."},{"name":"price:compute","description":"Call POST /api/compute/price or POST /api/price-router for a single price decision."},{"name":"price:compute:batch","description":"Call POST /api/compute/batch for batched price decisions."},{"name":"team:admin","description":"List, add, remove and change the roles of this workspace's members, and send, list and revoke its invitations, with the API key itself (x-api-key), acting for the person who created the key. Must be granted by name, by a workspace owner or admin: no wildcard and no unscoped key carries it. It works only while that person is still an owner or admin here, never grants a role above theirs or the owner role, never touches the owner or that person's own membership, and only an owner's key may demote or remove an admin. Agent tokens are refused."},{"name":"workspace:claim","description":"Claim a self-registered agent workspace into this workspace with POST /api/agents/claim, acting for the person who owns it. Must be granted by name, by a workspace owner or admin: no wildcard and no unscoped key carries it."}],"team_administration":{"scope":"team:admin","credential":"An API key of the workspace, sent as x-api-key, holding team:admin by name. Agent tokens and other JWTs are refused on these operations.","granted_by":"A workspace owner or admin signed in to the dashboard, on the API keys page. No wildcard and no unscoped key carries it.","operations":["GET /api/workspaces/{workspaceId}/team","POST /api/workspaces/{workspaceId}/team","PATCH /api/workspaces/{workspaceId}/team/{userId}","DELETE /api/workspaces/{workspaceId}/team/{userId}","GET /api/workspaces/{workspaceId}/invitations","POST /api/workspaces/{workspaceId}/invitations","DELETE /api/workspaces/{workspaceId}/invitations/{invitationId}"],"rules":["Only the key's own workspace (GET /api/me reports it), never on the agent starter plan.","Only while the person who created the key is still an owner or admin of the workspace; a key with no recorded creator is refused.","Never grants the owner role or a role above the creator's own.","Never changes or removes the workspace owner or the creator's own membership.","Demoting or removing an admin needs a key created by the owner."],"audit":"Every call, and every refused call, is recorded in the audit log (GET /api/audit?subject_kind=workspace_team) with the key, its agent if any, and the creator. Only owners and admins, and team:admin keys whose creator is one, can read those rows.","invitations":"An invitation a key sends can be accepted only while the key is valid and still holds team:admin and its creator can still invite at that role; revoking the key revokes its pending invitations.","dashboard":{"api_keys":"https://app.last-price.ai/settings/api-keys","team":"https://app.last-price.ai/settings/team"},"note":"Creating and deleting workspaces, workspace settings and the workspace LLM key stay dashboard-session only."},"idempotency":{"supported":true,"header":"Idempotency-Key","ttl_seconds":86400,"min_length":8,"max_length":255},"rate_limits":{"default":{"per_window":100,"window_seconds":900,"headers":["X-RateLimit-Limit","X-RateLimit-Remaining","X-RateLimit-Reset","Retry-After"]},"per_ip":{"per_window":1000,"window_seconds":900,"headers":["X-RateLimit-Limit","X-RateLimit-Remaining","X-RateLimit-Reset","Retry-After"]},"public_demo":{"per_window":30,"window_seconds":3600,"headers":["X-Demo-Limit","X-Demo-Remaining","X-Demo-Reset"]}},"error_envelope":{"shape":{"error":{"code":"string","message":"string","retryable":"boolean"}},"unauthorized":{"status":401,"shape":{"error":"string | object","code":"string","message":"string","retryable":"boolean"},"codes":["unauthorized","invalid_credentials"],"retryable":false,"www_authenticate":"Bearer realm=\"last-price\"","note":"Branch on the top-level code. invalid_credentials means the credential was sent and rejected; unauthorized means none was sent, or not the kind this route accepts. hint names the accepted credentials and next says where to get one, except on a route that takes only a person's credential, which answers a valid API key with a hint saying so and an empty next."},"optional_fields":{"hint":"string. One sentence on how to fix the request (401, 403 insufficient_scope, 400, 429).","next":"array of steps, each { method, path, description }, plus an id where a body lists steps you must tell apart. Calls that get you unstuck: self-registration and the OAuth token endpoint on a 401; on a 429 quota_exceeded, a pay_per_call step (also carrying header, price, asset, network and pay_to; only where the call can be paid for), a day_pass step (also carrying header, calls, valid_hours, price, asset and network; on a daily compute refusal while pay-per-call is configured) and a claim step, in that order. Find a step by its id, not its position.","example":"object. A minimal valid request body for the operation, on a 400 where one is published.","issues":"array of { path, message }. Each field that failed validation, by dotted path, with the reason (400 validation_failed).","retry_after":"integer seconds. Equal to the Retry-After header (429).","limit":"integer. Requests allowed per window by the limiter that refused the call (429)."},"invalid_json":{"status":400,"code":"invalid_json","operations":["POST /api/api-keys","POST /api/compute/batch","POST /api/compute/price","POST /api/costs","POST /api/credits","POST /api/customers","POST /api/disputes","POST /api/embed-tokens","POST /api/functions","POST /api/invoices","POST /api/jale/contribute","POST /api/jale/contribute/batch","POST /api/marketplace/listings","PATCH /api/marketplace/listings/{listingId}","POST /api/orders","POST /api/payments","POST /api/price-router","POST /api/price-router/verify","POST /api/pricing-models","POST /api/routing-policies","PATCH /api/routing-policies/{id}","PATCH /api/usage/events/{id}/outcome","POST /api/webhooks","PATCH /api/webhooks/{webhookId}"],"note":"The body is not JSON. Sent by the operations listed here only. Routes that already answered this with another code keep it (validation_failed on the nested envelope, invalid_request on self-registration) and add the same hint; elsewhere such a body can answer with only error, or, on some older routes, a 500."},"retryable_codes":["rate_limited","quota_exceeded","provider_unavailable","service_unavailable","upstream_timeout","circuit_breaker_open"],"needs_approval":{"status":202,"approve_endpoint":"/api/approvals/{approval_id}/approve","reject_endpoint":"/api/approvals/{approval_id}/reject"}},"attribution":{"user_agent":"Send a descriptive User-Agent on every call, such as your-system/role-name.","credential":"A request sent with an API key counts as the workspace's own. Several agents may share one workspace key and tell themselves apart by User-Agent.","agent_keys":{"optional":true,"create_agent":{"method":"POST","path":"/api/agents"},"create_key":{"method":"POST","path":"/api/agents/{agent_id}/keys"},"note":"An agent-bound key adds the agent name to each request, plus per-agent scopes and revocation."},"keyless":"Keyless calls (the public demo, MCP without a key) never count as a workspace's own traffic, whatever User-Agent they send.","usage_events":"/api/usage/events"},"capabilities_endpoint":"/api/agents/{agent_id}/capabilities","competitive_pricing":{"method":"POST","path":"/api/compute/price","scope":"price:compute","guide":"https://github.com/last-price-ai/last-price/blob/main/docs/integrations/inbound-competitive-pricing.md","function_name":"lastprice/competitive-price","request":{"context":{"currency":"USD","metadata":{"competitor_price":70,"competitor_currency":"USD","competitive_action":"match"}},"constraints":{"min_price":80},"options":{"include_explanation":true}},"note":"Send a comparable offer, matching currency, a match or undercut goal and a minimum acceptable price or unit cost with target margin. Missing inputs answer 400. The price is advice and does not change a store."},"audit_endpoint":"/api/audit","billing":{"scopes":{"read":"billing:read","write":"billing:write"},"endpoints":{"invoices":"/api/invoices","payments":"/api/payments","credits":"/api/credits","credit_balance":"/api/credits/balance?customerId={customer_id}","marketplace_earnings":"/api/marketplace/earnings","marketplace_payouts":"/api/marketplace/payouts","prepaid_balance":"/api/billing/balance","prepaid_topup":"/api/billing/topup"},"dashboard":{"invoices":"https://app.last-price.ai/invoices","payments":"https://app.last-price.ai/payments","credits":"https://app.last-price.ai/credits","payouts":"https://app.last-price.ai/payouts"},"vocabulary":{"credits":"Credit bundles a workspace grants to its own customers, with a balance per customer. They are not a prepaid balance for calling Last Price.","usage":"What your own price computations cost is metered per call and reported by GET /api/usage, which needs no billing scope.","payouts":"What a function publisher earns from marketplace calls, and the payouts of it.","prepaid_balance":"Your own prepaid balance in USDC, topped up with one x402 payment at POST /api/billing/topup and drawn down by compute calls at a lower price than paying per call. Nothing is charged automatically, and it needs price:compute rather than a billing scope."}},"public_demo":{"compute":{"method":"POST","path":"/api/public/compute/demo"},"verify":{"method":"POST","path":"/api/public/price-router/verify"},"rate_limit":{"per_window":30,"window_seconds":3600,"scope":"ip"},"note":"Runs on a demo tenant and drops caller metadata. It cannot evaluate a competitor offer. Production pricing is POST /api/compute/price with an API key."},"payments":{"x402":{"protocol":"x402","x402_version":1,"x402_versions":[1,2],"scheme":"exact","network":"base","network_caip2":"eip155:8453","asset":{"symbol":"USDC","address":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","decimals":6},"price_per_call":{"amount":"0.01","currency":"USDC","atomic":"10000"},"pay_to":"0x30F4f41158dBd194B51820E5633fCBa8eBD86ea4","endpoint":{"method":"POST","path":"/api/compute/price"},"payment_header":"X-PAYMENT","response_header":"X-PAYMENT-RESPONSE","v2_headers":{"required":"PAYMENT-REQUIRED","payment":"PAYMENT-SIGNATURE","response":"PAYMENT-RESPONSE"},"facilitator":"https://api.cdp.coinbase.com/platform/v2/x402","settlement_retry":{"max_attempts":3,"on":"payment_settlement_failed with retryable: true"},"agent_workspaces":{"endpoints":[{"method":"POST","path":"/api/compute/price"},{"method":"POST","path":"/api/price-router"}],"note":"A self-registered agent key (the agent_starter plan) may send the same compute request with a payment in X-PAYMENT or PAYMENT-SIGNATURE, at the same price, for instance once its daily compute limit is reached. The call runs now on the agent's own workspace and does not count against that limit. On any other plan a payment header next to a credential is ignored."},"day_pass":{"method":"POST","path":"/api/agents/allowance","header":"PAYMENT-SIGNATURE (v2) or X-PAYMENT (v1)","calls":500,"valid_hours":24,"price":{"amount":"2.5","currency":"USDC","atomic":"2500000"},"network":"base","list":{"method":"GET","path":"/api/agents/allowance"},"note":"A self-registered agent key (the agent_starter plan) may buy a day pass with one x402 payment: 500 extra compute calls on its own workspace for 24 hours, used only once the daily compute limit is reached. Send POST /api/agents/allowance with no payment for the 402 requirements, then again with a signed payment for exactly this price. Refused (409 sandbox_key_expiring, before any payment is read) when the workspace's key expires within 24 hours. A compute call sent with a payment header is paid per call even while a pass is live, and does not use the pass. Unused pass calls are forfeited when a person claims the workspace, since the claim lifts the daily limit the pass extends. Past the daily compute limit, the 429 lists this option as the day_pass step of its next array, with the price and where to pay."},"top_up":{"method":"POST","path":"/api/billing/topup","header":"PAYMENT-SIGNATURE (v2) or X-PAYMENT (v1)","body":{"amount":"10"},"minimum":"10","maximum":"10000","bonus_tiers":[{"from":"100","bonus_rate":"0.1"},{"from":"500","bonus_rate":"0.2"}],"pricing":{"per_call":"0.01","prepaid_per_call":"0.008333","saving_per_call":"0.001667","pay_per_call_premium":"0.2","note":"A prepaid call draws 0.008333 USDC from the balance. Paying per call with x402 costs 0.01 USDC, 20% more."},"network":"base","balance":{"method":"GET","path":"/api/billing/balance"},"note":"Prepay compute: POST /api/billing/topup with {\"amount\":\"<USDC>\"} (at least 10) answers 402 for exactly that amount; send it again with a signed payment and the balance is credited, bonus included. A prepaid call costs 0.008333 USDC instead of 0.01; nothing is ever charged automatically."},"note":"No account needed. Call without a credential to get the 402 payment requirements (body for v1, PAYMENT-REQUIRED header for v2), then repeat the call with a signed payment in X-PAYMENT (v1) or PAYMENT-SIGNATURE (v2). Each payment buys one call and cannot be reused, except that a payment whose settlement was refused (payment_settlement_failed, retryable: true) may be presented again, up to 3 settlement attempts in all. Paid calls run on a shared pay-per-call workspace with the built-in and publicly listed functions."}},"changelog":{"feed_json":"https://last-price.ai/changelog/feed.json","feed_rss":"https://last-price.ai/changelog/feed.xml","page":"https://last-price.ai/changelog","audience_filter":"items[]._lastprice.audience includes \"agents\"","recommended":"Check at the start of a session and before changing integration code","latest_entry_date":"2026-09-30T00:00:00.000Z"},"discovery":{"mcp_manifest":"/.well-known/mcp.json","mcp_endpoint":"/api/mcp/rpc","llms_txt":"/llms.txt","ucp_profile":"/.well-known/ucp","openapi":"/api/openapi"}}