{"openapi":"3.1.1","info":{"title":"Kinetic Pricing API","version":"1.0.0","summary":"Pricing research for software businesses, exposed for authorized agents.","description":"The Kinetic Pricing API gives authorized agents the same capabilities the website offers: create and run pricing studies, read deterministic analysis and teardowns, and manage the Kinetic Workspace (scenarios, decisions, evidence).\n\n**No account yet?** Start agent-assisted signup with `POST /v1/signup-attempts` (kinetic.signup_start). The account holder confirms by email; you then complete the attempt with explicit terms acceptance. Never claim an account exists before completion succeeds.\n\n**Already have an account?** Send the account holder through OAuth consent (Authorization Code + PKCE), or use client_credentials for a workspace service account, then call the API with the bearer token.\n\n**Static API access token?** An account holder can mint a long-lived token (format `kp_live_…`) in Integrations on the website and hand it to your platform's secret store. Send it as `Authorization: Bearer kp_live_…` against this REST API only — the MCP, OAuth, and website surfaces reject it. It carries the scopes chosen at creation and can be rotated or revoked at any time.\n\n**Terms of use:** https://kineticpricing.com/terms\n\nEvery error uses a stable envelope (`components.schemas.ErrorEnvelope`) with a machine-readable `code`, a `retryable` flag, and an optional `retry_after_s`.","termsOfService":"https://kineticpricing.com/terms"},"servers":[{"url":"https://api.kineticpricing.com"}],"paths":{"/v1/account":{"get":{"operationId":"accounts.get","tags":["accounts"],"summary":"Get the authorized account's profile.","description":"Returns the account behind the current grant: id, email, and creation time. Mirrors what the account holder sees on the website.\n\n**Auth:** Requires the kinetic.account.read scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"email":{"type":"string"},"created_at":{"type":"string"}},"required":["id","email","created_at"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.account.read"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/integrations/api-tokens":{"get":{"operationId":"integrations.listApiTokens","tags":["integrations"],"summary":"List the account's Kinetic API access tokens.","description":"Returns the acting user's static API access tokens: id, name, the public token prefix (kp_live_<public_id> — never the secret half), granted scopes, status (active/revoked/expired), and created/expires/last-used/rotated times. Secrets and secret hashes are never returned by any endpoint. Personal credentials: a service-account token is forbidden here.\n\n**Auth:** Requires the kinetic.integrations.read scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"token_prefix":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"created_at":{"type":"string"},"expires_at":{"type":["string","null"]},"last_used_at":{"type":["string","null"]},"secret_rotated_at":{"type":["string","null"]},"revoked_at":{"type":["string","null"]},"status":{"type":"string","enum":["active","revoked","expired"]}},"required":["id","name","token_prefix","scopes","created_at","expires_at","last_used_at","secret_rotated_at","revoked_at","status"],"additionalProperties":false}}},"required":["items"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.integrations.read"]},{"bearer":[]},{"apiToken":[]}]},"post":{"operationId":"integrations.createApiToken","tags":["integrations"],"summary":"Create a Kinetic API access token (one-time secret).","description":"Mints a static bearer token (kp_live_…) that delegates the acting user's live authority, restricted to the requested scopes. The full token is returned EXACTLY ONCE in `token` — store it immediately; it is never retrievable again. Scopes must be a subset of what the caller itself holds AND within the acting user's current workspace-role authority (viewers grant read scopes; editors add workspace writes; owners grant any scope); [\"kinetic.full\"] must be requested alone and only an account owner whose own credential carries kinetic.full may mint it. Optional expires_in_days (e.g. 30/90/365); a token minted by an expiring API token cannot outlive it. Tokens work only on the REST API host (api.kineticpricing.com) — the MCP, OAuth, and website surfaces reject them. Requires recent human authorization (10 minutes): an OAuth caller's grant must have been approved by the user within the window (re-run the authorization flow to refresh it — refreshing the access token does NOT count), and an API-token caller must itself carry a fresh authorization anchor (inherited from the human event that authorized its own mint). Stale callers receive `forbidden` with details.reason `recent_authorization_required`. Idempotency-Key is honored with HANDLER-MANAGED replay semantics: a replay returns the same token metadata with `token: null` (the secret is delivered exactly once, on the original response, and never enters any replay store).\n\n**Auth:** Requires the kinetic.integrations.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional. Honored when present so a retried write is de-duplicated. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"name":{"type":"string","minLength":1,"maxLength":120},"scopes":{"type":"array","items":{"type":"string"},"minItems":1},"expires_in_days":{"type":"integer","minimum":1,"maximum":3650}},"required":["name","scopes"]}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"token_prefix":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"created_at":{"type":"string"},"expires_at":{"type":["string","null"]},"last_used_at":{"type":["string","null"]},"secret_rotated_at":{"type":["string","null"]},"revoked_at":{"type":["string","null"]},"status":{"type":"string","enum":["active","revoked","expired"]},"token":{"type":["string","null"]},"token_note":{"type":"string"}},"required":["id","name","token_prefix","scopes","created_at","expires_at","last_used_at","secret_rotated_at","revoked_at","status","token","token_note"],"additionalProperties":false}}}},"201":{"description":"201 when a new resource is created.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"token_prefix":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"created_at":{"type":"string"},"expires_at":{"type":["string","null"]},"last_used_at":{"type":["string","null"]},"secret_rotated_at":{"type":["string","null"]},"revoked_at":{"type":["string","null"]},"status":{"type":"string","enum":["active","revoked","expired"]},"token":{"type":["string","null"]},"token_note":{"type":"string"}},"required":["id","name","token_prefix","scopes","created_at","expires_at","last_used_at","secret_rotated_at","revoked_at","status","token","token_note"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.integrations.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/integrations/api-tokens/{id}/rotate":{"post":{"operationId":"integrations.rotateApiToken","tags":["integrations"],"summary":"Rotate an API access token's secret (one-time secret).","description":"Issues a brand-new token string (new public id and secret) for this token and invalidates the previous credential in the same atomic update — the old string stops working immediately. Name, scopes, and expiry are unchanged. The new token is returned EXACTLY ONCE in `token`. A missing, foreign, or revoked token reads as resource_not_found. Requires recent human authorization (10 minutes), same as token creation: OAuth callers need a freshly approved grant (refreshing the access token does NOT count) and API-token callers need a fresh authorization anchor; stale callers receive `forbidden` with details.reason `recent_authorization_required`. Idempotency-Key is honored with HANDLER-MANAGED replay semantics: a replay returns metadata with `token: null` — rotate again if the secret was lost.\n\n**Auth:** Requires the kinetic.integrations.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional. Honored when present so a retried write is de-duplicated. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"token_prefix":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"created_at":{"type":"string"},"expires_at":{"type":["string","null"]},"last_used_at":{"type":["string","null"]},"secret_rotated_at":{"type":["string","null"]},"revoked_at":{"type":["string","null"]},"status":{"type":"string","enum":["active","revoked","expired"]},"token":{"type":["string","null"]},"token_note":{"type":"string"}},"required":["id","name","token_prefix","scopes","created_at","expires_at","last_used_at","secret_rotated_at","revoked_at","status","token","token_note"],"additionalProperties":false}}}},"201":{"description":"201 when a new resource is created.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"token_prefix":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"created_at":{"type":"string"},"expires_at":{"type":["string","null"]},"last_used_at":{"type":["string","null"]},"secret_rotated_at":{"type":["string","null"]},"revoked_at":{"type":["string","null"]},"status":{"type":"string","enum":["active","revoked","expired"]},"token":{"type":["string","null"]},"token_note":{"type":"string"}},"required":["id","name","token_prefix","scopes","created_at","expires_at","last_used_at","secret_rotated_at","revoked_at","status","token","token_note"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.integrations.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/integrations/api-tokens/{id}":{"delete":{"operationId":"integrations.revokeApiToken","tags":["integrations"],"summary":"Revoke (disable) an API access token.","description":"Disables the token so it can never authenticate again, effective immediately on the next request. Idempotent: revoking an already-revoked token still succeeds. A missing or foreign token reads as resource_not_found — list tokens first with kinetic.api_token_list to obtain a valid id.\n\n**Auth:** Requires the kinetic.integrations.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional. Honored when present so a retried write is de-duplicated. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"revoked":{"type":"boolean","const":true}},"required":["id","revoked"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.integrations.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/billing/offers":{"get":{"operationId":"billing.listOffers","tags":["billing"],"summary":"List purchasable offers: one-time study prices and Kinetic Pro plans.","description":"The complete, server-owned pricing surface. `study_methods` are the enabled one-time research methods with launch prices in integer cents and their methodology versions. `pro_subscription` is the Kinetic Pro subscription offer: monthly and annual prices in cents, the annual monthly-equivalent and annual savings, the seat limit, whether Pro/Workspace/scenarios are enabled, and whether checkout is currently available (with a reason when it is not). Public: no authentication required. Use these amounts before creating any checkout.\n\n**Auth:** Public — no authentication required. Present a bearer only if you already hold one.","responses":{"200":{"description":"Success."},"400":{"$ref":"#/components/responses/BadRequest"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[]}},"/v1/billing/entitlements":{"get":{"operationId":"billing.getEntitlements","tags":["billing"],"summary":"Get the account's Kinetic Pro entitlement state.","description":"Returns whether the authorized account (or, for a service account, the workspace owner it acts as) currently has Kinetic Pro: the entitlement `state`, whether it is `active`, whether the Workspace is `read_only` (had Pro, lost it), renewal/cancel and grace details, plus the pro/workspace/scenarios feature flags. Read-only.\n\n**Auth:** Requires the kinetic.billing.read scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","responses":{"200":{"description":"Success."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.billing.read"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/billing/subscription":{"get":{"operationId":"billing.getSubscription","tags":["billing"],"summary":"Get the account's Kinetic Pro subscription status.","description":"Mirrors the website subscription panel: entitlement `state`, `active`, `read_only`, `cancel_at_period_end`, billing `interval`, `current_period_end`, `workspace_id`, and the acting user's `role`. Read-only. Use before cancel/resume to decide whether a change is needed.\n\n**Auth:** Requires the kinetic.billing.read scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","responses":{"200":{"description":"Success."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.billing.read"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/billing/credits":{"get":{"operationId":"billing.getCredits","tags":["billing"],"summary":"Preview the one-use upgrade credit toward Kinetic Pro.","description":"Computes the upgrade credit the account has earned from recent net one-time study purchases inside the trailing window: `eligible_cents`, the amount that would apply to a monthly (`applied_monthly_cents`) or annual (`applied_annual_cents`) plan, the `window_days`, the `source_study_count`, and a `reason` (`ok`, `no_recent_purchases`, or `already_redeemed`, since the credit is one-use-ever). Read-only; the credit is only actually reserved when you start a Pro checkout.\n\n**Auth:** Requires the kinetic.billing.read scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","responses":{"200":{"description":"Success."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.billing.read"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/billing/checkouts/study":{"post":{"operationId":"billing.createStudyCheckout","tags":["billing"],"summary":"Start a Stripe checkout to pay for a draft study.","description":"Creates (or reuses a still-open) Stripe Checkout session for a one-time study purchase and returns `{checkout_url, study_id, amount_cents, expires_at?}` — the account holder completes payment on Stripe's hosted page in a browser. Card details never travel through this API: never collect or relay them. Over MCP the handoff arrives as a URL elicitation when your client supports it, otherwise as a structured body with `requires_user_action: true` and a `next_step`. Preconditions: the study must belong to you and be in `draft` (a paid or non-draft study fails with lifecycle_conflict), and session-method studies must have a complete, valid configuration (otherwise validation_failed). The price is the server-owned amount stamped on the study; never trust client prices. On a Stripe outage the call fails with external_dependency_failed — retry shortly. Requires an Idempotency-Key.\n\n**Auth:** Requires the kinetic.billing.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Required. A client-chosen unique key so a retried write executes at most once. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"study_id":{"type":"string"}},"required":["study_id"]}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"checkout_url":{"type":"string"},"study_id":{"type":"string"},"amount_cents":{"type":"integer"},"expires_at":{"type":"string"}},"required":["checkout_url","study_id","amount_cents"],"additionalProperties":false}}}},"201":{"description":"201 when a new resource is created.","content":{"application/json":{"schema":{"type":"object","properties":{"checkout_url":{"type":"string"},"study_id":{"type":"string"},"amount_cents":{"type":"integer"},"expires_at":{"type":"string"}},"required":["checkout_url","study_id","amount_cents"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.billing.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/billing/checkouts/pro":{"post":{"operationId":"billing.createProCheckout","tags":["billing"],"summary":"Start a Stripe checkout to subscribe to Kinetic Pro.","description":"Creates (or reuses a still-open) Stripe subscription Checkout session for Kinetic Pro and returns `{checkout_url, interval, credit_applied_cents, expires_at?}` — the workspace owner completes payment on Stripe's hosted page in a browser. Card details never travel through this API: never collect or relay them. Over MCP the handoff arrives as a URL elicitation when your client supports it, otherwise as a structured body with `requires_user_action: true` and a `next_step`. `interval` is monthly or annual; `apply_credit` (default true) reserves any eligible one-use upgrade credit as an amount-off discount on the first invoice. Owner-only: non-owners get forbidden. If Pro is disabled it reads as resource_not_found; an already-active subscription or an in-flight payment fails with lifecycle_conflict; Stripe outages surface as external_dependency_failed. Requires an Idempotency-Key.\n\n**Auth:** Requires the kinetic.billing.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Required. A client-chosen unique key so a retried write executes at most once. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"interval":{"type":"string","enum":["monthly","annual"]},"apply_credit":{"type":"boolean"}},"required":["interval"]}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"checkout_url":{"type":"string"},"interval":{"type":"string","enum":["monthly","annual"]},"credit_applied_cents":{"type":"integer"},"expires_at":{"type":"string"}},"required":["checkout_url","interval","credit_applied_cents"],"additionalProperties":false}}}},"201":{"description":"201 when a new resource is created.","content":{"application/json":{"schema":{"type":"object","properties":{"checkout_url":{"type":"string"},"interval":{"type":"string","enum":["monthly","annual"]},"credit_applied_cents":{"type":"integer"},"expires_at":{"type":"string"}},"required":["checkout_url","interval","credit_applied_cents"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.billing.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/billing/subscription/cancel":{"post":{"operationId":"billing.cancelSubscription","tags":["billing"],"summary":"Schedule the Kinetic Pro subscription to cancel at period end.","description":"Turns on cancel-at-period-end: Kinetic Pro keeps running until the current period ends, then does not renew. Owner-only. Returns the resulting subscription status (same shape as get subscription). Idempotent: if cancellation is already scheduled, the current state is returned unchanged (not an error). With no active/canceling subscription it fails with resource_not_found. Repeat-safe; an Idempotency-Key is honored when provided.\n\n**Auth:** Requires the kinetic.billing.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional. Honored when present so a retried write is de-duplicated. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"responses":{"200":{"description":"Success."},"201":{"description":"201 when a new resource is created."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.billing.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/billing/subscription/resume":{"post":{"operationId":"billing.resumeSubscription","tags":["billing"],"summary":"Undo a scheduled Kinetic Pro cancellation before it takes effect.","description":"Clears cancel-at-period-end so the subscription renews normally again. Owner-only. Returns the resulting subscription status (same shape as get subscription). Idempotent: if the subscription is not scheduled to cancel, the current state is returned unchanged (not an error). With no active subscription it fails with resource_not_found. Repeat-safe; an Idempotency-Key is honored when provided.\n\n**Auth:** Requires the kinetic.billing.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional. Honored when present so a retried write is de-duplicated. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"responses":{"200":{"description":"Success."},"201":{"description":"201 when a new resource is created."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.billing.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/methods":{"get":{"operationId":"methods.list","tags":["methods"],"summary":"List available research methods with server-owned pricing.","description":"The catalogue of study methods (Van Westendorp, Gabor-Granger, MaxDiff, choice-based conjoint) that are currently enabled, with launch prices in cents, methodology versions, and sample-size guidance. Public: no authentication required.\n\n**Auth:** Public — no authentication required. Present a bearer only if you already hold one.","responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"methods":{"type":"array","items":{"type":"object","properties":{"study_type":{"type":"string"},"title":{"type":"string"},"decision":{"type":"string"},"tagline":{"type":"string"},"price_cents":{"type":"integer"},"methodology_version":{"type":"string"},"recommended_minimum":{"type":"integer"},"strong_sample":{"type":"integer"}},"required":["study_type","title","decision","tagline","price_cents","methodology_version","recommended_minimum","strong_sample"],"additionalProperties":false}}},"required":["methods"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[]}},"/v1/methods/recommendation":{"post":{"operationId":"methods.recommend","tags":["methods"],"summary":"Recommend a research method for a pricing decision.","description":"Deterministic rules mapping the pricing decision you face to the best-fit method, with the reasoning and when to prefer an alternative. Decisions: price_range (what range will buyers accept), exact_price (which exact price to charge), feature_priorities (which features matter most), package_pricing (how to package features and price the bundle).\n\n**Auth:** Public — no authentication required. Present a bearer only if you already hold one.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"decision":{"type":"string","enum":["price_range","exact_price","feature_priorities","package_pricing"]}},"required":["decision"]}}}},"responses":{"200":{"description":"Success."},"201":{"description":"201 when a new resource is created."},"400":{"$ref":"#/components/responses/BadRequest"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[]}},"/v1":{"get":{"operationId":"help.catalogue","tags":["help"],"summary":"Orient yourself: what Kinetic Pricing offers and how to proceed.","description":"Returns what this service does, how authentication works (OAuth consent for existing accounts, agent-assisted signup for new ones), and the full capability catalogue grouped by area with the scope each one needs. Call this first.\n\n**Auth:** Public — no authentication required. Present a bearer only if you already hold one.","parameters":[{"name":"area","in":"query","required":false,"schema":{"type":"string","maxLength":60}}],"responses":{"200":{"description":"Success."},"400":{"$ref":"#/components/responses/BadRequest"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[]}},"/v1/integrations/grants":{"get":{"operationId":"integrations.listGrants","tags":["integrations"],"summary":"List the account's OAuth grants (authorized clients).","description":"Returns the active OAuth grants for the authorized account: which clients hold access, the client display name (from client metadata when available), the granted scopes, resource audiences, and created/updated/last-used times. Use a grant id with kinetic.grant_revoke to withdraw access.\n\n**Auth:** Requires the kinetic.integrations.read scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"client_id":{"type":"string"},"client_name":{"type":["string","null"]},"scopes":{"type":"array","items":{"type":"string"}},"resources":{"type":"array","items":{"type":"string"}},"created_at":{"type":"string"},"updated_at":{"type":"string"},"last_used_at":{"type":["string","null"]}},"required":["id","client_id","client_name","scopes","resources","created_at","updated_at","last_used_at"],"additionalProperties":false}}},"required":["items"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.integrations.read"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/integrations/grants/{id}":{"delete":{"operationId":"integrations.revokeGrant","tags":["integrations"],"summary":"Revoke an OAuth grant and its refresh tokens.","description":"Withdraws a client's access: the grant is marked revoked and every refresh token derived from it is revoked immediately. Already-issued access tokens are short-lived and expire naturally rather than being invalidated here. Revoking an already-revoked grant succeeds idempotently. If the grant does not exist or belongs to another account you get resource_not_found — list grants first with kinetic.grant_list to obtain a valid id.\n\n**Auth:** Requires the kinetic.integrations.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional. Honored when present so a retried write is de-duplicated. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"revoked":{"type":"boolean","const":true}},"required":["id","revoked"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.integrations.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/integrations/service-accounts":{"get":{"operationId":"integrations.listServiceAccounts","tags":["integrations"],"summary":"List the workspace's service accounts.","description":"Returns the machine credentials (service accounts) belonging to the caller's Kinetic Workspace: id, name, client_id, granted scopes, status (active/revoked/expired), and created/last-used/rotated times. Secrets and secret hashes are never returned. Requires an active Kinetic Pro workspace.\n\n**Auth:** Requires the kinetic.integrations.read scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"client_id":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"workspace_id":{"type":"string"},"created_by_user_id":{"type":"string"},"created_at":{"type":"string"},"expires_at":{"type":["string","null"]},"last_used_at":{"type":["string","null"]},"secret_rotated_at":{"type":["string","null"]},"revoked_at":{"type":["string","null"]},"status":{"type":"string","enum":["active","revoked","expired"]}},"required":["id","name","client_id","scopes","workspace_id","created_by_user_id","created_at","expires_at","last_used_at","secret_rotated_at","revoked_at","status"],"additionalProperties":false}}},"required":["items"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.integrations.read"]},{"bearer":[]},{"apiToken":[]}]},"post":{"operationId":"integrations.createServiceAccount","tags":["integrations"],"summary":"Create a workspace service account (client credentials).","description":"Provisions a machine credential for the caller's Kinetic Workspace and returns a client_id and a one-time client_secret usable at the OAuth token endpoint (client_credentials grant). The secret is shown EXACTLY ONCE — store it immediately, it cannot be retrieved later. Scopes must be a subset of the account-holder scopes an owner can grant (kinetic.full is not accepted; list explicit scopes). Owner-only: only the workspace owner via a USER token may do this — a service-account token is forbidden (privilege escalation). Requires an active Kinetic Pro workspace.\n\n**Auth:** Requires the kinetic.integrations.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Required. A client-chosen unique key so a retried write executes at most once. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"name":{"type":"string","minLength":1},"scopes":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["name","scopes"]}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"client_id":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"workspace_id":{"type":"string"},"created_by_user_id":{"type":"string"},"created_at":{"type":"string"},"expires_at":{"type":["string","null"]},"last_used_at":{"type":["string","null"]},"secret_rotated_at":{"type":["string","null"]},"revoked_at":{"type":["string","null"]},"status":{"type":"string","enum":["active","revoked","expired"]},"client_secret":{"type":"string"},"secret_note":{"type":"string"}},"required":["id","name","client_id","scopes","workspace_id","created_by_user_id","created_at","expires_at","last_used_at","secret_rotated_at","revoked_at","status","client_secret","secret_note"],"additionalProperties":false}}}},"201":{"description":"201 when a new resource is created.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"client_id":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"workspace_id":{"type":"string"},"created_by_user_id":{"type":"string"},"created_at":{"type":"string"},"expires_at":{"type":["string","null"]},"last_used_at":{"type":["string","null"]},"secret_rotated_at":{"type":["string","null"]},"revoked_at":{"type":["string","null"]},"status":{"type":"string","enum":["active","revoked","expired"]},"client_secret":{"type":"string"},"secret_note":{"type":"string"}},"required":["id","name","client_id","scopes","workspace_id","created_by_user_id","created_at","expires_at","last_used_at","secret_rotated_at","revoked_at","status","client_secret","secret_note"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.integrations.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/integrations/service-accounts/{id}/rotate":{"post":{"operationId":"integrations.rotateServiceAccount","tags":["integrations"],"summary":"Rotate a service account's secret.","description":"Issues a new client_secret for the service account and immediately invalidates the previous one. The new secret is returned EXACTLY ONCE — store it now, it cannot be retrieved later. Owner-only via a USER token; a service-account token is forbidden. If the account does not exist, is revoked, or belongs to another workspace you get resource_not_found. Requires an active Kinetic Pro workspace.\n\n**Auth:** Requires the kinetic.integrations.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Required. A client-chosen unique key so a retried write executes at most once. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"client_id":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"workspace_id":{"type":"string"},"created_by_user_id":{"type":"string"},"created_at":{"type":"string"},"expires_at":{"type":["string","null"]},"last_used_at":{"type":["string","null"]},"secret_rotated_at":{"type":["string","null"]},"revoked_at":{"type":["string","null"]},"status":{"type":"string","enum":["active","revoked","expired"]},"client_secret":{"type":"string"},"secret_note":{"type":"string"}},"required":["id","name","client_id","scopes","workspace_id","created_by_user_id","created_at","expires_at","last_used_at","secret_rotated_at","revoked_at","status","client_secret","secret_note"],"additionalProperties":false}}}},"201":{"description":"201 when a new resource is created.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"client_id":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"workspace_id":{"type":"string"},"created_by_user_id":{"type":"string"},"created_at":{"type":"string"},"expires_at":{"type":["string","null"]},"last_used_at":{"type":["string","null"]},"secret_rotated_at":{"type":["string","null"]},"revoked_at":{"type":["string","null"]},"status":{"type":"string","enum":["active","revoked","expired"]},"client_secret":{"type":"string"},"secret_note":{"type":"string"}},"required":["id","name","client_id","scopes","workspace_id","created_by_user_id","created_at","expires_at","last_used_at","secret_rotated_at","revoked_at","status","client_secret","secret_note"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.integrations.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/integrations/service-accounts/{id}":{"delete":{"operationId":"integrations.revokeServiceAccount","tags":["integrations"],"summary":"Revoke (disable) a service account.","description":"Disables the service account so it can never authenticate again. Idempotent: revoking an already-revoked account still succeeds. Owner-only via a USER token; a service-account token is forbidden. If the account does not exist or belongs to another workspace you get resource_not_found. Requires an active Kinetic Pro workspace.\n\n**Auth:** Requires the kinetic.integrations.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional. Honored when present so a retried write is de-duplicated. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"revoked":{"type":"boolean","const":true}},"required":["id","revoked"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.integrations.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/signup-attempts":{"post":{"operationId":"signup.start","tags":["signup"],"summary":"Start agent-assisted signup for a new Kinetic Pricing account.","description":"Creates a signup attempt and emails the account holder a confirmation link. Returns an attempt token (shown exactly once — store it). The account is only created after the holder clicks the link AND you call complete with terms_accepted=true. Never claim the account exists before completion succeeds. Enumeration-safe: the response never reveals whether the email already has an account.\n\n**Auth:** Public — no authentication required. Present a bearer only if you already hold one.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional. Honored when present so a retried write is de-duplicated. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"email":{"type":"string","maxLength":254},"authority_basis":{"type":"string","enum":["self","authorized_agent"]},"client_id":{"type":"string","maxLength":500}},"required":["email","authority_basis"]}}}},"responses":{"200":{"description":"Success."},"201":{"description":"201 when a new resource is created."},"400":{"$ref":"#/components/responses/BadRequest"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[]}},"/v1/signup-attempts/{id}":{"get":{"operationId":"signup.status","tags":["signup"],"summary":"Check whether the account holder confirmed a signup attempt.","description":"Requires the attempt token from kinetic.signup_start (as the bearer on REST, or as attempt_token here). A wrong token reads as not found. States: pending_verification → verified → completed (or expired).\n\n**Auth:** Bearer the opaque attempt token returned by kinetic.signup_start (Authorization: Bearer <attempt_token>), or pass attempt_token in the request. This is NOT an OAuth token; a wrong token reads as resource_not_found.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"attempt_token","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success."},"400":{"$ref":"#/components/responses/BadRequest"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[]}},"/v1/signup-attempts/{id}/complete":{"post":{"operationId":"signup.complete","tags":["signup"],"summary":"Complete a verified signup attempt (explicit terms acceptance).","description":"Only works after the account holder clicked the emailed confirmation link (state=verified). You MUST pass terms_accepted=true — this records the account holder's acceptance of the terms version returned by kinetic.signup_start. Never call this without the holder's actual consent. Idempotent: repeating it returns the same completed state.\n\n**Auth:** Bearer the opaque attempt token returned by kinetic.signup_start (Authorization: Bearer <attempt_token>), or pass attempt_token in the request. This is NOT an OAuth token; a wrong token reads as resource_not_found.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional. Honored when present so a retried write is de-duplicated. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"terms_accepted":{"type":"boolean","const":true},"attempt_token":{"type":"string"}},"required":["terms_accepted"]}}}},"responses":{"200":{"description":"Success."},"201":{"description":"201 when a new resource is created."},"400":{"$ref":"#/components/responses/BadRequest"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[]}},"/v1/tasks/{id}":{"get":{"operationId":"tasks.get","tags":["tasks"],"summary":"Poll a long-running task you started.","description":"Returns the task envelope (state: queued|running|input_required|succeeded|failed|cancelled, progress, result, error) for a task created by one of your earlier calls. Tasks are only visible to the credential that created them; anything else reads as not found. Task records expire after about 7 days and are purged on expiry. On MCP this surface also answers the tasks/get JSON-RPC method with the wire vocabulary (working|input_required|completed|failed|cancelled).\n\n**Auth:** Any valid OAuth bearer access token; resource ownership is enforced by the handler.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"bearer":[]}]}},"/v1/tasks/{id}/input":{"post":{"operationId":"tasks.update","tags":["tasks"],"summary":"Supply the input a paused task is waiting on.","description":"Continues a task in state input_required by supplying the requested input; execution resumes inline and the returned envelope is the settled task (succeeded or failed). Tasks in any other state answer lifecycle_conflict. Only the credential that created the task can update it. On MCP this surface also answers the tasks/update JSON-RPC method.\n\n**Auth:** Any valid OAuth bearer access token; resource ownership is enforced by the handler.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"object","additionalProperties":{}}},"required":["input"]}}}},"responses":{"200":{"description":"Success."},"201":{"description":"201 when a new resource is created."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"bearer":[]}]}},"/v1/tasks/{id}/cancel":{"post":{"operationId":"tasks.cancel","tags":["tasks"],"summary":"Cancel a task that has not finished.","description":"Cancels a task in state queued or input_required. Tasks execute inline on this deployment, so a task observed in state running is actively executing inside its creating request and cannot be aborted (lifecycle_conflict) — poll until it settles. Terminal tasks (succeeded, failed, cancelled) also answer lifecycle_conflict. Only the credential that created the task can cancel it. On MCP this surface also answers the tasks/cancel JSON-RPC method.\n\n**Auth:** Any valid OAuth bearer access token; resource ownership is enforced by the handler.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success."},"201":{"description":"201 when a new resource is created."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"bearer":[]}]}},"/v1/team":{"get":{"operationId":"team.get","tags":["team"],"summary":"List the workspace's team members and seat usage.","description":"Returns every non-revoked seat in the caller's Kinetic Pro workspace (owner included): id, email of accepted members, role, status, and invited/joined timestamps, plus seat_limit and seats_used. Requires an active Pro subscription. Read-only.\n\n**Auth:** Requires the kinetic.team.read scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"members":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"email":{"type":["string","null"]},"role":{"type":"string"},"status":{"type":"string"},"invited_at":{"type":"string"},"joined_at":{"type":["string","null"]},"invite_expires_at":{"type":["string","null"]}},"required":["id","user_id","email","role","status","invited_at","joined_at","invite_expires_at"],"additionalProperties":false}},"seat_limit":{"type":"integer"},"seats_used":{"type":"integer"}},"required":["members","seat_limit","seats_used"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.team.read"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/team/invitations":{"get":{"operationId":"team.listInvitations","tags":["team"],"summary":"List outstanding team invitations.","description":"Returns the pending 'invited' seats for the workspace, each with its expiry (invite_expires_at). Use kinetic.member_invite to create one and kinetic.invitation_accept to accept. Read-only.\n\n**Auth:** Requires the kinetic.team.read scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"email":{"type":["string","null"]},"role":{"type":"string"},"status":{"type":"string"},"invited_at":{"type":"string"},"joined_at":{"type":["string","null"]},"invite_expires_at":{"type":["string","null"]}},"required":["id","user_id","email","role","status","invited_at","joined_at","invite_expires_at"],"additionalProperties":false}}},"required":["items"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.team.read"]},{"bearer":[]},{"apiToken":[]}]},"post":{"operationId":"team.invite","tags":["team"],"summary":"Invite a collaborator to the workspace.","description":"Owner-only. Sends an email invitation for an editor or viewer seat. Kinetic Pro includes 3 seats total (owner included, counting outstanding invites); a full workspace returns lifecycle_conflict — remove a member first. Re-inviting a pending address refreshes that invitation. An address that already has a seat returns lifecycle_conflict. Requires an Idempotency-Key.\n\n**Auth:** Requires the kinetic.team.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Required. A client-chosen unique key so a retried write executes at most once. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"email":{"type":"string"},"role":{"type":"string","enum":["editor","viewer"]}},"required":["email","role"]}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"email":{"type":["string","null"]},"role":{"type":"string"},"status":{"type":"string"},"invited_at":{"type":"string"},"joined_at":{"type":["string","null"]},"invite_expires_at":{"type":["string","null"]}},"required":["id","user_id","email","role","status","invited_at","joined_at","invite_expires_at"],"additionalProperties":false}}}},"201":{"description":"201 when a new resource is created.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"email":{"type":["string","null"]},"role":{"type":"string"},"status":{"type":"string"},"invited_at":{"type":"string"},"joined_at":{"type":["string","null"]},"invite_expires_at":{"type":["string","null"]}},"required":["id","user_id","email","role","status","invited_at","joined_at","invite_expires_at"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.team.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/team/invitations/{token}/accept":{"post":{"operationId":"team.acceptInvitation","tags":["team"],"summary":"Accept a team invitation using its emailed token.","description":"The authenticated user accepts an invitation with the token from the invite email. Only a user token can accept (service accounts are forbidden). The caller's email must match the invited address; a wrong, expired, or already-used token returns resource_not_found. Safe to retry (replay).\n\n**Auth:** Authenticated bearer plus the emailed invitation token in the request body.","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional. Honored when present so a retried write is de-duplicated. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"email":{"type":["string","null"]},"role":{"type":"string"},"status":{"type":"string"},"invited_at":{"type":"string"},"joined_at":{"type":["string","null"]},"invite_expires_at":{"type":["string","null"]}},"required":["id","user_id","email","role","status","invited_at","joined_at","invite_expires_at"],"additionalProperties":false}}}},"201":{"description":"201 when a new resource is created.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"email":{"type":["string","null"]},"role":{"type":"string"},"status":{"type":"string"},"invited_at":{"type":"string"},"joined_at":{"type":["string","null"]},"invite_expires_at":{"type":["string","null"]}},"required":["id","user_id","email","role","status","invited_at","joined_at","invite_expires_at"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"bearer":[]}]}},"/v1/team/members/{id}":{"patch":{"operationId":"team.updateRole","tags":["team"],"summary":"Change a team member's role.","description":"Owner-only. Sets a member's role to editor or viewer. The owner row cannot be re-roled (lifecycle_conflict). A member id outside this workspace returns resource_not_found.\n\n**Auth:** Requires the kinetic.team.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"role":{"type":"string","enum":["editor","viewer"]}},"required":["role"]}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"email":{"type":["string","null"]},"role":{"type":"string"},"status":{"type":"string"},"invited_at":{"type":"string"},"joined_at":{"type":["string","null"]},"invite_expires_at":{"type":["string","null"]}},"required":["id","user_id","email","role","status","invited_at","joined_at","invite_expires_at"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.team.write"]},{"bearer":[]},{"apiToken":[]}]},"delete":{"operationId":"team.removeMember","tags":["team"],"summary":"Remove a team member from the workspace.","description":"Owner-only. Revokes a seat, freeing it for a new invite. The owner seat cannot be removed (lifecycle_conflict). Removing an already-revoked member is an idempotent success returning the current state. Safe to retry (replay).\n\n**Auth:** Requires the kinetic.team.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional. Honored when present so a retried write is de-duplicated. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"email":{"type":["string","null"]},"role":{"type":"string"},"status":{"type":"string"},"invited_at":{"type":"string"},"joined_at":{"type":["string","null"]},"invite_expires_at":{"type":["string","null"]}},"required":["id","user_id","email","role","status","invited_at","joined_at","invite_expires_at"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.team.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/teardowns":{"post":{"operationId":"teardowns.create","tags":["teardowns"],"summary":"Run a pricing-page teardown for a URL.","description":"Creates a teardown for the given pricing page URL and scores it synchronously in the same call: it fetches the page (plain HTTP, then a headless render fallback) and analyzes clarity, structure, and persuasion across the rubric dimensions. The teardown is owned by the calling account and its full report is returned unlocked. If the page cannot be read automatically (bot-blocked, login-walled, or too thin), the teardown comes back in status 'error' with details.state='needs_manual_text' — do NOT treat this as a hard failure: follow details.fix and call kinetic.teardown_manual_text with the pasted pricing text. The model provider being unavailable is an external_dependency_failed error.\n\n**Auth:** Requires the kinetic.teardown.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Required. A client-chosen unique key so a retried write executes at most once. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"url":{"type":"string","minLength":1}},"required":["url"]}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"url":{"type":["string","null"]},"status":{"type":"string"},"overall_score":{"anyOf":[{"type":"integer"},{"type":"null"}]},"dimensions":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"score":{"type":"integer"},"critique":{"type":"string"},"fix":{"type":"string"},"evidence":{"type":["string","null"]},"low_evidence":{"type":"boolean"}},"required":["name","score","critique","fix"],"additionalProperties":false}},{"type":"null"}]},"top_fixes":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"unlocked":{"type":"boolean"},"error_message":{"type":["string","null"]},"fetch_path":{"type":["string","null"]},"rubric_version":{"type":["string","null"]},"created_at":{"type":"string"},"details":{"type":"object","additionalProperties":{}}},"required":["id","url","status","overall_score","dimensions","top_fixes","unlocked","error_message","fetch_path","rubric_version","created_at"],"additionalProperties":false}}}},"201":{"description":"201 when a new resource is created.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"url":{"type":["string","null"]},"status":{"type":"string"},"overall_score":{"anyOf":[{"type":"integer"},{"type":"null"}]},"dimensions":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"score":{"type":"integer"},"critique":{"type":"string"},"fix":{"type":"string"},"evidence":{"type":["string","null"]},"low_evidence":{"type":"boolean"}},"required":["name","score","critique","fix"],"additionalProperties":false}},{"type":"null"}]},"top_fixes":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"unlocked":{"type":"boolean"},"error_message":{"type":["string","null"]},"fetch_path":{"type":["string","null"]},"rubric_version":{"type":["string","null"]},"created_at":{"type":"string"},"details":{"type":"object","additionalProperties":{}}},"required":["id","url","status","overall_score","dimensions","top_fixes","unlocked","error_message","fetch_path","rubric_version","created_at"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.teardown.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/teardowns/{id}":{"get":{"operationId":"teardowns.get","tags":["teardowns"],"summary":"Get a pricing teardown and its full report.","description":"Returns the teardown by id with its full report (the agent surface is authenticated and reports are always unlocked for their owner). Owner-only: a teardown belonging to another account reads as not found. A teardown stuck in pending/processing past the stale threshold is flipped to error automatically before it is returned.\n\n**Auth:** Requires the kinetic.teardown.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"url":{"type":["string","null"]},"status":{"type":"string"},"overall_score":{"anyOf":[{"type":"integer"},{"type":"null"}]},"dimensions":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"score":{"type":"integer"},"critique":{"type":"string"},"fix":{"type":"string"},"evidence":{"type":["string","null"]},"low_evidence":{"type":"boolean"}},"required":["name","score","critique","fix"],"additionalProperties":false}},{"type":"null"}]},"top_fixes":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"unlocked":{"type":"boolean"},"error_message":{"type":["string","null"]},"fetch_path":{"type":["string","null"]},"rubric_version":{"type":["string","null"]},"created_at":{"type":"string"},"details":{"type":"object","additionalProperties":{}}},"required":["id","url","status","overall_score","dimensions","top_fixes","unlocked","error_message","fetch_path","rubric_version","created_at"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.teardown.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/teardowns/{id}/manual-text":{"post":{"operationId":"teardowns.manualText","tags":["teardowns"],"summary":"Score a teardown from pasted pricing page text.","description":"Rescue path for a teardown that could not be read automatically (status 'error' with details.state='needs_manual_text'). Paste at least 200 characters of the pricing page's text; it replaces the failed fetch and is scored with the same analysis as an automatic run. Owner-only. If the teardown is not in an error state, its current state is returned unchanged.\n\n**Auth:** Requires the kinetic.teardown.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional. Honored when present so a retried write is de-duplicated. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"text":{"type":"string","minLength":1}},"required":["text"]}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"url":{"type":["string","null"]},"status":{"type":"string"},"overall_score":{"anyOf":[{"type":"integer"},{"type":"null"}]},"dimensions":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"score":{"type":"integer"},"critique":{"type":"string"},"fix":{"type":"string"},"evidence":{"type":["string","null"]},"low_evidence":{"type":"boolean"}},"required":["name","score","critique","fix"],"additionalProperties":false}},{"type":"null"}]},"top_fixes":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"unlocked":{"type":"boolean"},"error_message":{"type":["string","null"]},"fetch_path":{"type":["string","null"]},"rubric_version":{"type":["string","null"]},"created_at":{"type":"string"},"details":{"type":"object","additionalProperties":{}}},"required":["id","url","status","overall_score","dimensions","top_fixes","unlocked","error_message","fetch_path","rubric_version","created_at"],"additionalProperties":false}}}},"201":{"description":"201 when a new resource is created.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"url":{"type":["string","null"]},"status":{"type":"string"},"overall_score":{"anyOf":[{"type":"integer"},{"type":"null"}]},"dimensions":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"score":{"type":"integer"},"critique":{"type":"string"},"fix":{"type":"string"},"evidence":{"type":["string","null"]},"low_evidence":{"type":"boolean"}},"required":["name","score","critique","fix"],"additionalProperties":false}},{"type":"null"}]},"top_fixes":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"unlocked":{"type":"boolean"},"error_message":{"type":["string","null"]},"fetch_path":{"type":["string","null"]},"rubric_version":{"type":["string","null"]},"created_at":{"type":"string"},"details":{"type":"object","additionalProperties":{}}},"required":["id","url","status","overall_score","dimensions","top_fixes","unlocked","error_message","fetch_path","rubric_version","created_at"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.teardown.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/teardowns/{id}/unlock":{"post":{"operationId":"teardowns.unlock","tags":["teardowns"],"summary":"Ensure a teardown's full report is unlocked.","description":"Account-owned teardowns are already unlocked for their owner on this surface, so this is an idempotent no-op: it confirms ownership and returns the full report. No email is sent (the website's email-unlock gate applies only to legacy, account-less teardowns). A teardown owned by another account reads as not found.\n\n**Auth:** Requires the kinetic.teardown.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional. Honored when present so a retried write is de-duplicated. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"url":{"type":["string","null"]},"status":{"type":"string"},"overall_score":{"anyOf":[{"type":"integer"},{"type":"null"}]},"dimensions":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"score":{"type":"integer"},"critique":{"type":"string"},"fix":{"type":"string"},"evidence":{"type":["string","null"]},"low_evidence":{"type":"boolean"}},"required":["name","score","critique","fix"],"additionalProperties":false}},{"type":"null"}]},"top_fixes":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"unlocked":{"type":"boolean"},"error_message":{"type":["string","null"]},"fetch_path":{"type":["string","null"]},"rubric_version":{"type":["string","null"]},"created_at":{"type":"string"},"details":{"type":"object","additionalProperties":{}}},"required":["id","url","status","overall_score","dimensions","top_fixes","unlocked","error_message","fetch_path","rubric_version","created_at"],"additionalProperties":false}}}},"201":{"description":"201 when a new resource is created.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"url":{"type":["string","null"]},"status":{"type":"string"},"overall_score":{"anyOf":[{"type":"integer"},{"type":"null"}]},"dimensions":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"score":{"type":"integer"},"critique":{"type":"string"},"fix":{"type":"string"},"evidence":{"type":["string","null"]},"low_evidence":{"type":"boolean"}},"required":["name","score","critique","fix"],"additionalProperties":false}},{"type":"null"}]},"top_fixes":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"unlocked":{"type":"boolean"},"error_message":{"type":["string","null"]},"fetch_path":{"type":["string","null"]},"rubric_version":{"type":["string","null"]},"created_at":{"type":"string"},"details":{"type":"object","additionalProperties":{}}},"required":["id","url","status","overall_score","dimensions","top_fixes","unlocked","error_message","fetch_path","rubric_version","created_at"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.teardown.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/research":{"get":{"operationId":"research.list","tags":["research"],"summary":"List the published research reports.","description":"The public research library: every published report with its id, title, description, file size, and whether it is email-gated. Public — no authentication required. Use the id to fetch a single item or to download it.\n\n**Auth:** Public — no authentication required. Present a bearer only if you already hold one.","responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"description":{"type":"string"},"file_size_bytes":{"type":"integer"},"email_gated":{"type":"boolean"}},"required":["id","title","description","file_size_bytes","email_gated"],"additionalProperties":false}}},"required":["items"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[]}},"/v1/research/{slug}":{"get":{"operationId":"research.get","tags":["research"],"summary":"Get one published research report by id.","description":"Returns a single published research report's public metadata by its id (the library has no slug; the id is the identifier). Unpublished or unknown ids read as not found. Public — no authentication required.\n\n**Auth:** Public — no authentication required. Present a bearer only if you already hold one.","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"description":{"type":"string"},"file_size_bytes":{"type":"integer"},"email_gated":{"type":"boolean"}},"required":["id","title","description","file_size_bytes","email_gated"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[]}},"/v1/research/{slug}/download":{"post":{"operationId":"research.download","tags":["research"],"summary":"Download a published research report.","description":"Authenticated equivalent of the website download: the calling account is treated as a verified lead (the download is stamped like a signed-in website download). For small reports (< 5 MB) the PDF is returned inline as { download: { content_type: 'application/pdf', encoding: 'base64', data } }. Larger reports return { download: null, download_url: null, note } because this surface has no signed-URL primitive and inlining megabytes of base64 is unreasonable — fetch those from the website research page. Unpublished or unknown ids read as not found; a missing storage object is an external_dependency_failed error.\n\n**Auth:** Requires the kinetic.research.read scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional. Honored when present so a retried write is de-duplicated. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"file_size_bytes":{"type":"integer"},"download":{"anyOf":[{"type":"object","properties":{"content_type":{"type":"string","const":"application/pdf"},"encoding":{"type":"string","const":"base64"},"data":{"type":"string"}},"required":["content_type","encoding","data"],"additionalProperties":false},{"type":"null"}]},"download_url":{"type":["string","null"]},"note":{"type":"string"}},"required":["id","title","file_size_bytes","download","download_url"],"additionalProperties":false}}}},"201":{"description":"201 when a new resource is created.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"file_size_bytes":{"type":"integer"},"download":{"anyOf":[{"type":"object","properties":{"content_type":{"type":"string","const":"application/pdf"},"encoding":{"type":"string","const":"base64"},"data":{"type":"string"}},"required":["content_type","encoding","data"],"additionalProperties":false},{"type":"null"}]},"download_url":{"type":["string","null"]},"note":{"type":"string"}},"required":["id","title","file_size_bytes","download","download_url"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.research.read"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/studies/{id}/results":{"get":{"operationId":"results.get","tags":["results"],"summary":"Get the deterministic analysis results for a study.","description":"Returns the computed, snapshot-backed analysis for a study you own: price points, curves, importances, or utilities depending on the method, plus the confidence level, sample guidance, and valid-response count. Numbers come from the append-only analysis snapshot — the same figures the website results page shows. Preconditions: the study must have at least its method's developing-threshold of valid responses (15 for Van Westendorp/Gabor-Granger and legacy studies, 30 for MaxDiff, 50 for conjoint); if not, you get lifecycle_conflict with a fix hint telling you how many more responses to collect. A missing or foreign study reads as resource_not_found.\n\n**Auth:** Requires the kinetic.results.read scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.results.read"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/studies/{id}/narrative":{"get":{"operationId":"results.getNarrative","tags":["results"],"summary":"Get the current written narrative for a study's results.","description":"Returns the latest LLM-written markdown narrative for a study you own (narrative_md), with its version and generation time, or nulls when no narrative has been generated yet. To create or refresh one, call kinetic.narrative_generate. A missing or foreign study reads as resource_not_found.\n\n**Auth:** Requires the kinetic.results.read scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.results.read"]},{"bearer":[]},{"apiToken":[]}]},"post":{"operationId":"results.generateNarrative","tags":["results"],"summary":"Generate (or regenerate) the written narrative for a study's results.","description":"Computes the deterministic result, then asks the narrative model to write a fresh markdown report grounded strictly in those numbers, and appends it as a new report version. Preconditions: the study needs enough valid responses (same thresholds as kinetic.results_get) or you get lifecycle_conflict with a fix hint. If the model is unavailable or fails, you get external_dependency_failed (retryable) — retry shortly. A missing or foreign study reads as resource_not_found.\n\n**Auth:** Requires the kinetic.studies.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success."},"201":{"description":"201 when a new resource is created."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.studies.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/studies/{id}/evidence":{"get":{"operationId":"results.getEvidence","tags":["results"],"summary":"Get the structured decision evidence composed from a study's results.","description":"Returns the evidence bundle the website results page composes from the current analysis snapshot and its statistics: the method core, per-segment slices, data-quality summary, sample guidance, confidence level, and documented limitations. Session-method studies (Van Westendorp vw-2, Gabor-Granger, MaxDiff, conjoint) only; legacy vw-1 studies return lifecycle_conflict pointing you to kinetic.results_get. Same response thresholds and not-found rules as kinetic.results_get.\n\n**Auth:** Requires the kinetic.results.read scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.results.read"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/studies/{id}/exports/csv":{"post":{"operationId":"results.exportCsv","tags":["results"],"summary":"Export a study's raw responses or computed results as CSV.","description":"Returns a CSV export inline as { kind, filename, content_type, csv }. Set \"kind\" to \"responses\" for the raw per-respondent response table, or \"results\" for the computed-results table (price points / curves / importances / utilities). The bytes match the website export exactly. Results exports need at least 5 valid responses or you get lifecycle_conflict with a fix hint. If the CSV exceeds ~2MB it is too large to return inline: csv is null and a note explains to download it from the website instead. Requires an Idempotency-Key. A missing or foreign study reads as resource_not_found.\n\n**Auth:** Requires the kinetic.results.export scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Required. A client-chosen unique key so a retried write executes at most once. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"kind":{"type":"string","enum":["responses","results"]}},"required":["kind"]}}}},"responses":{"200":{"description":"Success."},"201":{"description":"201 when a new resource is created."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.results.export"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/workspace/cohorts":{"get":{"operationId":"workspace.listCohorts","tags":["workspace"],"summary":"List this workspace's cohorts with their tagged share links.","description":"Cohorts group tagged respondent share links across studies so you can compare audiences. Returns the newest 100 cohorts (each with its links). Requires an active Kinetic Pro workspace; if you get entitlement_required, complete a Pro checkout first.\n\n**Auth:** Requires the kinetic.workspace.read scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","responses":{"200":{"description":"Success."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.workspace.read"]},{"bearer":[]},{"apiToken":[]}]},"post":{"operationId":"workspace.createCohort","tags":["workspace"],"summary":"Create a cohort to group tagged share links.","description":"Creates a named cohort in the caller's workspace. Add tagged study share links to it with kinetic.cohort_link_create. Requires a writable Kinetic Pro workspace seat. Send an Idempotency-Key to make retries safe.\n\n**Auth:** Requires the kinetic.workspace.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Required. A client-chosen unique key so a retried write executes at most once. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"name":{"type":"string","minLength":1,"maxLength":120},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]}},"required":["name"]}}}},"responses":{"200":{"description":"Success."},"201":{"description":"201 when a new resource is created."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.workspace.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/workspace/cohorts/{cohortId}/links":{"post":{"operationId":"workspace.createCohortLink","tags":["workspace"],"summary":"Mint a tagged share link for a study under a cohort.","description":"Adds a study share link (with an optional label) to a cohort. The study must belong to the workspace owner. Fails with lifecycle_conflict if the cohort is archived, or resource_not_found if the cohort or study is not in this workspace. Requires a writable Pro seat; send an Idempotency-Key.\n\n**Auth:** Requires the kinetic.workspace.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"cohortId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Required. A client-chosen unique key so a retried write executes at most once. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"studyId":{"type":"string"},"label":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}]}},"required":["studyId"]}}}},"responses":{"200":{"description":"Success."},"201":{"description":"201 when a new resource is created."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.workspace.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/workspace/cohorts/{cohortId}/archive":{"post":{"operationId":"workspace.archiveCohort","tags":["workspace"],"summary":"Archive a cohort (links stop resolving; history kept).","description":"Archives a cohort so its links stop resolving while history is preserved. Idempotent: re-archiving an already-archived cohort simply refreshes its archived-at timestamp and succeeds. Returns resource_not_found if the cohort is not in this workspace. Requires a writable Pro seat.\n\n**Auth:** Requires the kinetic.workspace.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"cohortId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional. Honored when present so a retried write is de-duplicated. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"responses":{"200":{"description":"Success."},"201":{"description":"201 when a new resource is created."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.workspace.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/workspace/series":{"get":{"operationId":"workspace.listSeries","tags":["workspace"],"summary":"List study series with their waves.","description":"A study series tracks the same pricing question over time — each wave is a study using one shared method. Returns the newest 100 series, each with its ordered waves (wave number, study id, name, and status). Requires an active Kinetic Pro workspace.\n\n**Auth:** Requires the kinetic.workspace.read scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","responses":{"200":{"description":"Success."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.workspace.read"]},{"bearer":[]},{"apiToken":[]}]},"post":{"operationId":"workspace.createSeries","tags":["workspace"],"summary":"Create a study series (one question, one method).","description":"Creates a series pinned to a single research method. Optionally seed it with firstStudyId as wave 1 — that study must belong to the workspace owner and use the same method (else lifecycle_conflict). Requires a writable Pro seat; send an Idempotency-Key.\n\n**Auth:** Requires the kinetic.workspace.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Required. A client-chosen unique key so a retried write executes at most once. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"name":{"type":"string","minLength":1,"maxLength":160},"question":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"method":{"type":"string"},"reviewCadence":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}]},"firstStudyId":{"type":["string","null"]}},"required":["name","method"]}}}},"responses":{"200":{"description":"Success."},"201":{"description":"201 when a new resource is created."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.workspace.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/workspace/series/{seriesId}/waves":{"post":{"operationId":"workspace.addSeriesWave","tags":["workspace"],"summary":"Attach a study as the next wave in a series.","description":"Appends a study as the next wave. The study must belong to the workspace owner and use the SAME method as the series (else lifecycle_conflict). A study can appear at most once per series (duplicate attach → lifecycle_conflict). Requires a writable Pro seat; send an Idempotency-Key.\n\n**Auth:** Requires the kinetic.workspace.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"seriesId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Required. A client-chosen unique key so a retried write executes at most once. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"studyId":{"type":"string"}},"required":["studyId"]}}}},"responses":{"200":{"description":"Success."},"201":{"description":"201 when a new resource is created."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.workspace.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/workspace/decisions":{"get":{"operationId":"workspace.listDecisions","tags":["workspace"],"summary":"List decision records visible to the caller.","description":"Decision records capture what you decided from a study or scenario. NOT gated on Kinetic Pro: any study purchaser sees their own personal decisions. When the caller has a workspace, its shared decisions are included too. Returns the newest 200.\n\n**Auth:** Requires the kinetic.workspace.read scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","responses":{"200":{"description":"Success."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.workspace.read"]},{"bearer":[]},{"apiToken":[]}]},"post":{"operationId":"workspace.createDecision","tags":["workspace"],"summary":"Record a pricing decision (works without Pro for study owners).","description":"Records a decision linked to a study OR a scenario (at least one required). Study links require you to own the study. Scenario links require an active Kinetic Pro workspace seat (else entitlement_required); when a scenarioRunId is given, the modeled projection is frozen from that immutable run. If you have a writable workspace the decision attaches to it, otherwise it is personal. Send an Idempotency-Key.\n\n**Auth:** Requires the kinetic.workspace.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Required. A client-chosen unique key so a retried write executes at most once. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"title":{"type":"string","minLength":1,"maxLength":200},"actionType":{"type":"string","enum":["price_change","new_tier","packaging_change","no_change","other"]},"decision":{"type":"object","additionalProperties":{}},"reason":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"studyId":{"type":["string","null"]},"scenarioId":{"type":["string","null"]},"scenarioRunId":{"type":["string","null"]},"calcRecommendation":{"anyOf":[{"type":"object","additionalProperties":{}},{"type":"null"}]},"effectiveDate":{"type":["string","null"]},"reviewAt":{"type":["string","null"]}},"required":["title","actionType","decision"]}}}},"responses":{"200":{"description":"Success."},"201":{"description":"201 when a new resource is created."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.workspace.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/workspace/decisions/{decisionId}":{"get":{"operationId":"workspace.getDecision","tags":["workspace"],"summary":"Get one decision with its outcome check-ins.","description":"Returns a decision (frozen calc recommendation / modeled projection included) plus its outcome check-ins, newest first. Visible to the decision's creator, owner, or workspace members. Returns resource_not_found otherwise. The response carries an ETag; pass it as If-Match when updating.\n\n**Auth:** Requires the kinetic.workspace.read scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"decisionId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.workspace.read"]},{"bearer":[]},{"apiToken":[]}]},"patch":{"operationId":"workspace.updateDecision","tags":["workspace"],"summary":"Update owner-decision fields or status (frozen copies never change).","description":"Patches a decision's title, decision body, reason, status, effective date, or review date. Frozen copies (calc recommendation, modeled projection) can never change. Requires edit rights (creator/owner, or a writable workspace seat) else forbidden. Supports If-Match: pass the ETag from kinetic.decision_get to avoid clobbering concurrent edits.\n\n**Auth:** Requires the kinetic.workspace.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"decisionId","in":"path","required":true,"schema":{"type":"string"}},{"name":"If-Match","in":"header","required":false,"description":"Strong ETag from the matching read. When present, the write only proceeds if the resource is unchanged; otherwise fails version_conflict (412). Re-read and retry.","schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"title":{"type":"string","minLength":1,"maxLength":200},"decision":{"type":"object","additionalProperties":{}},"reason":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"effectiveDate":{"type":["string","null"]},"reviewAt":{"type":["string","null"]},"status":{"type":"string","enum":["planned","effective","review_due","reviewed","reversed"]}}}}}},"responses":{"200":{"description":"Success.","headers":{"ETag":{"description":"Strong ETag; pass it as If-Match on the next write.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.workspace.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/workspace/decisions/{decisionId}/outcomes":{"post":{"operationId":"workspace.createOutcome","tags":["workspace"],"summary":"Add an observational outcome check-in to a decision.","description":"Appends an append-only outcome check-in (observedAt + an aggregates-only, non-empty metrics object + optional note) to a decision. If the decision was review_due, recording an outcome moves it to reviewed. Requires edit rights (else forbidden). Send an Idempotency-Key.\n\n**Auth:** Requires the kinetic.workspace.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"decisionId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Required. A client-chosen unique key so a retried write executes at most once. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"observedAt":{"type":"string"},"metrics":{"type":"object","additionalProperties":{}},"note":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]}},"required":["observedAt","metrics"]}}}},"responses":{"200":{"description":"Success."},"201":{"description":"201 when a new resource is created."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.workspace.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/workspace/reminders":{"get":{"operationId":"workspace.listReminders","tags":["workspace"],"summary":"List the caller's workspace reminders.","description":"Reminders are owner-chosen (never automatic) nudges for a scenario review, a series wave, or a decision review. Returns the caller's newest 100 reminders in this workspace, by due date. Requires an active Kinetic Pro workspace.\n\n**Auth:** Requires the kinetic.workspace.read scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","responses":{"200":{"description":"Success."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.workspace.read"]},{"bearer":[]},{"apiToken":[]}]},"post":{"operationId":"workspace.createReminder","tags":["workspace"],"summary":"Create an owner-chosen reminder (never automatic).","description":"Schedules a reminder of kind scenario_review, series_wave, or decision_review, due in the future, targeting a record that lives in this workspace (else resource_not_found). Duplicate (same kind + target + due time) → lifecycle_conflict. Requires a writable Pro seat; send an Idempotency-Key.\n\n**Auth:** Requires the kinetic.workspace.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Required. A client-chosen unique key so a retried write executes at most once. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"kind":{"type":"string","enum":["scenario_review","series_wave","decision_review"]},"targetId":{"type":"string"},"dueAt":{"type":"string"}},"required":["kind","targetId","dueAt"]}}}},"responses":{"200":{"description":"Success."},"201":{"description":"201 when a new resource is created."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.workspace.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/workspace/reminders/{reminderId}/cancel":{"post":{"operationId":"workspace.cancelReminder","tags":["workspace"],"summary":"Cancel a pending reminder.","description":"Cancels one of the caller's pending reminders (not yet sent, not already canceled). Idempotency mode replay: an Idempotency-Key is optional but honored. Returns resource_not_found if the reminder is missing, already sent, or already canceled. Requires an active Kinetic Pro workspace.\n\n**Auth:** Requires the kinetic.workspace.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"reminderId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional. Honored when present so a retried write is de-duplicated. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"responses":{"200":{"description":"Success."},"201":{"description":"201 when a new resource is created."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.workspace.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/workspace":{"get":{"operationId":"workspace.get","tags":["workspace"],"summary":"Get the Kinetic Workspace with role, entitlement, and counts.","description":"Returns the caller's workspace profile, their role (owner/editor/viewer), the owner's Kinetic Pro entitlement summary, activity counts (scenarios, decisions, studies, active members), and the latest plan and metric snapshots. Requires an active or read-only Pro history; otherwise fails entitlement_required with a checkout hint. Returns an ETag you can pass as If-Match to kinetic.workspace_update.\n\n**Auth:** Requires the kinetic.workspace.read scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","responses":{"200":{"description":"Success."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.workspace.read"]},{"bearer":[]},{"apiToken":[]}]},"patch":{"operationId":"workspace.update","tags":["workspace"],"summary":"Update the Kinetic Workspace profile.","description":"Patches workspace profile fields the owner controls: name, company_name, product_names, business_model, value_metric, currency (3-letter code), report_brand_name, and complete_onboarding (set true once to fire the one-time onboarding conversion). Requires a writing role and active Pro. Send If-Match with the ETag from kinetic.workspace_get for optimistic concurrency; on version_conflict re-read and retry. Returns the refreshed bundle and a new ETag.\n\n**Auth:** Requires the kinetic.workspace.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"If-Match","in":"header","required":false,"description":"Strong ETag from the matching read. When present, the write only proceeds if the resource is unchanged; otherwise fails version_conflict (412). Re-read and retry.","schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"name":{"type":"string","minLength":1,"maxLength":200},"company_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"product_names":{"type":"array","items":{"type":"string","maxLength":200},"maxItems":50},"business_model":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"value_metric":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"currency":{"type":"string","minLength":3,"maxLength":3},"report_brand_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"complete_onboarding":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Success.","headers":{"ETag":{"description":"Strong ETag; pass it as If-Match on the next write.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.workspace.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/workspace/studies":{"get":{"operationId":"workspace.listStudies","tags":["workspace"],"summary":"List the workspace owner's studies with completed-response counts.","description":"Returns the studies visible to this workspace (the owner's studies), newest first, each with status, method, public_token, paid_at, entitlement_source, pro_subscription_id, and response_count (completed sessions). Use these study ids and their analysis snapshots as evidence for scenarios via kinetic.evidence_link.\n\n**Auth:** Requires the kinetic.workspace.read scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","responses":{"200":{"description":"Success."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.workspace.read"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/workspace/plan-snapshots":{"get":{"operationId":"workspace.listPlanSnapshots","tags":["workspace"],"summary":"List plan snapshots, newest version first.","description":"Returns up to 50 append-only plan snapshots for the workspace, newest version first. Each snapshot pins a versioned set of plans (integer cents / basis points) effective at a point in time. Create new versions with kinetic.plan_snapshot_create.\n\n**Auth:** Requires the kinetic.workspace.read scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","responses":{"200":{"description":"Success."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.workspace.read"]},{"bearer":[]},{"apiToken":[]}]},"post":{"operationId":"workspace.createPlanSnapshot","tags":["workspace"],"summary":"Append a new plan snapshot version.","description":"Appends an immutable plan snapshot (source=owner) with the next version allocated under a row lock. plans must be a non-empty array of objects, each with a non-empty name; every number anywhere in the payload must be a safe integer (cents / basis points), else validation_failed names the offending path. effective_at is an ISO date-time. Requires a writing role, active Pro, and an Idempotency-Key.\n\n**Auth:** Requires the kinetic.workspace.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Required. A client-chosen unique key so a retried write executes at most once. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"plans":{"type":"array","items":{"type":"object","additionalProperties":{}},"minItems":1,"maxItems":50},"effective_at":{"type":"string"},"note":{"type":"string","maxLength":500}},"required":["plans","effective_at"]}}}},"responses":{"200":{"description":"Success."},"201":{"description":"201 when a new resource is created."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.workspace.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/workspace/metric-snapshots":{"get":{"operationId":"workspace.listMetricSnapshots","tags":["workspace"],"summary":"List metric snapshots, newest month/version first.","description":"Returns up to 60 append-only metric snapshots for the workspace, newest effective_month and version first. Each snapshot pins the workspace's monthly business metrics (integer cents / basis points). Create new versions with kinetic.metric_snapshot_create.\n\n**Auth:** Requires the kinetic.workspace.read scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","responses":{"200":{"description":"Success."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.workspace.read"]},{"bearer":[]},{"apiToken":[]}]},"post":{"operationId":"workspace.createMetricSnapshot","tags":["workspace"],"summary":"Append a metric snapshot for a month.","description":"Appends an immutable metric snapshot (source=owner) for a month, with the next version for that month allocated under a row lock. effective_month must be the first day of a month (YYYY-MM-01). metrics must be a non-empty object; every number anywhere must be a safe integer (cents / basis points), else validation_failed names the offending path. Requires a writing role, active Pro, and an Idempotency-Key.\n\n**Auth:** Requires the kinetic.workspace.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Required. A client-chosen unique key so a retried write executes at most once. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"effective_month":{"type":"string"},"metrics":{"type":"object","additionalProperties":{}},"note":{"type":"string","maxLength":500}},"required":["effective_month","metrics"]}}}},"responses":{"200":{"description":"Success."},"201":{"description":"201 when a new resource is created."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.workspace.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/workspace/scenarios":{"get":{"operationId":"workspace.listScenarios","tags":["workspace"],"summary":"List revenue scenarios with their latest run summary.","description":"Returns up to 100 scenarios for the workspace, newest updated first, each with its latest run summary. Archived scenarios are excluded unless include_archived=true. Fails resource_not_found when revenue scenarios are disabled for this deployment.\n\n**Auth:** Requires the kinetic.workspace.read scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"include_archived","in":"query","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Success."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.workspace.read"]},{"bearer":[]},{"apiToken":[]}]},"post":{"operationId":"workspace.createScenario","tags":["workspace"],"summary":"Create a revenue scenario container.","description":"Creates an empty scenario (status=draft) with a required name and an optional 3-letter currency (defaults to the workspace currency). Run it with kinetic.scenario_run to append the first version. Requires a writing role, active Pro, and an Idempotency-Key.\n\n**Auth:** Requires the kinetic.workspace.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Required. A client-chosen unique key so a retried write executes at most once. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"name":{"type":"string","minLength":1,"maxLength":160},"currency":{"type":"string","minLength":3,"maxLength":3}},"required":["name"]}}}},"responses":{"200":{"description":"Success."},"201":{"description":"201 when a new resource is created."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.workspace.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/workspace/scenarios/{id}":{"get":{"operationId":"workspace.getScenario","tags":["workspace"],"summary":"Get a scenario with its runs and evidence links.","description":"Returns one scenario (with its latest run), up to 25 recent runs, and all evidence links. Unknown or cross-tenant ids read as resource_not_found. Returns an ETag you can pass as If-Match to kinetic.scenario_update.\n\n**Auth:** Requires the kinetic.workspace.read scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.workspace.read"]},{"bearer":[]},{"apiToken":[]}]},"patch":{"operationId":"workspace.updateScenario","tags":["workspace"],"summary":"Rename, restatus, or archive/unarchive a scenario.","description":"Patches a scenario's name, status (draft|ready|approved|launched|review_due|reviewed|reversed), or archived flag (true archives, false unarchives). Unknown or cross-tenant ids read as resource_not_found. Send If-Match with the ETag from kinetic.scenario_get; on version_conflict re-read and retry. Requires a writing role and active Pro.\n\n**Auth:** Requires the kinetic.workspace.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"If-Match","in":"header","required":false,"description":"Strong ETag from the matching read. When present, the write only proceeds if the resource is unchanged; otherwise fails version_conflict (412). Re-read and retry.","schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"name":{"type":"string","minLength":1,"maxLength":160},"status":{"type":"string","enum":["draft","ready","approved","launched","review_due","reviewed","reversed"]},"archived":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Success.","headers":{"ETag":{"description":"Strong ETag; pass it as If-Match on the next write.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.workspace.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/workspace/scenarios/{id}/archive":{"post":{"operationId":"workspace.archiveScenario","tags":["workspace"],"summary":"Archive a scenario (idempotent).","description":"Archives a scenario by setting its archived_at timestamp if not already archived; archived scenarios are excluded from kinetic.scenario_list unless include_archived=true. Idempotent: re-archiving an already-archived scenario returns the same object. Unknown or cross-tenant ids read as resource_not_found. Unarchive via kinetic.scenario_update with archived=false. Requires a writing role and active Pro.\n\n**Auth:** Requires the kinetic.workspace.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional. Honored when present so a retried write is de-duplicated. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"responses":{"200":{"description":"Success."},"201":{"description":"201 when a new resource is created."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.workspace.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/workspace/scenarios/{id}/runs":{"post":{"operationId":"workspace.runScenario","tags":["workspace"],"summary":"Run the deterministic engine and append an immutable run.","description":"Executes the revenue-scenario engine on your full ScenarioInput (integer cents / basis points; validated server-side) and appends an immutable run with the next version and the pinned engine_version. Optional plan_snapshot_id / metric_snapshot_id must belong to this workspace; when omitted the latest of each is pinned automatically. Archived scenarios fail lifecycle_conflict (unarchive first). Bad engine inputs fail validation_failed with the offending field. Requires a writing role, active Pro, and an Idempotency-Key.\n\n**Auth:** Requires the kinetic.workspace.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Required. A client-chosen unique key so a retried write executes at most once. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"label":{"type":"string","maxLength":160},"inputs":{"type":"object","additionalProperties":{}},"plan_snapshot_id":{"type":["string","null"]},"metric_snapshot_id":{"type":["string","null"]}},"required":["inputs"]}}}},"responses":{"200":{"description":"Success."},"201":{"description":"201 when a new resource is created."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.workspace.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/workspace/evidence-links":{"post":{"operationId":"workspace.linkEvidence","tags":["workspace"],"summary":"Link a study claim to a scenario assumption.","description":"Attaches an evidence link binding a claim from one of the workspace owner's studies (via an immutable analysis snapshot of THAT study) to a scenario assumption. scenario_id, study_id, snapshot_id, and claim (with a string claim.assumptionKey) are required; optional cohort_id must belong to this workspace. Cross-tenant study/snapshot ids read as resource_not_found. Requires a writing role, active Pro, and an Idempotency-Key.\n\n**Auth:** Requires the kinetic.workspace.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Required. A client-chosen unique key so a retried write executes at most once. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"scenario_id":{"type":"string"},"study_id":{"type":"string"},"snapshot_id":{"type":"string"},"claim":{"type":"object","additionalProperties":{}},"cohort_id":{"type":["string","null"]}},"required":["scenario_id","study_id","snapshot_id","claim"]}}}},"responses":{"200":{"description":"Success."},"201":{"description":"201 when a new resource is created."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.workspace.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/workspace/evidence-links/{id}":{"delete":{"operationId":"workspace.unlinkEvidence","tags":["workspace"],"summary":"Delete a scenario evidence link.","description":"Removes an evidence link by id within the caller's workspace and returns { deleted: true }. Unknown or cross-tenant ids read as resource_not_found. Safe to repeat with the same Idempotency-Key. Requires a writing role and active Pro.\n\n**Auth:** Requires the kinetic.workspace.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional. Honored when present so a retried write is de-duplicated. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"responses":{"200":{"description":"Success."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.workspace.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/studies":{"get":{"operationId":"studies.list","tags":["studies"],"summary":"List the account's studies.","description":"Returns every study owned by the calling account, oldest first, each with its full setup, lifecycle status (draft/live/closed), pricing, public token, and archive state. Use this to find a study id before reading, editing, launching, or closing it.\n\n**Auth:** Requires the kinetic.studies.read scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"},"name":{"type":"string"},"product_desc":{"type":"string"},"segment_desc":{"type":"string"},"decision_type":{"type":"string"},"currency":{"type":"string"},"current_prices":{"type":["string","null"]},"website_url":{"type":["string","null"]},"gather_audience_info":{"type":"boolean"},"brand_voice":{"type":["string","null"]},"methodology":{"type":"string"},"methodology_version":{"type":"string"},"method_config":{},"price_cents":{"anyOf":[{"type":"integer"},{"type":"null"}]},"entitlement_source":{"type":["string","null"]},"status":{"type":"string"},"survey_config":{},"public_token":{"type":["string","null"]},"paid_at":{"type":["string","null"]},"category_tag":{"type":["string","null"]},"created_at":{"type":"string"},"closed_at":{"type":["string","null"]},"archived_at":{"type":["string","null"]}},"required":["id","user_id","name","product_desc","segment_desc","decision_type","currency","current_prices","website_url","gather_audience_info","brand_voice","methodology","methodology_version","price_cents","entitlement_source","status","public_token","paid_at","category_tag","created_at","closed_at","archived_at"],"additionalProperties":false}}},"required":["items"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.studies.read"]},{"bearer":[]},{"apiToken":[]}]},"post":{"operationId":"studies.create","tags":["studies"],"summary":"Create a draft study.","description":"Creates a new draft study. Pricing, methodology version, and the per-respondent design seed are server-owned and stamped at creation — never pass them. methodology defaults to van_westendorp; other methods must be enabled server-side (entitlement_required if not). After creating, generate its survey with kinetic.survey_regenerate, then launch with kinetic.study_launch. Requires an Idempotency-Key.\n\n**Auth:** Requires the kinetic.studies.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Required. A client-chosen unique key so a retried write executes at most once. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"name":{"type":"string","minLength":1},"product_desc":{"type":"string","minLength":1},"segment_desc":{"type":"string","minLength":1},"decision_type":{"type":"string","enum":["underpriced","new_tier","first_time","other"]},"currency":{"type":"string","minLength":1,"description":"ISO 4217 currency code, e.g. USD."},"current_prices":{"type":["string","null"]},"category_tag":{"type":["string","null"]},"website_url":{"type":["string","null"]},"gather_audience_info":{"type":"boolean","description":"Include a short 'about you' audience section before the pricing questions."},"brand_voice":{"type":["string","null"]},"methodology":{"type":"string","enum":["van_westendorp","gabor_granger","maxdiff","conjoint"]}},"required":["name","product_desc","segment_desc","decision_type","currency"]}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"},"name":{"type":"string"},"product_desc":{"type":"string"},"segment_desc":{"type":"string"},"decision_type":{"type":"string"},"currency":{"type":"string"},"current_prices":{"type":["string","null"]},"website_url":{"type":["string","null"]},"gather_audience_info":{"type":"boolean"},"brand_voice":{"type":["string","null"]},"methodology":{"type":"string"},"methodology_version":{"type":"string"},"method_config":{},"price_cents":{"anyOf":[{"type":"integer"},{"type":"null"}]},"entitlement_source":{"type":["string","null"]},"status":{"type":"string"},"survey_config":{},"public_token":{"type":["string","null"]},"paid_at":{"type":["string","null"]},"category_tag":{"type":["string","null"]},"created_at":{"type":"string"},"closed_at":{"type":["string","null"]},"archived_at":{"type":["string","null"]}},"required":["id","user_id","name","product_desc","segment_desc","decision_type","currency","current_prices","website_url","gather_audience_info","brand_voice","methodology","methodology_version","price_cents","entitlement_source","status","public_token","paid_at","category_tag","created_at","closed_at","archived_at"],"additionalProperties":false}}}},"201":{"description":"201 when a new resource is created.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"},"name":{"type":"string"},"product_desc":{"type":"string"},"segment_desc":{"type":"string"},"decision_type":{"type":"string"},"currency":{"type":"string"},"current_prices":{"type":["string","null"]},"website_url":{"type":["string","null"]},"gather_audience_info":{"type":"boolean"},"brand_voice":{"type":["string","null"]},"methodology":{"type":"string"},"methodology_version":{"type":"string"},"method_config":{},"price_cents":{"anyOf":[{"type":"integer"},{"type":"null"}]},"entitlement_source":{"type":["string","null"]},"status":{"type":"string"},"survey_config":{},"public_token":{"type":["string","null"]},"paid_at":{"type":["string","null"]},"category_tag":{"type":["string","null"]},"created_at":{"type":"string"},"closed_at":{"type":["string","null"]},"archived_at":{"type":["string","null"]}},"required":["id","user_id","name","product_desc","segment_desc","decision_type","currency","current_prices","website_url","gather_audience_info","brand_voice","methodology","methodology_version","price_cents","entitlement_source","status","public_token","paid_at","category_tag","created_at","closed_at","archived_at"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.studies.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/studies/{id}":{"get":{"operationId":"studies.get","tags":["studies"],"summary":"Get one study by id.","description":"Returns the full study by id, including its survey/method configuration and lifecycle status. Owner-only: a study that does not exist or belongs to another account reads as not_found (existence is never leaked).\n\n**Auth:** Requires the kinetic.studies.read scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"},"name":{"type":"string"},"product_desc":{"type":"string"},"segment_desc":{"type":"string"},"decision_type":{"type":"string"},"currency":{"type":"string"},"current_prices":{"type":["string","null"]},"website_url":{"type":["string","null"]},"gather_audience_info":{"type":"boolean"},"brand_voice":{"type":["string","null"]},"methodology":{"type":"string"},"methodology_version":{"type":"string"},"method_config":{},"price_cents":{"anyOf":[{"type":"integer"},{"type":"null"}]},"entitlement_source":{"type":["string","null"]},"status":{"type":"string"},"survey_config":{},"public_token":{"type":["string","null"]},"paid_at":{"type":["string","null"]},"category_tag":{"type":["string","null"]},"created_at":{"type":"string"},"closed_at":{"type":["string","null"]},"archived_at":{"type":["string","null"]}},"required":["id","user_id","name","product_desc","segment_desc","decision_type","currency","current_prices","website_url","gather_audience_info","brand_voice","methodology","methodology_version","price_cents","entitlement_source","status","public_token","paid_at","category_tag","created_at","closed_at","archived_at"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.studies.read"]},{"bearer":[]},{"apiToken":[]}]},"patch":{"operationId":"studies.update","tags":["studies"],"summary":"Edit a draft study.","description":"Updates fields on a DRAFT study; only provided fields change. Draft-only: editing a live/closed study fails with lifecycle_conflict (details.fix suggests duplicating it). method_config is accepted only for session-method studies and is validated server-side (validation_failed with per-field errors otherwise).\n\n**Auth:** Requires the kinetic.studies.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"name":{"type":["string","null"]},"product_desc":{"type":["string","null"]},"segment_desc":{"type":["string","null"]},"decision_type":{"anyOf":[{"type":"string","enum":["underpriced","new_tier","first_time","other"]},{"type":"null"}]},"currency":{"type":["string","null"]},"current_prices":{"type":["string","null"]},"category_tag":{"type":["string","null"]},"website_url":{"type":["string","null"]},"gather_audience_info":{"type":["boolean","null"]},"brand_voice":{"type":["string","null"]},"survey_config":{},"method_config":{}}}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"},"name":{"type":"string"},"product_desc":{"type":"string"},"segment_desc":{"type":"string"},"decision_type":{"type":"string"},"currency":{"type":"string"},"current_prices":{"type":["string","null"]},"website_url":{"type":["string","null"]},"gather_audience_info":{"type":"boolean"},"brand_voice":{"type":["string","null"]},"methodology":{"type":"string"},"methodology_version":{"type":"string"},"method_config":{},"price_cents":{"anyOf":[{"type":"integer"},{"type":"null"}]},"entitlement_source":{"type":["string","null"]},"status":{"type":"string"},"survey_config":{},"public_token":{"type":["string","null"]},"paid_at":{"type":["string","null"]},"category_tag":{"type":["string","null"]},"created_at":{"type":"string"},"closed_at":{"type":["string","null"]},"archived_at":{"type":["string","null"]}},"required":["id","user_id","name","product_desc","segment_desc","decision_type","currency","current_prices","website_url","gather_audience_info","brand_voice","methodology","methodology_version","price_cents","entitlement_source","status","public_token","paid_at","category_tag","created_at","closed_at","archived_at"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.studies.write"]},{"bearer":[]},{"apiToken":[]}]},"delete":{"operationId":"studies.delete","tags":["studies"],"summary":"Permanently delete an empty draft study.","description":"Permanently deletes a study, reserved for accidental duplicates and abandoned test drafts. ONLY empty, unpaid, never-activated drafts with zero response/analysis history qualify; everything else must be archived (lifecycle_conflict, details.fix points at kinetic.study_archive). You must pass confirm_name matching the study's exact name. Any open Stripe checkout is expired first, and all checks run under a FOR UPDATE row lock, so no payment can complete after deletion. If Stripe cannot be reached, nothing is deleted (external_dependency_failed). Honors an Idempotency-Key when supplied.\n\n**Auth:** Requires the kinetic.studies.delete scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional. Honored when present so a retried write is de-duplicated. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}},{"name":"confirm_name","in":"query","required":true,"schema":{"type":"string","description":"Must exactly match the study's name to confirm deletion."}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.studies.delete"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/studies/{id}/duplicate":{"post":{"operationId":"studies.duplicate","tags":["studies"],"summary":"Duplicate a study into a fresh draft.","description":"Copies a study's setup (context, survey/method configuration) into a new draft named '<name> (Copy)'. Publish state (public token, payment, close/archive timestamps) intentionally starts clean; the copy gets its own respondent design seed. Requires an Idempotency-Key.\n\n**Auth:** Requires the kinetic.studies.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Required. A client-chosen unique key so a retried write executes at most once. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"},"name":{"type":"string"},"product_desc":{"type":"string"},"segment_desc":{"type":"string"},"decision_type":{"type":"string"},"currency":{"type":"string"},"current_prices":{"type":["string","null"]},"website_url":{"type":["string","null"]},"gather_audience_info":{"type":"boolean"},"brand_voice":{"type":["string","null"]},"methodology":{"type":"string"},"methodology_version":{"type":"string"},"method_config":{},"price_cents":{"anyOf":[{"type":"integer"},{"type":"null"}]},"entitlement_source":{"type":["string","null"]},"status":{"type":"string"},"survey_config":{},"public_token":{"type":["string","null"]},"paid_at":{"type":["string","null"]},"category_tag":{"type":["string","null"]},"created_at":{"type":"string"},"closed_at":{"type":["string","null"]},"archived_at":{"type":["string","null"]}},"required":["id","user_id","name","product_desc","segment_desc","decision_type","currency","current_prices","website_url","gather_audience_info","brand_voice","methodology","methodology_version","price_cents","entitlement_source","status","public_token","paid_at","category_tag","created_at","closed_at","archived_at"],"additionalProperties":false}}}},"201":{"description":"201 when a new resource is created.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"},"name":{"type":"string"},"product_desc":{"type":"string"},"segment_desc":{"type":"string"},"decision_type":{"type":"string"},"currency":{"type":"string"},"current_prices":{"type":["string","null"]},"website_url":{"type":["string","null"]},"gather_audience_info":{"type":"boolean"},"brand_voice":{"type":["string","null"]},"methodology":{"type":"string"},"methodology_version":{"type":"string"},"method_config":{},"price_cents":{"anyOf":[{"type":"integer"},{"type":"null"}]},"entitlement_source":{"type":["string","null"]},"status":{"type":"string"},"survey_config":{},"public_token":{"type":["string","null"]},"paid_at":{"type":["string","null"]},"category_tag":{"type":["string","null"]},"created_at":{"type":"string"},"closed_at":{"type":["string","null"]},"archived_at":{"type":["string","null"]}},"required":["id","user_id","name","product_desc","segment_desc","decision_type","currency","current_prices","website_url","gather_audience_info","brand_voice","methodology","methodology_version","price_cents","entitlement_source","status","public_token","paid_at","category_tag","created_at","closed_at","archived_at"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.studies.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/studies/prefill":{"post":{"operationId":"studies.prefillFromWebsite","tags":["studies"],"summary":"Suggest study context by reading a founder's website with AI.","description":"Fetches the given website and uses the model to extract suggested study-setup fields (name, product/segment descriptions, visible pricing, currency, brand voice). Stores nothing — feed the suggestions into kinetic.study_create. A site that cannot be read is validation_failed on url; the model being unavailable is external_dependency_failed (fill the fields manually instead).\n\n**Auth:** Requires the kinetic.studies.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"url":{"type":"string","minLength":4}},"required":["url"]}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":["string","null"]},"product_desc":{"type":["string","null"]},"segment_desc":{"type":["string","null"]},"current_prices":{"type":["string","null"]},"suggested_currency":{"type":["string","null"]},"brand_voice":{"type":["string","null"]},"source_url":{"type":"string"}},"required":["name","product_desc","segment_desc","current_prices","suggested_currency","brand_voice","source_url"],"additionalProperties":false}}}},"201":{"description":"201 when a new resource is created.","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":["string","null"]},"product_desc":{"type":["string","null"]},"segment_desc":{"type":["string","null"]},"current_prices":{"type":["string","null"]},"suggested_currency":{"type":["string","null"]},"brand_voice":{"type":["string","null"]},"source_url":{"type":"string"}},"required":["name","product_desc","segment_desc","current_prices","suggested_currency","brand_voice","source_url"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.studies.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/studies/{id}/survey/regenerate":{"post":{"operationId":"studies.regenerateSurvey","tags":["studies"],"summary":"Generate (or regenerate) a study's survey with AI.","description":"Uses the model to produce a survey for the study from its context (product, segment, decision, currency, brand voice) and saves it as the study's survey config, replacing any prior one. Owner-only. The model being unavailable is external_dependency_failed — retry shortly.\n\n**Auth:** Requires the kinetic.studies.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"},"name":{"type":"string"},"product_desc":{"type":"string"},"segment_desc":{"type":"string"},"decision_type":{"type":"string"},"currency":{"type":"string"},"current_prices":{"type":["string","null"]},"website_url":{"type":["string","null"]},"gather_audience_info":{"type":"boolean"},"brand_voice":{"type":["string","null"]},"methodology":{"type":"string"},"methodology_version":{"type":"string"},"method_config":{},"price_cents":{"anyOf":[{"type":"integer"},{"type":"null"}]},"entitlement_source":{"type":["string","null"]},"status":{"type":"string"},"survey_config":{},"public_token":{"type":["string","null"]},"paid_at":{"type":["string","null"]},"category_tag":{"type":["string","null"]},"created_at":{"type":"string"},"closed_at":{"type":["string","null"]},"archived_at":{"type":["string","null"]}},"required":["id","user_id","name","product_desc","segment_desc","decision_type","currency","current_prices","website_url","gather_audience_info","brand_voice","methodology","methodology_version","price_cents","entitlement_source","status","public_token","paid_at","category_tag","created_at","closed_at","archived_at"],"additionalProperties":false}}}},"201":{"description":"201 when a new resource is created.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"},"name":{"type":"string"},"product_desc":{"type":"string"},"segment_desc":{"type":"string"},"decision_type":{"type":"string"},"currency":{"type":"string"},"current_prices":{"type":["string","null"]},"website_url":{"type":["string","null"]},"gather_audience_info":{"type":"boolean"},"brand_voice":{"type":["string","null"]},"methodology":{"type":"string"},"methodology_version":{"type":"string"},"method_config":{},"price_cents":{"anyOf":[{"type":"integer"},{"type":"null"}]},"entitlement_source":{"type":["string","null"]},"status":{"type":"string"},"survey_config":{},"public_token":{"type":["string","null"]},"paid_at":{"type":["string","null"]},"category_tag":{"type":["string","null"]},"created_at":{"type":"string"},"closed_at":{"type":["string","null"]},"archived_at":{"type":["string","null"]}},"required":["id","user_id","name","product_desc","segment_desc","decision_type","currency","current_prices","website_url","gather_audience_info","brand_voice","methodology","methodology_version","price_cents","entitlement_source","status","public_token","paid_at","category_tag","created_at","closed_at","archived_at"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.studies.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/studies/{id}/preview":{"get":{"operationId":"studies.previewSurvey","tags":["studies"],"summary":"Preview a study's respondent survey payload.","description":"Returns the exact payload a respondent would receive for a session-method study, owner-only, so you can review the survey before launch. Read-only and stores nothing. Studies whose config is incomplete return validation_failed.\n\n**Auth:** Requires the kinetic.studies.read scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.studies.read"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/studies/{id}/preview/session":{"post":{"operationId":"studies.previewStart","tags":["studies"],"summary":"Start an ephemeral preview session for a study.","description":"Assigns a respondent design exactly as the live flow would and returns a preview session (respondent_key + design). EPHEMERAL: nothing is written to the database, so preview activity never appears in counts, analysis, or exports. Pass the returned respondent_key back to kinetic.survey_preview_check.\n\n**Auth:** Requires the kinetic.studies.read scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success."},"201":{"description":"201 when a new resource is created."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.studies.read"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/studies/{id}/preview/complete":{"post":{"operationId":"studies.previewCheck","tags":["studies"],"summary":"Validate a preview submission without storing it.","description":"Validates a preview session's answers and segmentation with exactly the same rules as a real respondent completion, then stores NOTHING. Use it to confirm the survey accepts a plausible submission. respondent_key must come from kinetic.survey_preview_start; duration_ms is the elapsed answer time in milliseconds.\n\n**Auth:** Requires the kinetic.studies.read scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"respondent_key":{"type":"string"},"answers":{},"segmentation":{},"duration_ms":{"type":"integer","exclusiveMinimum":true,"minimum":0}},"required":["respondent_key","duration_ms"]}}}},"responses":{"200":{"description":"Success."},"201":{"description":"201 when a new resource is created."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.studies.read"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/studies/{id}/launch":{"post":{"operationId":"studies.launch","tags":["studies"],"summary":"Launch a draft study under Kinetic Pro.","description":"Publishes a DRAFT study live under the account owner's Kinetic Pro subscription (no per-study payment) and mints its public respondent link. Requires an active Pro subscription owned by the caller — otherwise payment_required with details.fix pointing at kinetic.pro_checkout_create. Draft-only and readiness-gated (incomplete configs fail validation). Already-paid or non-draft studies fail with lifecycle_conflict. Requires an Idempotency-Key.\n\n**Auth:** Requires the kinetic.studies.launch scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Required. A client-chosen unique key so a retried write executes at most once. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"},"name":{"type":"string"},"product_desc":{"type":"string"},"segment_desc":{"type":"string"},"decision_type":{"type":"string"},"currency":{"type":"string"},"current_prices":{"type":["string","null"]},"website_url":{"type":["string","null"]},"gather_audience_info":{"type":"boolean"},"brand_voice":{"type":["string","null"]},"methodology":{"type":"string"},"methodology_version":{"type":"string"},"method_config":{},"price_cents":{"anyOf":[{"type":"integer"},{"type":"null"}]},"entitlement_source":{"type":["string","null"]},"status":{"type":"string"},"survey_config":{},"public_token":{"type":["string","null"]},"paid_at":{"type":["string","null"]},"category_tag":{"type":["string","null"]},"created_at":{"type":"string"},"closed_at":{"type":["string","null"]},"archived_at":{"type":["string","null"]}},"required":["id","user_id","name","product_desc","segment_desc","decision_type","currency","current_prices","website_url","gather_audience_info","brand_voice","methodology","methodology_version","price_cents","entitlement_source","status","public_token","paid_at","category_tag","created_at","closed_at","archived_at"],"additionalProperties":false}}}},"201":{"description":"201 when a new resource is created.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"},"name":{"type":"string"},"product_desc":{"type":"string"},"segment_desc":{"type":"string"},"decision_type":{"type":"string"},"currency":{"type":"string"},"current_prices":{"type":["string","null"]},"website_url":{"type":["string","null"]},"gather_audience_info":{"type":"boolean"},"brand_voice":{"type":["string","null"]},"methodology":{"type":"string"},"methodology_version":{"type":"string"},"method_config":{},"price_cents":{"anyOf":[{"type":"integer"},{"type":"null"}]},"entitlement_source":{"type":["string","null"]},"status":{"type":"string"},"survey_config":{},"public_token":{"type":["string","null"]},"paid_at":{"type":["string","null"]},"category_tag":{"type":["string","null"]},"created_at":{"type":"string"},"closed_at":{"type":["string","null"]},"archived_at":{"type":["string","null"]}},"required":["id","user_id","name","product_desc","segment_desc","decision_type","currency","current_prices","website_url","gather_audience_info","brand_voice","methodology","methodology_version","price_cents","entitlement_source","status","public_token","paid_at","category_tag","created_at","closed_at","archived_at"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.studies.launch"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/studies/{id}/respondent-link":{"get":{"operationId":"studies.getRespondentLink","tags":["studies"],"summary":"Get a study's public respondent link.","description":"Returns the public respondent URL and token for a launched study — the same link the dashboard shares (/s/<public_token>). A study that has not been launched yet has no link (lifecycle_conflict, details.fix points at kinetic.study_launch).\n\n**Auth:** Requires the kinetic.studies.read scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"},"public_token":{"type":"string"}},"required":["url","public_token"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.studies.read"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/studies/{id}/progress":{"get":{"operationId":"studies.getProgress","tags":["studies"],"summary":"Get live response progress and confidence for a study.","description":"Returns response counts (started, completed, valid, flagged), completion rate, a confidence level (insufficient/directional/cautious/full), sample-size guidance, and — once enough valid responses exist — a deterministic live analysis result. Reflects data as it arrives while the study is live.\n\n**Auth:** Requires the kinetic.studies.read scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.studies.read"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/studies/{id}/quality":{"get":{"operationId":"studies.getQuality","tags":["studies"],"summary":"Get response quality (flag) aggregates for a study.","description":"Returns the quality-flag aggregates for a study: completed vs. valid counts, the flagged count, and the flag rate. These are the same flag figures surfaced inside the study's progress; use them to judge whether responses are trustworthy.\n\n**Auth:** Requires the kinetic.studies.read scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.studies.read"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/studies/{id}/close":{"post":{"operationId":"studies.close","tags":["studies"],"summary":"Close a live study.","description":"Closes a LIVE study: the respondent link then tells visitors the study has ended, while results stay available. Idempotent — closing an already-closed study succeeds and returns it unchanged. Closing a draft (never launched) fails with lifecycle_conflict. Honors an Idempotency-Key when supplied.\n\n**Auth:** Requires the kinetic.studies.lifecycle scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional. Honored when present so a retried write is de-duplicated. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"},"name":{"type":"string"},"product_desc":{"type":"string"},"segment_desc":{"type":"string"},"decision_type":{"type":"string"},"currency":{"type":"string"},"current_prices":{"type":["string","null"]},"website_url":{"type":["string","null"]},"gather_audience_info":{"type":"boolean"},"brand_voice":{"type":["string","null"]},"methodology":{"type":"string"},"methodology_version":{"type":"string"},"method_config":{},"price_cents":{"anyOf":[{"type":"integer"},{"type":"null"}]},"entitlement_source":{"type":["string","null"]},"status":{"type":"string"},"survey_config":{},"public_token":{"type":["string","null"]},"paid_at":{"type":["string","null"]},"category_tag":{"type":["string","null"]},"created_at":{"type":"string"},"closed_at":{"type":["string","null"]},"archived_at":{"type":["string","null"]}},"required":["id","user_id","name","product_desc","segment_desc","decision_type","currency","current_prices","website_url","gather_audience_info","brand_voice","methodology","methodology_version","price_cents","entitlement_source","status","public_token","paid_at","category_tag","created_at","closed_at","archived_at"],"additionalProperties":false}}}},"201":{"description":"201 when a new resource is created.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"},"name":{"type":"string"},"product_desc":{"type":"string"},"segment_desc":{"type":"string"},"decision_type":{"type":"string"},"currency":{"type":"string"},"current_prices":{"type":["string","null"]},"website_url":{"type":["string","null"]},"gather_audience_info":{"type":"boolean"},"brand_voice":{"type":["string","null"]},"methodology":{"type":"string"},"methodology_version":{"type":"string"},"method_config":{},"price_cents":{"anyOf":[{"type":"integer"},{"type":"null"}]},"entitlement_source":{"type":["string","null"]},"status":{"type":"string"},"survey_config":{},"public_token":{"type":["string","null"]},"paid_at":{"type":["string","null"]},"category_tag":{"type":["string","null"]},"created_at":{"type":"string"},"closed_at":{"type":["string","null"]},"archived_at":{"type":["string","null"]}},"required":["id","user_id","name","product_desc","segment_desc","decision_type","currency","current_prices","website_url","gather_audience_info","brand_voice","methodology","methodology_version","price_cents","entitlement_source","status","public_token","paid_at","category_tag","created_at","closed_at","archived_at"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.studies.lifecycle"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/studies/{id}/archive":{"post":{"operationId":"studies.archive","tags":["studies"],"summary":"Archive a study (soft hide).","description":"Archives a study of any status: it is hidden from the main dashboard list while responses, analysis, and payment history are left untouched. Idempotent — archiving an already-archived study succeeds and keeps the original archive timestamp. Reverse with kinetic.study_restore. Honors an Idempotency-Key when supplied.\n\n**Auth:** Requires the kinetic.studies.lifecycle scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional. Honored when present so a retried write is de-duplicated. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"},"name":{"type":"string"},"product_desc":{"type":"string"},"segment_desc":{"type":"string"},"decision_type":{"type":"string"},"currency":{"type":"string"},"current_prices":{"type":["string","null"]},"website_url":{"type":["string","null"]},"gather_audience_info":{"type":"boolean"},"brand_voice":{"type":["string","null"]},"methodology":{"type":"string"},"methodology_version":{"type":"string"},"method_config":{},"price_cents":{"anyOf":[{"type":"integer"},{"type":"null"}]},"entitlement_source":{"type":["string","null"]},"status":{"type":"string"},"survey_config":{},"public_token":{"type":["string","null"]},"paid_at":{"type":["string","null"]},"category_tag":{"type":["string","null"]},"created_at":{"type":"string"},"closed_at":{"type":["string","null"]},"archived_at":{"type":["string","null"]}},"required":["id","user_id","name","product_desc","segment_desc","decision_type","currency","current_prices","website_url","gather_audience_info","brand_voice","methodology","methodology_version","price_cents","entitlement_source","status","public_token","paid_at","category_tag","created_at","closed_at","archived_at"],"additionalProperties":false}}}},"201":{"description":"201 when a new resource is created.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"},"name":{"type":"string"},"product_desc":{"type":"string"},"segment_desc":{"type":"string"},"decision_type":{"type":"string"},"currency":{"type":"string"},"current_prices":{"type":["string","null"]},"website_url":{"type":["string","null"]},"gather_audience_info":{"type":"boolean"},"brand_voice":{"type":["string","null"]},"methodology":{"type":"string"},"methodology_version":{"type":"string"},"method_config":{},"price_cents":{"anyOf":[{"type":"integer"},{"type":"null"}]},"entitlement_source":{"type":["string","null"]},"status":{"type":"string"},"survey_config":{},"public_token":{"type":["string","null"]},"paid_at":{"type":["string","null"]},"category_tag":{"type":["string","null"]},"created_at":{"type":"string"},"closed_at":{"type":["string","null"]},"archived_at":{"type":["string","null"]}},"required":["id","user_id","name","product_desc","segment_desc","decision_type","currency","current_prices","website_url","gather_audience_info","brand_voice","methodology","methodology_version","price_cents","entitlement_source","status","public_token","paid_at","category_tag","created_at","closed_at","archived_at"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.studies.lifecycle"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/studies/{id}/restore":{"post":{"operationId":"studies.restore","tags":["studies"],"summary":"Restore an archived study.","description":"Un-archives a study, returning it to the main dashboard list. Idempotent — restoring a study that is not archived succeeds and returns it unchanged. Honors an Idempotency-Key when supplied.\n\n**Auth:** Requires the kinetic.studies.lifecycle scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional. Honored when present so a retried write is de-duplicated. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"},"name":{"type":"string"},"product_desc":{"type":"string"},"segment_desc":{"type":"string"},"decision_type":{"type":"string"},"currency":{"type":"string"},"current_prices":{"type":["string","null"]},"website_url":{"type":["string","null"]},"gather_audience_info":{"type":"boolean"},"brand_voice":{"type":["string","null"]},"methodology":{"type":"string"},"methodology_version":{"type":"string"},"method_config":{},"price_cents":{"anyOf":[{"type":"integer"},{"type":"null"}]},"entitlement_source":{"type":["string","null"]},"status":{"type":"string"},"survey_config":{},"public_token":{"type":["string","null"]},"paid_at":{"type":["string","null"]},"category_tag":{"type":["string","null"]},"created_at":{"type":"string"},"closed_at":{"type":["string","null"]},"archived_at":{"type":["string","null"]}},"required":["id","user_id","name","product_desc","segment_desc","decision_type","currency","current_prices","website_url","gather_audience_info","brand_voice","methodology","methodology_version","price_cents","entitlement_source","status","public_token","paid_at","category_tag","created_at","closed_at","archived_at"],"additionalProperties":false}}}},"201":{"description":"201 when a new resource is created.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"},"name":{"type":"string"},"product_desc":{"type":"string"},"segment_desc":{"type":"string"},"decision_type":{"type":"string"},"currency":{"type":"string"},"current_prices":{"type":["string","null"]},"website_url":{"type":["string","null"]},"gather_audience_info":{"type":"boolean"},"brand_voice":{"type":["string","null"]},"methodology":{"type":"string"},"methodology_version":{"type":"string"},"method_config":{},"price_cents":{"anyOf":[{"type":"integer"},{"type":"null"}]},"entitlement_source":{"type":["string","null"]},"status":{"type":"string"},"survey_config":{},"public_token":{"type":["string","null"]},"paid_at":{"type":["string","null"]},"category_tag":{"type":["string","null"]},"created_at":{"type":"string"},"closed_at":{"type":["string","null"]},"archived_at":{"type":["string","null"]}},"required":["id","user_id","name","product_desc","segment_desc","decision_type","currency","current_prices","website_url","gather_audience_info","brand_voice","methodology","methodology_version","price_cents","entitlement_source","status","public_token","paid_at","category_tag","created_at","closed_at","archived_at"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.studies.lifecycle"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/integrations/webhooks":{"get":{"operationId":"webhooksOut.list","tags":["webhooksOut"],"summary":"List your outbound webhook endpoints.","description":"Returns the caller's webhook subscriber endpoints (newest first): id, destination url, subscribed event types, enabled flag, and each endpoint's ETag. Signing secrets are never returned — they are shown only once at creation. Use kinetic.webhook_create to add one, kinetic.webhook_update to change or disable one.\n\n**Auth:** Requires the kinetic.integrations.read scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"url":{"type":"string"},"description":{"type":["string","null"]},"events":{"type":"array","items":{"type":"string"}},"active":{"type":"boolean"},"workspace_id":{"type":["string","null"]},"secret_rotated_at":{"type":["string","null"]},"created_at":{"type":"string"},"updated_at":{"type":"string"},"etag":{"type":"string"}},"required":["id","url","description","events","active","workspace_id","secret_rotated_at","created_at","updated_at","etag"],"additionalProperties":false}}},"required":["items"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.integrations.read"]},{"bearer":[]},{"apiToken":[]}]},"post":{"operationId":"webhooksOut.create","tags":["webhooksOut"],"summary":"Create an outbound webhook endpoint.","description":"Registers an https endpoint that receives signed JSON POSTs for the event types you subscribe to (use \"*\" for all). The response includes the signing `secret` (whsec_...) EXACTLY ONCE — store it now; it can never be retrieved again. Each delivery carries X-Kinetic-Signature: t=<unix_ts>,v1=<hex hmac-sha256 of \"<t>.<raw body>\" keyed by the secret>, plus X-Kinetic-Event, X-Kinetic-Delivery, and User-Agent Kinetic-Webhooks/1. Receivers must recompute the HMAC and reject deliveries whose t is outside a 5-minute tolerance window. URLs must be https (http allowed only for localhost outside production); private/loopback/link-local/metadata hosts are rejected. Requires an Idempotency-Key. Fails with external_dependency_failed if webhook signing is not configured on this deployment.\n\n**Auth:** Requires the kinetic.integrations.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Required. A client-chosen unique key so a retried write executes at most once. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"url":{"type":"string","format":"uri","description":"https destination (http only for localhost outside production)."},"events":{"type":"array","items":{"type":"string","minLength":1,"maxLength":120,"description":"A dotted lowercase event type (e.g. \"study.launched\") or \"*\" for all."},"minItems":1,"description":"Event types to subscribe to; [\"*\"] for all."},"description":{"type":"string","maxLength":500}},"required":["url","events"]}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"endpoint":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"url":{"type":"string"},"description":{"type":["string","null"]},"events":{"type":"array","items":{"type":"string"}},"active":{"type":"boolean"},"workspace_id":{"type":["string","null"]},"secret_rotated_at":{"type":["string","null"]},"created_at":{"type":"string"},"updated_at":{"type":"string"},"etag":{"type":"string"}},"required":["id","url","description","events","active","workspace_id","secret_rotated_at","created_at","updated_at","etag"],"additionalProperties":false},"secret":{"type":"string"},"etag":{"type":"string"}},"required":["endpoint","secret","etag"],"additionalProperties":false}}}},"201":{"description":"201 when a new resource is created.","content":{"application/json":{"schema":{"type":"object","properties":{"endpoint":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"url":{"type":"string"},"description":{"type":["string","null"]},"events":{"type":"array","items":{"type":"string"}},"active":{"type":"boolean"},"workspace_id":{"type":["string","null"]},"secret_rotated_at":{"type":["string","null"]},"created_at":{"type":"string"},"updated_at":{"type":"string"},"etag":{"type":"string"}},"required":["id","url","description","events","active","workspace_id","secret_rotated_at","created_at","updated_at","etag"],"additionalProperties":false},"secret":{"type":"string"},"etag":{"type":"string"}},"required":["endpoint","secret","etag"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.integrations.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/integrations/webhooks/{id}":{"patch":{"operationId":"webhooksOut.update","tags":["webhooksOut"],"summary":"Update an outbound webhook endpoint.","description":"Changes an endpoint's destination url, subscribed event types, description, or enabled flag (active). The signing secret is never affected and cannot be revealed or rotated here. Send If-Match with the endpoint's current ETag for optimistic concurrency; on a 412 version_conflict, re-read with kinetic.webhook_list and retry. Disable an endpoint by setting active=false rather than deleting it if you want to keep its delivery history.\n\n**Auth:** Requires the kinetic.integrations.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"If-Match","in":"header","required":false,"description":"Strong ETag from the matching read. When present, the write only proceeds if the resource is unchanged; otherwise fails version_conflict (412). Re-read and retry.","schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"url":{"type":"string","format":"uri"},"events":{"type":"array","items":{"type":"string","minLength":1,"maxLength":120,"description":"A dotted lowercase event type (e.g. \"study.launched\") or \"*\" for all."},"minItems":1},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"active":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Success.","headers":{"ETag":{"description":"Strong ETag; pass it as If-Match on the next write.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"endpoint":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"url":{"type":"string"},"description":{"type":["string","null"]},"events":{"type":"array","items":{"type":"string"}},"active":{"type":"boolean"},"workspace_id":{"type":["string","null"]},"secret_rotated_at":{"type":["string","null"]},"created_at":{"type":"string"},"updated_at":{"type":"string"},"etag":{"type":"string"}},"required":["id","url","description","events","active","workspace_id","secret_rotated_at","created_at","updated_at","etag"],"additionalProperties":false},"etag":{"type":"string"}},"required":["endpoint","etag"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.integrations.write"]},{"bearer":[]},{"apiToken":[]}]},"delete":{"operationId":"webhooksOut.delete","tags":["webhooksOut"],"summary":"Delete an outbound webhook endpoint.","description":"Removes an endpoint so it stops receiving events; any still-pending deliveries are cancelled. A repeat delete or a delete of an endpoint you do not own reads as resource_not_found. Idempotency-Key is honored when present (replay-safe).\n\n**Auth:** Requires the kinetic.integrations.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional. Honored when present so a retried write is de-duplicated. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"deleted":{"type":"boolean","const":true}},"required":["id","deleted"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.integrations.write"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/integrations/webhook-deliveries":{"get":{"operationId":"webhooksOut.listDeliveries","tags":["webhooksOut"],"summary":"List outbound webhook delivery attempts.","description":"Returns delivery records for your endpoints (newest first): state (pending/succeeded/failed/exhausted), attempt count, last HTTP status, a redacted response snippet, next scheduled attempt, and retried_from_delivery_id when the row is a manual retry. Optionally filter by endpoint_id and/or state; page size is bounded (default 25, max 100). Use kinetic.webhook_delivery_retry to re-attempt a failed or exhausted delivery.\n\n**Auth:** Requires the kinetic.integrations.read scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"endpoint_id","in":"query","required":false,"schema":{"type":"string","format":"uuid"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","enum":["pending","succeeded","failed","exhausted"]}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"endpoint_id":{"type":"string","format":"uuid"},"event_id":{"type":"string","format":"uuid"},"event_type":{"type":["string","null"]},"state":{"type":"string","enum":["pending","succeeded","failed","exhausted"]},"attempt":{"type":"integer"},"last_status":{"anyOf":[{"type":"integer"},{"type":"null"}]},"last_response_snippet":{"type":["string","null"]},"next_attempt_at":{"type":["string","null"]},"last_attempt_at":{"type":["string","null"]},"delivered_at":{"type":["string","null"]},"retried_from_delivery_id":{"type":["string","null"]},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","endpoint_id","event_id","event_type","state","attempt","last_status","last_response_snippet","next_attempt_at","last_attempt_at","delivered_at","retried_from_delivery_id","created_at","updated_at"],"additionalProperties":false}}},"required":["items"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.integrations.read"]},{"bearer":[]},{"apiToken":[]}]}},"/v1/integrations/webhook-deliveries/{id}/retry":{"post":{"operationId":"webhooksOut.retryDelivery","tags":["webhooksOut"],"summary":"Retry a failed or exhausted webhook delivery.","description":"Enqueues a NEW pending delivery for the same endpoint and event as the given delivery, with retried_from_delivery_id pointing back at it. Only failed or exhausted deliveries can be retried (a pending one returns lifecycle_conflict). Replay-idempotent: retrying a delivery that has already been retried returns the existing retry instead of creating another. Idempotency-Key is honored when present.\n\n**Auth:** Requires the kinetic.integrations.write scope (OAuth: Authorization Code + PKCE for user grants, or client_credentials for workspace service accounts; or a static Kinetic API access token created in Integrations (https://kineticpricing.com/integrations/) that carries the scope).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional. Honored when present so a retried write is de-duplicated. Reusing the key with a different body fails idempotency_conflict.","schema":{"type":"string","maxLength":255}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"delivery":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"endpoint_id":{"type":"string","format":"uuid"},"event_id":{"type":"string","format":"uuid"},"event_type":{"type":["string","null"]},"state":{"type":"string","enum":["pending","succeeded","failed","exhausted"]},"attempt":{"type":"integer"},"last_status":{"anyOf":[{"type":"integer"},{"type":"null"}]},"last_response_snippet":{"type":["string","null"]},"next_attempt_at":{"type":["string","null"]},"last_attempt_at":{"type":["string","null"]},"delivered_at":{"type":["string","null"]},"retried_from_delivery_id":{"type":["string","null"]},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","endpoint_id","event_id","event_type","state","attempt","last_status","last_response_snippet","next_attempt_at","last_attempt_at","delivered_at","retried_from_delivery_id","created_at","updated_at"],"additionalProperties":false},"created":{"type":"boolean"}},"required":["delivery","created"],"additionalProperties":false}}}},"201":{"description":"201 when a new resource is created.","content":{"application/json":{"schema":{"type":"object","properties":{"delivery":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"endpoint_id":{"type":"string","format":"uuid"},"event_id":{"type":"string","format":"uuid"},"event_type":{"type":["string","null"]},"state":{"type":"string","enum":["pending","succeeded","failed","exhausted"]},"attempt":{"type":"integer"},"last_status":{"anyOf":[{"type":"integer"},{"type":"null"}]},"last_response_snippet":{"type":["string","null"]},"next_attempt_at":{"type":["string","null"]},"last_attempt_at":{"type":["string","null"]},"delivered_at":{"type":["string","null"]},"retried_from_delivery_id":{"type":["string","null"]},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","endpoint_id","event_id","event_type","state","attempt","last_status","last_response_snippet","next_attempt_at","last_attempt_at","delivered_at","retried_from_delivery_id","created_at","updated_at"],"additionalProperties":false},"created":{"type":"boolean"}},"required":["delivery","created"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamFailed"}},"security":[{"oauth2":["kinetic.integrations.write"]},{"bearer":[]},{"apiToken":[]}]}}},"components":{"securitySchemes":{"oauth2":{"type":"oauth2","description":"OAuth 2.1. Authorization Code + PKCE for account-holder grants; client_credentials for workspace service accounts. client_id may be a Client ID Metadata Document URL.","flows":{"authorizationCode":{"authorizationUrl":"https://kineticpricing.com/oauth/authorize","tokenUrl":"https://kineticpricing.com/oauth/token","scopes":{"kinetic.account.read":"Account profile, settings, grants, and entitlements","kinetic.account.write":"Profile, onboarding, preferences, and terms records","kinetic.account.delete":"Permanent account deletion","kinetic.billing.read":"Offers, credits, subscription, and invoices exposed in the current UI","kinetic.billing.write":"Checkout entry, subscription cancellation, and subscription resumption","kinetic.studies.read":"Studies, surveys, respondent links, progress, and quality status","kinetic.studies.write":"Draft creation, editing, duplication, survey regeneration, and archive state","kinetic.studies.launch":"Paid or entitled launch and public respondent-link activation","kinetic.studies.lifecycle":"Close, archive, and restore within current lifecycle rules","kinetic.studies.delete":"Permanent eligible-study deletion","kinetic.results.read":"Deterministic analysis, evidence, narratives, and decision records","kinetic.results.export":"Current supported results exports","kinetic.workspace.read":"Workspace, scenarios, decisions, outcomes, reminders, and linked evidence","kinetic.workspace.write":"Create and update Workspace records and run deterministic scenarios","kinetic.team.read":"Members, seats, invitations, and roles","kinetic.team.write":"Invite, remove, and change roles within ownership rules","kinetic.integrations.read":"Grants, service accounts, webhook endpoints, and delivery status","kinetic.integrations.write":"Create, rotate, update, revoke, or retry supported integrations","kinetic.research.read":"Research metadata and authorized report downloads","kinetic.teardown.write":"Create, unlock, and retrieve a pricing teardown","kinetic.full":"All account-holder scopes allowed by the account's role and entitlements"}},"clientCredentials":{"tokenUrl":"https://kineticpricing.com/oauth/token","scopes":{"kinetic.account.read":"Account profile, settings, grants, and entitlements","kinetic.account.write":"Profile, onboarding, preferences, and terms records","kinetic.account.delete":"Permanent account deletion","kinetic.billing.read":"Offers, credits, subscription, and invoices exposed in the current UI","kinetic.billing.write":"Checkout entry, subscription cancellation, and subscription resumption","kinetic.studies.read":"Studies, surveys, respondent links, progress, and quality status","kinetic.studies.write":"Draft creation, editing, duplication, survey regeneration, and archive state","kinetic.studies.launch":"Paid or entitled launch and public respondent-link activation","kinetic.studies.lifecycle":"Close, archive, and restore within current lifecycle rules","kinetic.studies.delete":"Permanent eligible-study deletion","kinetic.results.read":"Deterministic analysis, evidence, narratives, and decision records","kinetic.results.export":"Current supported results exports","kinetic.workspace.read":"Workspace, scenarios, decisions, outcomes, reminders, and linked evidence","kinetic.workspace.write":"Create and update Workspace records and run deterministic scenarios","kinetic.team.read":"Members, seats, invitations, and roles","kinetic.team.write":"Invite, remove, and change roles within ownership rules","kinetic.integrations.read":"Grants, service accounts, webhook endpoints, and delivery status","kinetic.integrations.write":"Create, rotate, update, revoke, or retry supported integrations","kinetic.research.read":"Research metadata and authorized report downloads","kinetic.teardown.write":"Create, unlock, and retrieve a pricing teardown","kinetic.full":"All account-holder scopes allowed by the account's role and entitlements"}}}},"bearer":{"type":"http","scheme":"bearer","description":"An OAuth 2.1 bearer access token issued for this API's audience."},"apiToken":{"type":"http","scheme":"bearer","description":"A static Kinetic API access token (format kp_live_<public_id>.<secret>) created by an account holder in Integrations on the website. Valid on this REST API only; carries the scopes chosen at creation; rotate/revoke via the kinetic.api_token_* capabilities or the website."}},"schemas":{"ErrorEnvelope":{"type":"object","additionalProperties":false,"required":["error"],"properties":{"error":{"type":"object","additionalProperties":false,"required":["code","message","retryable"],"properties":{"code":{"type":"string","enum":["authentication_required","invalid_token","insufficient_scope","entitlement_required","forbidden","resource_not_found","version_conflict","idempotency_conflict","validation_failed","lifecycle_conflict","payment_required","rate_limited","task_pending","task_failed","external_dependency_failed"],"description":"One of the 15 stable error families."},"message":{"type":"string","description":"Static, human-readable summary."},"details":{"type":"object","additionalProperties":true,"description":"Machine-readable extras: field errors, next-step hints, task ids."},"request_id":{"type":"string"},"retryable":{"type":"boolean","description":"Whether retrying the same request may succeed."},"retry_after_s":{"type":"integer","description":"Suggested backoff (present on rate_limited)."}}}}}},"responses":{"BadRequest":{"description":"validation_failed — the request did not pass input validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Unauthorized":{"description":"authentication_required or invalid_token — the bearer is missing, malformed, or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Forbidden":{"description":"insufficient_scope, entitlement_required, or forbidden — the grant lacks the required scope or the account lacks entitlement.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"NotFound":{"description":"resource_not_found — the resource does not exist or belongs to another tenant (existence is never leaked).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Conflict":{"description":"lifecycle_conflict, idempotency_conflict, or task_pending — the request conflicts with the resource's current state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"PreconditionFailed":{"description":"version_conflict — the If-Match ETag no longer matches; re-read and retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"PaymentRequired":{"description":"payment_required — not entitled and not paid; details points at the checkout step.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"RateLimited":{"description":"rate_limited — slow down; honor the Retry-After header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"UpstreamFailed":{"description":"external_dependency_failed — an upstream provider (Stripe, model, mail, fetch) failed; retryable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}},"externalDocs":{"description":"Human/agent-readable reference and the MCP endpoint.","url":"https://api.kineticpricing.com/v1/docs"},"x-mcp-endpoint":"https://mcp.kineticpricing.com/mcp"}