Every API here is available over the APIs.io API and to AI agents over MCP.
{"openapi":"3.1.0","info":{"description":"The One API. Universal API integration platform for AI agents and applications.","license":{"name":""},"title":"One API","version":"5.35.0"},"servers":[{"url":"https://api.withone.ai"}],"components":{"schemas":{"AccessResponse":{"properties":{"methods":{"items":{"$ref":"#/components/schemas/Method"},"type":["array","null"]},"rules":{"items":{"$ref":"#/components/schemas/RuleResponse"},"type":["array","null"]}},"type":"object"},"AccessRule":{"description":"A single access-control rule applied to a connection. Today the only\nvariant is `Connection`, which targets a connection by its public\nconnection key. The serde tag `type` lets future variants\n(e.g. platform-wide rules) coexist without changing the wire shape.","oneOf":[{"description":"Restricts the key to a specific connection. The connection must\nalready exist within the same scope (org or project) as the key\nbeing configured; unresolved keys are rejected by the server.","properties":{"actionIds":{"description":"Optional list of action IDs that further narrow the rule.\nWhen set, only these actions on the referenced connection\nare reachable; when omitted, all actions on the connection\nare permitted.","items":{"type":"string"},"type":["array","null"]},"connectionKey":{"description":"Public-facing key of the connection this rule targets,\nfor example `live::gmail::default`.","type":"string"},"methods":{"description":"HTTP methods allowed against this connection, overriding the\nrequest-level global list. Omitted inherits that list, or (in a\nconsent grant) permits every method — except that an\n`action_ids`-scoped rule never confers connection-record management,\nonly the listed actions.","items":{"$ref":"#/components/schemas/Method"},"type":["array","null"]},"type":{"enum":["connection"],"type":"string"}},"required":["connectionKey","type"],"type":"object"}]},"ActivateEndpointParams":{"properties":{"actions":{"items":{"$ref":"#/components/schemas/CreateRelayAction"},"type":"array"},"webhookSecret":{"type":["string","null"]}},"required":["actions"],"type":"object"},"ActivateRequest":{"description":"The connector the activate leg stands up, named in the body beside the\n[`CeremonyQuery`] that names the ceremony.","properties":{"connector":{"$ref":"#/components/schemas/ConnectionDefinitionId"}},"required":["connector"],"type":"object"},"AgentPodView":{"properties":{"active":{"type":"boolean"},"agentId":{"format":"uuid","type":"string"},"createdAt":{"format":"date-time","type":"string"},"id":{"format":"uuid","type":"string"},"podId":{"format":"uuid","type":"string"},"tags":{"items":{"type":"string"},"type":"array"},"updatedAt":{"format":"date-time","type":"string"},"version":{"type":"string"}},"required":["id","agentId","podId","createdAt","updatedAt","version","tags","active"],"type":"object"},"AiAgentActionPolicy":{"description":"How much of an action surface an agent may exercise. The wire strings are\nkebab-case because that is how the console has always persisted them.","enum":["read-only","read-write","all"],"type":"string"},"AiAgentApiChannel":{"description":"The agent's own HTTP surface. It carries no API key: that credential is\nissued and held elsewhere, never on the record.","properties":{"enabled":{"default":null,"type":["boolean","null"]},"rateLimit":{"default":null,"format":"int32","minimum":0,"type":["integer","null"]}},"type":"object"},"AiAgentChannels":{"description":"The messaging surfaces an agent answers on, and their settings.\n\nNo channel here carries a credential. Slack and Telegram bot tokens live in\nthe agent's pod secret (`channel-slack` / `channel-telegram`), encrypted at\nrest, so the fields do not exist on this type and serde drops them from\nwhatever a client sends. That is the guarantee, not a strip step a writer\nhas to remember.","properties":{"api":{"default":null,"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AiAgentApiChannel"}]},"slack":{"default":null,"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AiAgentSlackChannel"}]},"telegram":{"default":null,"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AiAgentTelegramChannel"}]},"whatsapp":{"default":null,"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AiAgentWhatsAppChannel"}]},"widget":{"default":null,"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AiAgentWidgetChannel"}]}},"type":"object"},"AiAgentChatTrigger":{"properties":{"enabled":{"type":"boolean"}},"required":["enabled"],"type":"object"},"AiAgentConnections":{"description":"Which connections an agent may reach: every one its tenant holds, or a\nnamed list of connection keys.","oneOf":[{"$ref":"#/components/schemas/EveryConnection"},{"items":{"type":"string"},"type":"array"}]},"AiAgentCronRunStatusType":{"enum":["pending","running","completed","failed"],"type":"string"},"AiAgentCronRunView":{"properties":{"agentId":{"format":"uuid","type":"string"},"completedAt":{"format":"date-time","type":["string","null"]},"createdAt":{"format":"date-time","type":"string"},"durationMs":{"format":"int32","type":["integer","null"]},"error":{"type":["string","null"]},"id":{"format":"uuid","type":"string"},"responsePreview":{"type":["string","null"]},"scheduledAt":{"format":"date-time","type":"string"},"startedAt":{"format":"date-time","type":["string","null"]},"status":{"$ref":"#/components/schemas/AiAgentCronRunStatusType"}},"required":["id","agentId","scheduledAt","status","createdAt"],"type":"object"},"AiAgentCronSchedule":{"properties":{"deliverTo":{"items":{"type":"string"},"type":["array","null"]},"enabled":{"type":"boolean"},"expression":{"type":"string"},"id":{"type":"string"},"instructions":{"type":["string","null"]},"label":{"type":"string"},"timezone":{"type":["string","null"]}},"required":["id","label","enabled","expression"],"type":"object"},"AiAgentDmPolicy":{"description":"Who may open a direct conversation with the agent on a channel.","enum":["open","allowlist"],"type":"string"},"AiAgentGroupPolicy":{"description":"Whether the agent answers every message in a group, or only when named.","enum":["always","mention"],"type":"string"},"AiAgentGuardrails":{"description":"The limits applied to an agent's behaviour.","properties":{"actionPolicy":{"default":null,"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AiAgentActionPolicy"}]},"blockedActions":{"default":null,"items":{"type":"string"},"type":["array","null"]},"maxBudgetUsd":{"default":null,"format":"double","type":["number","null"]},"maxTurns":{"default":null,"format":"int32","minimum":0,"type":["integer","null"]}},"type":"object"},"AiAgentHandScope":{"description":"How much of a platform's surface a framework agent's One \"hands\" may use.","enum":["read","write"],"type":"string"},"AiAgentMcpServer":{"description":"An MCP server the agent may call.\n\nIt carries no headers: a header map is where an MCP server's bearer token\nwould sit, and a credential does not belong on the record. One that a\nclient sends is dropped, the way the channel bot tokens are.","properties":{"name":{"default":null,"type":["string","null"]},"url":{"default":null,"type":["string","null"]}},"type":"object"},"AiAgentMemory":{"description":"The console's session settings for the agent.\n\n`runtime`, `model_provider` and `model_id` are the copies the console wrote\nbefore each became a column of its own. The typed columns are what core\nreads; these are kept so a console still writing them round-trips.","properties":{"maxSessionMessages":{"default":null,"format":"int32","minimum":0,"type":["integer","null"]},"mode":{"default":null,"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AiAgentMemoryMode"}]},"modelId":{"default":null,"type":["string","null"]},"modelProvider":{"default":null,"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AiModelProviderType"}]},"runtime":{"default":null,"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AiRuntimeType"}]},"sessionTimeout":{"default":null,"format":"int32","minimum":0,"type":["integer","null"]}},"type":"object"},"AiAgentMemoryMode":{"description":"How much of a conversation the agent carries between messages. The wire\nstrings are kebab-case because that is how the console has always persisted\nthem.","enum":["stateless","per-session","per-user"],"type":"string"},"AiAgentModelType":{"enum":["haiku","sonnet","opus","fable"],"type":"string"},"AiAgentSeatTrialOffer":{"description":"Where the caller stands with the free seat trial: `trialPeriodDays` when\none is on offer, `expiresAt` when one is running, neither once they have\ntransacted. An account with no billing record yet gets neither, which is\nan ordinary pre-onboarding state rather than an error.","properties":{"expiresAt":{"description":"When a trial already running ends.","format":"date-time","type":["string","null"]},"trialPeriodDays":{"description":"Free days a checkout would attach, when the caller is still eligible.","format":"int32","minimum":0,"type":["integer","null"]}},"type":"object"},"AiAgentSlackChannel":{"properties":{"channelPolicies":{"additionalProperties":{"$ref":"#/components/schemas/AiAgentGroupPolicy"},"default":null,"propertyNames":{"type":"string"},"type":["object","null"]},"enabled":{"default":null,"type":["boolean","null"]},"respondToMentions":{"default":null,"type":["boolean","null"]},"workspaceName":{"default":null,"type":["string","null"]}},"type":"object"},"AiAgentStatusType":{"enum":["active","paused","disabled"],"type":"string"},"AiAgentSystemTools":{"description":"The runtime's own tools the agent may call.","properties":{"bash":{"default":null,"type":["boolean","null"]},"codeExecution":{"default":null,"type":["boolean","null"]},"fileRead":{"default":null,"type":["boolean","null"]},"fileWrite":{"default":null,"type":["boolean","null"]},"webFetch":{"default":null,"type":["boolean","null"]},"webSearch":{"default":null,"type":["boolean","null"]}},"type":"object"},"AiAgentTelegramChannel":{"properties":{"allowedChatIds":{"default":null,"items":{"type":"string"},"type":["array","null"]},"botUsername":{"default":null,"type":["string","null"]},"dmPolicy":{"default":null,"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AiAgentDmPolicy"}]},"enabled":{"default":null,"type":["boolean","null"]},"groupPolicy":{"default":null,"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AiAgentGroupPolicy"}]}},"type":"object"},"AiAgentTools":{"description":"What the agent may reach: its connections, the actions and methods it is\nheld to on each, and the system tools it may call.\n\nEvery field is optional and the struct defaults, so a record written before\na field existed still reads back.","properties":{"allowedActions":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"default":null,"propertyNames":{"type":"string"},"type":["object","null"]},"allowedMethods":{"additionalProperties":{"items":{"$ref":"#/components/schemas/Method"},"type":"array"},"default":null,"propertyNames":{"type":"string"},"type":["object","null"]},"connections":{"default":null,"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AiAgentConnections"}]},"handScopes":{"additionalProperties":{"$ref":"#/components/schemas/AiAgentHandScope"},"default":null,"propertyNames":{"type":"string"},"type":["object","null"]},"mcpServers":{"default":null,"items":{"$ref":"#/components/schemas/AiAgentMcpServer"},"type":["array","null"]},"skillIds":{"default":null,"items":{"$ref":"#/components/schemas/AiSkillId"},"type":["array","null"]},"systemTools":{"default":null,"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AiAgentSystemTools"}]}},"type":"object"},"AiAgentTriggers":{"properties":{"chat":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AiAgentChatTrigger"}]},"cronSchedules":{"items":{"$ref":"#/components/schemas/AiAgentCronSchedule"},"type":"array"},"webhookSubscriptions":{"items":{"$ref":"#/components/schemas/AiAgentWebhookSubscription"},"type":"array"}},"type":"object"},"AiAgentView":{"description":"`Eq` is absent for the same reason as on the record: `guardrails` carries a\nfractional dollar amount.","properties":{"active":{"type":"boolean"},"channels":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AiAgentChannels"}]},"createdAt":{"format":"date-time","type":"string"},"description":{"type":["string","null"]},"environment":{"$ref":"#/components/schemas/SecretKeyEnvironment"},"guardrails":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AiAgentGuardrails"}]},"id":{"format":"uuid","type":"string"},"memory":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AiAgentMemory"}]},"model":{"$ref":"#/components/schemas/AiAgentModelType"},"modelId":{"type":["string","null"]},"modelProvider":{"$ref":"#/components/schemas/AiModelProviderType"},"name":{"type":"string"},"organizationId":{"format":"uuid","type":["string","null"]},"projectId":{"format":"uuid","type":["string","null"]},"runnerStatus":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/PodStatusType","description":"The state of this agent's runner, when it has one.\n\nThe agent's own lifecycle and its pod's are separate, and this field is\nwhat lets a caller see the second without conflating it into the first.\nAn agent that has never been run has no pod and reports `None`; one\nwhose pod was stopped - by the owner, or by a lapsed seat culling it -\nreports [`PodStatusType::Terminated`], which is what a console renders\nas paused.\n\nPopulated only by the read paths that opt in through\n[`ViewWithCtxExt::into_view_with_ctx`], so the write paths pay nothing\nfor it.\nAbsent from the wire rather than null when there is no runner, so a\nresponse for an agent that has never run is byte-identical to before."}]},"runnerStopReason":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/PodStopReasonType","description":"What stopped the runner, when it is stopped.\n\n`runnerStatus` alone cannot say: a pause the owner performed and a stop\nbilling performed both read `terminated`, which is the whole reason this\nexists. Absent while the runner is live, and on pods stopped before it\nwas recorded.\n\n**A cause, not a prediction.** It records the stop that happened and\nnothing re-derives it afterwards, so entitlement can move underneath it\nin both directions: an owner-paused agent stays `user_requested` when\nits seat later lapses, because the cull only counts what is running,\nyet `ensure` counts every undeleted agent and will refuse it; and a\nculled agent stays `seat_lapsed` after a replacement seat is bought,\nuntil a resume clears it. Use it to explain what happened - and ask\n`ensure` whether the agent can start, rather than guessing from\nthis."}]},"runtime":{"$ref":"#/components/schemas/AiRuntimeType"},"status":{"$ref":"#/components/schemas/AiAgentStatusType"},"tags":{"items":{"type":"string"},"type":"array"},"tools":{"$ref":"#/components/schemas/AiAgentTools"},"trialSeat":{"description":"Whether this agent occupies the owner's free-trial seat.\n\nWorth surfacing because it decides what happens when the trial ends:\nthis is the agent stopped first, ahead of the least recently used. It\nis also the only way a caller learns whether a `useTrial` create took\neffect, since that flag is ignored rather than rejected when there is\nno live trial or another agent already holds the seat.\n\nAbsent from the wire rather than `false` on the paths that do not\nresolve it, so \"not on the trial seat\" is never confused with \"not\nasked\".","type":["boolean","null"]},"triggers":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AiAgentTriggers"}]},"updatedAt":{"format":"date-time","type":"string"},"userId":{"format":"uuid","type":"string"},"version":{"type":"string"},"volumeId":{"format":"uuid","type":["string","null"]}},"required":["id","userId","name","model","status","tools","environment","runtime","modelProvider","createdAt","updatedAt","version","tags","active"],"type":"object"},"AiAgentWebhookSubscription":{"properties":{"actionId":{"items":{"type":"string"},"type":["array","null"]},"enabled":{"type":["boolean","null"]},"id":{"type":["string","null"]},"instructions":{"type":["string","null"]},"label":{"type":["string","null"]},"relayId":{"type":["string","null"]},"relayUrl":{"type":["string","null"]},"thirdPartyWebhookId":{"type":["string","null"]}},"type":"object"},"AiAgentWhatsAppChannel":{"properties":{"allowedNumbers":{"default":null,"items":{"type":"string"},"type":["array","null"]},"dmPolicy":{"default":null,"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AiAgentDmPolicy"}]},"enabled":{"default":null,"type":["boolean","null"]},"phoneNumber":{"default":null,"type":["string","null"]}},"type":"object"},"AiAgentWidgetChannel":{"properties":{"allowedOrigins":{"default":null,"items":{"type":"string"},"type":["array","null"]},"enabled":{"default":null,"type":["boolean","null"]},"publicKey":{"default":null,"type":["string","null"]},"theme":{"default":null,"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AiAgentWidgetTheme"}]}},"type":"object"},"AiAgentWidgetPosition":{"enum":["bottom-right","bottom-left"],"type":"string"},"AiAgentWidgetTheme":{"properties":{"placeholder":{"default":null,"type":["string","null"]},"position":{"default":null,"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AiAgentWidgetPosition"}]},"primaryColor":{"default":null,"type":["string","null"]},"welcomeMessage":{"default":null,"type":["string","null"]}},"type":"object"},"AiModelProviderType":{"description":"The model provider powering a framework agent's brain. Values mirror the\nwire ids the console has always written into `memory.modelProvider`\n(`openai-api`, not `openai`) so the typed column and the historical\nmarker can never disagree. Stored as text (the `Role` pattern) — the\nclosed set lives here in Rust, so admitting a provider is a code change,\nnever a Postgres enum migration.","enum":["anthropic","openai-api","gemini"],"type":"string"},"AiRunnerView":{"properties":{"agentId":{"format":"uuid","type":"string"},"dashboardPassword":{"description":"Always `None` on this status/lifecycle view. The dashboard password is\nnever returned alongside pod status — surfacing it here would ride every\npoll. It is returned only by the dedicated reveal / regenerate routes,\nwhich respond with a [`DashboardPasswordView`].","type":["string","null"]},"dashboardUsername":{"description":"Framework (Hermes) dashboard basic-auth username — the fixed `one`\naccount. Populated (decrypted) only on the owner-authed status route\nfor framework pods; `None` for Claude and on the ensure/resume\nconstruction sites. `skip_serializing_if` keeps the Claude status\nresponse byte-identical (the key is absent, not `null`).","type":["string","null"]},"link":{"$ref":"#/components/schemas/AgentPodView"},"pod":{"$ref":"#/components/schemas/PodView"}},"required":["agentId","pod","link"],"type":"object"},"AiRuntimeType":{"enum":["claude","hermes","openclaw","clockwork"],"type":"string"},"AiSkillId":{"description":"Prefixed ID with 'ai_skill' prefix (e.g., 'ai_skill_1C'), also accepts raw integer","type":"string"},"AiSkillVersionId":{"description":"Prefixed ID with 'ai_skill_ver' prefix (e.g., 'ai_skill_ver_1C'), also accepts raw integer","type":"string"},"AiSkillVersionView":{"properties":{"agent":{"type":["string","null"]},"aiSkillId":{"$ref":"#/components/schemas/AiSkillId"},"allowedTools":{},"argumentHint":{"type":["string","null"]},"content":{"type":"string"},"context":{"type":["string","null"]},"description":{"type":"string"},"disableModelInvocation":{"type":"boolean"},"hooks":{},"id":{"$ref":"#/components/schemas/AiSkillVersionId"},"model":{"type":["string","null"]},"name":{"type":"string"},"publishedAt":{"format":"date-time","type":"string"},"publishedBy":{"format":"uuid","type":"string"},"rejectReason":{"type":["string","null"]},"rejectedAt":{"format":"date-time","type":["string","null"]},"tags":{"items":{"type":"string"},"type":"array"},"userInvocable":{"type":"boolean"},"verifiedAt":{"format":"date-time","type":["string","null"]},"versionNumber":{"format":"int32","type":"integer"},"yankedAt":{"format":"date-time","type":["string","null"]},"yankedBy":{"format":"uuid","type":["string","null"]},"yankedReason":{"type":["string","null"]}},"required":["id","aiSkillId","versionNumber","name","description","content","disableModelInvocation","userInvocable","tags","publishedAt","publishedBy"],"type":"object"},"AiSkillView":{"properties":{"active":{"type":"boolean"},"agent":{"type":["string","null"]},"allowedTools":{},"argumentHint":{"type":["string","null"]},"content":{"type":"string"},"context":{"type":["string","null"]},"createdAt":{"format":"date-time","type":"string"},"description":{"type":"string"},"disableModelInvocation":{"type":"boolean"},"environment":{"$ref":"#/components/schemas/SecretKeyEnvironment"},"hooks":{},"id":{"$ref":"#/components/schemas/AiSkillId"},"lastUsedAt":{"format":"date-time","type":["string","null"]},"latestPublishedVersionId":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AiSkillVersionId"}]},"model":{"type":["string","null"]},"name":{"type":"string"},"organizationId":{"format":"uuid","type":["string","null"]},"projectId":{"format":"uuid","type":["string","null"]},"public":{"type":"boolean"},"tags":{"items":{"type":"string"},"type":"array"},"updatedAt":{"format":"date-time","type":"string"},"usageCount":{"format":"int32","type":"integer"},"userId":{"format":"uuid","type":"string"},"userInvocable":{"type":"boolean"},"version":{"type":"string"}},"required":["id","userId","name","description","content","disableModelInvocation","userInvocable","environment","usageCount","createdAt","updatedAt","version","tags","active","public"],"type":"object"},"AllowedActionView":{"properties":{"id":{"description":"The action's **`system_id`**, not its row id.\n\nThis is the identifier a rule's `actionIds` carries and the one both\nthe permission-set editor and the consent submission are validated\nagainst, so it is the only id a client can send back. Publishing the\nrow id instead round-trips into an action that resolves to a different\nconnector, which consent now refuses as foreign.","type":"string"},"title":{"type":"string"}},"required":["id","title"],"type":"object"},"ApiKeyCreatedPayload":{"description":"Identifies the key without ever carrying its material - the secret exists\nonly in the create response, never in a delivery.","properties":{"connection_type":{"type":"string"},"created_at":{"format":"date-time","type":"string"},"environment":{"type":"string"},"event_access_id":{"type":"string"},"name":{"type":["string","null"]},"organization_id":{"format":"uuid","type":["string","null"]},"project_id":{"format":"uuid","type":["string","null"]}},"required":["event_access_id","connection_type","environment","created_at"],"type":"object"},"ApiKeyRevokedPayload":{"properties":{"connection_type":{"type":"string"},"environment":{"type":"string"},"event_access_id":{"type":"string"},"name":{"type":["string","null"]},"organization_id":{"format":"uuid","type":["string","null"]},"project_id":{"format":"uuid","type":["string","null"]},"revoked_at":{"format":"date-time","type":"string"}},"required":["event_access_id","connection_type","environment","revoked_at"],"type":"object"},"AuthMethod":{"enum":["BearerToken","ApiKey","BasicAuth","OAuthLegacy","QueryParam","OAuth","None"],"type":"string"},"AuthMethodView":{"properties":{"authMethodType":{"$ref":"#/components/schemas/AuthMethod"},"hashAlgorithm":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/HashAlgorithm","description":"Ensured to have a value when auth method types are:\n- `OAuthLegacy`"}]},"key":{"description":"Ensured to have a value when auth method types are:\n- `ApiKey`\n- `QueryParam`","type":["string","null"]},"password":{"description":"Ensured to have a value when auth method types are:\n- `BasicAuth`","type":["string","null"]},"realm":{"description":"Ensured to have a value when auth method types are:\n- `OAuthLegacy`","type":["string","null"]},"username":{"description":"Ensured to have a value when auth method types are:\n- `BasicAuth`","type":["string","null"]},"value":{"description":"Ensured to have a value when auth method types are:\n- `ApiKey`\n- `QueryParam`\n- `BearerToken`","type":["string","null"]}},"required":["authMethodType"],"type":"object"},"AuthorizationReachView":{"description":"What one app reaches in one environment, as the manage page reads it.\n\n**Deliberately not folded into a single view.** A grant is per environment,\nand `Full` in one says nothing about the other: merging them would report a\nnarrowed live grant as unrestricted the moment a sandbox grant sat beside\nit, and drop every account the user came to edit. Keeping them apart is also\nwhat lets the page say which environment a level belongs to, which is the\nquestion a single merged answer cannot even express.","properties":{"environment":{"$ref":"#/components/schemas/SecretKeyEnvironment"},"reach":{"description":"What a grant reaches, generic over how each entry is rendered - the one\ntrichotomy two surfaces share: a dashboard reads it as counts\n([`GrantedReachView`]), a reconnect card as pre-selectable rules\n([`PriorGrantView`]). `KnowledgeOnly`/`Full` are identical on the wire for\nboth; only the `Connectors` element type differs.\n\nA bare generic derives a single schema named `ReachView`, so both\ninstantiations would collide on that one OpenAPI component and one endpoint\nwould advertise the other's connector shape. Every schema site that carries\none of these therefore inlines it (`#[schema(inline)]` / `inline(...)`), so\nno shared `ReachView` component exists to collide.","oneOf":[{"description":"Docs and search only: no connection access of any kind.","properties":{"type":{"enum":["knowledgeOnly"],"type":"string"}},"required":["type"],"type":"object"},{"description":"Every connection in the consented scope. No connector list because the\ngrant names none - it follows the account.","properties":{"type":{"enum":["full"],"type":"string"}},"required":["type"],"type":"object"},{"description":"Only what the grant names, each entry rendered as `C`. **The granularity\nis the instantiation's**: a reach report carries one entry per\nconnector, a prior grant one per granted *connection*, so two entries\nthere can share a connector.","properties":{"connectors":{"items":{"$ref":"#/components/schemas/PriorGrantConnectorView"},"type":"array"},"type":{"enum":["connectors"],"type":"string"}},"required":["connectors","type"],"type":"object"}]}},"required":["environment","reach"],"type":"object"},"AvailableActionsView":{"properties":{"key":{"type":"string"},"method":{"$ref":"#/components/schemas/Method"},"modelName":{"type":"string"},"path":{"type":"string"},"systemId":{"description":"Stable id for this action. Use as `actionId` for passthrough /\nexecute calls; survives renames of `key` or `title`.","type":"string"},"tags":{"items":{"type":"string"},"type":"array"},"title":{"type":"string"}},"required":["systemId","title","key","modelName","method","path","tags"],"type":"object"},"AvailableActionsWithKnowledgeView":{"properties":{"key":{"type":"string"},"knowledge":{"type":["string","null"]},"method":{"$ref":"#/components/schemas/Method"},"path":{"type":"string"},"systemId":{"type":"string"},"tags":{"items":{"type":"string"},"type":"array"},"title":{"type":"string"}},"required":["systemId","title","key","method","path","tags"],"type":"object"},"AvailableConnectorView":{"properties":{"active":{"type":"boolean"},"category":{"type":"string"},"description":{"type":"string"},"id":{"$ref":"#/components/schemas/ConnectionDefinitionId"},"image":{"type":"string"},"key":{"type":"string"},"name":{"type":"string"},"oauth":{"type":"boolean"},"oauthScopes":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/OAuthScopesView"}]},"platform":{"type":"string"},"platformVersion":{"type":"string"},"status":{"$ref":"#/components/schemas/ConnectionStatusType"},"tags":{"items":{"type":"string"},"type":"array"},"title":{"type":["string","null"]},"tools":{"format":"int32","type":"integer"},"version":{"type":"string"}},"required":["id","name","platformVersion","status","key","platform","description","category","image","tags","tools","oauth","version","active"],"type":"object"},"BrandingSnapshot":{"properties":{"customerFacingName":{"type":"string"},"darkLogoUrl":{"type":["string","null"]},"lightLogoUrl":{"type":["string","null"]},"successMessage":{"type":"string"},"welcomeMessage":{"type":"string"}},"required":["customerFacingName","welcomeMessage","successMessage"],"type":"object"},"CeremonyConnectResponse":{"allOf":[{"$ref":"#/components/schemas/Paginated_ConnectedPlatformView"},{"properties":{"requestId":{"$ref":"#/components/schemas/OAuthRequestId"}},"required":["requestId"],"type":"object"}],"description":"What the card renders its platform tiles from.\n\nShaped like `InitResponse`, which the dashboard's AuthKit legs return, and\nover the same [`ConnectedPlatformView`]: the card's embedded auth widget\nroutes a tile into its OAuth flow only when the row carries the OAuth\nfields, so the ceremony hands back the one full shape the widget already\nconsumes on the dashboard rather than a trimmed variant it dead-ends on. No\ncredential rides along - the masked secret display is truncated at write and\nthe real secret stays behind `secret_id`."},"CeremonyConnectionView":{"description":"One connection the card may be told about: enough to mark a connector as\nalready connected, and nothing more.\n\n**Not `ConnectionView`.** That carries `secret_id`, `webhook_secret_id`,\n`identity`, the owning `user_id` and the whole `change_log` - none of which\na consent screen needs, and all of which would be handed to a surface whose\nentire job is to be embedded in somebody else's page. What stays is what the\ncard acts on: which connector, which connection, and whether it is healthy.","properties":{"connectionDefinitionId":{"$ref":"#/components/schemas/ConnectionDefinitionId","description":"Which connector, so the card can match it against the ceremony's offer."},"key":{"description":"The connection's public key, and the reason this view is not narrower\nstill: a restricted consent names a connection through\n`AccessRule::Connection`, which is keyed on exactly this. Without it a\ncard that wants to include a connection the user already has cannot\nname it, and has to fall back to a connector-wide grant - so omitting\nit made the resulting grant *wider*, not tighter.","type":"string"},"name":{"description":"The user's own label for it, when they gave one.","type":["string","null"]},"platform":{"type":"string"},"state":{"$ref":"#/components/schemas/ConnectionStateType"},"tags":{"description":"The user's own tags, so the card can tell two accounts on one connector\napart at a glance. Empty when they tagged it with none.","items":{"type":"string"},"type":"array"}},"required":["connectionDefinitionId","key","platform","state","tags"],"type":"object"},"ChangeLog":{"type":"object"},"CheckoutSessionResponse":{"properties":{"checkoutUrl":{"type":"string"}},"required":["checkoutUrl"],"type":"object"},"ClientUserView":{"description":"One user's standing with an OAuth client, as its developer sees them.\n\nCarries `reach` in the same consent vocabulary as\n[`crate::domain::oauth_authorization::OAuthAuthorizationView`], so the two\nsides of the ledger report a grant identically.","properties":{"createdAt":{"format":"date-time","type":"string"},"email":{"type":"string"},"expiresAt":{"description":"When the user's current access token for this client expires. `None`\nwhile they hold a live grant but no live token - the window between\nre-consent and the client redeeming the new code.","format":"date-time","type":["string","null"]},"lastUsedAt":{"format":"date-time","type":["string","null"]},"name":{"type":["string","null"]},"reach":{"description":"What a grant reaches, generic over how each entry is rendered - the one\ntrichotomy two surfaces share: a dashboard reads it as counts\n([`GrantedReachView`]), a reconnect card as pre-selectable rules\n([`PriorGrantView`]). `KnowledgeOnly`/`Full` are identical on the wire for\nboth; only the `Connectors` element type differs.\n\nA bare generic derives a single schema named `ReachView`, so both\ninstantiations would collide on that one OpenAPI component and one endpoint\nwould advertise the other's connector shape. Every schema site that carries\none of these therefore inlines it (`#[schema(inline)]` / `inline(...)`), so\nno shared `ReachView` component exists to collide.","oneOf":[{"description":"Docs and search only: no connection access of any kind.","properties":{"type":{"enum":["knowledgeOnly"],"type":"string"}},"required":["type"],"type":"object"},{"description":"Every connection in the consented scope. No conne
# --- truncated at 32 KB (587 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/picaos/refs/heads/main/openapi/_original/picaos-api-openapi.json