{"openapi":"3.1.0","info":{"title":"Pomerado API","version":"1","description":"Run and build website tools, follow their jobs, and manage logins, API keys and webhooks. Authenticate with a Pomerado API key (pom_…), an MCP OAuth token or a Dashboard session as a Bearer token."},"servers":[{"url":"https://api.pomerado.ai"}],"tags":[{"name":"account","x-group":"Account"},{"name":"api_keys","x-group":"API keys"},{"name":"connected_apps","x-group":"Connected apps"},{"name":"usage","x-group":"Usage"},{"name":"quota","x-group":"Quota"},{"name":"billing","x-group":"Billing"},{"name":"integrations","x-group":"Integrations"},{"name":"connect","x-group":"Connect"},{"name":"code","x-group":"Code"},{"name":"logins","x-group":"Saved logins"},{"name":"two_factor","x-group":"2FA"},{"name":"login_access","x-group":"Login access"},{"name":"tools","x-group":"Tools"},{"name":"webhooks","x-group":"Webhooks"},{"name":"runs","x-group":"Runs"},{"name":"builds","x-group":"Builds"},{"name":"jobs","x-group":"Jobs"},{"name":"suggestions","x-group":"Suggestions"},{"name":"files","x-group":"Files"},{"name":"team","x-group":"Team"}],"paths":{"/v1/account":{"get":{"operationId":"account.get","tags":["account"],"summary":"Get your account","description":"Returns your account: its type and plan, your role and permissions, and which features it has.","responses":{"200":{"description":"Your account","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Account"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"identity"}},"/v1/account/name":{"put":{"operationId":"account.update_name","tags":["account"],"summary":"Set your name","description":"Sets your own first and last name, which your account, your team and Pomerado show. It changes only yours. Repeating the same call answers the same; after temporarily_unavailable, repeat it.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["first_name"],"properties":{"first_name":{"type":"string","description":"your first name: 1 to 100 characters once trimmed, without control or text-direction characters","examples":["Ada"]},"last_name":{"anyOf":[{"type":"string","description":"your last name: up to 100 characters once trimmed, without control or text-direction characters"},{"type":"null"}],"description":"Your last name; leave it out, null or blank for none","examples":["Lovelace"]}},"additionalProperties":false}}}},"responses":{"200":{"description":"You, with your new name","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountUser"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"request_too_large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"write","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"identity"}},"/v1/account/preferences":{"get":{"operationId":"account.get_preferences","tags":["account"],"summary":"Get your preferences","description":"Returns where the questions of jobs you start go: back to the calling agent, or to you on a form. Your default covers the account; the connection making this call may have its own setting, which wins. Also whether your Dashboard builds email you when they need you.","responses":{"200":{"description":"Your preferences","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountPreferences"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth","api_key","integration_key"],"x-pomerado-permission":"identity"},"patch":{"operationId":"account.update_preferences","tags":["account"],"summary":"Change your preferences","description":"Sets where the questions of jobs you start go: question_delivery sets your default for this account, and connection sets the connection making this call (its OAuth app or API key), which wins over the default. build_emails turns build emails on or off for you. Leave a field out to keep it.","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{"question_delivery":{"type":"string","enum":["agent","form"],"description":"Your new default for this account"},"connection":{"type":"object","required":["question_delivery"],"properties":{"question_delivery":{"anyOf":[{"type":"string","enum":["agent","form"],"description":"agent: a job's questions come back to the calling agent, which answers them or asks you. form: they are asked of you on a form, in your agent's client when it shows forms, otherwise on the job's answer page. A password, code or login is always asked on the answer page."},{"type":"null"}],"description":"This connection's own setting; null follows your default again"}},"additionalProperties":false,"description":"Sets the connection making this call (its OAuth app or API key); refused from a Dashboard session"},"build_emails":{"type":"boolean","description":"Turns build emails on or off for you in this account"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Your preferences","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountPreferences"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"request_too_large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"write","x-pomerado-callers":["session","oauth","api_key","integration_key"],"x-pomerado-permission":"identity"}},"/v1/api-keys":{"get":{"operationId":"api_keys.list","tags":["api_keys"],"summary":"List API keys","description":"Lists your API keys, newest first. Never returns a secret.","parameters":[{"name":"cursor","in":"query","required":false,"description":"The next_cursor of the previous page","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Items per page, 1 to 100 (default 20)","schema":{"type":"string"}}],"responses":{"200":{"description":"One page of your keys","content":{"application/json":{"schema":{"type":"object","required":["data","next_cursor"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ApiKey"}},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":false}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"identity","x-pomerado-key-permission":"api_keys:manage"},"post":{"operationId":"api_keys.create","tags":["api_keys"],"summary":"Create an API key","description":"Creates an API key and returns its secret once. Send the secret as a Bearer token to the REST API or any Pomerado MCP.\n\n- A key carries only permissions you hold. It gets api_keys:manage, billing:manage or team:manage only when permissions names them.\n- It expires after 90 days unless expires_in_days says otherwise.\n- With deliver \"dashboard\", nothing is created yet: this returns a Dashboard link where the person creates the key and sees the secret, so it never reaches this client.\n- With purpose \"connect\", for the Connect page: it revokes your older unused connect keys for the same integration (or for the account) beyond three, and at your key limit your oldest unused connect key, so these keys never fill your limit. A key that has been used is never revoked this way, and you can create at most 20 connect keys an hour.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"1 to 100 characters, without leading or trailing spaces","minLength":1,"maxLength":100,"examples":["Nightly price check"],"pattern":"^\\S(?:.*\\S)?$"},"permissions":{"type":"array","items":{"type":"string","enum":["tools:read","usage:read","tools:build","runs:create","jobs:read","jobs:cancel","logins:read","logins:manage","api_keys:manage","billing:manage","team:manage"]},"description":"Permissions the key carries, each one you hold. Default: all you hold except api_keys:manage, billing:manage and team:manage","minItems":1,"examples":[["tools:read","runs:create","jobs:read"]],"maxItems":16},"integration_id":{"type":"string","description":"an integration ID: int_ and 32 lowercase hex digits","examples":["int_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]},"expires_in_days":{"$ref":"#/components/schemas/Int","description":"Days until the key expires, 1 to 365 (default 90)","examples":[30],"minimum":1,"maximum":365},"deliver":{"type":"string","enum":["dashboard"],"description":"Return a Dashboard link instead of the secret, so the secret never reaches this client"},"purpose":{"type":"string","enum":["connect"],"description":"connect: a key the Connect page makes for an agent. Creating one revokes your older unused connect keys for the same integration (or for the account) beyond three, and at your key limit your oldest unused connect key; a key that has been used is never revoked this way. At most 20 connect keys an hour."}},"additionalProperties":false}}}},"responses":{"200":{"description":"With deliver dashboard: where to finish","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardDelivery"}}}},"201":{"description":"The new key and its one-time secret","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyWithSecret"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"permission_not_held, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"api_key_limit_reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"request_too_large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"api_key_create_throttled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"write","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"identity","x-pomerado-key-permission":"api_keys:manage"}},"/v1/api-keys/{id}/rotate":{"post":{"operationId":"api_keys.rotate","tags":["api_keys"],"summary":"Rotate an API key","description":"Replaces an API key's secret and returns the new one once.\n\n- The old secret stops working at once. The key keeps its ID, permissions, expiry and running jobs.\n- You can rotate only a key whose permissions you hold.\n- With deliver \"dashboard\", nothing changes yet: this returns a Dashboard link where the person rotates the key and sees the new secret.","parameters":[{"name":"id","in":"path","required":true,"description":"an API key ID: key_ and 32 lowercase hex digits","schema":{"type":"string","examples":["key_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{"deliver":{"type":"string","enum":["dashboard"],"description":"Return a Dashboard link instead of the secret, so the secret never reaches this client"}},"additionalProperties":false}}}},"responses":{"200":{"description":"The key and its new one-time secret; With deliver dashboard: where to finish","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKeyWithSecret"},{"$ref":"#/components/schemas/DashboardDelivery"}]}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"permission_not_held, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"request_too_large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"destructive","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"identity","x-pomerado-key-permission":"api_keys:manage"}},"/v1/api-keys/{id}":{"delete":{"operationId":"api_keys.revoke","tags":["api_keys"],"summary":"Revoke an API key","description":"Revokes an API key at once, so requests with it are refused and the jobs it started stop. An API key can revoke itself or a key within its own permissions.","parameters":[{"name":"id","in":"path","required":true,"description":"an API key ID: key_ and 32 lowercase hex digits","schema":{"type":"string","examples":["key_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"responses":{"204":{"description":"Revoked"},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"permission_not_held, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"destructive","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"identity","x-pomerado-key-permission":"api_keys:manage"}},"/v1/connected-apps":{"get":{"operationId":"connected_apps.list","tags":["connected_apps"],"summary":"List connected apps","description":"Lists the apps and agents you authorized by signing in (OAuth), such as an MCP client. Apps that use an API key are not listed; list API keys for those.","parameters":[{"name":"cursor","in":"query","required":false,"description":"The next_cursor of the previous page","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Items per page, 1 to 100 (default 20)","schema":{"type":"string"}}],"responses":{"200":{"description":"One page of your connected apps","content":{"application/json":{"schema":{"type":"object","required":["data","next_cursor"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ConnectedApp"}},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":false}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"identity","x-pomerado-key-permission":"api_keys:manage"}},"/v1/connected-apps/{id}":{"delete":{"operationId":"connected_apps.revoke","tags":["connected_apps"],"summary":"Disconnect an app","description":"Disconnects an app you authorized, ending its access to every Pomerado MCP at once and stopping the jobs it started. It can reconnect only if you authorize it again. An API key can disconnect only an app whose used permissions it holds.","parameters":[{"name":"id","in":"path","required":true,"description":"a connected app ID: app_ and 32 lowercase hex digits","schema":{"type":"string","examples":["app_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"responses":{"204":{"description":"Disconnected"},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"permission_not_held, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"destructive","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"identity","x-pomerado-key-permission":"api_keys:manage"}},"/v1/usage":{"get":{"operationId":"usage.get","tags":["usage"],"summary":"Get your usage","description":"Returns your account's charged tool calls and successful builds in a time range, optionally per integration, per member or as a series.\n\n- A charged call is a tool call that finished with a result, counted when Pomerado accepted it. A build counts when it published a tool.\n- With interval, the range also comes as a series of UTC hours, days or months.\n- With group_by member, an Owner or Admin sees every member, including those who have left; a Member sees only their own row.\n- coverage.complete says whether the whole range lies within recorded history.","parameters":[{"name":"from","in":"query","required":false,"description":"Start of the range, inclusive (default: when recording began)","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End of the range, exclusive (default: now)","schema":{"type":"string"}},{"name":"group_by","in":"query","required":false,"description":"integration: also list each integration's calls and integrations created. member: also list each member's calls and integrations created","schema":{"type":"string","enum":["integration","member"]}},{"name":"interval","in":"query","required":false,"description":"Also return the range as a series of UTC hours, days or months, at most 1000 buckets. Without from, the series starts at the bucket holding coverage.started_at","schema":{"type":"string","enum":["hour","day","month"]}}],"responses":{"200":{"description":"Your usage in the range","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageReport"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"usage:read"}},"/v1/quota":{"get":{"operationId":"quota.get","tags":["quota"],"summary":"Get your plan limits","description":"Returns your plan's limits and current use: tool calls per UTC day and integrations created per UTC month. A Business account's limits are one pool shared by every member, unlimited unless Pomerado sets one.","responses":{"200":{"description":"Your allowances","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quota"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"usage:read"}},"/v1/billing":{"get":{"operationId":"billing.get","tags":["billing"],"summary":"Get your subscription","description":"Returns your Personal account's plan and Premium subscription, any free Premium period from a redeemed code (promotion), and what checkout and the billing portal offer.","responses":{"200":{"description":"Your subscription","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Billing"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"billing_unavailable, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"identity","x-pomerado-key-permission":"billing:manage"}},"/v1/billing/checkout":{"post":{"operationId":"billing.checkout","tags":["billing"],"summary":"Start a Premium checkout","description":"Returns a Stripe Checkout link where the person subscribes their Personal account to Premium, monthly or yearly.\n\n- Premium starts once Stripe confirms payment.\n- An account already on Premium gets its Settings page instead, and one with a subscription gets the billing portal.\n- An open checkout for the other interval is kept unless replace_existing is true; the link is then a Settings page that asks to replace it.","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{"interval":{"type":"string","enum":["monthly","yearly"],"description":"Default monthly"},"replace_existing":{"type":"boolean","description":"Replace an open checkout for the other interval instead of answering a page that asks to (default false)"}},"additionalProperties":false}}}},"responses":{"200":{"description":"The page to open","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingLink"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"billing_unavailable, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"request_too_large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"501":{"description":"not_configured","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"write","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"identity","x-pomerado-key-permission":"billing:manage"}},"/v1/billing/portal":{"post":{"operationId":"billing.portal","tags":["billing"],"summary":"Open the billing portal","description":"Returns a Stripe billing portal link where the person manages their Premium subscription, payment method and invoices. An account that never started a checkout has no portal and gets not_found.","responses":{"200":{"description":"The page to open","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingLink"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"billing_unavailable, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"501":{"description":"not_configured","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"write","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"identity","x-pomerado-key-permission":"billing:manage"}},"/v1/billing/redeem":{"post":{"operationId":"billing.redeem","tags":["billing"],"summary":"Redeem a free Premium code","description":"Redeems a code for free Premium on your Personal account, such as 6 months of Premium with no card. An account already paying through Stripe gets the free months after its paid period, with nothing charged; Stripe bills again by itself afterwards. A code is single use, and an account gets each offer once; repeating your own redemption answers the same. An unknown, used, revoked or expired code, or an offer the account already had, is invalid_code; five of those in an hour wait an hour (redeem_throttled). While a free period runs another code is promotion_already_active and stays unused.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["code"],"properties":{"code":{"type":"string","description":"The code as sent, such as ABCD-EFGH-JKMN-PQRS; case, dashes and spaces are ignored, and I and L read as 1, O as 0","minLength":1,"maxLength":64}},"additionalProperties":false}}}},"responses":{"200":{"description":"The free Premium period","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingRedeemed"}}}},"400":{"description":"invalid_code, invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"billing_unavailable, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"promotion_already_active, billing_attention_needed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"request_too_large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"redeem_throttled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"501":{"description":"not_configured","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"write","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"identity","x-pomerado-key-permission":"billing:manage"}},"/v1/integrations":{"get":{"operationId":"integrations.list","tags":["integrations"],"summary":"List integrations","description":"List integrations: each one is a website's tools, published as its own MCP.\n\nBy default this lists the public catalog. With mine=true, it lists only my integrations: those holding a tool you created or own, and the public integrations your account added.","parameters":[{"name":"cursor","in":"query","required":false,"description":"The next_cursor of the previous page","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Items per page, 1 to 100 (default 20)","schema":{"type":"string"}},{"name":"mine","in":"query","required":false,"description":"true: only my integrations: those holding a tool you created or own, each with only those tools, and the public ones your account added, with all their tools","schema":{"type":"string","enum":["true","false"]}},{"name":"query","in":"query","required":false,"description":"Words that must all appear in the integration's name, site, description or tools","schema":{"type":"string"}}],"responses":{"200":{"description":"One page of integrations","content":{"application/json":{"schema":{"type":"object","required":["data","next_cursor"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Integration"}},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":false}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"tools:read"}},"/v1/integrations/team":{"get":{"operationId":"integrations.list_team","tags":["integrations"],"summary":"List your team's integrations","description":"List the integrations your team built, private and public, and the public ones your team added.\n\nEach built one lists the enabled tools your team created in it; an added one lists all its enabled tools. A Personal account sees its own integrations.","parameters":[{"name":"cursor","in":"query","required":false,"description":"The next_cursor of the previous page","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Items per page, 1 to 100 (default 20)","schema":{"type":"string"}}],"responses":{"200":{"description":"One page of integrations","content":{"application/json":{"schema":{"type":"object","required":["data","next_cursor"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TeamIntegration"}},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":false}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"tools:read"}},"/v1/integrations/{id}":{"get":{"operationId":"integrations.get","tags":["integrations"],"summary":"Get an integration","description":"Get one integration: its site, tools, MCP status, MCP URL and server name.\n\nYou can read a public integration or one your team's list holds. An integration key reaches only its own.","parameters":[{"name":"id","in":"path","required":true,"description":"an integration ID: int_ and 32 lowercase hex digits","schema":{"type":"string","examples":["int_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"responses":{"200":{"description":"The integration","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Integration"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth","api_key","integration_key","service_account_key"],"x-pomerado-permission":"tools:read"}},"/v1/integrations/{id}/openapi.json":{"get":{"operationId":"integrations.openapi","tags":["integrations"],"summary":"Get an integration's OpenAPI document","description":"Get an integration's OpenAPI 3.1 document, with one operation per tool.\n\nEach operation runs its tool, with the tool's input schema as the request body and a sample request. Use it to generate a client or import the integration into an API tool.","parameters":[{"name":"id","in":"path","required":true,"description":"an integration ID: int_ and 32 lowercase hex digits","schema":{"type":"string","examples":["int_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"responses":{"200":{"description":"The OpenAPI document","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenApiDocument"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth","api_key","integration_key","service_account_key"],"x-pomerado-permission":"tools:read"}},"/v1/integrations/{id}/reference":{"get":{"operationId":"integrations.reference","tags":["integrations"],"summary":"Get an integration's reference","description":"Get an integration's reference: one Markdown document an agent can read to use it.\n\n- It covers the site, its MCP URLs, how each MCP client connects, and each tool under its MCP name with its effect, login, input and a sample call.\n- You can read a public integration or one your team's list holds. An integration key reaches only its own.","parameters":[{"name":"id","in":"path","required":true,"description":"an integration ID: int_ and 32 lowercase hex digits","schema":{"type":"string","examples":["int_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"responses":{"200":{"description":"The integration's reference","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationReference"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth","api_key","integration_key","service_account_key"],"x-pomerado-permission":"tools:read"}},"/v1/connect":{"get":{"operationId":"connect.get","tags":["connect"],"summary":"Get MCP client setup","description":"Get the setup for adding an MCP to one client: the command or config, ready to paste.\n\n- Clients: Claude Code, Codex, Cursor, VS Code, Claude Desktop or any MCP client.\n- Without integration_id, this sets up the Pomerado MCP. With it, that integration's own MCP; one whose MCP is disabled or not hosted is not found.\n- The snippet never carries a secret. With oauth, the default, the client signs in itself; with api_key, it reads the POMERADO_API_KEY environment variable.","parameters":[{"name":"client","in":"query","required":true,"description":"The MCP client to set up; any gives a generic JSON config","schema":{"type":"string","enum":["claude_code","codex","cursor","vscode","claude_desktop","any"]}},{"name":"integration_id","in":"query","required":false,"description":"The integration whose MCP to connect; omit it for the Pomerado MCP","schema":{"type":"string","examples":["int_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}},{"name":"auth","in":"query","required":false,"description":"How the client signs in: oauth (the default), or api_key, which sends the POMERADO_API_KEY environment variable as a Bearer token. Claude Desktop takes oauth only","schema":{"type":"string","enum":["oauth","api_key"]}}],"responses":{"200":{"description":"The client's setup","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Connect"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"501":{"description":"not_configured","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth","api_key","integration_key","service_account_key"],"x-pomerado-permission":"tools:read"}},"/v1/integrations/{id}/added":{"put":{"operationId":"integrations.add","tags":["integrations"],"summary":"Add an integration to My integrations","description":"Add a public integration, with all its tools, to My integrations.\n\n- It is a link, not a copy: the integration's tools stay as their creators publish them.\n- On a Business account the whole team sees it.\n- Adding one already added changes nothing. A private or unknown integration is not found.","parameters":[{"name":"id","in":"path","required":true,"description":"an integration ID: int_ and 32 lowercase hex digits","schema":{"type":"string","examples":["int_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"responses":{"204":{"description":"Added"},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"write","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"tools:build"},"delete":{"operationId":"integrations.remove","tags":["integrations"],"summary":"Remove an added integration","description":"Remove a public integration your account added from My integrations.\n\n- The integration and its tools stay; only your account's link goes, for the whole team on Business.\n- Integrations holding a tool you or your team created stay in My integrations.\n- Removing one not added changes nothing. A private or unknown integration is not found.","parameters":[{"name":"id","in":"path","required":true,"description":"an integration ID: int_ and 32 lowercase hex digits","schema":{"type":"string","examples":["int_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"responses":{"204":{"description":"Removed"},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"write","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"tools:build"}},"/v1/integrations/{id}/tools":{"delete":{"operationId":"integrations.delete","tags":["integrations"],"summary":"Delete an integration","description":"Delete your tools in an integration, and the integration once it is empty.\n\n- A Business Owner or Admin, or a Personal account's owner, deletes every tool their team created there. Anyone else deletes only the tools they created. Other accounts' tools stay.\n- Deleted tools leave every list and stop running, including runs already started.\n- The integration stays while it holds any tool. Once empty, it is removed with its MCP and everything bound to it.\n- This can't be undone.","parameters":[{"name":"id","in":"path","required":true,"description":"an integration ID: int_ and 32 lowercase hex digits","schema":{"type":"string","examples":["int_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"responses":{"204":{"description":"Deleted"},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"destructive","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"tools:build"}},"/v1/integrations/{id}/visibility":{"put":{"operationId":"integrations.update","tags":["integrations"],"summary":"Set integration visibility","description":"Make your tools in an integration public or private.\n\n- A Business team's integrations start private, and the team makes them public or private again. An Owner or Admin changes every tool your team created there; a member changes only their own. Other accounts' tools in a public integration stay public.\n- A Personal account's owner makes public an integration Pomerado kept private, but not private again. Pomerado first checks that no tool there holds your own email address or name, or a credential, and refuses it if one does.\n- The tools may join the site's existing integration of that visibility, so the response names the integration that now holds them.","parameters":[{"name":"id","in":"path","required":true,"description":"an integration ID: int_ and 32 lowercase hex digits","schema":{"type":"string","examples":["int_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["visibility"],"properties":{"visibility":{"type":"string","enum":["public","private"],"description":"public: published on Pomerado for every account to find and use. private: only your team sees, uses and edits it"}},"additionalProperties":false}}}},"responses":{"200":{"description":"The integration that now holds your tools, and its visibility","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationVisibility"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"business_account_required, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"integration_tool_name_taken, unchecked_version, tool_holds_owner_data, integration_too_large_to_check, tool_code_missing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"request_too_large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"write","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"tools:build"}},"/v1/code":{"get":{"operationId":"code.list","tags":["code"],"summary":"List your team's code","description":"List the integrations your team built, each with the tools your team created in it and the version of its code that runs now.\n\n- Business accounts only. Every member sees all of the team's code.\n- Integrations your team only added from the catalog, and other accounts' tools, are not listed.\n- Each version says what made it and which member asked for it, and each tool how many files your team's draft of it changes.","parameters":[{"name":"cursor","in":"query","required":false,"description":"The next_cursor of the previous page","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Items per page, 1 to 100 (default 20)","schema":{"type":"string"}}],"responses":{"200":{"description":"One page of integrations","content":{"application/json":{"schema":{"type":"object","required":["data","next_cursor"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/CodeIntegration"}},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":false}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"business_account_required, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"tools:read"}},"/v1/code/{id}":{"get":{"operationId":"code.get","tags":["code"],"summary":"Get a tool's code","description":"Get the files of the code a tool your team built runs now, with the tool's versions and your team's draft of it.\n\n- Business accounts only.\n- files holds the live version's files: source team for the files its build wrote, pomerado for the files Pomerado added to run them.\n- draft holds the files your team's draft changes from its base version, or is null when the tool has no draft.\n- A draft copies its base version. When a later version went live, such as a repair, draft.base_files holds the base version's text of each of your team's files that differs.\n- Another account's tool, a catalog tool your team only added, or an archived tool is not found.","parameters":[{"name":"id","in":"path","required":true,"description":"a tool ID: tool_ and 32 lowercase hex digits","schema":{"type":"string","examples":["tool_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"responses":{"200":{"description":"The tool's live code and versions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeBundle"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"business_account_required, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"tools:read"}},"/v1/code/{id}/export":{"get":{"operationId":"code.export","tags":["code"],"summary":"Download a tool's code","description":"Download the code a tool your team built runs now, as a zip of its live version's files.\n\n- Business accounts only.\n- content_base64 holds the zip; decode it and save it as file_name.\n- It holds your team's files and the files Pomerado added to run them, and nothing else.","parameters":[{"name":"id","in":"path","required":true,"description":"a tool ID: tool_ and 32 lowercase hex digits","schema":{"type":"string","examples":["tool_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"responses":{"200":{"description":"The zip","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeArchive"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"business_account_required, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"tools:read"}},"/v1/code/{id}/export-link":{"post":{"operationId":"code.export_link","tags":["code"],"summary":"Get a download link for a tool's code","description":"Get a short-lived link that downloads the code a tool your team built runs now, as a zip of its live version's files, for a coding agent or anything else you give it to.\n\n- Business accounts only.\n- download_url needs no sign-in. It downloads the zip once, and stops working 30 minutes after it was made, at expires_at. Until then anyone with the link can download the code, so share it only with whoever should read it.\n- The zip is the one code.export answers. start_with names the files to read first.\n- Each call makes a new link.","parameters":[{"name":"id","in":"path","required":true,"description":"a tool ID: tool_ and 32 lowercase hex digits","schema":{"type":"string","examples":["tool_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"responses":{"200":{"description":"The link to the zip","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeExportLink"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"business_account_required, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"write","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"tools:read"}},"/v1/code/{id}/draft":{"put":{"operationId":"code.save_draft","tags":["code"],"summary":"Save a file in a tool's draft","description":"Save one file of your team's draft of the code of a tool your team built.\n\n- Business accounts only, with tools:build. Every member sees the draft with code.get.\n- One draft per tool, shared by the team. Each save changes one file, and the last save of a file wins.\n- content null deletes the file. A file saved back to its text in the draft's base version leaves the draft, and a draft with no change left is deleted.\n- Only files under src/, test/ and explore/ change, and an entrypoint can't be deleted. A public tool's draft stays your team's until it's published.","parameters":[{"name":"id","in":"path","required":true,"description":"a tool ID: tool_ and 32 lowercase hex digits","schema":{"type":"string","examples":["tool_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["path","content"],"properties":{"path":{"type":"string","description":"a path under src/, test/ or explore/ of letters, digits, '.', '_', '-' and '/', ending in .js, .mjs, .ts or .json"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The file's new text, or null to delete the file"}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool's draft after the save","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeSavedDraft"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"business_account_required, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"request_too_large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"write","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"tools:build"},"delete":{"operationId":"code.discard_draft","tags":["code"],"summary":"Discard a tool's draft","description":"Delete your team's draft of the code of a tool your team built, with every file it changes.\n\n- Business accounts only, with tools:build.\n- The tool's live code doesn't change. A tool with no draft answers the same.","parameters":[{"name":"id","in":"path","required":true,"description":"a tool ID: tool_ and 32 lowercase hex digits","schema":{"type":"string","examples":["tool_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"responses":{"204":{"description":"Discarded"},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"business_account_required, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"destructive","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"tools:build"}},"/v1/code/{id}/versions/{number}/restore":{"post":{"operationId":"code.restore","tags":["code"],"summary":"Restore an earlier version of a tool","description":"Make an earlier version of a tool your team built live again, as the tool's newest version.\n\n- Business accounts only, with tools:build. The version's code, inputs and outputs go live at once, for free. Restoring the live version, or the version it restored, changes nothing.\n- A version can be restored when code.get lists it as restorable: not one published before Pomerado kept a record of each version, or one taken down.\n- A public tool restores only a version Pomerado checked that keeps every input its callers send; it may make a required input optional. Only an Owner or Admin signed in to the Dashboard restores a version Pomerado didn't check, never an API key or an agent.","parameters":[{"name":"id","in":"path","required":true,"description":"a tool ID: tool_ and 32 lowercase hex digits","schema":{"type":"string","examples":["tool_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}},{"name":"number","in":"path","required":true,"description":"The version's number, as code.get lists it","schema":{"type":"string"}}],"responses":{"200":{"description":"The tool's code, with the restored version live","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeBundle"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"business_account_required, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"version_not_restorable, restore_changes_inputs, restore_unchecked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"write","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"tools:build"}},"/v1/code/{id}/runs":{"post":{"operationId":"code.run","tags":["code"],"summary":"Run a tool's code","description":"Run the code of a tool your team built, its draft or its live version, and return the run's job.\n\n- Business accounts only, with tools:build and runs:create. Follow the job with GET /v1/jobs/{id}.\n- It really runs on the website, so a write tool's run changes it. Send an Idempotency-Key, as with POST /v1/runs.\n- A run that signs in needs Edit access to its login, except a run of the live HTTP version.\n- A run starts no repair and sends no webhooks.","parameters":[{"name":"id","in":"path","required":true,"description":"a tool ID: tool_ and 32 lowercase hex digits","schema":{"type":"string","examples":["tool_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Repeat a request safely: the same key and body answer the first request's job again with Idempotent-Replayed: true; the same key with a different body answers idempotency_conflict.","schema":{"type":"string","description":"1 to 200 letters, digits, _ or -, such as a UUID","pattern":"^[A-Za-z0-9_-]{1,200}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["input","draft"],"properties":{"input":{"anyOf":[{"type":"object"},{"type":"array"},{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]},"login_id":{"$ref":"#/components/schemas/login_id"},"implementation":{"type":"string","enum":["browser","http"],"description":"browser (the default) runs the tool in a browser; http runs its HTTP version, for a tool that has one"},"draft":{"type":"boolean","description":"true runs your team's draft of the tool, false the version callers run now"}},"additionalProperties":false}}}},"responses":{"200":{"description":"The job this Idempotency-Key already started, with Idempotent-Replayed: true","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"202":{"description":"The new run's job","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"400":{"description":"invalid_input, unsupported_login_field, invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"save_forbidden, service_account_not_allowed, business_account_required, egress_options_not_allowed, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"idempotency_conflict, quota_expired, account_selection_required, saved_login_conflict, login_identity_conflict, legacy_duplicate_saved_logins, saved_login_unsettled, file_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"file_too_large, file_limit_exceeded, request_too_large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"file_type_refused","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"file_fetch_failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"quota_exceeded, service_account_cap_reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"501":{"description":"not_configured","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"acceptance_unknown, temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"write","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"tools:build"}},"/v1/code/runs/{id}/output":{"get":{"operationId":"code.run_output","tags":["code"],"summary":"Read a run's output","description":"Read what a run from the Code editor printed, while it runs and after it ends.\n\n- Business accounts only, with jobs:read. You read the runs whose job you can read with GET /v1/jobs/{id}, and any other run is not found.\n- Each chunk is the run's stdout (out) or stderr (err). A cut chunk, with no text, means the run printed more than the 4 MiB kept.\n- Send the last seq you read as after. more is true when more was printed already, so read again at once.\n- Output is kept until 60 minutes after the run ends.","parameters":[{"name":"id","in":"path","required":true,"description":"a job ID: job_ and 32 lowercase hex digits","schema":{"type":"string","examples":["job_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}},{"name":"after","in":"query","required":false,"description":"The seq of the last chunk you read; leave it out to read from the start","schema":{"type":"string"}}],"responses":{"200":{"description":"What the run printed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeRunOutput"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"business_account_required, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"run_view_throttled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"jobs:read"}},"/v1/code/{id}/draft/publish":{"post":{"operationId":"code.publish_draft","tags":["code"],"summary":"Publish a tool's draft","description":"Make your team's draft of a tool's code live, as the tool's newest version.\n\n- Business accounts only, with tools:build. Pomerado doesn't review the draft's code, so only an Owner or Admin signed in to the Dashboard publishes it, never an API key or an agent.\n- Send the digest of the draft you saw. It publishes once a run of the draft passed on the live version, for free, and the draft is then gone.\n- The draft's files replace the live version's, a repair's included, with the inputs and outputs its run read. A public tool's draft goes live only when it keeps every input callers send and holds no team member's email address or name, or a credential.","parameters":[{"name":"id","in":"path","required":true,"description":"a tool ID: tool_ and 32 lowercase hex digits","schema":{"type":"string","examples":["tool_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["digest"],"properties":{"digest":{"type":"string","description":"The draft's digest, as code.get answered it","pattern":"^[0-9a-f]{64}$"}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool's code, with the draft live","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeBundle"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"business_account_required, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"draft_changed, draft_not_run, draft_not_publishable, draft_changes_inputs, draft_holds_owner_data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"request_too_large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"write","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"tools:build"}},"/v1/logins/import":{"post":{"operationId":"logins.import","tags":["logins"],"summary":"Import saved logins","description":"Saves up to 1,000 logins in one request.\n\n- Each login is saved or refused on its own; results lists, by index, the saved login or its error.\n- The values pass through this client and its model provider. Warn the user first, or send only deliver \"dashboard\" to get the Dashboard import page instead.","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginImportRequest"}}}},"responses":{"200":{"description":"Each login's outcome; With deliver dashboard: where to finish","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/LoginImportResult"},{"$ref":"#/components/schemas/DashboardDelivery"}]}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"request_too_large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"write","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"logins:manage"}},"/v1/logins":{"get":{"operationId":"logins.list","tags":["logins"],"summary":"List saved logins","description":"Lists the saved website logins you may use, as metadata only. Never returns a password or other secret. Pass site_url to list one website's logins.","parameters":[{"name":"cursor","in":"query","required":false,"description":"The next_cursor of the previous page","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Items per page, 1 to 100 (default 20)","schema":{"type":"string"}},{"name":"site_url","in":"query","required":false,"description":"Only this website's logins, www. and subdomains included","schema":{"type":"string"}}],"responses":{"200":{"description":"One page of saved logins","content":{"application/json":{"schema":{"type":"object","required":["data","next_cursor"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Login"}},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":false}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"logins:read"},"post":{"operationId":"logins.create","tags":["logins"],"summary":"Save a login","description":"Saves a website login and returns its metadata.\n\n- The values pass through this client and its model provider. Warn the user first, or send deliver \"dashboard\" with only site_url and label to get a Dashboard link where the person enters the login instead.\n- A Personal account keeps one login per website, fixed to its identity after the first verified sign-in. A Business account may save several.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["site_url"],"properties":{"site_url":{"type":"string","description":"The website, such as instacart.com or a pasted URL, saved as its HTTPS origin","maxLength":2048},"label":{"type":"string","description":"a string at most 200 character(s) long","minLength":1,"maxLength":200},"username":{"type":"string","description":"a string at most 1024 character(s) long","minLength":1,"maxLength":1024},"email":{"type":"string","description":"a string at most 320 character(s) long","minLength":3,"maxLength":320},"phone":{"type":"string","description":"a string at most 64 character(s) long","minLength":3,"maxLength":64},"account_number":{"type":"string","description":"a string at most 128 character(s) long","minLength":1,"maxLength":128},"primary_identifier":{"type":"string","enum":["username","email","phone","account_number"],"description":"The identifier it signs in with; else the first it holds in this order"},"password":{"type":"string","description":"a string at most 16384 character(s) long","minLength":1,"maxLength":16384},"sign_in":{"type":"string","enum":["password","code"],"description":"code: the site sends a code each sign-in, so no password is saved"},"date_of_birth":{"type":"string","description":"a string matching the pattern ^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])$","pattern":"^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])$"},"zip":{"type":"string","description":"a string at most 10 character(s) long","minLength":3,"maxLength":10},"authenticator_secret":{"type":"string","description":"a string at most 4096 character(s) long","minLength":1,"maxLength":4096},"recovery_codes":{"type":"array","items":{"type":"string","description":"a string at most 64 character(s) long","minLength":4,"maxLength":64},"description":"an array of at most 20 item(s)","minItems":1,"maxItems":20},"preferred_method":{"type":"string","enum":["sms","call","email","authenticator","push","recovery_code"],"description":"A two-factor method"},"deliver":{"type":"string","enum":["dashboard"],"description":"Return a Dashboard link where the person enters the login, so no secret reaches this client"}},"additionalProperties":false}}}},"responses":{"200":{"description":"With deliver dashboard: where to finish","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardDelivery"}}}},"201":{"description":"The saved login","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Login"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden, site_not_supported","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"site_login_exists, login_identity_conflict, legacy_duplicate_saved_logins, saved_login_unsettled, login_in_use, login_save_in_progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"request_too_large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"invalid_credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"acceptance_unknown, temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"write","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"logins:manage"}},"/v1/logins/{id}":{"get":{"operationId":"logins.get","tags":["logins"],"summary":"Get a saved login","description":"Returns one saved login's metadata, never a password or other secret.","parameters":[{"name":"id","in":"path","required":true,"description":"a saved login ID: login_ and 32 lowercase hex digits","schema":{"type":"string","examples":["login_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"responses":{"200":{"description":"The login","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Login"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"logins:read"},"patch":{"operationId":"logins.update","tags":["logins"],"summary":"Change a saved login","description":"Changes a saved login's fields and returns the changed login.\n\n- A field left out is kept; null clears an optional one. The website and the sign-in type (password or code) never change.\n- On a password login, changing label, username, primary_identifier or authenticator_secret also needs password.\n- The values pass through this client and its model provider. Warn the user first, or send only deliver \"dashboard\" to get the login's Dashboard edit page instead.","parameters":[{"name":"id","in":"path","required":true,"description":"a saved login ID: login_ and 32 lowercase hex digits","schema":{"type":"string","examples":["login_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{"label":{"anyOf":[{"type":"string","description":"a string at most 200 character(s) long","minLength":1,"maxLength":200},{"type":"null"}]},"username":{"type":"string","description":"a string at most 1024 character(s) long","minLength":1,"maxLength":1024},"email":{"anyOf":[{"type":"string","description":"a string at most 320 character(s) long","minLength":3,"maxLength":320},{"type":"null"}]},"phone":{"anyOf":[{"type":"string","description":"a string at most 64 character(s) long","minLength":3,"maxLength":64},{"type":"null"}]},"account_number":{"anyOf":[{"type":"string","description":"a string at most 128 character(s) long","minLength":1,"maxLength":128},{"type":"null"}]},"primary_identifier":{"type":"string","enum":["username","email","phone","account_number"],"description":"The identifier it signs in with; else the first it holds in this order"},"password":{"type":"string","description":"a string at most 16384 character(s) long","minLength":1,"maxLength":16384},"date_of_birth":{"anyOf":[{"type":"string","description":"a string matching the pattern ^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])$","pattern":"^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])$"},{"type":"null"}]},"zip":{"anyOf":[{"type":"string","description":"a string at most 10 character(s) long","minLength":3,"maxLength":10},{"type":"null"}]},"authenticator_secret":{"anyOf":[{"type":"string","description":"a string at most 4096 character(s) long","minLength":1,"maxLength":4096},{"type":"null"}]},"recovery_codes":{"anyOf":[{"type":"array","items":{"type":"string","description":"a string at most 64 character(s) long","minLength":4,"maxLength":64},"description":"an array of at most 20 item(s)","minItems":1,"maxItems":20},{"type":"null"}]},"preferred_method":{"anyOf":[{"type":"string","enum":["sms","call","email","authenticator","push","recovery_code"],"description":"A two-factor method"},{"type":"null"}]},"deliver":{"type":"string","enum":["dashboard"],"description":"Return a Dashboard link where the person enters the login, so no secret reaches this client"}},"additionalProperties":false}}}},"responses":{"200":{"description":"The changed login; With deliver dashboard: where to finish","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/Login"},{"$ref":"#/components/schemas/DashboardDelivery"}]}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"reauthentication_required, unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"site_login_exists, login_identity_conflict, legacy_duplicate_saved_logins, saved_login_unsettled, login_in_use, login_save_in_progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"request_too_large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"invalid_credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"acceptance_unknown, temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"write","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"logins:manage"},"delete":{"operationId":"logins.delete","tags":["logins"],"summary":"Delete a saved login","description":"Deletes a saved login and erases its stored values. This cannot be undone. Jobs and saved sessions using the login stop.","parameters":[{"name":"id","in":"path","required":true,"description":"a saved login ID: login_ and 32 lowercase hex digits","schema":{"type":"string","examples":["login_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"responses":{"204":{"description":"Deleted"},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"login_in_use","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"acceptance_unknown, temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"destructive","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"logins:manage"}},"/v1/logins/{id}/recovery-codes":{"put":{"operationId":"logins.set_recovery_codes","tags":["two_factor"],"summary":"Replace recovery codes","description":"Replaces a saved login's two-factor recovery codes. Saved codes are never shown again, only counted. The codes pass through this client and its model provider, so warn the user first.","parameters":[{"name":"id","in":"path","required":true,"description":"a saved login ID: login_ and 32 lowercase hex digits","schema":{"type":"string","examples":["login_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["codes"],"properties":{"codes":{"type":"array","items":{"type":"string","description":"a string at most 64 character(s) long","minLength":4,"maxLength":64},"description":"an array of at most 20 item(s)","minItems":1,"maxItems":20}},"additionalProperties":false}}}},"responses":{"200":{"description":"The login","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Login"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"site_login_exists, login_identity_conflict, legacy_duplicate_saved_logins, saved_login_unsettled, login_in_use, login_save_in_progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"request_too_large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"invalid_credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"acceptance_unknown, temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"write","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"logins:manage"}},"/v1/logins/{id}/reveal":{"post":{"operationId":"logins.reveal","tags":["logins"],"summary":"Reveal a saved login","description":"Returns every value a saved login holds except its authenticator secret, and how many recovery codes are left.\n\nOnly the Dashboard shows the values, behind the Logins PIN. Elsewhere this returns a dashboard_url to the page that reveals them.","parameters":[{"name":"id","in":"path","required":true,"description":"a saved login ID: login_ and 32 lowercase hex digits","schema":{"type":"string","examples":["login_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"responses":{"200":{"description":"On the Dashboard: the values; Elsewhere: the page that reveals them","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/LoginReveal"},{"$ref":"#/components/schemas/DashboardDelivery"}]}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"logins:manage"}},"/v1/logins/{id}/authenticator-code":{"post":{"operationId":"logins.authenticator_code","tags":["two_factor"],"summary":"Get an authenticator code","description":"Returns the current code from a saved login's authenticator secret.\n\nOnly the Dashboard shows the code, behind the Logins PIN. Elsewhere this returns a dashboard_url to the page that shows it.","parameters":[{"name":"id","in":"path","required":true,"description":"a saved login ID: login_ and 32 lowercase hex digits","schema":{"type":"string","examples":["login_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"responses":{"200":{"description":"On the Dashboard: the code; Elsewhere: the page that shows it","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/LoginAuthenticatorCode"},{"$ref":"#/components/schemas/DashboardDelivery"}]}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found, authenticator_not_configured","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"logins:manage"}},"/v1/logins/{id}/sms-number":{"get":{"operationId":"logins.get_sms_number","tags":["two_factor"],"summary":"Get a phone number","description":"Returns the Pomerado phone number that receives a saved login's text-message sign-in codes.\n\n- During a verification, verification shows whether a code arrived and the newest code.\n- A login without a number returns sms_number_not_linked.","parameters":[{"name":"id","in":"path","required":true,"description":"a saved login ID: login_ and 32 lowercase hex digits","schema":{"type":"string","examples":["login_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"responses":{"200":{"description":"The login's number","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SmsNumber"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"sms_number_not_allowed, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found, sms_number_not_linked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"logins:manage"},"post":{"operationId":"logins.assign_sms_number","tags":["two_factor"],"summary":"Assign a phone number","description":"Gives a saved login a Pomerado phone number to receive its website's text-message sign-in codes, so sign-ins need no one to read them.\n\n- Assigning again returns the same number.\n- Next, the person sets this number as the website account's phone for codes. Then call logins.verify_sms_number to check that codes arrive.\n- features.sms_numbers on your account says whether you may assign one.","parameters":[{"name":"id","in":"path","required":true,"description":"a saved login ID: login_ and 32 lowercase hex digits","schema":{"type":"string","examples":["login_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"responses":{"200":{"description":"The login's number","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SmsNumber"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"sms_number_not_allowed, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found, sms_number_not_linked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"501":{"description":"not_configured","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable, sms_number_cap_reached, sms_number_purchase_failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"write","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"logins:manage"},"delete":{"operationId":"logins.unlink_sms_number","tags":["two_factor"],"summary":"Remove a phone number","description":"Removes a saved login's Pomerado phone number. Ask the person to remove the number from their website account first: a released number can go to someone else after 45 days.","parameters":[{"name":"id","in":"path","required":true,"description":"a saved login ID: login_ and 32 lowercase hex digits","schema":{"type":"string","examples":["login_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"responses":{"204":{"description":"Removed"},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"sms_number_not_allowed, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found, sms_number_not_linked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"destructive","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"logins:manage"}},"/v1/logins/{id}/sms-number/verify":{"post":{"operationId":"logins.verify_sms_number","tags":["two_factor"],"summary":"Verify a phone number","description":"Starts a 10-minute verification of a login's Pomerado phone number. During it, send the number a test text or have the website send a code, then call logins.get_sms_number to read the code that arrived.","parameters":[{"name":"id","in":"path","required":true,"description":"a saved login ID: login_ and 32 lowercase hex digits","schema":{"type":"string","examples":["login_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"responses":{"200":{"description":"The login's number, verifying","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SmsNumber"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"sms_number_not_allowed, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found, sms_number_not_linked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"501":{"description":"not_configured","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"write","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"logins:manage"}},"/v1/logins/{id}/access":{"get":{"operationId":"logins.get_access","tags":["login_access"],"summary":"Get login access","description":"Returns who may use, edit and manage a Business team's saved login. Only the Dashboard returns it, to someone who manages the login; elsewhere this returns a dashboard_url to the login's Share menu.","parameters":[{"name":"id","in":"path","required":true,"description":"a saved login ID: login_ and 32 lowercase hex digits","schema":{"type":"string","examples":["login_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"responses":{"200":{"description":"On the Dashboard: who has access; Elsewhere: the Share menu","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/LoginAccess"},{"$ref":"#/components/schemas/DashboardDelivery"}]}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden, login_access_required, team_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"logins:manage"},"put":{"operationId":"logins.set_access","tags":["login_access"],"summary":"Change login access","description":"Gives one member or the whole team access to a Business team's saved login, or removes it.\n\n- A member can get use, edit or manage; the whole team, use or edit. A level of null removes access.\n- No one can change the access of the login's creator, an Owner or an Admin.\n- Removing someone's last access stops their unfinished jobs on the login.\n- Lowering someone below edit stops their unfinished Code editor runs on the login.\n- Only the Dashboard makes the change, for someone who manages the login. Elsewhere this returns a dashboard_url to the login's Share menu.","parameters":[{"name":"id","in":"path","required":true,"description":"a saved login ID: login_ and 32 lowercase hex digits","schema":{"type":"string","examples":["login_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginAccessChange"}}}},"responses":{"200":{"description":"On the Dashboard: who has access now; Elsewhere: the Share menu","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/LoginAccess"},{"$ref":"#/components/schemas/DashboardDelivery"}]}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden, login_access_required, team_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"access_fixed, grantee_not_member, team_level_not_allowed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"request_too_large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"write","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"logins:manage"}},"/v1/tools":{"get":{"operationId":"tools.list","tags":["tools"],"summary":"List tools","description":"List or search the tools you can run: public tools and your own private ones.\n\n- Each tool has its input and output schemas, effect, sign-in needs and integration. Disabled tools are never listed.\n- An integration key lists only its integration's tools.\n- Without credentials, where allowed, only public read-only tools that need no login are listed. A notice says that signing up (free) or signing in adds tools that write, saved logins and building tools, and how to do it.","parameters":[{"name":"cursor","in":"query","required":false,"description":"The next_cursor of the previous page","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Items per page, 1 to 100 (default 20)","schema":{"type":"string"}},{"name":"query","in":"query","required":false,"description":"The task or words to look for: tools are ranked by keyword match in their names, descriptions and site, and by meaning","schema":{"type":"string"}},{"name":"site_url","in":"query","required":false,"description":"Only this site's tools: instacart.com or a pasted URL","schema":{"type":"string"}},{"name":"integration_id","in":"query","required":false,"description":"Only this integration's tools","schema":{"type":"string","examples":["int_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"responses":{"200":{"description":"One page of tools","content":{"application/json":{"schema":{"type":"object","required":["data","next_cursor"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Tool"}},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}]},"possible_matches":{"type":"array","items":{"$ref":"#/components/schemas/Tool"},"description":"With query and site_url, on the first page: up to 50 of the site's other tools that may cover the task. Compare them before building another."},"notice":{"$ref":"#/components/schemas/ToolsNotice"}},"additionalProperties":false}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth","api_key","integration_key","service_account_key"],"x-pomerado-permission":"tools:read"}},"/v1/tools/{id}":{"get":{"operationId":"tools.get","tags":["tools"],"summary":"Get a tool","description":"Get one tool: its input and output schemas, effect, sign-in needs and integration.\n\n- A disabled tool, or another account's private tool, is not found. An integration key reaches only its own integration's tools.\n- Without credentials, where allowed, it reads only public tools, and a tool that writes or needs a login answers sign_in_required.","parameters":[{"name":"id","in":"path","required":true,"description":"a tool ID: tool_ and 32 lowercase hex digits","schema":{"type":"string","examples":["tool_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"responses":{"200":{"description":"The tool","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Tool"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"sign_in_required, unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth","api_key","integration_key","service_account_key"],"x-pomerado-permission":"tools:read"},"delete":{"operationId":"tools.delete","tags":["tools"],"summary":"Delete a tool","description":"Delete one tool permanently, public or private.\n\n- A Business Owner or Admin, or a Personal account's owner, can delete any tool their team created. Anyone else can delete only tools they created; others answer forbidden.\n- The tool leaves every list and stops running, including runs already started.\n- The rest of its integration stays. An integration left with no tools is removed too, with its MCP and everything bound to it.\n- This can't be undone.","parameters":[{"name":"id","in":"path","required":true,"description":"a tool ID: tool_ and 32 lowercase hex digits","schema":{"type":"string","examples":["tool_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"responses":{"204":{"description":"Deleted"},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"destructive","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"tools:build"}},"/v1/tools/{id}/changes":{"post":{"operationId":"tools.change","tags":["tools"],"summary":"Request a change to a tool","description":"Request a change to an existing tool and return its job.\n\n- Ask for what the tool lacks, such as a filter, an input or an output field, instead of building another tool for the same site. Say the change in plain words.\n- A change takes about as long as a build. The tool keeps working meanwhile, and its callers get the change when it publishes. Follow the job with GET /v1/jobs/{id} or job webhooks.\n- example_input is the input of the one example the change runs, using any input the change adds. A write tool's change needs it and runs that example once for real.\n- Anyone who can run the tool and build tools can ask. A change from someone other than the tool's owner may only add or tighten what the tool returns, never remove or loosen it.\n- A change keeps every input working: it may add optional inputs, or make a required one optional when the tool handles it missing.\n- One change per tool at a time from your account. Another while yours is under way answers change_pending.","parameters":[{"name":"id","in":"path","required":true,"description":"a tool ID: tool_ and 32 lowercase hex digits","schema":{"type":"string","examples":["tool_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Repeat a request safely: the same key and body answer the first request's job again with Idempotent-Replayed: true; the same key with a different body answers idempotency_conflict.","schema":{"type":"string","description":"1 to 200 letters, digits, _ or -, such as a UUID","pattern":"^[A-Za-z0-9_-]{1,200}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["change"],"properties":{"change":{"type":"string","description":"What the tool should do differently, in plain words","minLength":1,"maxLength":2000},"example_input":{"anyOf":[{"type":"object"},{"type":"array"},{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"description":"The input of the one example the change runs, using any input the change adds. A write tool's change needs it and runs that example once for real"},"login_id":{"allOf":[{"$ref":"#/components/schemas/login_id"}],"description":"The saved login to sign in with, when the site has several"},"login":{"type":"object","required":["username"],"properties":{"label":{"type":"string","description":"a string at most 200 character(s) long","minLength":1,"maxLength":200},"username":{"type":"string","description":"a string at most 1024 character(s) long","minLength":1,"maxLength":1024},"password":{"type":"string","description":"a string at most 16384 character(s) long","minLength":1,"maxLength":16384},"mode":{"type":"string","enum":["code"]},"email":{"type":"string","description":"a string at most 320 character(s) long","minLength":3,"maxLength":320},"phone":{"type":"string","description":"a string at most 64 character(s) long","minLength":3,"maxLength":64},"account_number":{"type":"string","description":"a string at most 128 character(s) long","minLength":1,"maxLength":128},"date_of_birth":{"type":"string","description":"a string matching the pattern ^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])$","pattern":"^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])$"},"zip":{"type":"string","description":"a string at most 10 character(s) long","minLength":3,"maxLength":10}},"additionalProperties":false,"description":"A login for this call, used only when the site has no saved login: a username (or email, phone or account number) and password, or mode \"code\" without a password when the site sends a code. It passes through your client and model provider; without it, the run asks the person on its answer page."},"save_login":{"type":"boolean","description":"Save login for later runs (requires login)"},"redact_at_rest":{"type":"boolean","description":"Staging and preview only: true seals what this job stores and redacts it once it settles, false keeps it readable, overriding the environment's setting. Production refuses a request that names it with invalid_request."}},"additionalProperties":false}}}},"responses":{"200":{"description":"The job this Idempotency-Key already started, with Idempotent-Replayed: true","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"202":{"description":"The new change's job","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"save_forbidden, service_account_not_allowed, forbidden, business_account_required, egress_options_not_allowed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"idempotency_conflict, quota_expired, account_selection_required, saved_login_conflict, login_identity_conflict, legacy_duplicate_saved_logins, saved_login_unsettled, change_pending","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"request_too_large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"quota_exceeded, service_account_cap_reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"501":{"description":"not_configured","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"acceptance_unknown, temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"write","x-pomerado-callers":["session","oauth","api_key","service_account_key"],"x-pomerado-permission":"tools:build"}},"/v1/webhooks":{"get":{"operationId":"webhooks.list","tags":["webhooks"],"summary":"List webhooks","description":"List the webhooks you made in this account, newest first.\n\nA Business Owner or Admin sees every member's webhooks, including departed members'. Signing secrets are never returned.","parameters":[{"name":"cursor","in":"query","required":false,"description":"The next_cursor of the previous page","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Items per page, 1 to 100 (default 20)","schema":{"type":"string"}}],"responses":{"200":{"description":"One page of webhooks","content":{"application/json":{"schema":{"type":"object","required":["data","next_cursor"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Webhook"}},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":false}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"webhooks_unavailable, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"jobs:read"},"post":{"operationId":"webhooks.create","tags":["webhooks"],"summary":"Create a webhook","description":"Create a webhook for your jobs' events and return its signing secret once.\n\n- It receives events for every job you started, from any client: the Dashboard, an MCP client or an API key, except Code editor runs.\n- Events: job.needs_input (a job asks a question; the payload has its questions and the page to answer them), job.input_expiring (three minutes left to answer), job.succeeded and job.failed (a job settled), and job.repairing (a repair of a run's tool is under way, and the run ends by maintenance.deadline_at). Without events, it receives all five.\n- No event carries a result. Read the result from the job, through the client that started it.\n- Deliveries are signed with Standard Webhooks, retried for about 14 minutes, and sent only to public HTTPS addresses.\n- Only you can change, test or rotate it; a Business Owner or Admin can also see and delete it. It keeps working if you leave the team.\n- You can hold at most 20 webhooks.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string"},"events":{"type":"array","items":{"type":"string","enum":["job.needs_input","job.input_expiring","job.succeeded","job.failed","job.repairing"]},"description":"an array of at least 1 item(s)","minItems":1}},"additionalProperties":false}}}},"responses":{"201":{"description":"The new webhook and its one-time secret","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookWithSecret"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"webhooks_unavailable, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"webhook_limit_reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"request_too_large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"write","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"jobs:read"}},"/v1/webhooks/{id}":{"get":{"operationId":"webhooks.get","tags":["webhooks"],"summary":"Get a webhook","description":"Get one of your webhooks, or any member's as a Business Owner or Admin.\n\nIts signing secret is never returned.","parameters":[{"name":"id","in":"path","required":true,"description":"a webhook ID: wh_ and 32 lowercase hex digits","schema":{"type":"string","examples":["wh_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"responses":{"200":{"description":"The webhook","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webhook"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"webhooks_unavailable, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"jobs:read"},"patch":{"operationId":"webhooks.update","tags":["webhooks"],"summary":"Update a webhook","description":"Change a webhook's URL or events, or turn it off or on.\n\n- Only its creator can change it; another member's is forbidden.\n- A webhook turns itself off when its receiver answers 410 or fails 20 deliveries in a row. Setting status to active turns it back on and clears its failures.","parameters":[{"name":"id","in":"path","required":true,"description":"a webhook ID: wh_ and 32 lowercase hex digits","schema":{"type":"string","examples":["wh_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{"url":{"type":"string"},"events":{"type":"array","items":{"type":"string","enum":["job.needs_input","job.input_expiring","job.succeeded","job.failed","job.repairing"]},"description":"an array of at least 1 item(s)","minItems":1},"status":{"type":"string","enum":["active","disabled"],"description":"active turns a disabled webhook on again and clears its failures; disabled turns it off"}},"additionalProperties":false}}}},"responses":{"200":{"description":"The changed webhook","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webhook"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"webhooks_unavailable, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"request_too_large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"write","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"jobs:read"},"delete":{"operationId":"webhooks.delete","tags":["webhooks"],"summary":"Delete a webhook","description":"Delete one of your webhooks, or any member's as a Business Owner or Admin.\n\nEvents not yet delivered to it are dropped.","parameters":[{"name":"id","in":"path","required":true,"description":"a webhook ID: wh_ and 32 lowercase hex digits","schema":{"type":"string","examples":["wh_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"responses":{"204":{"description":"Deleted"},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"webhooks_unavailable, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"destructive","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"jobs:read"}},"/v1/webhooks/{id}/test":{"post":{"operationId":"webhooks.test","tags":["webhooks"],"summary":"Test a webhook","description":"Send a signed test event to one of your webhooks and report how its receiver responded.\n\n- It is sent now, whether the webhook is active or not.\n- The event is {\"id\", \"type\": \"webhook.test\", \"created_at\", \"data\": {\"webhook_id\"}}.\n- It is not retried and does not count toward turning the webhook off.","parameters":[{"name":"id","in":"path","required":true,"description":"a webhook ID: wh_ and 32 lowercase hex digits","schema":{"type":"string","examples":["wh_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"responses":{"200":{"description":"How the receiver answered","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookTestResult"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"webhooks_unavailable, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"webhook_secret_unreadable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"write","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"jobs:read"}},"/v1/webhooks/{id}/rotate-secret":{"post":{"operationId":"webhooks.rotate_secret","tags":["webhooks"],"summary":"Rotate a webhook secret","description":"Replace one of your webhooks' signing secret and return the new one once.\n\nFor 24 hours each delivery is signed with both secrets (two webhook-signature entries), so your receiver can switch without missing an event.","parameters":[{"name":"id","in":"path","required":true,"description":"a webhook ID: wh_ and 32 lowercase hex digits","schema":{"type":"string","examples":["wh_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"responses":{"200":{"description":"The webhook and its new one-time secret","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookWithSecret"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"webhooks_unavailable, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"write","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"jobs:read"}},"/v1/runs":{"post":{"operationId":"runs.create","tags":["runs"],"summary":"Run a tool","description":"Run a website tool once and return its job.\n\n- Follow the job with GET /v1/jobs/{id} or job webhooks until it finishes or needs input. Retry-After suggests when to read it again.\n- A tool that signs in uses the site's saved login, and login_id picks one when there are several. login is used only when no login is saved.\n- Send an Idempotency-Key with every write. A retry with the same key returns the same job instead of acting on the website again.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Repeat a request safely: the same key and body answer the first request's job again with Idempotent-Replayed: true; the same key with a different body answers idempotency_conflict.","schema":{"type":"string","description":"1 to 200 letters, digits, _ or -, such as a UUID","pattern":"^[A-Za-z0-9_-]{1,200}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["tool_id","input"],"properties":{"tool_id":{"type":"string","description":"The ID of the tool to run, from a tool search","pattern":"^tool_[0-9a-f]{32}$"},"input":{"anyOf":[{"type":"object"},{"type":"array"},{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"description":"The tool's input, as its input_schema describes; {} when it takes none"},"login_id":{"allOf":[{"$ref":"#/components/schemas/login_id"}],"description":"The saved login to sign in with, when the site has several"},"login":{"type":"object","required":["username"],"properties":{"label":{"type":"string","description":"a string at most 200 character(s) long","minLength":1,"maxLength":200},"username":{"type":"string","description":"a string at most 1024 character(s) long","minLength":1,"maxLength":1024},"password":{"type":"string","description":"a string at most 16384 character(s) long","minLength":1,"maxLength":16384},"mode":{"type":"string","enum":["code"]},"email":{"type":"string","description":"a string at most 320 character(s) long","minLength":3,"maxLength":320},"phone":{"type":"string","description":"a string at most 64 character(s) long","minLength":3,"maxLength":64},"account_number":{"type":"string","description":"a string at most 128 character(s) long","minLength":1,"maxLength":128},"date_of_birth":{"type":"string","description":"a string matching the pattern ^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])$","pattern":"^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])$"},"zip":{"type":"string","description":"a string at most 10 character(s) long","minLength":3,"maxLength":10}},"additionalProperties":false,"description":"A login for this call, used only when the site has no saved login: a username (or email, phone or account number) and password, or mode \"code\" without a password when the site sends a code. It passes through your client and model provider; without it, the run asks the person on its answer page."},"save_login":{"type":"boolean","description":"Save login for later runs (requires login)"},"two_factor_method":{"type":"string","enum":["sms","call","email","authenticator","push"],"description":"The two-factor method to use when the site offers several; one the tool supports"},"correct_login":{"type":"boolean","enum":[true],"description":"Fix the rejected saved login named by login_id during this run"},"redact_at_rest":{"type":"boolean","description":"Staging and preview only: true seals what this job stores and redacts it once it settles, false keeps it readable, overriding the environment's setting. Production refuses a request that names it with invalid_request."}},"additionalProperties":false}}}},"responses":{"200":{"description":"The job this Idempotency-Key already started, with Idempotent-Replayed: true","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"202":{"description":"The new run's job","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"400":{"description":"invalid_input, unsupported_login_field, invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"save_forbidden, service_account_not_allowed, business_account_required, egress_options_not_allowed, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"idempotency_conflict, quota_expired, account_selection_required, saved_login_conflict, login_identity_conflict, legacy_duplicate_saved_logins, saved_login_unsettled, file_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"file_too_large, file_limit_exceeded, request_too_large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"file_type_refused","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"file_fetch_failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"quota_exceeded, service_account_cap_reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"501":{"description":"not_configured","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"acceptance_unknown, temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"write","x-pomerado-callers":["session","oauth","api_key","integration_key","service_account_key"],"x-pomerado-permission":"runs:create"},"get":{"operationId":"runs.list","tags":["runs"],"summary":"List the runs your team started","description":"Lists the runs your team started, newest first, one numbered page at a time, with the totals of every page. A run is listed when a team member started it, in the Dashboard, through an agent or with an API key, on any tool: the team's own or a public one.\n\n- Every member sees every run the team started, whoever started it.\n- Filter by integration, status, source and time range, or find one run by its ID.\n- Runs stay listed for 90 days.\n- To follow a run you just started, use jobs.get with its job ID. Use this list to look back over the team's runs.","parameters":[{"name":"integration_id","in":"query","required":false,"description":"an integration ID: int_ and 32 lowercase hex digits","schema":{"type":"string","examples":["int_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["queued","running","needs_input","succeeded","failed","cancelled"]}},{"name":"source","in":"query","required":false,"description":"mcp: an agent over MCP signed in with OAuth. dashboard: a member in the Dashboard. api: an API key, an MCP connection that uses one, or OAuth on the API. editor: a run of a tool's code from the Code editor, code.run, on any of them","schema":{"type":"string","enum":["mcp","api","dashboard","editor"]}},{"name":"from","in":"query","required":false,"description":"Accepted at or after, inclusive (default and earliest: 90 days ago)","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"Accepted before (default: now)","schema":{"type":"string"}},{"name":"run_id","in":"query","required":false,"description":"a job ID: job_ and 32 lowercase hex digits","schema":{"type":"string","examples":["job_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}},{"name":"page","in":"query","required":false,"description":"The page to read, from 1 (default 1)","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Runs per page, 1 to 100 (default 20)","schema":{"type":"string"}}],"responses":{"200":{"description":"One page of the team's runs","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunList"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"business_account_required, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth"],"x-pomerado-permission":"jobs:read"}},"/v1/runs/read-only":{"post":{"operationId":"runs.create_read_only","tags":["runs"],"summary":"Run a read-only tool","description":"Run a read-only website tool once and return its job.\n\nIt takes the same body as POST /v1/runs and changes nothing on the website, so you can send several at once. A tool that changes the website is refused with tool_not_read_only before any job starts; run it with POST /v1/runs. Follow the job with GET /v1/jobs/{id} or job webhooks.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Repeat a request safely: the same key and body answer the first request's job again with Idempotent-Replayed: true; the same key with a different body answers idempotency_conflict.","schema":{"type":"string","description":"1 to 200 letters, digits, _ or -, such as a UUID","pattern":"^[A-Za-z0-9_-]{1,200}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["tool_id","input"],"properties":{"tool_id":{"type":"string","description":"The ID of the tool to run, from a tool search","pattern":"^tool_[0-9a-f]{32}$"},"input":{"anyOf":[{"type":"object"},{"type":"array"},{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"description":"The tool's input, as its input_schema describes; {} when it takes none"},"login_id":{"allOf":[{"$ref":"#/components/schemas/login_id"}],"description":"The saved login to sign in with, when the site has several"},"login":{"type":"object","required":["username"],"properties":{"label":{"type":"string","description":"a string at most 200 character(s) long","minLength":1,"maxLength":200},"username":{"type":"string","description":"a string at most 1024 character(s) long","minLength":1,"maxLength":1024},"password":{"type":"string","description":"a string at most 16384 character(s) long","minLength":1,"maxLength":16384},"mode":{"type":"string","enum":["code"]},"email":{"type":"string","description":"a string at most 320 character(s) long","minLength":3,"maxLength":320},"phone":{"type":"string","description":"a string at most 64 character(s) long","minLength":3,"maxLength":64},"account_number":{"type":"string","description":"a string at most 128 character(s) long","minLength":1,"maxLength":128},"date_of_birth":{"type":"string","description":"a string matching the pattern ^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])$","pattern":"^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])$"},"zip":{"type":"string","description":"a string at most 10 character(s) long","minLength":3,"maxLength":10}},"additionalProperties":false,"description":"A login for this call, used only when the site has no saved login: a username (or email, phone or account number) and password, or mode \"code\" without a password when the site sends a code. It passes through your client and model provider; without it, the run asks the person on its answer page."},"save_login":{"type":"boolean","description":"Save login for later runs (requires login)"},"two_factor_method":{"type":"string","enum":["sms","call","email","authenticator","push"],"description":"The two-factor method to use when the site offers several; one the tool supports"},"correct_login":{"type":"boolean","enum":[true],"description":"Fix the rejected saved login named by login_id during this run"},"redact_at_rest":{"type":"boolean","description":"Staging and preview only: true seals what this job stores and redacts it once it settles, false keeps it readable, overriding the environment's setting. Production refuses a request that names it with invalid_request."}},"additionalProperties":false}}}},"responses":{"200":{"description":"The job this Idempotency-Key already started, with Idempotent-Replayed: true","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"202":{"description":"The new run's job","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"400":{"description":"invalid_input, unsupported_login_field, tool_not_read_only, invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"save_forbidden, service_account_not_allowed, business_account_required, egress_options_not_allowed, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"idempotency_conflict, quota_expired, account_selection_required, saved_login_conflict, login_identity_conflict, legacy_duplicate_saved_logins, saved_login_unsettled, file_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"file_too_large, file_limit_exceeded, request_too_large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"file_type_refused","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"file_fetch_failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"quota_exceeded, service_account_cap_reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"501":{"description":"not_configured","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"acceptance_unknown, temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth","api_key","integration_key","service_account_key"],"x-pomerado-permission":"runs:create"}},"/v1/integrations/{id}/tools/{tool_id}/runs":{"post":{"operationId":"runs.create_for_integration","tags":["runs"],"summary":"Run an integration's tool","description":"Run one of an integration's tools and return its job.\n\nIt works like POST /v1/runs, with the tool named in the path. An integration key reaches only its own integration's tools.","parameters":[{"name":"id","in":"path","required":true,"description":"an integration ID: int_ and 32 lowercase hex digits","schema":{"type":"string","examples":["int_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}},{"name":"tool_id","in":"path","required":true,"description":"A tool ID from GET /v1/tools: tool_ and 32 lowercase hex digits","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Repeat a request safely: the same key and body answer the first request's job again with Idempotent-Replayed: true; the same key with a different body answers idempotency_conflict.","schema":{"type":"string","description":"1 to 200 letters, digits, _ or -, such as a UUID","pattern":"^[A-Za-z0-9_-]{1,200}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["input"],"properties":{"input":{"anyOf":[{"type":"object"},{"type":"array"},{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"description":"The tool's input, as its input_schema describes; {} when it takes none"},"login_id":{"allOf":[{"$ref":"#/components/schemas/login_id"}],"description":"The saved login to sign in with, when the site has several"},"login":{"type":"object","required":["username"],"properties":{"label":{"type":"string","description":"a string at most 200 character(s) long","minLength":1,"maxLength":200},"username":{"type":"string","description":"a string at most 1024 character(s) long","minLength":1,"maxLength":1024},"password":{"type":"string","description":"a string at most 16384 character(s) long","minLength":1,"maxLength":16384},"mode":{"type":"string","enum":["code"]},"email":{"type":"string","description":"a string at most 320 character(s) long","minLength":3,"maxLength":320},"phone":{"type":"string","description":"a string at most 64 character(s) long","minLength":3,"maxLength":64},"account_number":{"type":"string","description":"a string at most 128 character(s) long","minLength":1,"maxLength":128},"date_of_birth":{"type":"string","description":"a string matching the pattern ^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])$","pattern":"^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])$"},"zip":{"type":"string","description":"a string at most 10 character(s) long","minLength":3,"maxLength":10}},"additionalProperties":false,"description":"A login for this call, used only when the site has no saved login: a username (or email, phone or account number) and password, or mode \"code\" without a password when the site sends a code. It passes through your client and model provider; without it, the run asks the person on its answer page."},"save_login":{"type":"boolean","description":"Save login for later runs (requires login)"},"two_factor_method":{"type":"string","enum":["sms","call","email","authenticator","push"],"description":"The two-factor method to use when the site offers several; one the tool supports"},"correct_login":{"type":"boolean","enum":[true],"description":"Fix the rejected saved login named by login_id during this run"},"redact_at_rest":{"type":"boolean","description":"Staging and preview only: true seals what this job stores and redacts it once it settles, false keeps it readable, overriding the environment's setting. Production refuses a request that names it with invalid_request."}},"additionalProperties":false}}}},"responses":{"200":{"description":"The job this Idempotency-Key already started, with Idempotent-Replayed: true","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"202":{"description":"The new run's job","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"400":{"description":"invalid_input, unsupported_login_field, invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"save_forbidden, service_account_not_allowed, business_account_required, egress_options_not_allowed, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"idempotency_conflict, quota_expired, account_selection_required, saved_login_conflict, login_identity_conflict, legacy_duplicate_saved_logins, saved_login_unsettled, file_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"file_too_large, file_limit_exceeded, request_too_large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"file_type_refused","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"file_fetch_failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"quota_exceeded, service_account_cap_reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"501":{"description":"not_configured","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"acceptance_unknown, temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"write","x-pomerado-callers":["session","oauth","api_key","integration_key","service_account_key"],"x-pomerado-permission":"runs:create"}},"/v1/builds":{"post":{"operationId":"builds.create","tags":["builds"],"summary":"Build a tool","description":"Build a new tool for a task on a website and return its job.\n\n- A build runs your example once. The tool is reused after that.\n- A build's `build.eta` gives how long builds like it usually take.\n- Follow the job with GET /v1/jobs/{id} or job webhooks.\n- If an existing tool already covers the task, the job names it as tool_id and build.existing_tool_id.\n- Ticket, bank, government and link shortener sites are refused with site_not_supported.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Repeat a request safely: the same key and body answer the first request's job again with Idempotent-Replayed: true; the same key with a different body answers idempotency_conflict.","schema":{"type":"string","description":"1 to 200 letters, digits, _ or -, such as a UUID","pattern":"^[A-Za-z0-9_-]{1,200}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["task"],"properties":{"task":{"type":"string","description":"What the tool should do, in plain words","minLength":1,"maxLength":20000},"site_url":{"type":"string","description":"The website's https origin, which every build needs; a path is dropped, so use start_url for a page","maxLength":2048},"start_url":{"type":"string","description":"An https page on site_url that the user gave, which the build opens unchanged as its start page, path, query and fragment kept","maxLength":4096},"effect":{"type":"string","enum":["read","write","ask"],"description":"read if the tool only looks things up; write if it changes the website (submits, books, saves a form, uploads, updates an account); ask to have the build work it out from the task, asking first only when the task is unclear. Required for a website build."},"example_input":{"anyOf":[{"type":"object"},{"type":"array"},{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"description":"The input for the one real example the build runs. A file the example needs is the ID of your own upload from POST /v1/files, which the build alone then uses"},"login_id":{"allOf":[{"$ref":"#/components/schemas/login_id"}],"description":"The saved login to sign in with, when the site has several"},"login":{"type":"object","required":["username"],"properties":{"label":{"type":"string","description":"a string at most 200 character(s) long","minLength":1,"maxLength":200},"username":{"type":"string","description":"a string at most 1024 character(s) long","minLength":1,"maxLength":1024},"password":{"type":"string","description":"a string at most 16384 character(s) long","minLength":1,"maxLength":16384},"mode":{"type":"string","enum":["code"]},"email":{"type":"string","description":"a string at most 320 character(s) long","minLength":3,"maxLength":320},"phone":{"type":"string","description":"a string at most 64 character(s) long","minLength":3,"maxLength":64},"account_number":{"type":"string","description":"a string at most 128 character(s) long","minLength":1,"maxLength":128},"date_of_birth":{"type":"string","description":"a string matching the pattern ^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])$","pattern":"^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])$"},"zip":{"type":"string","description":"a string at most 10 character(s) long","minLength":3,"maxLength":10}},"additionalProperties":false,"description":"A login for this call, used only when the site has no saved login: a username (or email, phone or account number) and password, or mode \"code\" without a password when the site sends a code. It passes through your client and model provider; without it, the run asks the person on its answer page."},"save_login":{"type":"boolean","description":"Save login for later runs (requires login)"},"force_sign_in":{"type":"boolean","description":"true: sign in before the example even if the task might work signed out, so the tool always signs in. Needs site_url. Otherwise a read build tries signed out and signs in (with login_id, login or the site's saved login) only when the task needs an account or hits a sign-in wall; the tool then needs a login only if the build signed in. A write or ask build given login_id or login always signs in first."},"redact_at_rest":{"type":"boolean","description":"Staging and preview only: true seals what this job stores and redacts it once it settles, false keeps it readable, overriding the environment's setting. Production refuses a request that names it with invalid_request."}},"additionalProperties":false}}}},"responses":{"200":{"description":"The job this Idempotency-Key already started, with Idempotent-Replayed: true","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"202":{"description":"The new build's job","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"400":{"description":"effect_required, invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"save_forbidden, service_account_not_allowed, site_not_supported, business_account_required, egress_options_not_allowed, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"idempotency_conflict, quota_expired, account_selection_required, saved_login_conflict, login_identity_conflict, legacy_duplicate_saved_logins, saved_login_unsettled, file_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"file_limit_exceeded, request_too_large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"quota_exceeded, service_account_cap_reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"501":{"description":"not_configured","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"acceptance_unknown, temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"write","x-pomerado-callers":["session","oauth","api_key","integration_key","service_account_key"],"x-pomerado-permission":"tools:build"}},"/v1/jobs/{id}":{"get":{"operationId":"jobs.get","tags":["jobs"],"summary":"Get a job","description":"Get a run's or build's job: its status, question, result, write status and error.\n\n- Returns at once. While the job is live, Retry-After suggests when to read it again.\n- A result is kept until it is first read, and at most 60 minutes after the job ends. include_result=false reads everything else and leaves the result for later.","parameters":[{"name":"id","in":"path","required":true,"description":"a job ID: job_ and 32 lowercase hex digits","schema":{"type":"string","examples":["job_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}},{"name":"include_result","in":"query","required":false,"description":"false to read the job without its result, which stays for a later read; result_status says whether one waits. Default true.","schema":{"type":"string","enum":["true","false"]}}],"responses":{"200":{"description":"The job","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"result_unavailable, temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth","api_key","integration_key","service_account_key"],"x-pomerado-permission":"jobs:read"}},"/v1/jobs/{id}/answers":{"post":{"operationId":"jobs.answer","tags":["jobs"],"summary":"Answer a job's question","description":"Answer every question in a job's input request at once; the job then continues.\n\nSecrets and website logins sent here pass through your client. To keep them private, give the person the input request's answer_url instead. Sending the same answers again counts as one answer.","parameters":[{"name":"id","in":"path","required":true,"description":"a job ID: job_ and 32 lowercase hex digits","schema":{"type":"string","examples":["job_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}},{"name":"include_result","in":"query","required":false,"description":"false to read the job without its result, which stays for a later read; result_status says whether one waits. Default true.","schema":{"type":"string","enum":["true","false"]}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["input_request_id","answers"],"properties":{"input_request_id":{"type":"string","description":"The input_request.id you are answering","examples":["req_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"],"pattern":"^req_[0-9a-f]{32}$"},"answers":{"type":"object","required":[],"properties":{},"additionalProperties":{"anyOf":[{"type":"string"},{"type":"object","required":["other"],"properties":{"other":{"type":"string"}},"additionalProperties":false},{"type":"object","required":["option"],"properties":{"option":{"type":"string"},"note":{"type":"string"}},"additionalProperties":false},{"type":"array","items":{"type":"string"}},{"type":"object","required":["options"],"properties":{"options":{"type":"array","items":{"type":"string"}},"other":{"type":"string"},"note":{"type":"string"}},"additionalProperties":false},{"type":"object","required":["confirmed"],"properties":{"confirmed":{"type":"boolean"},"text":{"type":"string"}},"additionalProperties":false},{"type":"object","required":["save_login"],"properties":{"username":{"type":"string"},"password":{"type":"string"},"save_login":{"type":"boolean"}},"additionalProperties":false}]},"description":"Answers keyed by question ID. choice: an option ID, {\"other\": text} (allow_other) or {\"option\": id, \"note\": text} (allow_note). multi_choice: option IDs, or {\"options\": [ids]} with \"other\" (allow_other) and \"note\" (allow_note). text and secret: a string. confirm: {\"confirmed\": true|false}. login: {\"username\", \"password\", \"save_login\"}, where username is the identifier its fields name (username, email, phone or account_number), left out when they name none, and password is sent only when fields lists it. A login whose fields name several identifiers is answered at its answer_url."}},"additionalProperties":false}}}},"responses":{"202":{"description":"The job, continuing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"400":{"description":"invalid_answer, invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"save_forbidden, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"input_not_pending, site_login_exists, login_identity_conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"input_expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"request_too_large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"write","x-pomerado-callers":["session","oauth","api_key","integration_key","service_account_key"],"x-pomerado-permission":"jobs:read"}},"/v1/jobs/{id}/cancel":{"post":{"operationId":"jobs.cancel","tags":["jobs"],"summary":"Cancel a job","description":"Stop a job.\n\n- A website action it already sent may have happened. Its write_status says whether it did.\n- Don't cancel a run whose maintenance.status is repairing. When its repair ends, Pomerado finishes the task, and a cancel ends the task without a result.","parameters":[{"name":"id","in":"path","required":true,"description":"a job ID: job_ and 32 lowercase hex digits","schema":{"type":"string","examples":["job_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"responses":{"200":{"description":"The job, stopping or cancelled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"destructive","x-pomerado-callers":["session","oauth","api_key","integration_key","service_account_key"],"x-pomerado-permission":"jobs:cancel"}},"/v1/jobs":{"get":{"operationId":"jobs.list","tags":["jobs"],"summary":"List jobs","description":"List your runs and builds, newest first, each with its status, website, task and the question it asks.\n\n- Lists the jobs you can read with GET /v1/jobs/{id}: those your API key, app or Dashboard started. The Dashboard lists the ones you started from any client.\n- status filters by one or more statuses, comma-separated, such as status=needs_input. A filtered page can hold fewer jobs than limit, so follow next_cursor until it is null.\n- q finds the jobs whose website or site name contains its text. Tasks are kept encrypted for you alone and can't be searched here; search them in the jobs you list.\n- counts totals your jobs of the listed type by state, whatever status, q, cursor and limit asked for; needs_input_count repeats counts.needs_input.\n- A job's result is never listed; read it with GET /v1/jobs/{id}.","parameters":[{"name":"type","in":"query","required":false,"description":"Only runs, or only builds","schema":{"type":"string","enum":["run","build"]}},{"name":"status","in":"query","required":false,"description":"Only jobs in these statuses, comma-separated: queued, running, needs_input, succeeded, failed, cancelled","schema":{"type":"string"}},{"name":"q","in":"query","required":false,"description":"Only jobs whose website or site name contains this text, ignoring case. A task is kept encrypted for you alone, so search tasks in the jobs you have listed","schema":{"type":"string"}},{"name":"cursor","in":"query","required":false,"description":"The next_cursor of the previous page","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Jobs per page, 1 to 50 (default 20)","schema":{"type":"string"}}],"responses":{"200":{"description":"One page of jobs","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobList"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth","api_key","integration_key","service_account_key"],"x-pomerado-permission":"jobs:read"}},"/v1/jobs/{id}/activity":{"get":{"operationId":"jobs.get_activity","tags":["jobs"],"summary":"Get a build's activity","description":"Returns what a build did, one entry per step in time order, each in the stage it happened in: the stages it went through, the first page it opened, its sign-in steps, its steps on the website, its example and test runs, a move to another connection, the questions it asked you and how it ended.\n\n- Business accounts only. You read the activity of a build whose job you can read with GET /v1/jobs/{id}.\n- An entry never holds what was typed to sign in, a code, an answer, a question's words, a path or a URL.\n- label says what a step was allowed to do on the website: read, write or sign_in. result says how a step went, when it has one.\n- Entries from the build's records are kept 90 days.","parameters":[{"name":"id","in":"path","required":true,"description":"a job ID: job_ and 32 lowercase hex digits","schema":{"type":"string","examples":["job_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"responses":{"200":{"description":"The build's activity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildActivity"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"business_account_required, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth","api_key","integration_key"],"x-pomerado-permission":"jobs:read"}},"/v1/suggestions":{"get":{"operationId":"suggestions.list","tags":["suggestions"],"summary":"Get build ideas","description":"Returns ideas for a tool to build: each a website and one task on it, from a reviewed set of popular US websites that Pomerado has no public tool for that task yet and that a Pomerado browser opened without being blocked. Ideas come from different categories in random order; ask again with exclude for others.","parameters":[{"name":"count","in":"query","required":false,"description":"How many ideas, 1 to 10 (default 3)","schema":{"type":"string"}},{"name":"exclude","in":"query","required":false,"description":"IDs of ideas already shown, comma-separated, to leave out: at most 100, so send the latest shown. Once nearly every idea has been shown, the rest are filled from all of them again","schema":{"type":"string"}}],"responses":{"200":{"description":"Build ideas","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildSuggestions"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"tools:read"}},"/v1/runs/{id}/log":{"get":{"operationId":"runs.get_log","tags":["runs"],"summary":"Get a run's log","description":"Returns one run your team started and its log, one line per event in time order: the start, each worker start, the tool's browser actions (at most 500 per attempt), the site's own requests after its last page load (at most 32 per browser), the result's size and the end.\n\n- The start line names who started the run: the member's name or email, and the API key's name.\n- An action line names the Playwright action, its target and, when known, the site it ran on, and a goto line the page it opened. It never holds a value the tool typed, filled, pressed or selected, and text in its target reads as …. Runs from before action lines list the tool's browser steps instead.\n- A request line never holds a query, matrix parameters, headers, cookies or body. In its path, a credential Pomerado recognizes reads as [secret withheld], a card number as [card withheld], and other personal data as a tag such as [EMAIL#7c21e0b4]. An action's target and a goto line's path read the same way.\n- A log is kept 90 days.","parameters":[{"name":"id","in":"path","required":true,"description":"a job ID: job_ and 32 lowercase hex digits","schema":{"type":"string","examples":["job_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"responses":{"200":{"description":"The run and its log","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunLog"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"business_account_required, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth"],"x-pomerado-permission":"jobs:read"}},"/v1/files":{"post":{"operationId":"files.create","tags":["files"],"summary":"Upload a file","description":"Create a file for a run's input and get a one-time upload URL.\n\n- PUT the bytes to upload_url, then pass the file's ID as the file field's value in a run's input.\n- A file can be at most 25 MiB unless the deployment sets otherwise. Executables are refused, and the first bytes must match media_type.\n- A file serves one run. It is erased when that run's job ends, or after an hour if unused.\n- A run's file field also takes an https URL, or a data: URI of at most 512 KB.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","media_type"],"properties":{"name":{"type":"string","description":"The file's name, as the website will see it, for example receipt.pdf","minLength":1,"maxLength":255},"media_type":{"type":"string","description":"The file's media type, such as application/pdf; its first bytes must match it","minLength":1,"maxLength":255},"size":{"allOf":[{"$ref":"#/components/schemas/Int","description":"a non-negative number","minimum":0}],"description":"The file's size in bytes; if given, the upload's Content-Length must match"}},"additionalProperties":false}}}},"responses":{"201":{"description":"The new file, awaiting its upload","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileUpload"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"sign_in_required, unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"file_too_large, request_too_large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"file_type_refused","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"501":{"description":"not_configured","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"write","x-pomerado-callers":["session","oauth","api_key","integration_key","service_account_key"],"x-pomerado-permission":"runs:create"}},"/v1/files/{id}":{"get":{"operationId":"files.get","tags":["files"],"summary":"Get a file","description":"Get a file's name, type, size, SHA-256 and status, without its bytes.","parameters":[{"name":"id","in":"path","required":true,"description":"a file ID: file_ and 32 lowercase hex digits","schema":{"type":"string","examples":["file_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"responses":{"200":{"description":"The file","content":{"application/json":{"schema":{"$ref":"#/components/schemas/File"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"sign_in_required, unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"501":{"description":"not_configured","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth","api_key","integration_key","service_account_key"],"x-pomerado-permission":"runs:create"},"delete":{"operationId":"files.delete","tags":["files"],"summary":"Delete a file","description":"Erase a file now, before it expires. A run that took it can no longer place it on the website.","parameters":[{"name":"id","in":"path","required":true,"description":"a file ID: file_ and 32 lowercase hex digits","schema":{"type":"string","examples":["file_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]}}],"responses":{"204":{"description":"The file is erased"},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"sign_in_required, unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"501":{"description":"not_configured","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"destructive","x-pomerado-callers":["session","oauth","api_key","integration_key","service_account_key"],"x-pomerado-permission":"runs:create"}},"/v1/team/members":{"get":{"operationId":"team.list_members","tags":["team"],"summary":"List team members","description":"Lists your Business team's members, oldest first. Every member may call it.","parameters":[{"name":"cursor","in":"query","required":false,"description":"The next_cursor of the previous page","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Items per page, 1 to 100 (default 20)","schema":{"type":"string"}}],"responses":{"200":{"description":"One page of members","content":{"application/json":{"schema":{"type":"object","required":["data","next_cursor"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Member"}},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":false}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"team_unavailable, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"identity"}},"/v1/team/members/{user_id}":{"patch":{"operationId":"team.update_member","tags":["team"],"summary":"Change a member's role","description":"Sets a team member's role to owner, admin or member. Admins can't change an owner's role or make anyone an owner, and the team always keeps at least one owner.","parameters":[{"name":"user_id","in":"path","required":true,"description":"a team member ID: the user_id GET /v1/team/members gives: user_ and up to 100 letters or digits","schema":{"type":"string","examples":["user_01K6QZ8V3N4M5P6R7S8T9W0XYZ"]}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["role"],"properties":{"role":{"type":"string","enum":["owner","admin","member"]}},"additionalProperties":false}}}},"responses":{"200":{"description":"The member with their new role","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Member"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"role_permission_missing, role_change_forbidden, team_unavailable, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"last_owner","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"request_too_large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"write","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"team:manage","x-pomerado-key-permission":"team:manage"},"delete":{"operationId":"team.remove_member","tags":["team"],"summary":"Remove a team member","description":"Removes a member from your team, stopping their running jobs and API keys. Logins they created stay with the team. Admins can't remove an owner, and the team always keeps at least one owner.","parameters":[{"name":"user_id","in":"path","required":true,"description":"a team member ID: the user_id GET /v1/team/members gives: user_ and up to 100 letters or digits","schema":{"type":"string","examples":["user_01K6QZ8V3N4M5P6R7S8T9W0XYZ"]}}],"responses":{"204":{"description":"Removed"},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"role_permission_missing, role_change_forbidden, team_unavailable, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"last_owner","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"destructive","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"team:manage","x-pomerado-key-permission":"team:manage"}},"/v1/team/invitations":{"get":{"operationId":"team.list_invitations","tags":["team"],"summary":"List invitations","description":"Lists your team's open invitations, newest first: pending ones and expired ones that can be resent.","parameters":[{"name":"cursor","in":"query","required":false,"description":"The next_cursor of the previous page","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Items per page, 1 to 100 (default 20)","schema":{"type":"string"}}],"responses":{"200":{"description":"One page of invitations","content":{"application/json":{"schema":{"type":"object","required":["data","next_cursor"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Invitation"}},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":false}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"role_permission_missing, team_unavailable, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"read","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"team:manage","x-pomerado-key-permission":"team:manage"},"post":{"operationId":"team.invite","tags":["team"],"summary":"Invite team members","description":"Invites people to your team by email; each invitation lasts 7 days.\n\n- Send one address as email, or up to 500 as invitations or as a CSV file's text in csv.\n- An address already on the team, in another team or repeated in the request is refused on its own row. One already invited returns its pending invitation.\n- Only an owner can invite an owner.\n- With an Idempotency-Key, repeating the same request returns the first answer.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Repeat a request safely: the same key and body answer the first request's job again with Idempotent-Replayed: true; the same key with a different body answers idempotency_conflict.","schema":{"type":"string","description":"1 to 200 letters, digits, _ or -, such as a UUID","pattern":"^[A-Za-z0-9_-]{1,200}$"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{"email":{"type":"string","description":"One address to invite; answers its Invitation","maxLength":320},"role":{"type":"string","enum":["owner","admin","member"],"description":"With email: its role (default member)"},"invitations":{"type":"array","items":{"type":"object","required":["email"],"properties":{"email":{"type":"string","description":"a string at most 320 character(s) long","maxLength":320},"role":{"type":"string","enum":["owner","admin","member"],"description":"Default: member"}},"additionalProperties":false},"description":"Up to 500 addresses, each with an optional role; answers each row's result"},"csv":{"type":"string","description":"A CSV file's text: an email column and an optional role column, with or without a header row, up to 500 rows; answers each row's result"}},"additionalProperties":false}}}},"responses":{"200":{"description":"With invitations or csv: each row's invitation or error, by index","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationResults"}}}},"201":{"description":"With email: the invitation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invitation"}}}},"400":{"description":"invalid_request, invalid_email","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"role_not_allowed, role_permission_missing, team_unavailable, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"already_member, already_invited, in_another_team, idempotency_conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"request_too_large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"acceptance_unknown, temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"write","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"team:manage","x-pomerado-key-permission":"team:manage"}},"/v1/team/invitations/{id}/resend":{"post":{"operationId":"team.resend_invitation","tags":["team"],"summary":"Resend an invitation","description":"Emails a pending or expired invitation again.","parameters":[{"name":"id","in":"path","required":true,"description":"a team invitation ID: invitation_ and up to 100 letters or digits","schema":{"type":"string","examples":["invitation_01K6QZ8V3N4M5P6R7S8T9W0XYZ"]}}],"responses":{"200":{"description":"The invitation, sent again","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invitation"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"role_permission_missing, role_not_allowed, team_unavailable, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"write","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"team:manage","x-pomerado-key-permission":"team:manage"}},"/v1/team/invitations/{id}":{"delete":{"operationId":"team.revoke_invitation","tags":["team"],"summary":"Revoke an invitation","description":"Revokes a pending or expired invitation, so its link no longer joins the team.","parameters":[{"name":"id","in":"path","required":true,"description":"a team invitation ID: invitation_ and up to 100 letters or digits","schema":{"type":"string","examples":["invitation_01K6QZ8V3N4M5P6R7S8T9W0XYZ"]}}],"responses":{"204":{"description":"Revoked"},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized, reauthentication_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"role_permission_missing, role_not_allowed, team_unavailable, forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"temporarily_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearer":[]}],"x-pomerado-effect":"write","x-pomerado-callers":["session","oauth","api_key"],"x-pomerado-permission":"team:manage","x-pomerado-key-permission":"team:manage"}}},"components":{"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","retryable","docs_url"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryable":{"type":"boolean"},"docs_url":{"type":"string"},"details":{"type":"object","required":[],"properties":{},"additionalProperties":{"$id":"/schemas/unknown"}}},"additionalProperties":false}},"additionalProperties":false},"Account":{"type":"object","required":["id","type","plan","user","organization","role","permissions","features"],"properties":{"id":{"$ref":"#/components/schemas/account_id"},"type":{"type":"string","enum":["personal","business"]},"plan":{"type":"string","enum":["free","premium","business","service"],"description":"free or premium (Personal), business (Business), or service (no plan limits)"},"user":{"$ref":"#/components/schemas/AccountUser"},"organization":{"anyOf":[{"type":"object","required":["id","name"],"properties":{"id":{"type":"string","description":"The Business organization's ID"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The organization's name; null when it has none or can't be read right now"}},"additionalProperties":false},{"type":"null"}]},"role":{"type":"string","enum":["owner","admin","member"]},"permissions":{"type":"array","items":{"type":"string","enum":["tools:read","usage:read","tools:build","runs:create","jobs:read","jobs:cancel","logins:read","logins:manage","api_keys:manage","billing:manage","team:manage"]},"description":"The permissions your role holds"},"features":{"type":"object","required":["sms_numbers","team","passwordless_logins","login_sharing"],"properties":{"sms_numbers":{"type":"boolean","description":"Saved logins may get Pomerado phone numbers for their sign-in codes"},"team":{"type":"boolean"},"passwordless_logins":{"type":"boolean","description":"A login may sign in with a code instead of a password"},"login_sharing":{"type":"boolean","description":"Saved logins can be shared with teammates (Business only)"},"advanced_settings":{"type":"boolean","description":"Your private tools can each have a location and use your own proxy (Business only). Left out where Pomerado doesn't offer them"}},"additionalProperties":false}},"additionalProperties":false},"account_id":{"type":"string","description":"an account ID: acct_ and 32 lowercase hex digits","examples":["acct_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]},"AccountUser":{"type":"object","required":["id","email","name","first_name","last_name"],"properties":{"id":{"type":"string","description":"Your user ID"},"email":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Your first and last name together; null when you have none"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":false},"AccountPreferences":{"type":"object","required":["question_delivery","connection","build_emails"],"properties":{"question_delivery":{"type":"string","enum":["agent","form"],"description":"Where the questions of the jobs you start in this account go, by default"},"connection":{"anyOf":[{"type":"object","required":["question_delivery","effective_question_delivery"],"properties":{"question_delivery":{"anyOf":[{"type":"string","enum":["agent","form"],"description":"agent: a job's questions come back to the calling agent, which answers them or asks you. form: they are asked of you on a form, in your agent's client when it shows forms, otherwise on the job's answer page. A password, code or login is always asked on the answer page."},{"type":"null"}],"description":"This connection's own setting, which wins over your default; null follows your default"},"effective_question_delivery":{"type":"string","enum":["agent","form"],"description":"Where questions go for this connection's jobs"}},"additionalProperties":false},{"type":"null"}],"description":"The connection making this call: its OAuth app or API key, on every Pomerado MCP and on the API; null for your Dashboard session"},"build_emails":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Whether a build you start on the Dashboard emails you when its question or sign-in waits for you; true unless you turned it off, and null when it couldn't be read just now"}},"additionalProperties":false},"ApiKey":{"type":"object","required":["id","name","permissions","integration_id","prefix","created_via","created_at","expires_at","last_used_at","purpose"],"properties":{"id":{"$ref":"#/components/schemas/api_key_id"},"name":{"type":"string","examples":["Nightly price check"]},"permissions":{"type":"array","items":{"type":"string","enum":["tools:read","usage:read","tools:build","runs:create","jobs:read","jobs:cancel","logins:read","logins:manage","api_keys:manage","billing:manage","team:manage"]},"examples":[["tools:read","runs:create","jobs:read"]]},"integration_id":{"anyOf":[{"$ref":"#/components/schemas/integration_id"},{"type":"null"}],"description":"The one integration the key is bound to, or null for an account key"},"prefix":{"type":"string","description":"The token's visible start, pom_ and 8 hex digits, to tell keys apart","examples":["pom_0f8e2d1c"]},"created_via":{"type":"string","enum":["dashboard","api","mcp"],"description":"Where the key was created"},"created_at":{"$ref":"#/components/schemas/Timestamp"},"expires_at":{"$ref":"#/components/schemas/Timestamp"},"last_used_at":{"anyOf":[{"$ref":"#/components/schemas/Timestamp"},{"type":"null"}],"description":"When a request last used the key, to within a minute, or null if none has"},"purpose":{"anyOf":[{"type":"string","enum":["connect"]},{"type":"null"}],"description":"connect for a key the Connect page made, else null"}},"additionalProperties":false},"api_key_id":{"type":"string","description":"an API key ID: key_ and 32 lowercase hex digits","examples":["key_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]},"integration_id":{"type":"string","description":"an integration ID: int_ and 32 lowercase hex digits","examples":["int_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]},"Timestamp":{"type":"string","format":"date-time","description":"An ISO 8601 timestamp in UTC","examples":["2026-10-05T18:30:00.000Z"]},"ApiKeyWithSecret":{"type":"object","required":["id","name","permissions","integration_id","prefix","created_via","created_at","expires_at","last_used_at","purpose","secret"],"properties":{"id":{"$ref":"#/components/schemas/api_key_id"},"name":{"type":"string","examples":["Nightly price check"]},"permissions":{"type":"array","items":{"type":"string","enum":["tools:read","usage:read","tools:build","runs:create","jobs:read","jobs:cancel","logins:read","logins:manage","api_keys:manage","billing:manage","team:manage"]},"examples":[["tools:read","runs:create","jobs:read"]]},"integration_id":{"anyOf":[{"$ref":"#/components/schemas/integration_id"},{"type":"null"}],"description":"The one integration the key is bound to, or null for an account key"},"prefix":{"type":"string","description":"The token's visible start, pom_ and 8 hex digits, to tell keys apart","examples":["pom_0f8e2d1c"]},"created_via":{"type":"string","enum":["dashboard","api","mcp"],"description":"Where the key was created"},"created_at":{"$ref":"#/components/schemas/Timestamp"},"expires_at":{"$ref":"#/components/schemas/Timestamp"},"last_used_at":{"anyOf":[{"$ref":"#/components/schemas/Timestamp"},{"type":"null"}],"description":"When a request last used the key, to within a minute, or null if none has"},"purpose":{"anyOf":[{"type":"string","enum":["connect"]},{"type":"null"}],"description":"connect for a key the Connect page made, else null"},"secret":{"type":"string","description":"The key's secret, shown in this answer only. Send it as a Bearer token.","examples":["pom_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190_example-secret-not-a-real-key-0000000000000"]}},"additionalProperties":false},"DashboardDelivery":{"type":"object","required":["dashboard_url"],"properties":{"dashboard_url":{"type":"string","description":"A signed-in Dashboard page where the person finishes this and sees the secret once"}},"additionalProperties":false},"Int":{"type":"integer","description":"an integer"},"ConnectedApp":{"type":"object","required":["id","client_name","mcps","permissions","created_at","last_used_at"],"properties":{"id":{"$ref":"#/components/schemas/connected_app_id"},"client_name":{"type":"string","description":"The app's name, as it registered"},"mcps":{"type":"array","items":{"anyOf":[{"type":"string","enum":["admin"],"description":"The Pomerado MCP"},{"type":"object","required":["integration_id","name"],"properties":{"integration_id":{"$ref":"#/components/schemas/integration_id"},"name":{"type":"string","description":"The integration's website"}},"additionalProperties":false,"description":"One integration's MCP"}]},"description":"Every Pomerado MCP in this account the app is authorized for"},"permissions":{"type":"array","items":{"type":"string","enum":["tools:read","usage:read","tools:build","runs:create","jobs:read","jobs:cancel","logins:read","logins:manage","api_keys:manage","billing:manage","team:manage"]},"description":"The permissions the app has used in this account"},"created_at":{"anyOf":[{"$ref":"#/components/schemas/Date"},{"type":"null"}],"description":"When the app first used Pomerado in this account; null before it has"},"last_used_at":{"anyOf":[{"$ref":"#/components/schemas/Date"},{"type":"null"}],"description":"When the app last used Pomerado in this account, to within five minutes; null before it has"}},"additionalProperties":false},"connected_app_id":{"type":"string","description":"a connected app ID: app_ and 32 lowercase hex digits","examples":["app_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]},"Date":{"type":"string","description":"a string to be decoded into a Date"},"UsageReport":{"type":"object","required":["from","to","as_of","calls","last_used_at","unattributed_calls","integrations_created","coverage"],"properties":{"from":{"anyOf":[{"type":"string"},{"type":"null"}]},"to":{"type":"string"},"as_of":{"type":"string"},"calls":{"type":"integer","description":"Charged tool calls in the range","minimum":0},"last_used_at":{"anyOf":[{"type":"string"},{"type":"null"}]},"unattributed_calls":{"type":"integer","description":"Calls in the range recorded before calls named their integration","minimum":0},"integrations_created":{"type":"integer","description":"Successful builds in the range: each build that published a tool, including one that added a tool to an existing integration","minimum":0},"coverage":{"type":"object","required":["started_at","complete","attribution_complete"],"properties":{"started_at":{"type":"string","description":"When usage recording began"},"complete":{"type":"boolean","description":"The whole range lies within recorded history"},"attribution_complete":{"type":"boolean"}},"additionalProperties":false},"groups":{"type":"array","items":{"type":"object","required":["integration_id","name","calls","last_used_at","integrations_created"],"properties":{"integration_id":{"$ref":"#/components/schemas/integration_id"},"name":{"type":"string","description":"The integration's name, such as its site's"},"calls":{"type":"integer","description":"a non-negative number","minimum":0},"last_used_at":{"anyOf":[{"type":"string"},{"type":"null"}]},"integrations_created":{"type":"integer","description":"Successful builds in the range that published a tool still in this integration","minimum":0}},"additionalProperties":false}},"series":{"type":"array","items":{"type":"object","required":["start","calls","integrations_created"],"properties":{"start":{"type":"string","description":"The bucket's start, a UTC hour, day or month"},"calls":{"type":"integer","description":"Charged tool calls in the bucket","minimum":0},"integrations_created":{"type":"integer","description":"Successful builds in the bucket","minimum":0}},"additionalProperties":false},"description":"Every bucket of the range in order, empty ones included. The first and last bucket count only their part inside the range"},"members":{"type":"array","items":{"type":"object","required":["member_id","name","email","role","calls","integrations_created","last_used_at"],"properties":{"member_id":{"type":"string","description":"The member's user ID"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"role":{"anyOf":[{"type":"string","enum":["owner","admin","member"]},{"type":"null"}],"description":"The member's current role; null once they have left the team"},"calls":{"type":"integer","description":"Their charged tool calls in the range","minimum":0},"integrations_created":{"type":"integer","description":"Their successful builds in the range, including builds that added a tool to an existing integration","minimum":0},"last_used_at":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Their last charged call in the range"}},"additionalProperties":false}}},"additionalProperties":false},"Quota":{"type":"object","required":["as_of","tool_calls","integrations_created"],"properties":{"as_of":{"type":"string"},"tool_calls":{"anyOf":[{"type":"object","required":["status","period","period_start","resets_at","limit","used","reserved","remaining"],"properties":{"status":{"type":"string","enum":["ready"]},"period":{"type":"string","enum":["day","month"]},"period_start":{"type":"string"},"resets_at":{"type":"string"},"limit":{"anyOf":[{"type":"integer","description":"a non-negative number","minimum":0},{"type":"null"}],"description":"Null is unlimited"},"used":{"type":"integer","description":"a non-negative number","minimum":0},"reserved":{"type":"integer","description":"Started and not yet confirmed or released","minimum":0},"remaining":{"anyOf":[{"type":"integer","description":"a non-negative number","minimum":0},{"type":"null"}],"description":"Null is unlimited"}},"additionalProperties":false},{"type":"object","required":["status","reason"],"properties":{"status":{"type":"string","enum":["unavailable"]},"reason":{"type":"string","enum":["not_initialized","partial_history"]}},"additionalProperties":false}],"description":"Tool calls today, by the UTC day"},"integrations_created":{"anyOf":[{"type":"object","required":["status","period","period_start","resets_at","limit","used","reserved","remaining"],"properties":{"status":{"type":"string","enum":["ready"]},"period":{"type":"string","enum":["day","month"]},"period_start":{"type":"string"},"resets_at":{"type":"string"},"limit":{"anyOf":[{"type":"integer","description":"a non-negative number","minimum":0},{"type":"null"}],"description":"Null is unlimited"},"used":{"type":"integer","description":"a non-negative number","minimum":0},"reserved":{"type":"integer","description":"Started and not yet confirmed or released","minimum":0},"remaining":{"anyOf":[{"type":"integer","description":"a non-negative number","minimum":0},{"type":"null"}],"description":"Null is unlimited"}},"additionalProperties":false},{"type":"object","required":["status","reason"],"properties":{"status":{"type":"string","enum":["unavailable"]},"reason":{"type":"string","enum":["not_initialized","partial_history"]}},"additionalProperties":false}],"description":"Successful builds this UTC month, including builds that add a tool to an existing integration. Failed, cancelled and empty builds don't count"}},"additionalProperties":false},"Billing":{"type":"object","required":["plan","status","interval","current_period_end","live","portal","checkout","yearly_switch","promotion"],"properties":{"plan":{"type":"string","enum":["free","premium"]},"status":{"type":"string","enum":["free","active","trialing","canceling","past_due","payment_failed"],"description":"canceling: Premium until current_period_end, then Free. past_due: still Premium while a failed payment is retried. payment_failed: the first payment failed, so still Free"},"interval":{"anyOf":[{"type":"string","enum":["monthly","yearly"]},{"type":"null"}]},"current_period_end":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"When the current period ends: the next renewal, the end of a trial, or when Premium ends"},"live":{"type":"boolean","description":"False when Stripe couldn't be read, so this is the last stored subscription"},"portal":{"type":"boolean","description":"The billing portal can open"},"checkout":{"type":"object","required":["monthly","yearly"],"properties":{"monthly":{"type":"boolean"},"yearly":{"type":"boolean"}},"additionalProperties":false,"description":"Which Premium intervals checkout offers"},"yearly_switch":{"type":"object","required":["available","scheduled","needs_support"],"properties":{"available":{"type":"boolean","description":"A monthly subscription can switch to yearly at its next renewal"},"scheduled":{"anyOf":[{"type":"object","required":["schedule_id","starts_at"],"properties":{"schedule_id":{"type":"string"},"starts_at":{"type":"string"}},"additionalProperties":false},{"type":"null"}]},"needs_support":{"type":"boolean","description":"The subscription has a scheduled change Pomerado didn't make; contact support"}},"additionalProperties":false},"promotion":{"anyOf":[{"$ref":"#/components/schemas/PromotionSummary"},{"type":"null"}],"description":"The free Premium period from a redeemed code, while it runs; else null"}},"additionalProperties":false},"PromotionSummary":{"type":"object","required":["offer_name","ends_at","billing_resumes_at"],"properties":{"offer_name":{"type":"string","description":"The offer, such as 6 months of Premium"},"ends_at":{"type":"string","description":"When the free Premium period ends (ISO 8601)"},"billing_resumes_at":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"When Stripe bills again (ISO 8601), for an account that also pays through Stripe; else null"}},"additionalProperties":false},"BillingLink":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"The page to open in a browser"}},"additionalProperties":false},"BillingRedeemed":{"type":"object","required":["status","promotion"],"properties":{"status":{"type":"string","enum":["redeemed"]},"promotion":{"$ref":"#/components/schemas/PromotionSummary"}},"additionalProperties":false},"Integration":{"type":"object","required":["id","name","description","site_url","visibility","owned_by_me","added","built","status","mcp_url","keyless_mcp_url","mcp_server_name","icon_url","tools","created_at","updated_at"],"properties":{"id":{"$ref":"#/components/schemas/integration_id"},"name":{"type":"string","description":"The site's everyday name, such as Instacart"},"description":{"type":"string","description":"What the site is, in a sentence"},"site_url":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The site's https origin; null for an offline integration"},"visibility":{"type":"string","enum":["public","private"]},"owned_by_me":{"type":"boolean","description":"Whether it holds a tool you created or own"},"added":{"type":"boolean","description":"Whether your account added it to My integrations"},"built":{"type":"boolean","description":"Whether it holds a tool you or your team created"},"status":{"type":"string","enum":["ready","disabled","not_hosted"],"description":"Its MCP: ready with mcp_url, disabled, or not_hosted where this deployment hosts none. Its tools run through the Pomerado MCP and REST in every state."},"mcp_url":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Its MCP endpoint while ready; connect with GET /v1/connect"},"keyless_mcp_url":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Its MCP's URL for use without signing in; null unless the integration is public and ready"},"mcp_server_name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Its MCP's name in client configs, such as instacart"},"icon_url":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Its site's icon, a PNG on the API host; null when it has none. Fetch it with the same Authorization: Bearer <API key> header as the API, from a key that can read integrations (tools:read); a key for one integration fetches only its icon. Without credentials it answers 401, and it answers 404 while the site has no captured icon. The URL changes whenever the icon may, so an icon fetched from it can be kept"},"tools":{"type":"array","items":{"type":"object","required":["id","name","description","effect","login_required"],"properties":{"id":{"$ref":"#/components/schemas/tool_id"},"name":{"type":"string"},"description":{"type":"string"},"effect":{"type":"string","enum":["read","write"]},"login_required":{"type":"boolean"}},"additionalProperties":false}},"created_at":{"$ref":"#/components/schemas/Date"},"updated_at":{"$ref":"#/components/schemas/DateFromString"}},"additionalProperties":false},"tool_id":{"type":"string","description":"a tool ID: tool_ and 32 lowercase hex digits","examples":["tool_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]},"DateFromString":{"type":"string","description":"a string to be decoded into a Date"},"TeamIntegration":{"type":"object","required":["id","name","description","site_url","visibility","owned_by_me","added","built","icon_url","tools","created_at"],"properties":{"id":{"$ref":"#/components/schemas/integration_id"},"name":{"type":"string"},"description":{"type":"string"},"site_url":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The website's https origin, or null for an offline tool"},"visibility":{"type":"string","enum":["public","private"],"description":"public: published on Pomerado for every account to find and use. private: only your team sees, uses and edits it"},"owned_by_me":{"type":"boolean","description":"Whether you created one of its tools, which you may delete"},"added":{"type":"boolean","description":"Whether your account added it to My integrations"},"built":{"type":"boolean","description":"Whether it holds a tool you or your team created"},"icon_url":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Its site's icon, a PNG on the API host; null when it has none. Fetch it with the same Authorization: Bearer <API key> header as the API, from a key that can read integrations (tools:read); a key for one integration fetches only its icon. Without credentials it answers 401, and it answers 404 while the site has no captured icon. The URL changes whenever the icon may, so an icon fetched from it can be kept"},"tools":{"type":"array","items":{"$ref":"#/components/schemas/IntegrationTool"},"description":"The enabled tools your team's members created in it; all its enabled tools when your team added it"},"created_at":{"$ref":"#/components/schemas/Date"}},"additionalProperties":false},"IntegrationTool":{"type":"object","required":["id","name","description","effect","login_required"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"effect":{"type":"string","enum":["read","write"]},"login_required":{"type":"boolean"}},"additionalProperties":false},"OpenApiDocument":{"type":"object","required":[],"properties":{},"additionalProperties":{"$id":"/schemas/unknown"},"description":"An OpenAPI 3.1 document"},"IntegrationReference":{"type":"object","required":["format","content"],"properties":{"format":{"type":"string","enum":["markdown"]},"content":{"type":"string","description":"The integration's reference as Markdown"}},"additionalProperties":false},"Connect":{"type":"object","required":["client","name","mcp_url","keyless_mcp_url","transport","auth","format","snippet","docs_url","api_base_url","openapi_url"],"properties":{"client":{"type":"string","enum":["claude_code","codex","cursor","vscode","claude_desktop","any"]},"name":{"type":"string"},"mcp_url":{"type":"string"},"keyless_mcp_url":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The same MCP's URL for use without signing in; null for a private integration"},"transport":{"type":"string","enum":["streamable_http"]},"auth":{"type":"string","enum":["oauth","api_key"]},"format":{"type":"string","enum":["shell","json","text"]},"snippet":{"type":"string","description":"What to paste or run, as format says"},"docs_url":{"type":"string"},"api_base_url":{"type":"string","description":"The REST API's base URL, such as https://api.pomerado.ai/v1"},"openapi_url":{"type":"string","description":"The OpenAPI document for what this MCP reaches: the Pomerado API or the integration"}},"additionalProperties":false},"IntegrationVisibility":{"type":"object","required":["id","visibility"],"properties":{"id":{"$ref":"#/components/schemas/integration_id"},"visibility":{"type":"string","enum":["public","private"],"description":"public: published on Pomerado for every account to find and use. private: only your team sees, uses and edits it"}},"additionalProperties":false},"CodeIntegration":{"type":"object","required":["id","name","site_url","visibility","tools"],"properties":{"id":{"$ref":"#/components/schemas/integration_id"},"name":{"type":"string"},"site_url":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The website's https origin, or null for an offline tool"},"visibility":{"type":"string","enum":["public","private"],"description":"public: published on Pomerado for every account to find and use. private: only your team sees, uses and edits it"},"tools":{"type":"array","items":{"$ref":"#/components/schemas/CodeTool"},"description":"The tools your team created in it"}},"additionalProperties":false},"CodeTool":{"type":"object","required":["id","name","effect","live_version","draft_changed_files","login_required","browser_version","http_version"],"properties":{"id":{"$ref":"#/components/schemas/tool_id"},"name":{"type":"string"},"effect":{"type":"string","enum":["read","write"]},"live_version":{"type":"object","required":["number","published_at","change","requested_by","restored_from","restorable"],"properties":{"number":{"type":"integer","description":"The version's number: 1 for the tool's first code, one more for each later version"},"published_at":{"$ref":"#/components/schemas/Date"},"change":{"type":"string","enum":["build","repair","change","update","edit","restore"],"description":"What made this version: build (Pomerado built the tool), repair (Pomerado repaired it after a run failed), change (someone asked for a change), update (Pomerado updated it), edit (a team member edited its code) or restore (a team member restored an earlier version as this one)"},"requested_by":{"anyOf":[{"$ref":"#/components/schemas/CodeMember"},{"type":"null"}],"description":"The team member who started the build, asked for the change, or published the edit or restore; null for a repair or an update, and for someone outside your team"},"restored_from":{"anyOf":[{"$ref":"#/components/schemas/Int"},{"type":"null"}],"description":"For a restore, the number of the version it restored; otherwise null"},"restorable":{"type":"boolean","description":"Whether code.restore can make this version live again: false for a version published before Pomerado kept a record of each version, and for one taken down"}},"additionalProperties":false,"description":"The version callers run now"},"draft_changed_files":{"type":"integer","description":"How many files your team's draft of the tool changes; 0 when it has none"},"login_required":{"type":"boolean","description":"Whether the tool signs in to its website"},"browser_version":{"type":"boolean","description":"Whether the live version has a browser version, which code.run runs with implementation browser; false only for a read whose HTTP version alone worked"},"http_version":{"type":"boolean","description":"Whether the live version has an HTTP version, which code.run runs with implementation http"}},"additionalProperties":false},"CodeMember":{"type":"object","required":["user_id","name","email"],"properties":{"user_id":{"type":"string","description":"The member's user ID"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The member's name, or null when they gave none"},"email":{"type":"string","description":"The member's sign-in email"}},"additionalProperties":false},"CodeBundle":{"type":"object","required":["integration","tool","versions","files","input_schema","draft","repair"],"properties":{"integration":{"$ref":"#/components/schemas/CodeIntegration"},"tool":{"$ref":"#/components/schemas/CodeTool"},"versions":{"type":"array","items":{"$ref":"#/components/schemas/CodeVersion"},"description":"The tool's versions, newest first, at most 100"},"files":{"type":"array","items":{"$ref":"#/components/schemas/CodeFile"},"description":"The live version's files, by path"},"input_schema":{"type":"object","required":[],"properties":{},"additionalProperties":{"$id":"/schemas/unknown"},"description":"What the live version's input takes, as JSON Schema"},"draft":{"anyOf":[{"$ref":"#/components/schemas/CodeDraft"},{"type":"null"}],"description":"Your team's draft of the tool, shared by every member, or null when it has none"},"repair":{"anyOf":[{"$ref":"#/components/schemas/CodeRepair"},{"type":"null"}],"description":"Pomerado's automatic repair of the tool while one is under way after a run of it failed, whoever ran it, or null when none is"}},"additionalProperties":false},"CodeVersion":{"type":"object","required":["number","published_at","change","requested_by","restored_from","restorable"],"properties":{"number":{"type":"integer","description":"The version's number: 1 for the tool's first code, one more for each later version"},"published_at":{"$ref":"#/components/schemas/Date"},"change":{"type":"string","enum":["build","repair","change","update","edit","restore"],"description":"What made this version: build (Pomerado built the tool), repair (Pomerado repaired it after a run failed), change (someone asked for a change), update (Pomerado updated it), edit (a team member edited its code) or restore (a team member restored an earlier version as this one)"},"requested_by":{"anyOf":[{"$ref":"#/components/schemas/CodeMember"},{"type":"null"}],"description":"The team member who started the build, asked for the change, or published the edit or restore; null for a repair or an update, and for someone outside your team"},"restored_from":{"anyOf":[{"$ref":"#/components/schemas/Int"},{"type":"null"}],"description":"For a restore, the number of the version it restored; otherwise null"},"restorable":{"type":"boolean","description":"Whether code.restore can make this version live again: false for a version published before Pomerado kept a record of each version, and for one taken down"}},"additionalProperties":false},"CodeFile":{"type":"object","required":["path","source","bytes","content"],"properties":{"path":{"type":"string","description":"The file's path, such as src/tool.mjs"},"source":{"type":"string","enum":["team","pomerado"],"description":"team: written for your tool by its build. pomerado: added by Pomerado to run it, such as operation.mjs and the sign-in recipe auth-fill.json"},"bytes":{"type":"integer","description":"The file's size in bytes"},"content":{"type":"string","description":"The file's text"}},"additionalProperties":false},"CodeDraft":{"type":"object","required":["base_version","digest","changed","updated_at","updated_by","passed_at","files","base_files","input_schema"],"properties":{"base_version":{"type":"integer","description":"The version the draft started from: the live one when its first file was saved"},"digest":{"type":"string","description":"The SHA-256 of the whole file set the draft makes, in hex"},"changed":{"type":"array","items":{"type":"string"},"description":"The paths of the files the draft changes from its base version, sorted"},"updated_at":{"$ref":"#/components/schemas/Date"},"updated_by":{"anyOf":[{"$ref":"#/components/schemas/CodeMember"},{"type":"null"}],"description":"The member who saved last; null for someone no longer on your team"},"passed_at":{"anyOf":[{"$ref":"#/components/schemas/Date"},{"type":"null"}],"description":"When a run of the draft as it is now passed; null until one does"},"files":{"type":"array","items":{"$ref":"#/components/schemas/CodeDraftFile"},"description":"The changed files, by path"},"base_files":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/CodeBaseFile"}},{"type":"null"}],"description":"Your team's files whose text in the base version isn't the live version's, by path: empty while the base version is live, and null when, with the live files and the changed ones, they'd take more than 4 MiB of the answer's JSON"},"input_schema":{"type":"object","required":[],"properties":{},"additionalProperties":{"$id":"/schemas/unknown"},"description":"What the draft's input takes, as JSON Schema: as the latest run of the draft that passed read it, or its base version's until one passes"}},"additionalProperties":false},"CodeDraftFile":{"type":"object","required":["path","content"],"properties":{"path":{"type":"string","description":"The file's path, such as src/tool.mjs"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The file's text in the draft, or null when the draft deletes it"}},"additionalProperties":false},"CodeBaseFile":{"type":"object","required":["path","content"],"properties":{"path":{"type":"string","description":"The file's path, such as src/tool.mjs"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The file's text in the base version, or null when the base version doesn't have it"}},"additionalProperties":false},"CodeRepair":{"type":"object","required":["status","deadline_at"],"properties":{"status":{"type":"string","enum":["repairing"],"description":"repairing: Pomerado is repairing the tool after a run of it failed"},"deadline_at":{"anyOf":[{"$ref":"#/components/schemas/Date"},{"type":"null"}],"description":"When the runs waiting on the repair end at the latest, each with its result or a final error by its own maintenance.deadline_at; null when none waits, as the repair goes on for later runs"}},"additionalProperties":false},"CodeArchive":{"type":"object","required":["file_name","media_type","size","content_base64"],"properties":{"file_name":{"type":"string","description":"A name to save it under, such as acme-travel-search-flights-v7.zip"},"media_type":{"type":"string","enum":["application/zip"]},"size":{"type":"integer","description":"The zip's size in bytes"},"content_base64":{"type":"string","description":"The zip, base64-encoded"}},"additionalProperties":false},"CodeExportLink":{"type":"object","required":["download_url","expires_at","file_name","size","tool_name","integration_name","site_url","editable","start_with"],"properties":{"download_url":{"type":"string","description":"A link to the zip that needs no sign-in: one GET downloads it, before expires_at"},"expires_at":{"$ref":"#/components/schemas/DateFromString"},"file_name":{"type":"string","description":"A name to save it under, such as acme-travel-search-flights-v7.zip"},"size":{"type":"integer","description":"The zip's size in bytes"},"tool_name":{"type":"string","description":"The tool's name"},"integration_name":{"type":"string","description":"The integration's name"},"site_url":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The website's https origin, or null for an offline tool"},"editable":{"type":"boolean","description":"Whether code.save_draft can save changes to the tool's draft. Always true."},"start_with":{"type":"array","items":{"type":"string"},"description":"Where to start reading: the paths of your team's files the tool runs, such as src/tool.mjs"}},"additionalProperties":false},"CodeSavedDraft":{"type":"object","required":["draft"],"properties":{"draft":{"anyOf":[{"$ref":"#/components/schemas/CodeDraftSummary"},{"type":"null"}],"description":"The tool's draft after the save, or null when no change is left in it"}},"additionalProperties":false},"CodeDraftSummary":{"type":"object","required":["base_version","digest","changed","updated_at","updated_by","passed_at"],"properties":{"base_version":{"type":"integer","description":"The version the draft started from: the live one when its first file was saved"},"digest":{"type":"string","description":"The SHA-256 of the whole file set the draft makes, in hex"},"changed":{"type":"array","items":{"type":"string"},"description":"The paths of the files the draft changes from its base version, sorted"},"updated_at":{"$ref":"#/components/schemas/Date"},"updated_by":{"anyOf":[{"$ref":"#/components/schemas/CodeMember"},{"type":"null"}],"description":"The member who saved last; null for someone no longer on your team"},"passed_at":{"anyOf":[{"$ref":"#/components/schemas/Date"},{"type":"null"}],"description":"When a run of the draft as it is now passed; null until one does"}},"additionalProperties":false},"Job":{"type":"object","required":["id","type","status","tool_id","input_request","result","result_status","result_expires_at","write_status","login_save","error","message","maintenance","build","watch_url","created_at","updated_at","completed_at"],"properties":{"id":{"$ref":"#/components/schemas/job_id"},"type":{"type":"string","enum":["run","build"]},"status":{"type":"string","enum":["queued","running","needs_input","succeeded","failed","cancelled"]},"tool_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"input_request":{"anyOf":[{"$ref":"#/components/schemas/InputRequest"},{"type":"null"}]},"result":{"$id":"/schemas/unknown"},"result_status":{"anyOf":[{"type":"string","enum":["available","delivered","expired"]},{"type":"null"}]},"result_expires_at":{"anyOf":[{"$ref":"#/components/schemas/Date"},{"type":"null"}]},"write_status":{"anyOf":[{"type":"string","enum":["not_attempted","may_have_applied","applied","not_applied"]},{"type":"null"}]},"login_save":{"anyOf":[{"type":"object","required":["status","login_id","reason"],"properties":{"status":{"type":"string","enum":["saved","not_saved","failed"]},"login_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"reason":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":false},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/Error"},{"type":"null"}]},"message":{"anyOf":[{"type":"string"},{"type":"null"}]},"maintenance":{"anyOf":[{"type":"object","required":["status","result_recovered","message","deadline_at"],"properties":{"status":{"type":"string","enum":["repairing","repaired","incomplete"]},"result_recovered":{"type":"boolean"},"message":{"type":"string"},"deadline_at":{"anyOf":[{"type":"string"},{"type":"null"}]},"now":{"$ref":"#/components/schemas/JobMaintenanceNow"}},"additionalProperties":false},{"type":"null"}]},"build":{"anyOf":[{"$ref":"#/components/schemas/JobBuild"},{"type":"null"}]},"site_url":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The website's https origin the job was asked for: a build's site_url, or the site of the tool a run runs"},"site_name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The site's name: its tool's integration's, else the integration of its website; null until one names it"},"task":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A build's task, or a requested change, as it was sent; null for a run and a job accepted before Pomerado kept tasks"},"tool_name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The name of the tool tool_id names, as GET /v1/tools shows it"},"waiting_since":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"When the question input_request asks was asked; null when the job asks none"},"answered_questions":{"type":"array","items":{"$ref":"#/components/schemas/JobAnsweredQuestion"},"description":"The questions the job asked and its member answered, oldest first; a secret, login or code shows only that it was answered"},"watch_url":{"type":"string"},"tip":{"type":"string"},"created_at":{"$ref":"#/components/schemas/Date"},"updated_at":{"$ref":"#/components/schemas/Date"},"completed_at":{"anyOf":[{"$ref":"#/components/schemas/Date"},{"type":"null"}]}},"additionalProperties":false},"job_id":{"type":"string","description":"a job ID: job_ and 32 lowercase hex digits","examples":["job_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]},"InputRequest":{"type":"object","required":["id","expires_at","answer_url","message","questions"],"properties":{"id":{"type":"string","description":"An input request ID: req_ and 32 lowercase hex digits","examples":["req_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"],"pattern":"^req_[0-9a-f]{32}$"},"expires_at":{"type":"string"},"answer_url":{"type":"string"},"message":{"type":"string"},"questions":{"type":"array","items":{"$ref":"#/components/schemas/Question"}}},"additionalProperties":false},"Question":{"anyOf":[{"type":"object","required":["id","prompt","type","options","allow_other","allow_note"],"properties":{"id":{"type":"string"},"prompt":{"type":"string"},"type":{"type":"string","enum":["choice"]},"options":{"type":"array","items":{"type":"object","required":["id","label"],"properties":{"id":{"type":"string"},"label":{"type":"string"}},"additionalProperties":false}},"allow_other":{"type":"boolean"},"allow_note":{"type":"boolean"}},"additionalProperties":false},{"type":"object","required":["id","prompt","type","options","min_selections","max_selections","allow_other","allow_note"],"properties":{"id":{"type":"string"},"prompt":{"type":"string"},"type":{"type":"string","enum":["multi_choice"]},"options":{"type":"array","items":{"type":"object","required":["id","label"],"properties":{"id":{"type":"string"},"label":{"type":"string"}},"additionalProperties":false}},"min_selections":{"$ref":"#/components/schemas/Int"},"max_selections":{"$ref":"#/components/schemas/Int"},"allow_other":{"type":"boolean"},"allow_note":{"type":"boolean"}},"additionalProperties":false},{"type":"object","required":["id","prompt","type","max_length"],"properties":{"id":{"type":"string"},"prompt":{"type":"string"},"type":{"type":"string","enum":["text"]},"max_length":{"anyOf":[{"$ref":"#/components/schemas/Int"},{"type":"null"}]}},"additionalProperties":false},{"type":"object","required":["id","prompt","type","follow_up"],"properties":{"id":{"type":"string"},"prompt":{"type":"string"},"type":{"type":"string","enum":["confirm"]},"follow_up":{"anyOf":[{"type":"object","required":["prompt"],"properties":{"prompt":{"type":"string"}},"additionalProperties":false},{"type":"null"}]}},"additionalProperties":false},{"type":"object","required":["id","prompt","type","kind"],"properties":{"id":{"type":"string"},"prompt":{"type":"string"},"type":{"type":"string","enum":["secret"]},"kind":{"type":"string","enum":["one_time_code","authenticator_code","private_text"]}},"additionalProperties":false},{"type":"object","required":["id","prompt","type","site_url","fields","reason","username_masked","can_save"],"properties":{"id":{"type":"string"},"prompt":{"type":"string"},"type":{"type":"string","enum":["login"]},"site_url":{"type":"string"},"fields":{"type":"array","items":{"type":"string","enum":["username","email","phone","account_number","password"]}},"reason":{"type":"string","enum":["missing","rejected","expired"]},"username_masked":{"anyOf":[{"type":"string"},{"type":"null"}]},"can_save":{"type":"boolean"}},"additionalProperties":false}]},"JobMaintenanceNow":{"type":"object","required":["label","started_at"],"properties":{"label":{"type":"string","description":"One line for the user saying what the repair is doing now: repairing, testing the fix or publishing it"},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"When the repair's current step started (ISO 8601 UTC); null when unknown"}},"additionalProperties":false,"description":"What the repair is doing now while the run waits for it. Absent otherwise, and from an older backend"},"JobBuild":{"type":"object","required":["integration_id","stage","stages","eta","example_result","existing_tool_id","change","recorded"],"properties":{"integration_id":{"anyOf":[{"$ref":"#/components/schemas/integration_id"},{"type":"null"}]},"stage":{"type":"string","enum":["queued","checking_login","exploring","building","publishing"]},"stages":{"type":"array","items":{"type":"object","required":["key","label","status","started_at","completed_at"],"properties":{"key":{"type":"string","enum":["queued","checking_login","exploring","building","publishing"]},"label":{"type":"string"},"status":{"type":"string","enum":["done","active","pending"]},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}]},"completed_at":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":false}},"now":{"anyOf":[{"$ref":"#/components/schemas/JobBuildNow"},{"type":"null"}],"description":"What the build is doing now; null once it has ended"},"eta":{"anyOf":[{"type":"object","required":["min_seconds","max_seconds"],"properties":{"min_seconds":{"type":"number"},"max_seconds":{"type":"number"}},"additionalProperties":false},{"type":"null"}]},"example_result":{"$id":"/schemas/unknown"},"existing_tool_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"change":{"anyOf":[{"$ref":"#/components/schemas/JobChange"},{"type":"null"}]},"recorded":{"type":"boolean","description":"Whether the build's browser was recorded. A Business account watches the recording on the build page, or reads there why it was removed"}},"additionalProperties":false},"JobBuildNow":{"type":"object","required":["label","started_at"],"properties":{"label":{"type":"string","description":"One line for the user saying what the build is doing now, such as its step on the site, a test round's progress or that it waits for an answer. It changes as the build moves on"},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"When this line started (ISO 8601 UTC); null when unknown"}},"additionalProperties":false},"JobChange":{"type":"object","required":["revision_id","previous_revision_id","write_started"],"properties":{"revision_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"previous_revision_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"write_started":{"type":"boolean"}},"additionalProperties":false},"JobAnsweredQuestion":{"type":"object","required":["request_id","question_id","type","prompt","options","selected","other","note","text","confirmed","answered","value_hidden","asked_at","answered_at"],"properties":{"request_id":{"type":"string"},"question_id":{"type":"string"},"type":{"type":"string"},"prompt":{"type":"string"},"options":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"The offered options' labels, for a choice; null otherwise"},"selected":{"type":"array","items":{"type":"string"},"description":"The labels picked"},"other":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The member's own answer instead of, or beside, the offered options"},"note":{"anyOf":[{"type":"string"},{"type":"null"}]},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A text answer, or the text a confirmation sent"},"confirmed":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"answered":{"type":"boolean","description":"False for an optional question left unanswered"},"value_hidden":{"type":"boolean","description":"True for a secret, a login, a code or a saved login's choice: it was answered, and its value is never shown"},"asked_at":{"anyOf":[{"type":"string"},{"type":"null"}]},"answered_at":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":false},"login_id":{"type":"string","description":"a saved login ID: login_ and 32 lowercase hex digits","examples":["login_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]},"CodeRunOutput":{"type":"object","required":["chunks","more"],"properties":{"chunks":{"type":"array","items":{"type":"object","required":["seq","stream","at","text"],"properties":{"seq":{"type":"integer","description":"The chunk's position; send it as after to read what follows"},"stream":{"type":"string","enum":["out","err","cut"],"description":"out: the run's stdout. err: its stderr. cut: the run printed more than the 4 MiB kept"},"at":{"$ref":"#/components/schemas/DateFromString"},"text":{"type":"string","description":"What the run printed; empty for cut"}},"additionalProperties":false}},"more":{"type":"boolean","description":"Whether more was printed already: read again at once"}},"additionalProperties":false},"LoginImportResult":{"type":"object","required":["results"],"properties":{"results":{"type":"array","items":{"type":"object","required":["index"],"properties":{"index":{"$ref":"#/components/schemas/Int"},"login":{"$ref":"#/components/schemas/Login"},"error":{"type":"object","required":["code","message","retryable","docs_url"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryable":{"type":"boolean"},"docs_url":{"type":"string"}},"additionalProperties":false}},"additionalProperties":false}}},"additionalProperties":false},"Login":{"type":"object","required":["id","label","site","username_masked","identifier_type","sign_in","saved_fields","two_factor","status","needs_attention","locked","your_access","created_at","updated_at","verified_at"],"properties":{"id":{"$ref":"#/components/schemas/login_id"},"label":{"anyOf":[{"type":"string"},{"type":"null"}]},"site":{"type":"object","required":["url","name"],"properties":{"url":{"type":"string"},"name":{"type":"string","description":"The site as people say it"}},"additionalProperties":false},"username_masked":{"type":"string"},"identifier_type":{"type":"string","enum":["username","email","phone","account_number"]},"sign_in":{"type":"string","enum":["password","code"]},"saved_fields":{"anyOf":[{"type":"array","items":{"type":"string","enum":["email","phone","account_number","date_of_birth","zip","recovery_codes","preferred_method"]}},{"type":"null"}],"description":"What it holds besides its username and password; null when not recorded"},"two_factor":{"type":"object","required":["authenticator","sms_number"],"properties":{"authenticator":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"sms_number":{"type":"string","enum":["none","linked"]}},"additionalProperties":false},"status":{"type":"string","enum":["unverified","verified","needs_attention"]},"needs_attention":{"anyOf":[{"anyOf":[{"type":"object","required":["field"],"properties":{"field":{"type":"string","enum":["username","email","phone","account_number","password"]}},"additionalProperties":false},{"type":"object","required":["reason"],"properties":{"reason":{"type":"string","enum":["account_locked"],"description":"The website said the account is locked; unlock it on the website"}},"additionalProperties":false}]},{"type":"null"}]},"locked":{"type":"boolean","description":"Personal accounts: its identity is fixed after the first verified sign-in"},"your_access":{"type":"string","enum":["use","edit","manage"],"description":"use: run and build with it. edit: also reveal and change it. manage: also share and delete it"},"created_at":{"type":"string","description":"When it was saved, ISO 8601 UTC"},"updated_at":{"type":"string","description":"When it last changed, ISO 8601 UTC"},"verified_at":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Its first verified sign-in, ISO 8601 UTC; null before one"}},"additionalProperties":false},"LoginImportRequest":{"type":"object","required":[],"properties":{"logins":{"type":"array","items":{"$id":"/schemas/unknown"},"description":"Up to 1,000 logins, each a LoginInput","minItems":1,"maxItems":1000},"deliver":{"type":"string","enum":["dashboard"],"description":"Return a Dashboard link where the person enters the login, so no secret reaches this client"}},"additionalProperties":false},"LoginReveal":{"type":"object","required":["username","password","email","phone","account_number","date_of_birth","zip","preferred_method","recovery_codes"],"properties":{"username":{"type":"string"},"password":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"phone":{"anyOf":[{"type":"string"},{"type":"null"}]},"account_number":{"anyOf":[{"type":"string"},{"type":"null"}]},"date_of_birth":{"anyOf":[{"type":"string"},{"type":"null"}]},"zip":{"anyOf":[{"type":"string"},{"type":"null"}]},"preferred_method":{"anyOf":[{"type":"string","enum":["sms","call","email","authenticator","push","recovery_code"],"description":"A two-factor method"},{"type":"null"}]},"recovery_codes":{"anyOf":[{"type":"object","required":["saved","unused","low"],"properties":{"saved":{"$ref":"#/components/schemas/Int"},"unused":{"$ref":"#/components/schemas/Int"},"low":{"type":"boolean","description":"Few unused codes are left: add more"}},"additionalProperties":false},{"type":"null"}]}},"additionalProperties":false},"LoginAuthenticatorCode":{"type":"object","required":["code"],"properties":{"code":{"type":"string"},"expires_at":{"type":"string","description":"When the code's period ends (some sites use 60 s periods). Absent when the credential worker can't say; the code then lasts at least 30 s from when it was read."}},"additionalProperties":false},"SmsNumber":{"type":"object","required":["phone_number","status","linked_at","verified_at","verification"],"properties":{"phone_number":{"type":"string"},"status":{"type":"string","enum":["linked","verified"]},"linked_at":{"type":"string"},"verified_at":{"anyOf":[{"type":"string"},{"type":"null"}]},"verification":{"anyOf":[{"type":"object","required":["expires_at","code_received","code"],"properties":{"expires_at":{"type":"string"},"code_received":{"type":"boolean"},"code":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":false},{"type":"null"}]}},"additionalProperties":false},"LoginAccess":{"type":"object","required":["login_id","creator","team","members"],"properties":{"login_id":{"type":"string"},"creator":{"anyOf":[{"type":"object","required":["user_id","name","email","former"],"properties":{"user_id":{"type":"string","description":"Their user ID"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Null when they gave none"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Null for someone no longer on the team, except to an Owner or Admin"},"former":{"type":"boolean","description":"They are no longer on the team"}},"additionalProperties":false},{"type":"null"}],"description":"Who created it, and so manages it; null for a login saved before teams existed"},"team":{"anyOf":[{"type":"string","enum":["use","edit"]},{"type":"null"}],"description":"The whole team's level, later joiners included; null when the team has none"},"members":{"type":"array","items":{"type":"object","required":["user_id","name","email","former","level"],"properties":{"user_id":{"type":"string","description":"Their user ID"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Null when they gave none"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Null for someone no longer on the team, except to an Owner or Admin"},"former":{"type":"boolean","description":"They are no longer on the team"},"level":{"type":"string","enum":["use","edit","manage"]}},"additionalProperties":false},"description":"Each member's own level. Every Owner and Admin manages it whatever this lists"}},"additionalProperties":false},"LoginAccessChange":{"type":"object","required":["grantee","level"],"properties":{"grantee":{"anyOf":[{"type":"object","required":["type"],"properties":{"type":{"type":"string","enum":["team"]}},"additionalProperties":false},{"type":"object","required":["type","user_id"],"properties":{"type":{"type":"string","enum":["member"]},"user_id":{"$ref":"#/components/schemas/user_id"}},"additionalProperties":false}]},"level":{"anyOf":[{"type":"string","enum":["use","edit","manage"]},{"type":"null"}],"description":"Null removes their access"}},"additionalProperties":false},"user_id":{"type":"string","description":"a team member ID: the user_id GET /v1/team/members gives: user_ and up to 100 letters or digits","examples":["user_01K6QZ8V3N4M5P6R7S8T9W0XYZ"]},"Tool":{"type":"object","required":["id","name","description","integration_id","site","effect","input_schema","output_schema","login","mcp_name","can_change"],"properties":{"id":{"$ref":"#/components/schemas/tool_id"},"name":{"type":"string"},"description":{"type":"string"},"integration_id":{"anyOf":[{"$ref":"#/components/schemas/integration_id"},{"type":"null"}]},"site":{"anyOf":[{"type":"object","required":["url","name"],"properties":{"url":{"type":"string","description":"The site's https origin"},"name":{"type":"string","description":"The site's everyday name"}},"additionalProperties":false},{"type":"null"}]},"effect":{"type":"string","enum":["read","write"],"description":"read changes nothing on the site; write changes something there"},"input_schema":{"type":"object","required":[],"properties":{},"additionalProperties":{"$id":"/schemas/unknown"},"description":"What a run's input takes, as JSON Schema. References are resolved: one left in a recursive schema points at its root $defs"},"output_schema":{"type":"object","required":[],"properties":{},"additionalProperties":{"$id":"/schemas/unknown"},"description":"What a succeeded run's result holds, as JSON Schema, in the same form"},"login":{"anyOf":[{"type":"object","required":["fields","two_factor_methods"],"properties":{"fields":{"type":"array","items":{"type":"string","enum":["username","password","email","phone","account_number","date_of_birth","zip"]},"description":"The login fields a run may carry for its sign-in"},"two_factor_methods":{"type":"array","items":{"type":"string","enum":["sms","call","email","authenticator","push"]},"description":"Second steps its recorded sign-in offered; empty when none was recorded"}},"additionalProperties":false},{"type":"null"}],"description":"What its sign-in takes; null when it needs none"},"mcp_name":{"type":"string","description":"Its tool name on its integration's MCP, such as get_claim_status"},"can_change":{"type":"boolean","description":"Whether you can request a change to this tool: you can run it and build tools, and you aren't using an integration key"},"egress":{"type":"object","required":["location","own_proxy"],"properties":{"location":{"type":"string","enum":["US","GB","FR","DE","SG"],"description":"The country websites see its builds, changes and runs coming from"},"own_proxy":{"type":"boolean","description":"Whether it uses your own proxy, which each of its runs then passes as proxy"}},"additionalProperties":false,"description":"Its location and proxy: only on your Business account's private tools, where Pomerado offers them"}},"additionalProperties":false},"ToolsNotice":{"type":"object","required":["code","message","docs_url"],"properties":{"code":{"type":"string","enum":["sign_in_to_see_all_tools"]},"message":{"type":"string","description":"Says the list holds only tools you can run without an account, that signing up (free) or signing in adds tools that write, saved logins and building tools, and how to do it"},"docs_url":{"type":"string","description":"How to sign up or sign in"}},"additionalProperties":false,"description":"Present only without credentials: the list holds only public read-only tools that need no login. Signing up (free) or signing in shows every tool."},"Webhook":{"type":"object","required":["id","created_by","url","events","status","disabled_reason","created_at","last_delivery_at"],"properties":{"id":{"$ref":"#/components/schemas/webhook_id"},"created_by":{"$ref":"#/components/schemas/WebhookCreator"},"url":{"type":"string"},"events":{"type":"array","items":{"type":"string","enum":["job.needs_input","job.input_expiring","job.succeeded","job.failed","job.repairing"]}},"status":{"type":"string","enum":["active","disabled"]},"disabled_reason":{"anyOf":[{"type":"string","enum":["manual","gone","unreachable","secret_unreadable"]},{"type":"null"}],"description":"Why a disabled webhook sends nothing: manual (turned off), gone (its receiver answered 410), unreachable (20 failed deliveries in a row) or secret_unreadable (rotate its secret)"},"created_at":{"$ref":"#/components/schemas/Date"},"last_delivery_at":{"anyOf":[{"$ref":"#/components/schemas/Date"},{"type":"null"}]}},"additionalProperties":false},"webhook_id":{"type":"string","description":"a webhook ID: wh_ and 32 lowercase hex digits","examples":["wh_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]},"WebhookCreator":{"type":"object","required":["user_id","email"],"properties":{"user_id":{"type":"string","description":"The member's user ID"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The email they sign in with, or null when the account no longer has it"}},"additionalProperties":false,"description":"The member who made the webhook. Only they can change, test or rotate it, and it carries events for the jobs they can see"},"WebhookWithSecret":{"type":"object","required":["id","created_by","url","events","status","disabled_reason","created_at","last_delivery_at","secret"],"properties":{"id":{"$ref":"#/components/schemas/webhook_id"},"created_by":{"$ref":"#/components/schemas/WebhookCreator"},"url":{"type":"string"},"events":{"type":"array","items":{"type":"string","enum":["job.needs_input","job.input_expiring","job.succeeded","job.failed","job.repairing"]}},"status":{"type":"string","enum":["active","disabled"]},"disabled_reason":{"anyOf":[{"type":"string","enum":["manual","gone","unreachable","secret_unreadable"]},{"type":"null"}],"description":"Why a disabled webhook sends nothing: manual (turned off), gone (its receiver answered 410), unreachable (20 failed deliveries in a row) or secret_unreadable (rotate its secret)"},"created_at":{"$ref":"#/components/schemas/Date"},"last_delivery_at":{"anyOf":[{"$ref":"#/components/schemas/Date"},{"type":"null"}]},"secret":{"type":"string","description":"The Standard Webhooks signing secret (whsec_…), shown only in this response. Verify each delivery's webhook-signature with it."}},"additionalProperties":false},"WebhookTestResult":{"type":"object","required":["delivered","status","failure"],"properties":{"delivered":{"type":"boolean","description":"The receiver answered with a 2xx"},"status":{"anyOf":[{"$ref":"#/components/schemas/Int"},{"type":"null"}],"description":"The receiver's HTTP status, or null when none answered"},"failure":{"anyOf":[{"type":"string","enum":["invalid_url","forbidden_address","timeout","unreachable"]},{"type":"null"}],"description":"Why no receiver answered: forbidden_address when the URL resolves to a private address, timeout after 10 seconds, or unreachable"}},"additionalProperties":false},"JobList":{"type":"object","required":["data","next_cursor","needs_input_count","counts"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/JobSummary"}},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}]},"needs_input_count":{"$ref":"#/components/schemas/Int","description":"counts.needs_input, kept for callers that read it","minimum":0},"counts":{"$ref":"#/components/schemas/JobCounts"}},"additionalProperties":false},"JobSummary":{"type":"object","required":["id","type","build_kind","status","stage","site_url","site_name","task","question","waiting_since","tool_id","tool_name","integration_id","eta","watch_url","created_at","updated_at","completed_at"],"properties":{"id":{"$ref":"#/components/schemas/job_id"},"type":{"type":"string","enum":["run","build"]},"build_kind":{"anyOf":[{"type":"string","enum":["new","change"]},{"type":"null"}],"description":"A build of a new tool, or a requested change to an existing one; null for a run"},"status":{"type":"string","enum":["queued","running","needs_input","succeeded","failed","cancelled"]},"stage":{"anyOf":[{"type":"string","enum":["queued","checking_login","exploring","building","publishing"]},{"type":"null"}],"description":"A build's current stage, or the one it ended in; null for a run"},"site_url":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The website's https origin the job was asked for"},"site_name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The site's name: its tool's integration's, else the integration of its website; null until one names it"},"task":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A build's task or a requested change, its first 500 characters; GET /v1/jobs/{id} shows all of it. Null for a run"},"question":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The first question's prompt while the job asks one; answer it with GET /v1/jobs/{id}'s input_request"},"waiting_since":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"When the question was asked, while the job asks one"},"tool_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"tool_name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The name of the tool tool_id names, such as the one a build published"},"integration_id":{"anyOf":[{"$ref":"#/components/schemas/integration_id"},{"type":"null"}]},"eta":{"anyOf":[{"type":"object","required":["min_seconds","max_seconds"],"properties":{"min_seconds":{"type":"number"},"max_seconds":{"type":"number"}},"additionalProperties":false},{"type":"null"}],"description":"How long builds usually take, in seconds from start to end, while this one is queued or running; null otherwise"},"watch_url":{"type":"string"},"created_at":{"$ref":"#/components/schemas/Date"},"updated_at":{"$ref":"#/components/schemas/Date"},"completed_at":{"anyOf":[{"$ref":"#/components/schemas/Date"},{"type":"null"}]}},"additionalProperties":false},"JobCounts":{"type":"object","required":["needs_input","in_progress","finished"],"properties":{"needs_input":{"$ref":"#/components/schemas/Int","description":"Waiting on an answer now (at most 100)","minimum":0},"in_progress":{"$ref":"#/components/schemas/Int","description":"Queued or running (at most 100)","minimum":0},"finished":{"$ref":"#/components/schemas/Int","description":"Succeeded, failed or cancelled (at most 1000)","minimum":0}},"additionalProperties":false,"description":"How many of your jobs of the listed type are in each state, whatever status, q, cursor and limit asked for"},"BuildActivity":{"type":"object","required":["job_id","entries","incomplete","truncated"],"properties":{"job_id":{"type":"string"},"entries":{"type":"array","items":{"type":"object","required":["at","stage","kind","text"],"properties":{"at":{"type":"string","description":"When it happened, an ISO 8601 UTC time"},"stage":{"type":"string","enum":["queued","checking_login","exploring","building","publishing"],"description":"The build stage it happened in"},"kind":{"type":"string","enum":["stage","queued","worker","opened","sign_in","browse","write","example","test","blocked","connection","question","answer","outcome"],"description":"stage: a stage started. queued: the build was accepted. worker: another worker continued it. opened: the first page it opened. sign_in: a sign-in step. browse: steps that only read the site. write: a step that changes the site. example: a run of your example. test: a test run. blocked: the site blocked a test browser. connection: it tried another connection or kind of browser. question and answer: a question it asked you, and your answer. outcome: how the build ended"},"text":{"type":"string","description":"What happened, in a sentence"},"label":{"type":"string","enum":["read","write","sign_in"],"description":"What the step was allowed to do on the website: read, write or sign_in"},"result":{"type":"string","enum":["passed","failed"],"description":"How it went, when it has a result"}},"additionalProperties":false}},"incomplete":{"type":"boolean","description":"Some entries are missing because a record could not be read yet. Read it again later for any that can be read then"},"truncated":{"type":"boolean","description":"The build has more records than one read takes, so some of its earliest entries are left out"}},"additionalProperties":false},"BuildSuggestions":{"type":"object","required":["suggestions"],"properties":{"suggestions":{"type":"array","items":{"$ref":"#/components/schemas/BuildSuggestion"}}},"additionalProperties":false},"BuildSuggestion":{"type":"object","required":["id","site_name","site_url","task","inputs","outputs","category","sign_in"],"properties":{"id":{"type":"string"},"site_name":{"type":"string","description":"The website's name"},"site_url":{"type":"string","description":"Where the website starts"},"task":{"type":"string","description":"What the tool would do, verb first"},"inputs":{"type":"string","description":"What you would give the tool"},"outputs":{"type":"string","description":"What the tool would return"},"category":{"type":"string","enum":["shopping","groceries","travel","outdoors","home","jobs","records","money","health","learning","events","food","work","tech","sports","cars","entertainment","local"]},"sign_in":{"type":"string","enum":["none","own_account"],"description":"none: the task needs no sign-in. own_account: the build asks you to sign in with your own account on the website"}},"additionalProperties":false},"RunList":{"type":"object","required":["data","page","limit","total","summary"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Run"}},"page":{"type":"integer","description":"a non-negative number","minimum":0},"limit":{"type":"integer","description":"a non-negative number","minimum":0},"total":{"type":"integer","description":"Runs matching the filters, on every page","minimum":0},"summary":{"type":"object","required":["succeeded","failed","cancelled","in_progress","median_duration_ms"],"properties":{"succeeded":{"type":"integer","description":"a non-negative number","minimum":0},"failed":{"type":"integer","description":"a non-negative number","minimum":0},"cancelled":{"type":"integer","description":"a non-negative number","minimum":0},"in_progress":{"type":"integer","description":"Queued, running or waiting for an answer","minimum":0},"median_duration_ms":{"anyOf":[{"type":"integer","description":"a non-negative number","minimum":0},{"type":"null"}]}},"additionalProperties":false}},"additionalProperties":false},"Run":{"type":"object","required":["id","status","tool_id","tool_name","integration_id","integration_name","effect","write_status","source","started_by","login_id","revision","attempts","created_at","started_at","completed_at","duration_ms"],"properties":{"id":{"type":"string"},"status":{"type":"string","enum":["queued","running","needs_input","succeeded","failed","cancelled"]},"tool_id":{"type":"string"},"tool_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"integration_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"integration_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"effect":{"anyOf":[{"type":"string","enum":["read","write"]},{"type":"null"}]},"write_status":{"anyOf":[{"type":"string","enum":["not_attempted","may_have_applied","applied","not_applied"]},{"type":"null"}]},"source":{"anyOf":[{"type":"string","enum":["mcp","api","dashboard","editor"]},{"type":"null"}]},"started_by":{"type":"object","required":["member_id","name","email","api_key"],"properties":{"member_id":{"type":"string","description":"The member's user ID"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"api_key":{"anyOf":[{"type":"object","required":["id","name"],"properties":{"id":{"type":"string"},"name":{"type":"string"}},"additionalProperties":false},{"type":"null"}]}},"additionalProperties":false},"login_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"revision":{"type":"object","required":["id","published_at","draft_of_version"],"properties":{"id":{"type":"string"},"published_at":{"anyOf":[{"type":"string"},{"type":"null"}]},"draft_of_version":{"anyOf":[{"type":"integer","description":"a non-negative number","minimum":0},{"type":"null"}],"description":"For a run of the tool's draft from the Code editor, the number of the version it ran the draft on; otherwise null"}},"additionalProperties":false},"attempts":{"type":"integer","description":"a non-negative number","minimum":0},"created_at":{"type":"string"},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}]},"completed_at":{"anyOf":[{"type":"string"},{"type":"null"}]},"duration_ms":{"anyOf":[{"type":"integer","description":"a non-negative number","minimum":0},{"type":"null"}]}},"additionalProperties":false},"RunLog":{"type":"object","required":["run","lines","incomplete"],"properties":{"run":{"$ref":"#/components/schemas/Run"},"implementation":{"type":"string","enum":["browser","http"],"description":"Which version of the tool the run ran: browser or http. Absent for a run from before logs recorded it"},"lines":{"type":"array","items":{"type":"object","required":["at","event","fields"],"properties":{"at":{"type":"string"},"event":{"type":"string","enum":["run.started","run.worker_started","browser.step","browser.steps_omitted","browser.action","browser.actions_omitted","site.request","run.result","run.finished"]},"fields":{"type":"object","required":[],"properties":{},"additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"The line's facts by name. A browser.action line has action (the Playwright method), ms and outcome (ok, timeout or error), and when known target (the locator), host (the site it ran on), path (on a goto, the page it opened), function (the tool's function that called it) and count (when it repeated). A browser.actions_omitted line has actions, how many more there were"}},"additionalProperties":false}},"incomplete":{"type":"boolean","description":"Some of the run's lines are missing: a record could not be read yet, or the run has more records than one log reads. Read the log again later for any that can be read then"}},"additionalProperties":false},"FileUpload":{"type":"object","required":["id","name","media_type","size","sha256","status","direction","job_id","created_at","expires_at","upload_url"],"properties":{"id":{"$ref":"#/components/schemas/file_id"},"name":{"type":"string","description":"The file's name, as given"},"media_type":{"type":"string","description":"The file's media type, as checked"},"size":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Bytes: the declared size until the upload arrives, then the size received; null when none was declared"},"sha256":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The SHA-256 of the bytes, lowercase hex, once they arrived"},"status":{"type":"string","enum":["awaiting_upload","ready","in_use"],"description":"awaiting_upload until its bytes arrive at upload_url, ready to pass to a run, in_use once a run took it"},"direction":{"type":"string","enum":["input","output"],"description":"input for a file sent to a run, output for one a run collected"},"job_id":{"anyOf":[{"$ref":"#/components/schemas/job_id"},{"type":"null"}],"description":"The run's job the file is bound to: an input in use, and every output"},"created_at":{"$ref":"#/components/schemas/Date"},"expires_at":{"anyOf":[{"$ref":"#/components/schemas/Date"},{"type":"null"}],"description":"When the file is erased unless used first; null for an input in use, which is erased when its job ends"},"upload_url":{"type":"string","description":"PUT the file's bytes here once, with Content-Type and Content-Length and no Authorization header. Valid until expires_at."}},"additionalProperties":false},"file_id":{"type":"string","description":"a file ID: file_ and 32 lowercase hex digits","examples":["file_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190"]},"File":{"type":"object","required":["id","name","media_type","size","sha256","status","direction","job_id","created_at","expires_at"],"properties":{"id":{"$ref":"#/components/schemas/file_id"},"name":{"type":"string","description":"The file's name, as given"},"media_type":{"type":"string","description":"The file's media type, as checked"},"size":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Bytes: the declared size until the upload arrives, then the size received; null when none was declared"},"sha256":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The SHA-256 of the bytes, lowercase hex, once they arrived"},"status":{"type":"string","enum":["awaiting_upload","ready","in_use"],"description":"awaiting_upload until its bytes arrive at upload_url, ready to pass to a run, in_use once a run took it"},"direction":{"type":"string","enum":["input","output"],"description":"input for a file sent to a run, output for one a run collected"},"job_id":{"anyOf":[{"$ref":"#/components/schemas/job_id"},{"type":"null"}],"description":"The run's job the file is bound to: an input in use, and every output"},"created_at":{"$ref":"#/components/schemas/Date"},"expires_at":{"anyOf":[{"$ref":"#/components/schemas/Date"},{"type":"null"}],"description":"When the file is erased unless used first; null for an input in use, which is erased when its job ends"}},"additionalProperties":false},"Member":{"type":"object","required":["user_id","email","name","role","joined_at"],"properties":{"user_id":{"type":"string","description":"The member's user ID"},"email":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Null when they gave none"},"role":{"type":"string","enum":["owner","admin","member"]},"joined_at":{"$ref":"#/components/schemas/Date"}},"additionalProperties":false},"Invitation":{"type":"object","required":["id","email","role","status","invited_by","created_at","expires_at"],"properties":{"id":{"type":"string","description":"The invitation's ID (invitation_…)"},"email":{"type":"string"},"role":{"anyOf":[{"type":"string","enum":["owner","admin","member"]},{"type":"null"}],"description":"The role the invitee gets; null when it isn't one Pomerado knows"},"status":{"type":"string","enum":["pending","expired"]},"invited_by":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The inviter's user ID, when recorded"},"created_at":{"$ref":"#/components/schemas/Date"},"expires_at":{"$ref":"#/components/schemas/Date"}},"additionalProperties":false},"InvitationResults":{"type":"object","required":["results"],"properties":{"results":{"type":"array","items":{"type":"object","required":["index","email"],"properties":{"index":{"$ref":"#/components/schemas/Int"},"email":{"type":"string"},"invitation":{"$ref":"#/components/schemas/Invitation"},"error":{"type":"object","required":["code","message","retryable","docs_url"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryable":{"type":"boolean"},"docs_url":{"type":"string"}},"additionalProperties":false}},"additionalProperties":false}}},"additionalProperties":false}},"securitySchemes":{"bearer":{"type":"http","scheme":"bearer"}}}}