mirror of
https://github.com/hanzoai/cli.git
synced 2026-10-30 15:00:27 +00:00
1 line
1.3 MiB
Plaintext
1 line
1.3 MiB
Plaintext
{"components":{"schemas":{"Brief":{"properties":{"batch":{"items":{"type":"string"},"type":"array"},"format":{"type":"string"},"glossary":{"additionalProperties":{"type":"string"},"type":"object"},"model":{"type":"string"},"source":{"type":"string"},"target":{"type":"string"},"text":{"type":"string"},"tier":{"type":"string"}},"required":["target"],"type":"object"},"CaptureBatch":{"properties":{"batch":{"items":{"$ref":"#/components/schemas/CaptureEvent"},"type":"array"},"events":{"items":{"$ref":"#/components/schemas/CaptureEvent"},"type":"array"}},"type":"object"},"CaptureEvent":{"properties":{"anonymousId":{"type":"string"},"channel":{"type":"string"},"clip":{"$ref":"#/components/schemas/ClipBody"},"currency":{"type":"string"},"distinctId":{"type":"string"},"environment":{"type":"string"},"error":{"$ref":"#/components/schemas/Exception"},"event":{"type":"string"},"groupId":{"type":"string"},"groupType":{"type":"string"},"kind":{"type":"string"},"lastUtm":{"$ref":"#/components/schemas/UTM"},"level":{"type":"string"},"library":{"type":"string"},"libraryVersion":{"type":"string"},"log":{"$ref":"#/components/schemas/LogBody"},"messageId":{"type":"string"},"metric":{"$ref":"#/components/schemas/MetricBody"},"path":{"type":"string"},"personId":{"type":"string"},"product":{"type":"string"},"productId":{"type":"string"},"properties":{"additionalProperties":{},"type":"object"},"quantity":{"type":"integer"},"refCode":{"type":"string"},"referrer":{"type":"string"},"release":{"type":"string"},"resource":{"type":"string"},"revenue":{"type":"number"},"service":{"type":"string"},"sessionId":{"type":"string"},"signupWeek":{"type":"string"},"site":{"type":"string"},"span":{"$ref":"#/components/schemas/SpanBody"},"spanId":{"type":"string"},"timestamp":{"type":"string"},"traceId":{"type":"string"},"type":{"type":"string"},"url":{"type":"string"},"utm":{"$ref":"#/components/schemas/UTM"}},"type":"object"},"CartItemSet":{"properties":{"id":{"description":"ID is the cart to amend, from the path.","type":"string"},"product":{"description":"Product names the catalog product to set, by its id or its URL slug. Give\nthis or Variant, never both; a request naming neither is refused.","type":"string"},"quantity":{"description":"Quantity is how many of that item the cart should hold AFTER this call — it\nis the resulting count, not a delta, so sending 3 twice leaves 3 and not 6.\nZERO REMOVES the line, which is the only way to take an item out.","format":"int64","type":"integer"},"variant":{"description":"Variant names the specific sellable variant to set, by its id or its SKU.\nPrefer it over Product for anything sold in sizes, colours or tiers — the\nprice and the stock are the variant's, not the product's.","type":"string"}},"type":"object"},"CartOpen":{"properties":{"currency":{"description":"Currency is the ISO 4217 code the cart is priced in, lower-cased. Empty\nmeans usd.","type":"string"},"email":{"description":"Email is the shopper's address, for a cart that belongs to someone who has\nnot signed in. It is what a guest checkout and an abandoned-cart follow-up\nkey on. Empty is fine.","type":"string"},"store":{"description":"Store is the storefront this cart is being filled on. Empty uses the org's\ndefault store, which is what a single-storefront merchant always wants.","type":"string"},"user":{"description":"User is the id of the signed-in shopper this cart belongs to, when there is\none. Empty means a guest cart identified only by its own id.","type":"string"}},"type":"object"},"ChatTurn":{"properties":{"assets":{"items":{"type":"string"},"type":"array"},"brand":{"type":"string"},"message":{"type":"string"},"model":{"type":"string"},"thread":{"type":"string"}},"type":"object"},"ClipBody":{"properties":{"bytes":{"type":"integer"},"duration":{"type":"integer"},"object":{"type":"string"}},"type":"object"},"CorrectIn":{"properties":{"answer":{"description":"Answer is the right option label; a score's level may be named by its\nindex.","type":"string"},"cohort":{"description":"Cohort groups corrections the org files together.","type":"string"},"decision":{"description":"Decision is the decision's id.","type":"string"},"note":{"description":"Note says why, for the person reading it later.","type":"string"},"question":{"description":"Question is the question's key.","type":"string"}},"type":"object"},"Exception":{"properties":{"frames":{"items":{"$ref":"#/components/schemas/Frame"},"type":"array"},"handled":{"type":"boolean"},"message":{"type":"string"},"stack":{"type":"string"},"type":{"type":"string"}},"type":"object"},"Frame":{"properties":{"column":{"type":"integer"},"file":{"type":"string"},"function":{"type":"string"},"line":{"type":"integer"}},"type":"object"},"LogBody":{"properties":{"body":{"type":"string"},"number":{"type":"integer"},"severity":{"type":"string"}},"type":"object"},"MCPRequest":{"properties":{"id":{},"jsonrpc":{"type":"string"},"method":{"type":"string"},"params":{"additionalProperties":{},"type":"object"}},"type":"object"},"MetricBody":{"properties":{"labels":{"additionalProperties":{},"type":"object"},"name":{"type":"string"},"value":{"type":"number"}},"type":"object"},"PagesDeploy":{"properties":{"branch":{"type":"string"}},"type":"object"},"PatentApproval":{"properties":{"authored_by":{"description":"AuthoredBy is the validated principal who decided. The same rule as\neverywhere here: it comes from the credential, never the body, so one\nperson cannot record a decision on another's behalf.","type":"string"},"canonical":{"description":"Canonical is DERIVED on read: this author's latest word on this\ndisclosure.","type":"boolean"},"comment":{"description":"Comment is the reviewer's note — the part an inventor reads.","type":"string"},"content_hash":{"description":"ContentHash is the server's digest of the recorded content.","type":"string"},"decision":{"description":"Decision is approved, rejected or needs-work. A needs-work is dated and\nretained exactly like a sign-off, because it IS one.","type":"string"},"disclosure_id":{"description":"DisclosureID is the document this decides on. Required.","type":"string"},"id":{"description":"ID is the server's handle for this decision, derived from the disclosure\nand its author. Read-only: a caller cannot name someone else's approval.","type":"string"},"project":{"description":"Project is the SERVER's scope value.","type":"string"},"recorded_at":{"description":"RecordedAt is the server's clock.","type":"string"},"revision":{"description":"Revision is original, corrected or retracted.","type":"string"},"role":{"description":"Role is the capacity the person acted in: author, cto, reviewer, attorney\nor counsel. Required, because \"approved\" by nobody is not a fact.","type":"string"},"seq":{"description":"Seq is the append order.","format":"int64","type":"integer"}},"type":"object"},"PatentDisclosure":{"properties":{"approvals":{"description":"Approvals is DERIVED on read: the current decision of record from each\nperson who has ruled on this disclosure. Never an input — a caller cannot\napprove its own document by writing a field in it.","items":{"$ref":"#/components/schemas/PatentApproval"},"type":"array"},"authored_by":{"description":"AuthoredBy is the validated principal who recorded this version.","type":"string"},"body":{"description":"Body is the document's text. Its digest is published beside it so a reader\ncan tell a stored body from a re-sent one.","type":"string"},"body_sha256":{"description":"BodySHA256 is the SERVER's digest of body. On a read it is the address of\nwhat is stored; a body is never hashed from what a reader sent.","type":"string"},"canonical":{"description":"Canonical is DERIVED on read.","type":"boolean"},"claims":{"description":"Claims is the draft claim set, or a pointer to where it lives.","type":"string"},"content_hash":{"description":"ContentHash is the server's digest of the recorded content.","type":"string"},"filing_ref":{"description":"FilingRef is a filing number a human recorded here after filing. Empty\nmeans nothing has been filed, and no code path fills it.","type":"string"},"id":{"description":"ID is the disclosure's stable id. Required.","type":"string"},"idea_ids":{"description":"IdeaIDs are the conception entries this disclosure is built from. The\nevidence half; a disclosure citing none is an assertion.","items":{"type":"string"},"type":"array"},"implementation_ids":{"description":"ImplementationIDs are the artifacts it describes.","items":{"type":"string"},"type":"array"},"project":{"description":"Project is the SERVER's scope value.","type":"string"},"recorded_at":{"description":"RecordedAt is the server's clock.","type":"string"},"revision":{"description":"Revision is original, corrected or retracted.","type":"string"},"seq":{"description":"Seq is the append order.","format":"int64","type":"integer"},"status":{"description":"Status is draft, reviewed, approved or filed. `approved` means the\napprovals below carry a decision for each required role, which is DERIVED\non read, not a word a caller sets and gets believed.","type":"string"},"summary":{"description":"Summary is the invention in one paragraph, for the reader who decides\nwhether to read the rest.","type":"string"},"title":{"description":"Title names the invention the way the document does.","type":"string"},"visibility":{"description":"Visibility is private, org or public; forced private on a write.","type":"string"}},"type":"object"},"PatentIdea":{"properties":{"alternatives":{"description":"Alternatives are the routes considered and rejected, each with its reason.","items":{"$ref":"#/components/schemas/PatentRejectedAlternative"},"type":"array"},"authored_by":{"description":"AuthoredBy is the validated principal who recorded this version — an IAM\nsubject, never a body field. It is the §115 answer, and a model has none.","type":"string"},"canonical":{"description":"Canonical is DERIVED on read: a version is canonical when it is the\nlatest-appended non-retracted version of its id.","type":"boolean"},"content_hash":{"description":"ContentHash is the SERVER's digest of the recorded content and this\nversion's identity. Computed on a write; read back on a read.","type":"string"},"id":{"description":"ID is the entry's stable id, the key its versions accrue under:\nlowercase, terse, and named for the idea rather than the file —\nlatency-aware-request-routing. Required on a write.","type":"string"},"kind":{"description":"Kind is what kind of conception this is: problem, alternative,\narchitecture, mechanism, decision or rejection. Required on a write.","type":"string"},"notes":{"description":"Notes is anything a later reader needs that the fields above cannot carry.","type":"string"},"prior_art":{"description":"PriorArt is what the author knows already existed, named as the author\nknows it. It is a statement of the inventor's awareness, not a search\nresult, and it is not a substitute for one.","type":"string"},"problem":{"description":"Problem is the technical problem being solved, and why the existing\napproaches fail at it.","type":"string"},"project":{"description":"Project is the sub-scope inside the org this entry is filed under. On a\nwrite it is the SERVER's value and a project in the body is ignored.","type":"string"},"recorded_at":{"description":"RecordedAt is when this store accepted the version, RFC3339, from the\nserver clock.","type":"string"},"revision":{"description":"Revision is the producer's declared kind of this version: original,\ncorrected or retracted. A retracted latest version WITHDRAWS the id; every\nearlier version stays retained.","type":"string"},"seq":{"description":"Seq is this version's place in the store's append order. The ordering\nauthority; never a client value.","format":"int64","type":"integer"},"signature":{"$ref":"#/components/schemas/PatentSignature","description":"PatentSignature is an optional detached signature over this entry's digest."},"statement":{"description":"Statement is the operative idea in the author's own prose — definite\nenough that a reader could implement it from this alone. Required, and the\nfield an examiner would actually read.","type":"string"},"title":{"description":"Title is the one-line name of the entry.","type":"string"},"visibility":{"description":"Visibility is private, org or public. A write forces private.","type":"string"}},"type":"object"},"PatentImplementation":{"properties":{"artifact_sha256":{"description":"ArtifactSHA256 is the digest of the recorded artifact — a diff, a file, a\nbuild — when the caller has one and wants it addressed by content.","type":"string"},"authored_by":{"description":"AuthoredBy is the validated principal who recorded this. Authorship of the\nIDEA is PatentIdea.AuthoredBy — this field records who filed the\nimplementation record, which is not the same question.","type":"string"},"canonical":{"description":"Canonical is DERIVED on read.","type":"boolean"},"content_hash":{"description":"ContentHash is the server's digest of the recorded content.","type":"string"},"generated":{"description":"Generated says the recorded artifact was produced with a model's\nassistance rather than typed by hand.","type":"boolean"},"git_branch":{"description":"GitBranch is the branch that commit was on.","type":"string"},"git_dirty":{"description":"GitDirty says the working tree carried uncommitted changes when this was\nrecorded. It is recorded because an exact commit claim that is not true is\nworse than no commit claim.","type":"boolean"},"git_sha":{"description":"GitSHA is the commit. Together with Seq it is what makes the claim checkable\noutside this app: a reader can go read the code.","type":"string"},"human_review":{"description":"HumanReview is what a person did with the output: accepted, edited,\nrewritten, or none. `none` on a novel mechanism is the disposition to\nknow about.","type":"string"},"id":{"description":"ID is this implementation's stable id — usually the artifact or change it\nrecords, e.g. router-v2-generated. Required.","type":"string"},"idea_ids":{"description":"IdeaIDs names the conceptions this implements. REQUIRED and non-empty:\nan implementation citing nothing is the inverted order the guidance is\nwritten against, and filing it silently would be the worst thing this\nsurface could do.","items":{"type":"string"},"type":"array"},"model":{"description":"Model names the system that produced the code, as it was addressed. This is\nthe field that answers \"how much of this was a tool\" without a guess.","type":"string"},"notes":{"description":"Notes is anything a later reader needs.","type":"string"},"project":{"description":"Project is the SERVER's scope value.","type":"string"},"prompt_sha256":{"description":"PromptSHA256 is the digest of the prompt, not the prompt. The text often\ncarries third-party material; the digest lets a later reader prove the\nsame request was made.","type":"string"},"recorded_at":{"description":"RecordedAt is the server's clock.","type":"string"},"repo":{"description":"Repo is the repository the work landed in.","type":"string"},"revision":{"description":"Revision is original, corrected or retracted.","type":"string"},"seq":{"description":"Seq is the append order, which is what GET /v1/patent/proof compares\nagainst the cited ideas.","format":"int64","type":"integer"},"visibility":{"description":"Visibility is private, org or public; forced private on a write.","type":"string"}},"type":"object"},"PatentRejectedAlternative":{"properties":{"option":{"description":"Option is the approach, in the author's words.","type":"string"},"reason":{"description":"Reason is why it was rejected — the constraint or failure that decided it.","type":"string"}},"type":"object"},"PatentSignature":{"properties":{"algo":{"description":"Algo names the scheme, e.g. ed25519. Empty means the record does not say.","type":"string"},"key_id":{"description":"KeyID names the key that signed. It is a reference, not public bytes.","type":"string"},"value":{"description":"Value is the signature, base64.","type":"string"},"verified":{"description":"Verified is the SERVER's answer to whether it checked this signature. It is\nfalse on a deployment with no verifier wired, and a record carrying an\nunchecked signature says so rather than borrowing credibility.","type":"boolean"}},"type":"object"},"SpanBody":{"properties":{"duration":{"type":"integer"},"id":{"type":"string"},"kind":{"type":"string"},"parent":{"type":"string"},"status":{"type":"string"},"trace":{"type":"string"}},"type":"object"},"UTM":{"properties":{"campaign":{"type":"string"},"content":{"type":"string"},"medium":{"type":"string"},"source":{"type":"string"},"term":{"type":"string"}},"type":"object"},"account.appearance":{"properties":{"accent":{"description":"Accent is the one hue — a CSS colour token (a hex, or a bounded functional\ncolour like rgb()/oklch()). Anything else is dropped rather than stored.","type":"string"},"density":{"description":"Density is the spacing step: \"compact\", \"default\" or \"comfortable\".","type":"string"},"type":{"description":"Type is the text-size multiplier, clamped to the ramp window [0.85, 1.4].\nAbsent (0) leaves the published default.","format":"double","type":"number"}},"type":"object"},"account.keyBudget":{"properties":{"month":{"description":"Month is per calendar month, UTC.","format":"int64","type":"integer"},"total":{"description":"Total is over the key's whole life.","format":"int64","type":"integer"}},"type":"object"},"account.keyEdit":{"properties":{"budget":{"$ref":"#/components/schemas/account.keyBudget","description":"Budget replaces the key's spend caps, in cents; a zero drops that cap."},"expires":{"description":"Expires replaces when the key stops working, RFC 3339. An empty string means\nnever.","type":"string"},"id":{"description":"ID is the key to edit, from the path.","type":"string"},"limit":{"description":"Limit replaces what the key may reach. An empty list makes it unrestricted.","items":{"type":"string"},"type":"array"},"name":{"description":"Name relabels the key.","type":"string"},"rate":{"description":"Rate replaces the key's requests a minute; zero drops the limit.","format":"int64","type":"integer"}},"type":"object"},"account.keyIn":{"properties":{"budget":{"$ref":"#/components/schemas/account.keyBudget","description":"Budget caps what the key may spend on models, in cents, per calendar month\nand in all; a request past either is refused 402. Omitted means no cap."},"expires":{"description":"Expires is when the key stops working, RFC 3339. Omitted means never.","type":"string"},"limit":{"description":"Limit narrows what the key may reach, as `kind:name` entries: `model:zen5`,\n`project:acme`, `product:commerce`, or `model:*` for a whole kind. It only\never NARROWS — a key never reaches further than the person who made it.\nOmitted makes an unrestricted key.\n\nExample: {\"name\": \"ci\", \"limit\": [\"model:zen5\", \"project:acme\"]}","items":{"type":"string"},"type":"array"},"name":{"description":"Name labels the key. Omitted names it \"key N\".","type":"string"},"rate":{"description":"Rate caps the key's requests a minute; past it a request is refused 429.\nOmitted means no limit of its own.","format":"int64","type":"integer"},"type":{"description":"Type is the key class: \"secret\" (sk-, session-equivalent, belongs on a\nserver) or \"publishable\" (pk-, org-identifying, safe in a browser bundle).\nOmitted means secret.","type":"string"}},"type":"object"},"account.onboardReq":{"properties":{"name":{"description":"Name is the organization's display name. Ignored when personal is true, which\nderives the name from the caller's own username instead.","type":"string"},"personal":{"description":"Personal marks the organization as the caller's own space: the name is\nderived from their username and the slug auto-suffixes to stay unique.","type":"boolean"}},"type":"object"},"ad.campaignInput":{"properties":{"account":{"description":"Account is the provider ad-account this campaign runs on (Meta act_<id>). Optional.","type":"string"},"budget":{"description":"Budget is the campaign budget in MINOR units (cents). Negative values clamp to 0.","format":"int64","type":"integer"},"name":{"description":"Name is the campaign's display label. Required; trimmed and bounded to 1024 bytes.","type":"string"},"objective":{"description":"Objective is the campaign goal as the provider names it. Optional, bounded to 1024 bytes.","type":"string"},"platform":{"description":"Platform is the ad network: meta, google, tiktok or x. Empty defaults to meta.","type":"string"},"spend":{"description":"Spend is the amount spent so far in MINOR units (cents). Negative values clamp to 0.","format":"int64","type":"integer"},"status":{"description":"Status is the lifecycle state: draft, active, paused or completed. Empty defaults to draft.","type":"string"}},"type":"object"},"ad.updateCampaignIn":{"properties":{"account":{"description":"Account is the provider ad-account this campaign runs on (Meta act_<id>). Optional.","type":"string"},"budget":{"description":"Budget is the campaign budget in MINOR units (cents). Negative values clamp to 0.","format":"int64","type":"integer"},"name":{"description":"Name is the campaign's display label. Required; trimmed and bounded to 1024 bytes.","type":"string"},"objective":{"description":"Objective is the campaign goal as the provider names it. Optional, bounded to 1024 bytes.","type":"string"},"platform":{"description":"Platform is the ad network: meta, google, tiktok or x. Empty defaults to meta.","type":"string"},"spend":{"description":"Spend is the amount spent so far in MINOR units (cents). Negative values clamp to 0.","format":"int64","type":"integer"},"status":{"description":"Status is the lifecycle state: draft, active, paused or completed. Empty defaults to draft.","type":"string"}},"type":"object"},"affiliate.applyRequest":{"properties":{"requestedCode":{"description":"RequestedCode is the vanity code the applicant asks for; approval may mint\na different one if it is taken. Body-only: the URL cannot supply it.","type":"string"}},"type":"object"},"affiliate.attributeRequest":{"properties":{"code":{"description":"Code is the affiliate code the referred org arrived with. Body-only: the\nURL cannot supply it.","type":"string"}},"type":"object"},"affiliate.clickRequest":{"properties":{"code":{"description":"Code is the share-link code that was clicked. Body-only: the URL cannot\nsupply it.","type":"string"}},"type":"object"},"affiliate.createLinkRequest":{"properties":{"code":{"description":"Code is an optional vanity code; it must be free across the whole\ndirectory, and omitting it mints a random one. Body-only.","type":"string"},"label":{"description":"Label is cosmetic — trimmed, stripped of control characters, capped — and\nnever part of a code. Body-only: the URL cannot supply it.","type":"string"}},"type":"object"},"affiliate.handleRequest":{"properties":{"handle":{"description":"Handle is the public leaderboard display name; empty opts out. Body-only:\nthe URL cannot supply it.","type":"string"}},"type":"object"},"agent.CodingStartIn":{"properties":{"after":{"description":"After names a previous run's session, and starts this one from where that\none stopped instead of from the repository's default. It is how a follow-up\ninstruction — \"now add tests for it\" — builds on work already done rather\nthan beginning again on a fresh clone: the follow-up resumes the earlier\nrun's sandbox and works in its tree, files, installs and all, while that\nsandbox is kept; one reaped by then is cloned again from the earlier branch.\n\nIt sets the base and nothing else, so this run still writes its OWN branch.\nOne run, one branch: a run that wrote back onto an earlier run's branch\nwould break the rule the forge's ref policy is built on, and would leave\ntwo turns of work with one name to review.\n\nA caller who already knows the branch may pass Base directly; this exists\nbecause the branch is derived from a session id and nobody should have to\nknow how. Base wins if both are given.","type":"string"},"agentRef":{"description":"AgentRef names a configured agent to run as, which is how an org pins a\nharness, a model and a prompt to a name. Empty runs the default agent.","type":"string"},"base":{"description":"Base is the branch to start from. Empty takes the repository's default. The\nrun never writes here — it writes the agent branch it answers with.","type":"string"},"desktop":{"description":"Desktop asks for a run with a SCREEN — an image carrying an X server — for a\ntask that has to drive a browser or another windowed program. False, the\ndefault, is a headless checkout, which is what writing code needs.","type":"boolean"},"effort":{"description":"Effort is how hard that model reasons: low, medium or high. Empty takes the\nmodel's own default. Taken by the dev and codex harnesses, like Model.","type":"string"},"issue":{"description":"Issue is the number of the issue on Repo this run resolves. Its pull\nrequest says `Closes #<n>`, so merging the work closes the issue. Zero is a\nrun no issue asked for.","format":"int64","type":"integer"},"mode":{"description":"Mode is what the run may do to the repository: `build` edits, commits and\npushes its branch; `plan` reads the repository and answers with a plan,\nwriting nothing — its sandbox is handed a credential that can only read and\nno push step runs, and the plan arrives as the run's final status. `setup`\nis a plan put to one question: its agent explores the checkout, installs and\nchecks what it finds, and ends with the codebase's environment, which is kept\nas the proposal at /v1/environment/{repo} until someone saves it. Empty is\n`build`. A plan or a setup runs in our sandbox only: a claimed machine clones\nand pushes with its own credential, so one routed to a machine is refused.","type":"string"},"model":{"description":"Model is the model the run's agent thinks with, by the id GET /v1/models\nlists. Empty takes the platform's coding model. The dev and codex harnesses\ntake it; the others do not think with a model we name, so naming one for\nthem is refused.","type":"string"},"project":{"description":"Project scopes the run to one board's work when the org keeps more than one.\nEmpty is the org's default.","type":"string"},"prompt":{"description":"Prompt is the task, in the words you would use with a colleague who has the\ncheckout open. It is the whole instruction: there is no second field for\ncontext, and a prompt that names files and the outcome it wants gets a run\nthat does not have to guess either.","type":"string"},"reply":{"$ref":"#/components/schemas/agent.Reply","description":"Reply is WHERE THE RUN NARRATES ITSELF, when the surface that started it has\nsomewhere for it to talk. Empty means nobody is listening and the run simply\ndoes not narrate — which is the app surface's case, because /v1/agent/coding\nhands back a session id and the session stream is a better progress feed than\nany message could be.\n\nIT IS NOT A FIELD A MODEL FILLS IN. A run asked for in a conversation is\ndispatched with the address that conversation is happening at, written over\nwhatever arrived here (apps/agents/replyto.go). A model naming a channel is\na model naming a room it was not spoken to in, so the value it chose is\ndiscarded rather than argued with — which is the same rule that left the org\nand the subject off this type entirely."},"repo":{"description":"Repo is what to work on: a repository's name, `owner/name` in the caller's\nown org, or the site a repository serves (`hanzo.ai`), as the person said\nit. The engine resolves it against the org's own repositories — a name that\nmatches none is refused with the nearest ones — and finds the clone URL and\nthe push credential from the org itself, so this says WHICH repository and\nnever how to reach it.\n\nA repository on GitHub is named by GitHub's address, `github.com/owner/name`\n— or `owner/name` when the owner is not the org's own — and runs there\ndirectly: it is admitted when the caller's own connected GitHub may push to\nit, or when the caller administers the org and the org's installation holds\nit, and refused otherwise.\n\nA repository the caller can read and not push to — a public repository, or\none their GitHub reads — is cloned read-only: the run works, commits in its\nworkspace, and pushes nothing; its change is kept as the run's artifacts.\n\nEmpty runs in an empty workspace: a fresh git repository in the sandbox,\nwith nothing cloned and nothing pushed.","type":"string"},"targetId":{"description":"TargetID routes the run to a registered machine the org has claimed instead\nof to a sandbox in our cluster. Empty runs it here, which is the usual case.","type":"string"},"task":{"description":"Task is Prompt under the name a caller asking for work tends to reach for.\nThe two are one field: Prompt wins when both are given.","type":"string"},"timeoutSeconds":{"description":"TimeoutSeconds bounds the whole run. Unset takes the default budget; a run\nthat hits the bound is stopped and reports what it had done by then.","format":"int64","type":"integer"},"tool":{"description":"Tool is which harness runs the prompt — dev | claude | codex | python |\nnode — and Desktop is whether the run needs a screen. Both are empty by\ndefault, which is `dev` with no screen, and that default is what every\ncaller gets until it says otherwise.\n\nThey are two fields because they are two questions. The harness decides\nwhat argv starts; the screen decides which image carries an X server. A\ncaller may want claude WITH a browser it can see, and a single enum would\nhave made that combination unsayable.","type":"string"}},"type":"object"},"agent.GPU":{"properties":{"memory":{"description":"VRAM bytes, 0 = unknown","format":"int64","type":"integer"},"model":{"description":"\"GB10\", \"8060S\", \"RTX 4090\"","type":"string"},"vendor":{"description":"nvidia | amd | apple | intel | ...","type":"string"}},"type":"object"},"agent.Metrics":{"properties":{"at":{"description":"unix seconds, server-stamped","format":"int64","type":"integer"},"cpuTemp":{"description":"CPUTemp is the CPU package temperature in °C.","format":"double","type":"number"},"cpuUtil":{"description":"CPUUtil is the busy fraction of all cores over the sample window, 0..1.","format":"double","type":"number"},"decode":{"description":"Decode is generation throughput over the sample window, in tokens per second.","format":"double","type":"number"},"diskRead":{"description":"DiskRead is the block-device read rate in bytes per second.","format":"double","type":"number"},"diskTotal":{"description":"DiskTotal is the size of those filesystems, in bytes.","format":"int64","type":"integer"},"diskUsed":{"description":"DiskUsed is the space used across local block filesystems, in bytes.","format":"int64","type":"integer"},"diskWrite":{"description":"DiskWrite is the block-device write rate in bytes per second.","format":"double","type":"number"},"gpuMemTotal":{"description":"GPUMemTotal is dedicated VRAM in bytes; absent when the GPU shares system memory (unified).","format":"int64","type":"integer"},"gpuMemUsed":{"description":"GPUMemUsed is the memory held by GPU processes, in bytes.","format":"int64","type":"integer"},"gpuPower":{"description":"GPUPower is the total GPU power draw in watts.","format":"double","type":"number"},"gpuPowerLimit":{"description":"GPUPowerLimit is the total enforced GPU power limit in watts; absent when the driver reports none.","format":"double","type":"number"},"gpuTemp":{"description":"GPUTemp is the hottest GPU's temperature in °C.","format":"double","type":"number"},"gpuUtil":{"description":"0..1 aggregate utilization","format":"double","type":"number"},"kvCache":{"description":"KVCache is the KV-cache occupancy, 0..1.","format":"double","type":"number"},"load1":{"description":"Load1 is the machine's own one-minute load average — a count of runnable and\nuninterruptible tasks, NOT a percentage and NOT already divided by core\ncount, so it is read against Spec.CPUs: 8.0 is idle on 16 cores and swamped\non 4. Coerced finite and non-negative on write, so 0 means either genuinely\nidle or nothing reported.","format":"double","type":"number"},"load15":{"description":"Load15 is the same figure over fifteen. The three together are what separate\na machine that is busy right now from one that has been busy all along —\nwhich is the question a dispatcher is really asking.","format":"double","type":"number"},"load5":{"description":"Load5 is the same figure averaged over five minutes.","format":"double","type":"number"},"memFree":{"description":"bytes","format":"int64","type":"integer"},"memUsed":{"description":"bytes","format":"int64","type":"integer"},"model":{"description":"Model is the model id(s) served on this machine, comma-separated, at most 128 bytes.","type":"string"},"netRx":{"description":"NetRx is the receive rate of physical interfaces in bytes per second.","format":"double","type":"number"},"netTx":{"description":"NetTx is the transmit rate of physical interfaces in bytes per second.","format":"double","type":"number"},"prefill":{"description":"Prefill is prompt (prefill) throughput over the sample window, in tokens per second.","format":"double","type":"number"},"running":{"description":"Running is the number of requests being served now.","format":"int64","type":"integer"},"ttft":{"description":"TTFT is the mean time to first token, in seconds, of requests that started in the window.","format":"double","type":"number"},"waiting":{"description":"Waiting is the number of requests queued.","format":"int64","type":"integer"}},"type":"object"},"agent.Reply":{"properties":{"channel":{"description":"Channel is the room inside that workspace, and it is what decides whether\nthere is an address at all. Empty is the ordinary case: a caller of\n/v1/agent/coding holds a session id and reads the stream instead.","type":"string"},"provider":{"description":"Provider is the transport the conversation is on — slack, discord,\ntelegram, teams — and it is what decides who can carry the text at all. An\naddress without it names a room in no particular workspace.","type":"string"},"thread":{"description":"Thread narrows the address to one thread inside the channel — on Slack the\nparent message's ts, the same value a reply carries as thread_ts. Empty\nputs the text at the top level of the channel.","type":"string"},"turn":{"description":"Turn is the turn that renders a run started here: the session whose one\nmessage the run's progress and its outcome are shown in. A run with a Turn\nposts nothing of its own — one question, one message. The dispatcher writes\nit (apps/agents/replyto.go); a model never does.","type":"string"},"user":{"description":"User is the platform's id for the person the conversation is with — whose\nrun it is. A run's buttons name them to anyone else who presses one; it is\nnever what decides who may (that is the chat identity).","type":"string"}},"type":"object"},"agent.Spec":{"properties":{"arch":{"description":"amd64 | arm64 | ...","type":"string"},"cpus":{"description":"logical cores","format":"int64","type":"integer"},"gpus":{"description":"GPUs is every accelerator the machine advertises, one entry each, capped at\n32 on write. Empty means the probe found none — and that is the answer a\nNeed is checked against, so a machine with no entry here clears no\naccelerator floor. The list is not vendor-filtered: what satisfies a job is\ncounts and VRAM, never a brand (see Need).","items":{"$ref":"#/components/schemas/agent.GPU"},"type":"array"},"memory":{"description":"total RAM, bytes","format":"int64","type":"integer"},"os":{"description":"linux | darwin | windows","type":"string"}},"type":"object"},"agent.codingInstruction":{"properties":{"session":{"description":"Session identifies the running or paused coding session from the path.","type":"string"},"text":{"description":"Text is the new instruction to carry into the follow-up run.","type":"string"}},"type":"object"},"agent.controlIn":{"properties":{"id":{"description":"ID is the session to steer, from the path.","type":"string"},"message":{"description":"Message is free text for the running agent, up to 16 KiB. On a stop it is\nrecorded as the cancellation reason.","type":"string"},"payload":{"description":"Payload is a structured argument for the command: any valid JSON up to\n64 KiB, scanned for credentials before it is stored (a hit refuses the\ncommand with 422 and the findings). A task-backed session receives it as\nthe forwarded signal's argument."}},"type":"object"},"agent.createAgentIn":{"properties":{"avatar":{"description":"Avatar and Emoji are how the agent APPEARS. An image wins when both are\ngiven — it is the thing somebody made — and both empty leaves the agent\ndrawn as its initial. Validated by iam/pkg/schema, the same rule a person's\navatar passes, so the 96 KiB bound and the accepted URL forms are stated\nonce for every subject that has a face.","type":"string"},"cap_micro_usd":{"description":"The budget, required. An agent is not creatable without one: a zero cap\nwould mean no limit and no record of its spend, which is what a budget\nexists to remove. Integer micro-USD; the CLI converts dollars before sending.","format":"int64","type":"integer"},"computeRef":{"description":"ComputeRef optionally binds this bot to a visor machine. Opaque here, bounded\nat 256 characters, and not resolved — this package stores the reference and\nthe binding's lifecycle belongs elsewhere.","type":"string"},"description":{"description":"Description is the one line published as the description of the `agent_<name>`\ntool, which is how another agent decides whether to call this one. Optional,\nand worth writing for exactly that reason.","type":"string"},"emoji":{"description":"Emoji is the single glyph shown when there is no image. An image WINS when\nboth are given — it is the thing somebody made — and both empty leaves the\nagent drawn as its initial.","type":"string"},"executionMode":{"description":"ExecutionMode is one-shot or long-running. Empty takes one-shot, which runs\nonly when something POSTs to it. long-running additionally requires Schedule,\nand counts against a per-org cap that answers 409 when it is full.","type":"string"},"instructions":{"description":"Instructions is the system prompt, up to 32 KiB, stored verbatim. This is what\nthe model reads; Description is what other CALLERS read.","type":"string"},"max_task_micro_usd":{"description":"MaxTaskMicroUSD is the ceiling for a single run, in micro-USD. A session\ncannot exceed it even when the period cap still has room, so one runaway\ntask cannot consume a month.","format":"int64","type":"integer"},"model":{"description":"Model names the model to run on. Omit it to take the deployment's configured\ndefault; name one and it is checked against the gateway's served catalogue\nhere, so a model this deployment cannot serve is refused now rather than at\nthe first run. Stored under our own name for it, whatever spelling arrives.","type":"string"},"name":{"description":"Name is the agent's org-unique handle and the only required field. It must\nmatch ^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$, and a name already taken in this org\nis a 409 rather than an overwrite. It is permanent: no update route moves it.","type":"string"},"parent":{"description":"Parent is the agent spawning this one — its id or name, in the caller's\norg. The new agent answers to the org its parent answers to, and a parent\noutside the caller's org is not found: an agent is never spawned into a\nprincipal its creator does not answer to. Omitted for an agent a person\ndefines. Set once; no update moves it.","type":"string"},"period":{"description":"Period is the window the cap resets on: day, week or month.","type":"string"},"schedule":{"description":"Schedule is the 5-field cron a long-running agent fires on, parsed here so a\nbad expression is a 400 and not an agent that silently never runs. Required\nwith long-running; DISCARDED for one-shot rather than stored unused.","type":"string"},"serviceAccountId":{"description":"ServiceAccountID optionally names the IAM agent service account (<org>-<agent>)\na scheduled run should be billed AS, so an autonomous run is attributable to a\nprincipal rather than only to the org. Same 256-character bound, also\nunresolved here.","type":"string"},"tools":{"description":"Tools are the tool names this agent may call. Omitted or empty grants NONE —\nthat default is the agent's authority and is not widened anywhere. The single\nentry \"*\" means whatever the fleet's MCP server serves at the time of each run.","items":{"type":"string"},"type":"array"}},"type":"object"},"agent.eventIn":{"properties":{"actor":{"description":"Actor is who produced the turn. Empty takes the validated caller, which is\nwhat an agent writing its own transcript wants; naming one is for a surface\nrecording on somebody else's behalf.","type":"string"},"id":{"description":"ID is the session to append to, from the path.","type":"string"},"kind":{"description":"Kind is what this turn IS: message, tool-call, spawn, log, status, control\nor progress. Anything else is refused — the vocabulary is closed so a\nreader can branch on it.","type":"string"},"payload":{"description":"Payload is the turn's own body, any valid JSON up to 64 KiB. It is SCANNED\nfor credentials before it is stored, and a hit refuses the whole append with\n422 and the findings — this plane never redacts a secret into a transcript\nit then keeps.\n\nIts SHAPE is the writer's business for every kind but one: a `progress`\nturn is the run reporting on itself in a shape this surface publishes —\n{\"pct\":0-100 (optional), \"phase\":\"running|blocked|done\",\n\"activity\":\"≤120 chars\"} — so a malformed one is refused with 400 instead\nof being stored as prose nobody reads."}},"type":"object"},"agent.patchSessionIn":{"properties":{"cwd":{"description":"Cwd is where the session is working NOW.\n\nIt was write-once — captured at register and never again — which is right\nfor a run that starts in a directory and stays there, and wrong for a linked\nshell, which is a place a person moves around in. The console showed the\ndirectory `hanzo link` happened to be run from and kept showing it after the\nshell had walked away, so the field answered \"which work is this\" with an\nanswer that was true once. A pointer, so an unchanged path is an omitted\nfield rather than a repeated write.","type":"string"},"id":{"description":"ID is the session to update, from the path.","type":"string"},"project":{"description":"Project tags the product this session built; Published is the author's\ndecision to let anyone read the story (provenance.go). Both are pointers so\n\"absent\" and \"cleared\" are different requests.","type":"string"},"published":{"description":"Published opens the session's story to the public build route; false withdraws\nit, and withdrawing is always allowed. PUBLISHING is refused unless the\nsession names a Project — the one set in this same request, or the one already\nstored — because that route is keyed on (org, project). It widens READ access\nto what is already there and grants nothing else.","type":"boolean"},"status":{"description":"Status moves the session to running, paused, done or error. A session that has\nalready finished refuses any change with 409 — done and error are monotonic —\nand moving INTO one stamps the end time. This is the surface REPORTING what\nhappened; a control command never writes it.","type":"string"},"target":{"description":"Target re-dispatches a session to a run-target (the #48 association). \"\" detaches.","type":"string"},"terminal":{"description":"Terminal publishes (or, with \"\", withdraws) the URL this session's live\nterminal can be watched at. A pointer so \"absent\" and \"withdrawn\" are\ndifferent requests: a session that stops sharing must be able to say so.","type":"string"},"title":{"description":"Title rewrites the human line, up to 512 characters — usually because the work\nturned out to be something other than what it was opened as.","type":"string"}},"type":"object"},"agent.patchTargetIn":{"properties":{"capacity":{"description":"Capacity rewrites the human summary, up to 256 characters. \"\" clears it.","type":"string"},"host":{"description":"Host re-points the hostname sessions are matched by. Moving it moves the load:\nthe session counts follow the new name from the next read.","type":"string"},"id":{"description":"ID is the target to update, from the path.","type":"string"},"kind":{"description":"Kind re-files it under laptop | cloud | gpu | cluster | machine.","type":"string"},"label":{"description":"Label renames the machine, up to 128 characters. Empty STRING is refused — a\ntarget with no name is a row nobody can pick out of a fleet.","type":"string"},"metrics":{"$ref":"#/components/schemas/agent.Metrics","description":"Metrics replaces the live sample, and sending one IS A HEARTBEAT: the server\nstamps the time and appends the point to the fleet series. Sending an all-zero\nsample CLEARS the heartbeat — the machine goes back to having no liveness fact\nat all, and its stored status is taken at face value again."},"spec":{"$ref":"#/components/schemas/agent.Spec","description":"Spec replaces the static capability whole, sanitized and clamped the same way\na register's is."},"status":{"description":"Status sets operator INTENT: online | offline | draining. Draining is how a\nmachine is taken out of dispatch without ending what is already on it. What\ncomes back may still read offline, because the heartbeat outranks the intent.","type":"string"}},"type":"object"},"agent.registerReq":{"properties":{"account":{"description":"Account is which subscription or API account under that provider served the\nrun, up to 256 characters. It is what lets a revoke of that login stop exactly\nthe sessions it was paying for.","type":"string"},"agent":{"description":"Agent is the label the surface opening this session calls itself by\n(\"hanzo-dev\"). REQUIRED, up to 128 characters, and free text — nothing\nresolves it against a defined agent.","type":"string"},"budget_micro_usd":{"description":"BudgetMicroUSD caps what this session may spend, integer micro-USD. Zero\nmeans no cap; a cap can be raised or removed later, never added.","format":"int64","type":"integer"},"cwd":{"description":"Cwd is the directory the session starts in, up to 1024 characters. It can be\nmoved later, because a linked shell walks around.","type":"string"},"host":{"description":"Execution context — where this session runs (all optional).","type":"string"},"parentSessionId":{"description":"ParentSessionID makes this a subagent of that session: it inherits the\nparent's root, so one flow stays one tree. The parent must exist IN THE SAME\nORG — a foreign or unknown id is a 400, never a tree across tenants. Empty\nopens a root session.","type":"string"},"project":{"description":"The readable build (provenance.go): which product this session builds, and\nwhether its story may be read by the world.","type":"string"},"provider":{"description":"Account tag — the linked AI account this session ran under (login manager).","type":"string"},"published":{"description":"Published opens this session's story to the public build route. It is refused\nwithout a Project, because that route is keyed on (org, project) — a build\nwith no product is not a story anyone can open. False keeps it org-only.","type":"boolean"},"repo":{"description":"Repo is the code being worked on, up to 512 characters. A label the surface\nstates; nothing resolves it against the forge.","type":"string"},"room":{"description":"Room is the collaborative room this run was started in (HIP-0523), so a\nspace view can list the sessions of one room. It is PROVENANCE and is set\nonly here: there is deliberately no way to move a session to another room, so\nit is absent from the patch input and from UpdateSession's SET list.","type":"string"},"status":{"description":"Status opens the session in one of running, paused, done or error. Empty means\nrunning. A TERMINAL status here (done, error) records a session that has\nalready finished — its end time is stamped now — and nothing can move it\nafterwards.","type":"string"},"target":{"description":"Target names a run-target the org has registered. Unlike Host and Repo it IS\nresolved: a target that does not exist in this org is a 400, so a session can\nnever claim to run on another tenant's machine. Empty names no machine.","type":"string"},"taskRunId":{"description":"TaskRunID is that workflow's particular run, same bound. Recorded, not\nresolved: this surface does not check the workflow exists.","type":"string"},"taskWorkflowId":{"description":"TaskWorkflowID links this session to the hanzoai/tasks workflow that executes\nit, up to 256 characters. Set it and control commands are forwarded to that\nengine; leave it and the running surface polls for them instead.","type":"string"},"terminal":{"description":"Terminal is the URL this session's live terminal is published at, so the\nconsole can watch it. Optional — a session that publishes nothing is still\na session.","type":"string"},"title":{"description":"Title is the human line a card shows, up to 512 characters. Optional, and\nchangeable later.","type":"string"}},"type":"object"},"agent.reportRunIn":{"properties":{"branch":{"description":"Branch, CommitSha and Diffstat describe what the run produced; Error is the\nfailure when OK is false. Each is clamped, never rejected.","type":"string"},"changed":{"description":"Changed says whether the run produced any commit. It is INDEPENDENT of OK: a\nrun can succeed and change nothing (there was nothing to do), and a run can\nfail after committing some of its work. Two questions, two booleans.","type":"boolean"},"commitSha":{"description":"CommitSha is the tip the run pushed, clamped to 128 characters. Empty when it\npushed nothing, which is the same case Changed reports false for.","type":"string"},"diffstat":{"description":"Diffstat is the run's own summary of what it changed, as text, clamped to\n64 KiB. Free-form: it is shown, never parsed.","type":"string"},"error":{"description":"Error is why the run failed, clamped to 64 KiB. It is CLAMPED rather than\nrefused — a truncated reason is worth more than a rejected report, because a\nrejected report leaves the durable workflow waiting forever.","type":"string"},"id":{"description":"ID is the machine reporting, from the path.","type":"string"},"ok":{"description":"OK is whether the run succeeded; Changed whether it produced any commit.","type":"boolean"},"runId":{"description":"RunID is the routed run being completed, from the path.","type":"string"}},"type":"object"},"agent.sessionBudgetIn":{"properties":{"budget_micro_usd":{"description":"BudgetMicroUSD is the new cap, or null to remove the cap for good.","format":"int64","type":"integer"},"id":{"description":"ID is the session, from the path.","type":"string"}},"type":"object"},"agent.targetReq":{"properties":{"capacity":{"description":"Capacity is a human summary of the machine's size, up to 256 characters. Prose\nonly; a scheduler reads Spec.","type":"string"},"host":{"description":"Host is the hostname sessions on this machine will report. It is what makes a\nre-link IDEMPOTENT: the same (org, host, owner) refreshes the existing row and\nanswers 200, while a request with no host always creates a new target and\nanswers 201. It never adopts a row owned by somebody else.","type":"string"},"kind":{"description":"Kind is laptop | cloud | gpu | cluster | machine. Empty registers a `machine`;\nanything outside the five is a 400.","type":"string"},"label":{"description":"Label is the name to show for this machine, up to 128 characters. REQUIRED —\nit is the only field here a person reads.","type":"string"},"metrics":{"$ref":"#/components/schemas/agent.Metrics","description":"Metrics is a live sample, and sending one IS A HEARTBEAT: it refreshes the row\nand starts the 90-second liveness window, and it is appended to the fleet\nseries as one point. Its own `at` is ignored — the server stamps the time, so\na client can never age or backdate its own machine. Omit it to register a\nmachine without claiming it is alive."},"spec":{"$ref":"#/components/schemas/agent.Spec","description":"Spec is the machine's static capability — os, arch, cores, RAM, accelerators.\nEvery field is bounded on write and at most 32 accelerators are accepted, so\nwhat comes back may be clamped. Omit it for a destination nothing probes."},"status":{"description":"Status is online | offline | draining. Empty registers `online`. It states\nINTENT — a heartbeat is what decides whether an online machine is actually\nreachable, so declaring online does not make it so.","type":"string"}},"type":"object"},"agent.updateAgentIn":{"properties":{"avatar":{"description":"Avatar and Emoji re-draw the agent. Sending either replaces the pair, so\nsetting an image clears a glyph and \"\" for both goes back to the initial —\nthere is no state where a row holds two answers.","type":"string"},"cap_micro_usd":{"description":"The budget, any part of it. Changing the period opens a new window.","format":"int64","type":"integer"},"computeRef":{"description":"ComputeRef re-binds (or, with \"\", unbinds) the visor machine. Opaque here.","type":"string"},"description":{"description":"Description replaces the line other agents read in the tool catalogue.","type":"string"},"emoji":{"description":"Emoji re-draws the agent as a glyph. Sending either of the pair replaces\nBOTH, so setting a glyph clears an image and \"\" for both goes back to the\ninitial — there is no state where a row holds two answers.","type":"string"},"executionMode":{"description":"ExecutionMode switches between one-shot and long-running. The RESULTING\nmode+schedule are validated together, so switching to long-running without a\nstored or supplied cron is refused rather than accepted into an agent the\nscheduler would skip forever. A switch INTO long-running counts against the\nper-org cap and can be a 409.","type":"string"},"instructions":{"description":"Instructions replaces the system prompt whole, up to 32 KiB. There is no\nappend: a prompt is one text, and sending \"\" clears it.","type":"string"},"max_task_micro_usd":{"description":"MaxTaskMicroUSD is the ceiling for a single run, in micro-USD. A session\ncannot exceed it even when the period cap still has room, so one runaway\ntask cannot consume a month.","format":"int64","type":"integer"},"model":{"description":"Model re-points the agent at another model, checked against the gateway's\nserved catalogue exactly as create checks it. Empty STRING is refused — say\nnothing to keep the current one. Past runs keep the model that served them.","type":"string"},"period":{"description":"Period is the window the cap resets on: day, week or month.","type":"string"},"ref":{"description":"Ref is the agent to update — its public id or org-unique name, from the path.","type":"string"},"schedule":{"description":"Schedule replaces the cron. It is validated against the mode this update\nleaves behind, and dropped if that mode is one-shot.","type":"string"},"serviceAccountId":{"description":"ServiceAccountID re-points (or, with \"\", clears) the IAM service account a\nscheduled run is billed as. Clearing it puts that spend back on the org.","type":"string"},"tools":{"description":"Tools replaces the whole allow-list, it does not add to it. Sending [] takes\nevery tool away, which is the only way to say that.","items":{"type":"string"},"type":"array"}},"type":"object"},"ai.AnthropicMessage":{"properties":{"content":{},"role":{"type":"string"}},"type":"object"},"ai.AnthropicRequest":{"properties":{"max_tokens":{"type":"integer"},"messages":{"items":{"$ref":"#/components/schemas/ai.AnthropicMessage"},"type":"array"},"model":{"type":"string"},"stream":{"type":"boolean"},"system":{},"temperature":{"type":"number"},"thinking":{},"tool_choice":{},"tools":{"items":{"$ref":"#/components/schemas/ai.AnthropicTool"},"type":"array"}},"type":"object"},"ai.AnthropicTool":{"properties":{"description":{"type":"string"},"input_schema":{},"name":{"type":"string"}},"type":"object"},"ai.DecisionSides":{"properties":{"false":{"description":"A string, an object or an array, kept as written."},"true":{"description":"A string, an object or an array, kept as written."}},"type":"object"},"ai.DecisionsBoolean":{"properties":{"criteria":{"$ref":"#/components/schemas/ai.DecisionSides"},"instructions":{"description":"A string, an object or an array, kept as written."},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"type":{"enum":["boolean"],"type":"string"}},"required":["type"],"type":"object"},"ai.DecisionsChoice":{"properties":{"criteria":{"description":"At least two labels: an object mapping each label to what it means (a string, an object, an array, or null), or an array of labels that need no description."},"instructions":{"description":"A string, an object or an array, kept as written."},"type":{"enum":["choice"],"type":"string"}},"required":["type","criteria"],"type":"object"},"ai.DecisionsNoul":{"properties":{"criteria":{"$ref":"#/components/schemas/ai.DecisionSides"},"instructions":{"description":"A string, an object or an array, kept as written."},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"type":{"enum":["noul"],"type":"string"}},"required":["type"],"type":"object"},"ai.DecisionsQuestion":{"discriminator":{"mapping":{"boolean":"#/components/schemas/ai.DecisionsBoolean","choice":"#/components/schemas/ai.DecisionsChoice","noul":"#/components/schemas/ai.DecisionsNoul","score":"#/components/schemas/ai.DecisionsScore"},"propertyName":"type"},"oneOf":[{"$ref":"#/components/schemas/ai.DecisionsBoolean"},{"$ref":"#/components/schemas/ai.DecisionsNoul"},{"$ref":"#/components/schemas/ai.DecisionsChoice"},{"$ref":"#/components/schemas/ai.DecisionsScore"}]},"ai.DecisionsRequest":{"properties":{"handle":{"type":"string"},"model":{"type":"string"},"observe":{"type":"string"},"provider":{},"questions":{"additionalProperties":{"$ref":"#/components/schemas/ai.DecisionsQuestion"},"maxProperties":100,"minProperties":1,"type":"object"},"session_id":{"type":"string"},"state":{"description":"A string, an object or an array, kept as written."},"trace":{},"user":{"type":"string"}},"required":["model"],"type":"object"},"ai.DecisionsScore":{"properties":{"criteria":{"items":{"description":"A string, an object or an array, kept as written."},"minItems":1,"type":"array"},"instructions":{"description":"A string, an object or an array, kept as written."},"type":{"enum":["score"],"type":"string"}},"required":["type","criteria"],"type":"object"},"ai.RoutingEdit":{"properties":{"base":{"type":"integer"},"catalog":{},"family":{"type":"string"},"model":{"type":"string"},"note":{"type":"string"},"version":{"type":"integer"}},"type":"object"},"ai.RoutingRewardRequest":{"properties":{"rating":{"type":"number"},"request_id":{"type":"string"},"reward":{"type":"number"},"signal":{"enum":["up","accept","regenerate","down","switch","abandon","revert","rating","dismiss"],"type":"string"}},"required":["request_id"],"type":"object"},"aiChatIn":{"properties":{"max_tokens":{"description":"MaxTokens bounds the answer in tokens; 0 leaves it to the model.","format":"int64","type":"integer"},"model":{"description":"Model is the model to answer, by id (zen5, enso, kai, anthropic/claude-sonnet-4.5\n— aiModels lists them). Empty asks the deployment's default Hanzo model.","type":"string"},"prompt":{"description":"Prompt is what to ask.","type":"string"},"system":{"description":"System is the system message ahead of the prompt, when set.","type":"string"}},"type":"object"},"aiDecideIn":{"properties":{"handle":{"description":"Handle decides over a state this org observed earlier, in place of State and\nQuestions.","type":"string"},"model":{"description":"Model is kai, Kai's versioned id kai-<12 hex>, or Jev by its vendor id\n(typesafe/jev-1.13, ~typesafe/jev-latest).","type":"string"},"observe":{"description":"Observe holds the state under this id (1 to 128 of A-Z a-z 0-9 . _ -), so a\nlater decision can name it as its Handle.","type":"string"},"questions":{"additionalProperties":{},"description":"Questions are 1 to 100 named questions, each {\"type\": \"choice\"|\"noul\"|\"score\",\n\"instructions\"?, \"criteria\"?}; a choice names at least 2 labels and a score at\nleast 1 level. Not sent with a Handle.","type":"object"},"state":{"description":"State is what the questions are about: a string, an object or an array, kept\nas written. Not sent with a Handle."}},"type":"object"},"aiLimitsSet":{"properties":{"creditsAfterAllowance":{"description":"CreditsAfterAllowance keeps a model working once the plan's included usage of\nit is spent, paid from prepaid credit (and granted credit where the model takes\nit), when true; when false the conversation moves to a Hanzo model and other\ncalls are refused until the plan resets. Off until the payer turns it on.","type":"boolean"}},"type":"object"},"approvalBatch":{"properties":{"approvals":{"description":"Approvals are the decisions to append, at most 2000.","items":{"$ref":"#/components/schemas/PatentApproval"},"type":"array"}},"type":"object"},"ask.webQuestion":{"properties":{"language":{"description":"Language narrows the search to a locale, BCP-47-ish (\"en\", \"ja\"). Empty\nmeans no narrowing.","type":"string"},"max_sources":{"description":"MaxSources caps how many pages are read. Empty means the mode's own budget.","format":"int64","type":"integer"},"mode":{"description":"Mode is how much work to do: `search` (fast, one pass), `news` (recency\nbiased), `research` (a plan and several rounds) or `deep` (the widest\nsurvey). Empty means research.","type":"string"},"q":{"description":"Q is the question, in plain language. Required.","type":"string"},"sources":{"description":"Sources narrows where the evidence comes from: any of `web`, `news`,\n`academic`, `github`, `reddit`, `x`. Each becomes a site-scoped search, so\n`[\"x\"]` researches X/Twitter posts rather than the open web.","items":{"type":"string"},"type":"array"}},"type":"object"},"askRequest":{"properties":{"followUps":{"type":"boolean"},"language":{"type":"string"},"maxQueries":{"type":"integer"},"maxSources":{"type":"integer"},"mode":{"type":"string"},"model":{"type":"string"},"q":{"type":"string"},"question":{"type":"string"},"sources":{"items":{"type":"string"},"type":"array"},"stream":{"type":"boolean"},"system":{"type":"string"}},"type":"object"},"author.connectRequest":{"properties":{"githubLogin":{"description":"GithubLogin is the account to link. Used only when IAM holds no linked\naccount for the provider — a linked account is stronger proof and always wins.","type":"string"},"login":{"description":"Login is the provider-neutral alias for GithubLogin, preferred when both are\nsent.","type":"string"},"provider":{"description":"Provider is the forge to enrol with: github (the default) or gitlab.","type":"string"}},"type":"object"},"author.deployRequest":{"properties":{"project":{"description":"Project is the deployed project's id. Required.","type":"string"},"repoUrl":{"description":"RepoURL is the source repository the project was built from. Empty means a\nhand-built project with nothing to attribute — an honest no-op, not an error.","type":"string"}},"type":"object"},"author.verifyRequest":{"properties":{"repoUrl":{"description":"RepoURL is what to claim: a repository (github.com/owner/name) or a whole\nOWNER (github.com/owner, no repository segment). gitlab.com is accepted too.","type":"string"}},"type":"object"},"auto.FlowAction":{"properties":{"displayName":{"type":"string"},"name":{"type":"string"},"nextAction":{"$ref":"#/components/schemas/auto.FlowAction"},"settings":{"$ref":"#/components/schemas/auto.StepSettings"},"skip":{"type":"boolean"},"type":{"description":"PIECE | CODE | ROUTER | LOOP_ON_ITEMS","type":"string"},"valid":{"type":"boolean"}},"type":"object"},"auto.FlowTrigger":{"properties":{"displayName":{"type":"string"},"name":{"type":"string"},"nextAction":{"$ref":"#/components/schemas/auto.FlowAction"},"settings":{"$ref":"#/components/schemas/auto.StepSettings"},"strategy":{"type":"string"},"type":{"description":"PIECE_TRIGGER | EMPTY","type":"string"},"valid":{"type":"boolean"}},"type":"object"},"auto.OutcomeTrigger":{"properties":{"name":{"description":"Name is the event, for example improvement.reviewed.","type":"string"},"source":{"description":"Source is the producing capability, for example research.","type":"string"}},"type":"object"},"auto.Schedule":{"properties":{"at":{"description":"At is the local time, HH:MM on a 24-hour clock, for daily, weekdays and\nweekly. Hourly takes its minute, and runs on the hour without one. Once\ntakes a local date and time, YYYY-MM-DDTHH:MM, and runs now without one.","type":"string"},"cron":{"description":"Cron is a five-field cron expression (minute hour day-of-month month\nday-of-week), for kind cron only, read in TZ.","type":"string"},"day":{"description":"Day is the weekday a weekly schedule runs on: mon, tue, wed, thu, fri, sat\nor sun.","type":"string"},"kind":{"description":"Kind is manual, hourly, daily, weekdays, weekly, cron or once. Manual runs\nonly when asked; once runs one time and then switches itself off.","type":"string"},"tz":{"description":"TZ is the IANA time zone every time here is read in. Empty is UTC.","type":"string"}},"type":"object"},"auto.StepSettings":{"properties":{"actionName":{"type":"string"},"input":{"additionalProperties":{},"type":"object"},"pieceName":{"type":"string"},"pieceVersion":{"type":"string"},"triggerName":{"type":"string"}},"type":"object"},"auto.automationIn":{"properties":{"enabled":{"description":"Enabled arms its schedule. Absent is true.","type":"boolean"},"event":{"$ref":"#/components/schemas/auto.OutcomeTrigger","description":"Event arms a product-outcome trigger; it is mutually exclusive with a timed schedule."},"instructions":{"description":"Instructions are what the agent is asked to do each run. Required.","type":"string"},"model":{"description":"Model is the model id to think with. Optional; absent is the default.","type":"string"},"name":{"description":"Name is what it is called. Required.","type":"string"},"notify":{"description":"Notify sends a one-line summary when a run ends.","type":"boolean"},"permissions":{"description":"Permissions is auto (works without stopping) or ask (proposes, changes\nnothing). Absent is ask.","type":"string"},"postTo":{"description":"PostTo are the connected accounts each run's answer is posted to: x,\nlinkedin, facebook. Absent posts nothing.","items":{"type":"string"},"type":"array"},"project":{"description":"Project is a Dev project's slug to work in. Optional.","type":"string"},"schedule":{"$ref":"#/components/schemas/auto.Schedule","description":"Schedule is when it runs. Absent runs it only on demand."},"source":{"description":"Source is the product it is made in: chat, dev, studio or workflow. Absent\nis dev.","type":"string"},"target":{"description":"Target selects a registered execution target for the coding run.","type":"string"}},"type":"object"},"auto.automationPatch":{"properties":{"enabled":{"description":"Enabled arms or disarms its schedule.","type":"boolean"},"event":{"$ref":"#/components/schemas/auto.OutcomeTrigger","description":"Event replaces the trigger with a product outcome; null clears it."},"id":{"description":"ID is the automation, from the path.","type":"string"},"instructions":{"type":"string"},"model":{"type":"string"},"name":{"type":"string"},"notify":{"type":"boolean"},"permissions":{"type":"string"},"postTo":{"items":{"type":"string"},"type":"array"},"project":{"type":"string"},"schedule":{"$ref":"#/components/schemas/auto.Schedule"},"target":{"description":"Target replaces the registered execution target; null clears it.","type":"string"}},"type":"object"},"auto.createFlowReq":{"properties":{"displayName":{"description":"DisplayName names the flow's initial draft version.","type":"string"},"externalId":{"description":"ExternalID is the caller's own id for this flow. Optional.","type":"string"},"folderId":{"description":"FolderID groups the flow in the builder's tree. Optional.","type":"string"},"trigger":{"$ref":"#/components/schemas/auto.FlowTrigger","description":"Trigger is the root of the step tree — how the flow starts, and the action\nchain that follows. Optional: a flow may be created empty and edited later."}},"type":"object"},"auto.createVersionIn":{"properties":{"displayName":{"description":"DisplayName names the new version.","type":"string"},"id":{"description":"ID is the flow to add a version to, from the path.","type":"string"},"trigger":{"$ref":"#/components/schemas/auto.FlowTrigger","description":"Trigger is the root of the version's step tree. Optional: a version with no\ntrigger is created invalid, and cannot run until one is set."}},"type":"object"},"auto.patchFlowIn":{"properties":{"externalId":{"description":"ExternalID sets the caller's own id for this flow.","type":"string"},"folderId":{"description":"FolderID moves the flow in the builder's tree.","type":"string"},"id":{"description":"ID is the flow to update, from the path.","type":"string"},"metadata":{"description":"Metadata replaces the caller's opaque JSON."},"publishedVersionId":{"description":"PublishedVersionID pins the version runs execute. It must name a version OF\nTHIS FLOW; empty clears the pin, so runs take the latest version again.","type":"string"}},"type":"object"},"auto.reviewIn":{"properties":{"id":{"description":"ID is the automation, and Run its run in review, from the path.","type":"string"},"post":{"description":"Post posts it when true and discards it when false.","type":"boolean"},"run":{"type":"string"}},"type":"object"},"auto.runIn":{"properties":{"action":{"description":"Action is the name of the provider action to invoke.","type":"string"},"auth":{"description":"Auth is the caller's resolved credential for the provider, handed to the\naction verbatim. Its shape is whatever the provider's auth descriptor\ndeclares (a token string, an object), so it is opaque here."},"id":{"description":"ID is the provider to run, from the path.","type":"string"},"props":{"additionalProperties":{},"description":"Props are the action's input properties, keyed by property name.","type":"object"}},"type":"object"},"auto.whenIn":{"properties":{"text":{"description":"Text is when it runs, as a person says it: \"every monday at 9am\".","type":"string"},"tz":{"description":"TZ is the IANA zone the words are read in. Empty is UTC.","type":"string"}},"type":"object"},"benchmark.Claim":{"properties":{"benchmark":{"description":"Benchmark is the canonical test id the claim is about, from /catalog.","type":"string"},"evidence":{"description":"Evidence are the evidence uris the claim rests on, at most 64.","items":{"type":"string"},"type":"array"},"model":{"description":"Model is the system the score is claimed for.","type":"string"},"protocol":{"description":"Protocol records HOW it was scored — provider-reported, agentic,\nthird-party-leaderboard — so a provider card is never read as a measurement.","type":"string"},"provider":{"description":"Provider is who the claim belongs to — the lab or leaderboard whose number\nthis is.","type":"string"},"runs":{"description":"Runs are the research run ids the claim rests on, at most 64.","items":{"type":"string"},"type":"array"},"score":{"description":"Score is the reported aggregate, as a percentage.","format":"double","type":"number"},"source":{"description":"Source is the citation the row was read from. Required.","type":"string"}},"type":"object"},"benchmark.Preset":{"properties":{"arms":{"description":"the blend — model ids from the arena","items":{"type":"string"},"type":"array"},"at":{"description":"At is when this version was stored. Set by the server; a value sent is not\nread. Zero on the reference blend.","format":"date-time","type":"string"},"by":{"description":"By is the verified user who stored it. Set by the server; a value sent is\nnot read.","type":"string"},"name":{"description":"the part after enso-: lowercase letters, digits and inner hyphens, at most 64","type":"string"},"note":{"description":"why this blend (audit)","type":"string"},"owner":{"description":"the org the blend belongs to: the writer's verified org, never a value sent","type":"string"},"panel":{"description":"fan-out width (>=1)","format":"int64","type":"integer"},"rank":{"description":"escalation order over arms","items":{"type":"string"},"type":"array"}},"type":"object"},"benchmark.putClaimsIn":{"properties":{"data":{"description":"Data is the claims to record. One row is a correction; many is an import.\nThere is no separate bulk endpoint because there is no separate operation:\nimporting a leaderboard and fixing one number are the same write.","items":{"$ref":"#/components/schemas/benchmark.Claim"},"type":"array"},"visibility":{"description":"Visibility is who may read every row in Data: \"private\", the default, keeps\nthem to the caller's org; \"public\" shows them to anyone. Restating a claim\nwith the other value moves it.","type":"string"}},"type":"object"},"benchmark.suite":{"properties":{"benchmarks":{"description":"Benchmarks are the catalog ids to ask about. At least one is required, and\nevery id must be in the catalog.","items":{"type":"string"},"type":"array"},"model":{"description":"Model is the model to ask about, by the id its attempts are stored under.\nRequired.","type":"string"}},"required":["benchmarks"],"type":"object"},"billing.AlertPatch":{"properties":{"enforce":{"type":"boolean"},"id":{"type":"string"},"project":{"type":"string"},"rateLimitRpm":{"format":"int64","type":"integer"},"service":{"type":"string"},"softPct":{"format":"int64","type":"integer"},"subject":{"type":"string"},"threshold":{"format":"int64","type":"integer"},"title":{"type":"string"}},"type":"object"},"billing.AlertSpec":{"properties":{"currency":{"type":"string"},"enforce":{"type":"boolean"},"project":{"type":"string"},"rateLimitRpm":{"format":"int64","type":"integer"},"service":{"type":"string"},"softPct":{"format":"int64","type":"integer"},"subject":{"type":"string"},"threshold":{"format":"int64","type":"integer"},"title":{"type":"string"}},"type":"object"},"billing.AutoRechargeEdit":{"properties":{"amountCents":{"format":"int64","type":"integer"},"currency":{"type":"string"},"enabled":{"type":"boolean"},"thresholdCents":{"format":"int64","type":"integer"}},"type":"object"},"billing.InvoiceLine":{"properties":{"amount":{"description":"Amount is the line total in whole cents (250000 is $2,500.00).","format":"int64","type":"integer"},"description":{"description":"Description is the human-readable line, e.g. \"Advisory retainer — August\".","type":"string"},"quantity":{"description":"Quantity is the number of units, when the line is metered. Optional.","format":"int64","type":"integer"},"unitPrice":{"description":"UnitPrice is the per-unit price in cents, when the line is metered. Optional.","format":"int64","type":"integer"}},"type":"object"},"billing.InvoiceRef":{"properties":{"brand":{"description":"Brand is the brand that bills (hanzo, lux, zoo, pars), whose mark and\naddress a rendered invoice carries. The edge sets it from the caller's\nissuer; empty is Hanzo.","type":"string"},"id":{"description":"ID is the invoice id.","type":"string"}},"type":"object"},"billing.ModeIn":{"properties":{"testMode":{"type":"boolean"}},"type":"object"},"billing.Money":{"properties":{"currency":{"type":"string"},"decimal":{"type":"string"}},"required":["decimal","currency"],"type":"object"},"billing.RaiseIn":{"properties":{"currency":{"description":"Currency is the ISO 4217 code, lower-cased. Empty means usd.","type":"string"},"customerEmail":{"description":"CustomerEmail is where the invoice is sent. Optional.","type":"string"},"lines":{"description":"Lines are the charges. The invoice subtotal and amount due are COMPUTED\nfrom these — there is no total field to send, because a total that\ndisagreed with its own lines would bill a number nobody could derive.","items":{"$ref":"#/components/schemas/billing.InvoiceLine"},"type":"array"},"userId":{"description":"UserID identifies the customer being billed, within the caller's own org.\nRequired — an invoice with no addressee is not an invoice.","type":"string"}},"type":"object"},"billing.SaleLine":{"properties":{"planId":{"description":"PlanID is the seat type, e.g. \"team-premium\".","type":"string"},"quantity":{"description":"Quantity is the seats of it bought, at least 1.","format":"int64","type":"integer"}},"type":"object"},"billing.SubscriptionSeat":{"properties":{"member":{"description":"Member is the IAM user who holds the seat, as the org's members list names them.","type":"string"},"plan":{"description":"Plan is the seat type held: \"team\" (standard) or \"team-premium\".","type":"string"}},"type":"object"},"billing.assignment":{"properties":{"assigned":{"description":"Assigned is every seat assigned: the member, and the seat type (a plan the\nsubscription holds seats of, \"team\" or \"team-premium\") they hold. It\nreplaces what was assigned; an empty list unassigns every seat.","items":{"$ref":"#/components/schemas/billing.SubscriptionSeat"},"type":"array"}},"type":"object"},"billing.cryptoAsset":{"properties":{"amountCents":{"description":"AmountCents is what the payer intends to send, for the record. Optional —\nthe credit is what actually arrives, never what was announced.","format":"int64","type":"integer"},"chain":{"description":"Chain is the network to receive on. Empty takes the rail's default.","type":"string"},"token":{"description":"Token is the asset on that chain. Empty takes the chain's native one.","type":"string"}},"type":"object"},"billing.resize":{"properties":{"lines":{"description":"Lines are the team's other seat types and the seats of each:\n[{\"planId\":\"team-premium\",\"quantity\":2}]. A seat type of the team the\nsubscription does not hold yet is added.","items":{"$ref":"#/components/schemas/billing.SaleLine"},"type":"array"},"quantity":{"description":"Quantity is the seats of the subscription's own seat type; 0 keeps them.","format":"int64","type":"integer"}},"type":"object"},"billing.subscriptionAct":{"properties":{"atPeriodEnd":{"description":"AtPeriodEnd cancels at the end of the paid period rather than at once. It\ndefaults TRUE, because a customer who cancels has already paid for the\nperiod they are in.","type":"boolean"},"id":{"description":"ID is the subscription, from the path.","type":"string"}},"type":"object"},"billing.topupIn":{"properties":{"amountCents":{"description":"AmountCents is how much to charge, in cents of Currency. Required.","format":"int64","type":"integer"},"currency":{"description":"Currency is the ISO-4217 code to charge in. Empty takes the deployment's\nown default.","type":"string"},"paymentMethodId":{"description":"MethodID names a card the subject already saved, for the saved-card endpoint.","type":"string"},"sourceId":{"description":"SourceID is a single-use card token from the payment form, for the token\nendpoint. It is vaulted as part of the charge, so a caller never holds card\nnumbers and this service never sees one.","type":"string"}},"type":"object"},"billing.usageReport":{"properties":{"amount":{"$ref":"#/components/schemas/billing.Money","description":"Amount is what the act costs, as an exact decimal in USD. It must be\ngreater than zero."},"id":{"description":"ID names the act, chosen by the reporting application and stable across its\nretries: the ledger debits one act once. At most 128 printable characters,\nno whitespace. Reusing an ID for a different amount is a 409.","type":"string"},"model":{"description":"Model names the unit the amount prices (a machine size, a model id), and is\nrecorded with the debit.","type":"string"},"org":{"description":"Org is the organization this usage is billed to. It must be the org the\ntoken acts in — the application's own, or one that granted it membership and\nis selected with X-Org-Id — and any other is refused before money moves.","type":"string"},"project":{"description":"Project attributes the debit to one project of the org. Empty is the org's\ndefault project.","type":"string"},"service":{"description":"Service scopes the debit for spend caps and attributes it to a product, as\na lowercase slug. Empty takes the reporting application's name.","type":"string"}},"type":"object"},"books.AskRequest":{"properties":{"from":{"description":"From is the RFC3339 start of the metric window. Empty means all time, treated as a\nsingle reporting period (see monthsBetween).","type":"string"},"question":{"description":"Question is the plain-language question about the org's books, e.g. \"what is my\nMRR?\". Longer than 2000 characters is truncated, never refused.","type":"string"},"to":{"description":"To is the RFC3339 end of the metric window. Empty means up to now.","type":"string"}},"type":"object"},"books.BookRequest":{"properties":{"override":{"description":"Override books this bill even when one of the SAME economic identity\n(vendor, total, issue date) already posted — the explicit human confirmation that a\nsame-looking bill is a genuine second spend, not the same receipt re-scanned.","type":"boolean"},"scanId":{"description":"ScanID is the scanned document's file hash, as GET /v1/books/inbox and the scan\ndraft report it. It is the idempotency key: re-booking the same scan writes nothing.","type":"string"},"voucher":{"$ref":"#/components/schemas/books.Voucher","description":"Voucher is the reviewed voucher to post. Its source is FORCED to (scan, scanId)\nserver-side, so it can never be booked under another source's key."}},"type":"object"},"books.Leg":{"properties":{"account":{"description":"Account is the chart-of-accounts number this side posts to, e.g. \"5300\".","type":"string"},"credit":{"description":"Credit is the leg's credit in exact cents. Set this or Debit, not both.","format":"int64","type":"integer"},"debit":{"description":"Debit is the leg's debit in exact cents. Set this or Credit, not both.","format":"int64","type":"integer"}},"type":"object"},"books.Rule":{"properties":{"category":{"description":"Category is the COA expense account a matching bill books to. An upsert normalizes\na slug (\"cloud\") to its account number.","type":"string"},"pattern":{"description":"Pattern is the merchant substring the rule matches on, case-insensitively. It is\nalso the key an upsert writes by.","type":"string"},"priority":{"description":"Priority breaks ties: when several patterns match, the highest wins.","format":"int64","type":"integer"}},"type":"object"},"books.VendorRow":{"properties":{"aliases":{"description":"Aliases are the other spellings a receipt may print the vendor under; a scan\nmatching any of them resolves to this vendor.","items":{"type":"string"},"type":"array"},"canonical":{"description":"Canonical is the vendor's one true name, and the key an upsert writes by.","type":"string"},"defaultCategory":{"description":"DefaultCategory is the COA expense account new bills from this vendor book to.\nAn upsert normalizes a slug (\"software\") to its account number.","type":"string"}},"type":"object"},"books.Voucher":{"properties":{"description":{"description":"Description is the human line for the event, e.g. the vendor a bill came from.","type":"string"},"legs":{"description":"Legs are the sides of the posting. They must balance: Σdebit == Σcredit, give or\ntake the 2¢ round-off allowance.","items":{"$ref":"#/components/schemas/books.Leg"},"type":"array"},"postingAt":{"description":"PostingAt is the RFC3339 instant the event posts at — the time every statement\nwindow filters on.","type":"string"},"sourceId":{"description":"SourceID is the source event's own id within that namespace. Together with\nSourceKind it is the key that makes a repeat posting a no-op.","type":"string"},"sourceKind":{"description":"SourceKind is the idempotency namespace naming what booked this, e.g. \"scan\".","type":"string"}},"type":"object"},"campaign.ChannelSpec":{"properties":{"account":{"description":"Account is the provider account this channel runs under: an ad-account, a page\nor a mailing-list id. An executor may replace it at launch with the account it\nactually used.","type":"string"},"detail":{"description":"Detail is the last outcome in one secret-free line — the failure reason, or\nwhat the executor reported. Absent when there is nothing to explain.","type":"string"},"externalId":{"description":"ExternalID is the provider-side id of the running execution, recorded by the\norchestrator at launch and handed back verbatim to read spend or to pause.\nServer-owned and absent until this channel has launched; anything a caller\nsends for it is dropped.","type":"string"},"kind":{"description":"Kind is the channel and the identity a campaign holds at most one of: paid,\norganic or email. It picks the executor the launch fans out to.","type":"string"},"platform":{"description":"Platform is the provider within the kind — meta, google, x, instagram, or the\nemail provider.","type":"string"},"status":{"description":"Status is this channel's own launch outcome, not the campaign's: pending (added,\nnever launched), live, paused, failed (Detail says why) or unavailable (no\nexecutor wired on this deployment). Server-owned — a caller can never assert it.","type":"string"}},"type":"object"},"campaign.campaignUpdate":{"properties":{"audience":{"description":"Audience is the segment or audience selector this campaign targets.","type":"string"},"budget":{"description":"Budget is the campaign's total budget in CENTS. Negative reads as 0.","format":"int64","type":"integer"},"channels":{"description":"Channels are the fan-out targets, at most one per kind (paid, organic,\nemail) and at most 12. A channel's status and provider id are server-owned:\nwhatever the caller sends for them is replaced with \"pending\".","items":{"$ref":"#/components/schemas/campaign.ChannelSpec"},"type":"array"},"content":{"description":"Content is the ordered creative set. Content[0] is the active creative and\nthe rest are A/B variants; at most 32, empty entries dropped.","items":{"type":"string"},"type":"array"},"id":{"description":"ID is the campaign to update, from the path.","type":"string"},"name":{"description":"Name is the campaign's display name. Required; trimmed and capped at 2048\ncharacters.","type":"string"},"scheduleAt":{"description":"ScheduleAt is when the campaign should run, in unix seconds. Negative reads\nas 0 (immediately).","format":"int64","type":"integer"}},"type":"object"},"campaign.campaignWrite":{"properties":{"audience":{"description":"Audience is the segment or audience selector this campaign targets.","type":"string"},"budget":{"description":"Budget is the campaign's total budget in CENTS. Negative reads as 0.","format":"int64","type":"integer"},"channels":{"description":"Channels are the fan-out targets, at most one per kind (paid, organic,\nemail) and at most 12. A channel's status and provider id are server-owned:\nwhatever the caller sends for them is replaced with \"pending\".","items":{"$ref":"#/components/schemas/campaign.ChannelSpec"},"type":"array"},"content":{"description":"Content is the ordered creative set. Content[0] is the active creative and\nthe rest are A/B variants; at most 32, empty entries dropped.","items":{"type":"string"},"type":"array"},"name":{"description":"Name is the campaign's display name. Required; trimmed and capped at 2048\ncharacters.","type":"string"},"scheduleAt":{"description":"ScheduleAt is when the campaign should run, in unix seconds. Negative reads\nas 0 (immediately).","format":"int64","type":"integer"}},"type":"object"},"campaign.channelAdd":{"properties":{"account":{"description":"Account is the provider account this channel runs under: an ad-account, a\npage, or a mailing-list id.","type":"string"},"id":{"description":"ID is the campaign to add the channel to, from the path.","type":"string"},"kind":{"description":"Kind is the channel kind and the identity a campaign holds at most one of:\npaid, organic or email.","type":"string"},"platform":{"description":"Platform is the provider within the kind — meta, google, x, instagram, or\nthe email provider.","type":"string"}},"type":"object"},"captable.captableCompanyUpdate":{"properties":{"incorporationCountry":{"description":"IncorporationCountry is the ISO country the entity is incorporated in.\nOptional; omitted, null or empty clears it. Any JSON scalar is accepted\nand stored as its text."},"incorporationState":{"description":"IncorporationState is the state or province of incorporation. Optional;\nomitted, null or empty clears it. Any JSON scalar is accepted and stored\nas its text."},"incorporationType":{"description":"IncorporationType is the entity kind, e.g. LLC or C_CORP. Optional;\nomitted, null or empty clears it. Any JSON scalar is accepted and stored\nas its text."},"name":{"description":"Name is the company's legal name. Required, and it must be a non-empty\nstring — anything else is refused with the cap table's own validation\nerror."}},"type":"object"},"captable.captableConvertibleIn":{"properties":{"additionalTerms":{"description":"AdditionalTerms is free text for anything the fields above do not carry. Optional."},"boardApprovalDate":{"description":"BoardApprovalDate is when the board approved it, YYYY-MM-DD."},"capital":{"description":"Capital is the principal lent, in the company's currency."},"conversionCap":{"description":"ConversionCap is the valuation the note converts at, at most. Optional."},"discountRate":{"description":"DiscountRate is the discount to the next round's price, as a percentage. Optional."},"interestRate":{"description":"InterestRate is the annual interest the principal accrues, as a percentage. Optional."},"issueDate":{"description":"IssueDate is when the note was issued, YYYY-MM-DD."},"publicId":{"description":"PublicID is the note's identifier. It must be UNIQUE within the company; reusing one is refused 409."},"stakeholderId":{"description":"StakeholderID is the lender. It must name a stakeholder of THIS company."},"status":{"description":"Status is DRAFT, ACTIVE, PENDING, EXPIRED or CANCELLED."},"type":{"description":"Type is CCD, OCD or NOTE."}},"type":"object"},"captable.captableEquityPlanIn":{"properties":{"boardApprovalDate":{"description":"BoardApprovalDate is when the board adopted the plan, YYYY-MM-DD."},"comments":{"description":"Comments is a free-text note kept with the plan. Optional."},"defaultCancellatonBehavior":{"description":"DefaultCancellatonBehavior is what happens to cancelled grants: RETIRE, RETURN_TO_POOL, HOLD_AS_CAPITAL_STOCK or DEFINED_PER_PLAN_SECURITY.\n\nThe key is spelled `defaultCancellatonBehavior` — one `l` — because that is\nthe wire, and correcting it here would silently drop the field."},"initialSharesReserved":{"description":"InitialSharesReserved is how many shares the plan may grant. A whole number."},"name":{"description":"Name is the plan's name, e.g. \"2026 Stock Option Plan\"."},"planEffectiveDate":{"description":"PlanEffectiveDate is when the plan takes effect, YYYY-MM-DD. Optional."},"shareClassId":{"description":"ShareClassID is the class the plan grants from. It must name a class of THIS company."}},"type":"object"},"captable.captableInvestmentIn":{"properties":{"amount":{"description":"Amount is the money invested, in the round's own currency. Required and must\nbe positive."},"comments":{"description":"Comments is a free-text note kept with the investment. Optional."},"date":{"description":"Date is when the investment was made, YYYY-MM-DD. Optional: omitted, it is\nrecorded as today."},"id":{"description":"ID is the round to invest in. The URL is the addressing authority — a path\nsegment binds after the body and after the query — so the address decides\nwhich round is written whatever a body claims.","type":"string"},"stakeholderId":{"description":"StakeholderID is the investor. Required, and it must reference a stakeholder\nof the same company."}},"type":"object"},"captable.captableOptionIn":{"properties":{"boardApprovalDate":{"description":"BoardApprovalDate is when the board approved the grant, YYYY-MM-DD."},"cliffYears":{"description":"CliffYears is how long before ANY of the grant vests. A whole number; 0 for no cliff."},"equityPlanId":{"description":"EquityPlanID is the plan the options come from. It must name a plan of THIS company."},"exercisePrice":{"description":"ExercisePrice is the strike price per share, in the company's currency."},"expirationDate":{"description":"ExpirationDate is when unexercised options lapse, YYYY-MM-DD."},"grantId":{"description":"GrantID is the grant's identifier. It must be UNIQUE within the company; reusing one is refused 409."},"issueDate":{"description":"IssueDate is when the grant was made, YYYY-MM-DD."},"notes":{"description":"Notes is a free-text note kept with the grant. Optional."},"quantity":{"description":"Quantity is how many options to grant. A whole number above 0."},"rule144Date":{"description":"Rule144Date is when the Rule 144 holding period starts, YYYY-MM-DD."},"stakeholderId":{"description":"StakeholderID is who receives the grant. It must name a stakeholder of THIS company."},"status":{"description":"Status is DRAFT, ACTIVE, EXERCISED, EXPIRED or CANCELLED."},"type":{"description":"Type is ISO, NSO or RSU."},"vestingStartDate":{"description":"VestingStartDate is when vesting begins, YYYY-MM-DD."},"vestingYears":{"description":"VestingYears is the total vesting period. A whole number."}},"type":"object"},"captable.captableRoundCloseRequest":{"properties":{"closeDate":{"description":"CloseDate is the date to record the round as closed on. Optional: omitted,\nnull or empty records TODAY. Any JSON scalar is accepted and stored as its\ntext, and the text is stored unparsed, so a caller that wants an ISO date\nsends one."},"id":{"description":"ID is the round to close. It is the path segment: the URL is the\naddressing authority, and the org it is resolved in comes from the\ncaller's principal, so an id from another tenant is simply not found.","type":"string"}},"type":"object"},"captable.captableRoundIn":{"properties":{"name":{"description":"Name is the round's name, e.g. \"Series A\"."},"preMoneyValuation":{"description":"PreMoneyValuation is the company's valuation before the new money. Optional."},"pricePerShare":{"description":"PricePerShare is the price investors pay per share. An investment into a round with a price ISSUES the shares it buys; one into a round priced later records the money alone."},"roundType":{"description":"RoundType is PRICED, SAFE or CONVERTIBLE."},"shareClassId":{"description":"ShareClassID is the class investors receive. It must name a class of THIS company."},"targetAmount":{"description":"TargetAmount is how much the round aims to raise, in the company's currency."}},"type":"object"},"captable.captableSafeIn":{"properties":{"additionalTerms":{"description":"AdditionalTerms is free text for anything the fields above do not carry. Optional."},"boardApprovalDate":{"description":"BoardApprovalDate is when the board approved it, YYYY-MM-DD."},"capital":{"description":"Capital is the money invested, in the company's currency."},"discountRate":{"description":"DiscountRate is the discount to the next round's price, as a percentage. Optional."},"issueDate":{"description":"IssueDate is when the SAFE was signed, YYYY-MM-DD."},"publicId":{"description":"PublicID is the SAFE's identifier. It must be UNIQUE within the company; reusing one is refused 409."},"stakeholderId":{"description":"StakeholderID is the investor. It must name a stakeholder of THIS company."},"status":{"description":"Status is DRAFT, ACTIVE, PENDING, EXPIRED or CANCELLED."},"type":{"description":"Type is PRE_MONEY or POST_MONEY — which side of the new money the cap is measured on."},"valuationCap":{"description":"ValuationCap is the valuation the SAFE converts at, at most. Optional; omit for an uncapped SAFE."}},"type":"object"},"captable.captableShareClassAmend":{"properties":{"boardApprovalDate":{"description":"BoardApprovalDate is when the board approved the class, YYYY-MM-DD."},"classType":{"description":"ClassType is COMMON or PREFERRED."},"conversionRights":{"description":"ConversionRights is CONVERTS_TO_FUTURE_ROUND or CONVERTS_TO_SHARE_CLASS_ID. The second requires convertsToShareClassId."},"convertsToShareClassId":{"description":"ConvertsToShareClassID names the class this one converts into. Required when conversionRights is CONVERTS_TO_SHARE_CLASS_ID, ignored otherwise."},"id":{"description":"ID addresses the resource. The URL is the addressing authority — a path\nsegment binds after the body and after the query — so the address decides\nwhich row is written whatever a body claims.","type":"string"},"initialSharesAuthorized":{"description":"InitialSharesAuthorized is how many shares this class may issue. A whole number."},"liquidationPreferenceMultiple":{"description":"LiquidationPreferenceMultiple is the multiple of invested capital paid out before junior classes — 1 for a 1x preference."},"name":{"description":"Name is the share class's name, e.g. \"Series A Preferred\"."},"parValue":{"description":"ParValue is the nominal per-share value on the certificate, in the company's currency."},"participationCapMultiple":{"description":"ParticipationCapMultiple caps participation after the preference is paid, as a multiple of invested capital. 0 for no cap."},"pricePerShare":{"description":"PricePerShare is the issue price for this class, in the company's currency."},"seniority":{"description":"Seniority orders liquidation preference: LOWER is more senior, so 1 is paid before 2."},"stockholderApprovalDate":{"description":"StockholderApprovalDate is when the stockholders approved it, YYYY-MM-DD."},"votesPerShare":{"description":"VotesPerShare is how many votes one share of this class carries. A whole number; 0 for non-voting."}},"type":"object"},"captable.captableShareClassIn":{"properties":{"boardApprovalDate":{"description":"BoardApprovalDate is when the board approved the class, YYYY-MM-DD."},"classType":{"description":"ClassType is COMMON or PREFERRED."},"conversionRights":{"description":"ConversionRights is CONVERTS_TO_FUTURE_ROUND or CONVERTS_TO_SHARE_CLASS_ID. The second requires convertsToShareClassId."},"convertsToShareClassId":{"description":"ConvertsToShareClassID names the class this one converts into. Required when conversionRights is CONVERTS_TO_SHARE_CLASS_ID, ignored otherwise."},"initialSharesAuthorized":{"description":"InitialSharesAuthorized is how many shares this class may issue. A whole number."},"liquidationPreferenceMultiple":{"description":"LiquidationPreferenceMultiple is the multiple of invested capital paid out before junior classes — 1 for a 1x preference."},"name":{"description":"Name is the share class's name, e.g. \"Series A Preferred\"."},"parValue":{"description":"ParValue is the nominal per-share value on the certificate, in the company's currency."},"participationCapMultiple":{"description":"ParticipationCapMultiple caps participation after the preference is paid, as a multiple of invested capital. 0 for no cap."},"pricePerShare":{"description":"PricePerShare is the issue price for this class, in the company's currency."},"seniority":{"description":"Seniority orders liquidation preference: LOWER is more senior, so 1 is paid before 2."},"stockholderApprovalDate":{"description":"StockholderApprovalDate is when the stockholders approved it, YYYY-MM-DD."},"votesPerShare":{"description":"VotesPerShare is how many votes one share of this class carries. A whole number; 0 for non-voting."}},"type":"object"},"captable.captableShareIn":{"properties":{"boardApprovalDate":{"description":"BoardApprovalDate is when the board approved the issuance, YYYY-MM-DD."},"capitalContribution":{"description":"CapitalContribution is cash paid for the shares. Optional."},"certificateId":{"description":"CertificateID is the certificate number. It must be UNIQUE within the company; reusing one is refused 409."},"cliffYears":{"description":"CliffYears is how long before ANY of the grant vests. A whole number; 0 for no cliff."},"companyLegends":{"description":"CompanyLegends are the restrictive legends printed on the certificate.\n\nA LIST, and it must be sent as one: the bundle substitutes an EMPTY list for\nanything that is not an array, so a single string would be accepted and\nsilently discarded — the certificate issued with no legends and nothing\nreporting it.","items":{},"type":"array"},"debtCancelled":{"description":"DebtCancelled is debt forgiven as consideration. Optional."},"ipContribution":{"description":"IPContribution is intellectual property assigned as consideration, valued in the company's currency. Optional."},"issueDate":{"description":"IssueDate is when the shares were issued, YYYY-MM-DD."},"otherContributions":{"description":"OtherContributions is any other consideration, valued in the company's currency. Optional."},"pricePerShare":{"description":"PricePerShare is what was paid per share. Optional."},"quantity":{"description":"Quantity is how many shares to issue. A whole number above 0."},"rule144Date":{"description":"Rule144Date is when the Rule 144 holding period starts, YYYY-MM-DD. Optional."},"shareClassId":{"description":"ShareClassID is the class being issued. It must name a class of THIS company."},"stakeholderId":{"description":"StakeholderID is who receives the shares. It must name a stakeholder of THIS company."},"status":{"description":"Status is ACTIVE, DRAFT, SIGNED or PENDING."},"vestingStartDate":{"description":"VestingStartDate is when vesting begins, YYYY-MM-DD. Optional; defaults to the issue date."},"vestingYears":{"description":"VestingYears is the total vesting period. A whole number; 0 for fully vested at issue."}},"type":"object"},"captable.captableShareTransfer":{"properties":{"certificateId":{"description":"CertificateID names the NEW certificate a partial transfer issues, and is\nrequired for one — a partial transfer without it is refused 400. It is unused\nby a full transfer, which reassigns the existing certificate.\n\nIt must be unique within the company; reusing one is refused 409. Declaring\nit is not optional in the way the tag suggests: omitting this field from the\nGo type would leave `quantity` accepted and every PARTIAL transfer answering\n\"certificateId is required\" with no way for a caller to supply it — the\nsilent-drop failure this whole conversion was blocked on, one field wide."},"quantity":{"description":"Quantity is how many shares to move. OPTIONAL, and its absence is not zero:\nomitted or null transfers the WHOLE certificate. A value outside 1..held is\nrefused, so a partial transfer can never over-issue.\n\nA full transfer REASSIGNS the certificate and mints no new one; a partial\ntransfer splits it and answers with the new share's id. That is the fact a\ncaller needs from the answer, not from this comment."},"shareId":{"description":"ShareID is the certificate being transferred. Required, and it must name a\nshare in the caller org's own company — a share id from another tenant\nresolves to not-found rather than to another company's certificate."},"toStakeholderId":{"description":"ToStakeholderID is who receives them. Required, and it must reference a\nstakeholder of the SAME company; one that does not is refused 400 rather\nthan creating a dangling holder."}},"type":"object"},"captable.captableStakeholderPatch":{"properties":{"city":{"description":"City is the stakeholder's city."},"currentRelationship":{"description":"CurrentRelationship is how the stakeholder relates to the company, e.g.\nFOUNDER, INVESTOR or EMPLOYEE. This route stores it as sent — unlike\nadding a stakeholder, it is not checked against the vocabulary."},"email":{"description":"Email is the stakeholder's email. This route stores it as sent — unlike\nadding a stakeholder, it is not checked for shape or uniqueness."},"id":{"description":"ID is the stakeholder to update. It is the path segment: the URL is the\naddressing authority, and the org it is resolved in comes from the\ncaller's principal, so an id from another tenant is simply not found.","type":"string"},"institutionName":{"description":"InstitutionName names the institution, when the stakeholder is one."},"name":{"description":"Name is the stakeholder's full name."},"stakeholderType":{"description":"StakeholderType is INDIVIDUAL or INSTITUTION. This route stores it as\nsent — unlike adding a stakeholder, it is not checked against the\nvocabulary."},"state":{"description":"State is the stakeholder's state or province."},"streetAddress":{"description":"StreetAddress is the stakeholder's street address."},"taxId":{"description":"TaxID is the stakeholder's tax identifier."},"zipcode":{"description":"Zipcode is the stakeholder's postal code."}},"type":"object"},"channel.allowlistPutIn":{"properties":{"accessGroups":{"additionalProperties":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object"},"description":"AccessGroups REPLACES the org's named access groups, as\ngroup name -> channel -> entries. Absent or null leaves them alone.","type":"object"},"channel":{"description":"Channel is the transport to edit: discord, github, linear, slack, teams, telegram or whatsapp.\nRequired; an unknown value is a 404.","type":"string"},"dm":{"description":"DM REPLACES the config-managed DM allow entries. Absent or null leaves them\nalone; an empty list clears them. It never touches senders approved through\npairing — a policy edit cannot revoke an approved pairing.","items":{"type":"string"},"type":"array"},"dmPolicy":{"description":"DMPolicy sets how direct messages are admitted: \"pairing\" (a person must be\napproved first), \"allowlist\" (only listed senders) or \"open\". Empty leaves\nit unchanged.","type":"string"},"group":{"description":"Group REPLACES the config-managed group allow entries. Absent or null\nleaves them alone; an empty list clears them.","items":{"type":"string"},"type":"array"},"groupPolicy":{"description":"GroupPolicy sets how group and thread rooms are admitted: \"open\",\n\"allowlist\" or \"disabled\". Empty leaves it unchanged.","type":"string"}},"type":"object"},"channel.approvePairingIn":{"properties":{"channel":{"description":"Channel is the transport the request came in on: discord, slack, teams,\ntelegram or whatsapp.","type":"string"},"code":{"description":"Code is the pairing code from GET /v1/channel/pairing. It is a capability:\nholding it is what authorises the approval, alongside org admin.","type":"string"}},"type":"object"},"channel.channelAgentsPut":{"properties":{"channel":{"description":"Channel is the transport to edit. Required; an unknown value is a 404.","type":"string"},"default":{"description":"Default sets the agent for rooms with no binding of their own; \"hanzo\"\nrestores the built-in. Empty or absent leaves it unchanged.","type":"string"},"rooms":{"additionalProperties":{"type":"string"},"description":"Rooms binds platform room ids to agents; rooms not named are left alone.","type":"object"},"unbind":{"description":"Unbind removes the bindings of these rooms, so they fall back to Default.","items":{"type":"string"},"type":"array"}},"type":"object"},"cloudflare.D1Query":{"properties":{"params":{"description":"Params are the statement's bound values, in the order its `?` placeholders\nappear — a string, a number, a boolean or null, whatever the column takes.\nAbsent means the statement carries no placeholders; bind values here rather\nthan interpolating them into the statement.","items":{},"type":"array"},"sql":{"description":"SQL is the statement to run. Blank (or absent) is refused before anything\nreaches D1.","type":"string"}},"type":"object"},"cloudflare.PagesBuildConfig":{"properties":{"build_command":{"description":"BuildCommand is what Cloudflare runs to build the site (\"npm run build\").\nOmitted means no build step: the repository is published as it stands.","type":"string"},"destination_dir":{"description":"DestinationDir is the directory the build leaves the site in (\"dist\"),\nrelative to RootDir. It is what gets served.","type":"string"},"root_dir":{"description":"RootDir is where in the repository the build runs, for a project that is not at\nthe repository root. Omitted means the root.","type":"string"}},"type":"object"},"cloudflare.PagesD1Binding":{"properties":{"id":{"description":"ID is the D1 database this binding points at, by Cloudflare's uuid. The binding\nname the Worker code reads it as is the map key, not a field here.","type":"string"}},"type":"object"},"cloudflare.PagesDeploymentConfig":{"properties":{"compatibility_date":{"description":"CompatibilityDate pins which Workers runtime behaviour the functions run under,\nas a date (\"2024-01-01\"). It is a pin, not a version: the runtime keeps that\ndate's semantics for code deployed against it.","type":"string"},"compatibility_flags":{"description":"CompatibilityFlags turn individual runtime behaviours on or off ahead of, or\nbehind, the date above (\"nodejs_compat\").","items":{"type":"string"},"type":"array"},"d1_databases":{"additionalProperties":{"$ref":"#/components/schemas/cloudflare.PagesD1Binding"},"description":"D1Databases binds D1 databases in, keyed by binding name.","type":"object"},"env_vars":{"additionalProperties":{"$ref":"#/components/schemas/cloudflare.PagesEnvVar"},"description":"EnvVars are the environment variables the functions see, KEYED BY VARIABLE NAME.\nThe key is the name; the value carries the value and whether it is a secret.","type":"object"},"kv_namespaces":{"additionalProperties":{"$ref":"#/components/schemas/cloudflare.PagesKVBinding"},"description":"KVNamespaces binds KV namespaces into the functions, KEYED BY THE BINDING NAME\nthe code reads (`env.SESSIONS`). Same shape for the two below.","type":"object"},"r2_buckets":{"additionalProperties":{"$ref":"#/components/schemas/cloudflare.PagesR2Binding"},"description":"R2Buckets binds R2 buckets in, keyed by binding name.","type":"object"}},"type":"object"},"cloudflare.PagesDeploymentConfigs":{"properties":{"preview":{"$ref":"#/components/schemas/cloudflare.PagesDeploymentConfig","description":"Preview is the config every branch build other than the production branch runs\nunder. It is a SEPARATE set of bindings and variables, which is what lets a\npreview point at test data."},"production":{"$ref":"#/components/schemas/cloudflare.PagesDeploymentConfig","description":"Production is the config the production branch builds under."}},"type":"object"},"cloudflare.PagesEnvVar":{"properties":{"type":{"description":"Type is \"plain_text\" or \"secret_text\" and decides that: plain text is readable\nafterwards, secret text is write-only. Empty is Cloudflare's default,\nplain_text — so a secret with no type set is stored in the clear.","type":"string"},"value":{"description":"Value is the variable's value. Under type \"secret_text\" Cloudflare encrypts it\non arrival and never reads it back, so a later read of the project shows the\nvariable without this.","type":"string"}},"type":"object"},"cloudflare.PagesKVBinding":{"properties":{"namespace_id":{"description":"NamespaceID is the KV namespace this binding points at, by Cloudflare's id\nrather than its title. The BINDING NAME — what the Worker code reads it as — is\nthe map key this value sits under, not a field here.","type":"string"}},"type":"object"},"cloudflare.PagesProjectCreate":{"properties":{"build_config":{"$ref":"#/components/schemas/cloudflare.PagesBuildConfig","description":"BuildConfig says how to build the site. Omitted means no build step."},"deployment_configs":{"$ref":"#/components/schemas/cloudflare.PagesDeploymentConfigs","description":"DeploymentConfigs carries the preview and production runtime configs — the\nbindings and variables the built site's functions run with."},"name":{"description":"Name is the project name, and it is also the address: the site answers at\n<name>.pages.dev. Cloudflare will not rename a project afterwards.","type":"string"},"production_branch":{"description":"ProductionBranch is which git branch builds to production; every other branch\nbuilds a preview. Omitted leaves Cloudflare's own default.","type":"string"}},"type":"object"},"cloudflare.PagesR2Binding":{"properties":{"name":{"description":"Name is the R2 bucket this binding points at, by bucket name — R2 addresses\nbuckets by name where KV and D1 use ids. The binding name the Worker code reads\nit as is the map key.","type":"string"}},"type":"object"},"cloudflare.WorkerScriptPut":{"properties":{"bindings":{"description":"Bindings are the resources the script can reach (KV, D1, R2, secrets, …), in\nCloudflare's own binding vocabulary, passed through as written: this plane\ndeliberately does not model Cloudflare's shapes. Absent uploads a script with\nNO bindings, which replaces whatever the previous version had."},"compatibilityDate":{"description":"CompatibilityDate pins which Workers runtime behaviour the script runs under,\nas a plain calendar date (\"2024-01-01\"). Absent leaves the account's own\ndefault in force.","type":"string"},"compatibilityFlags":{"description":"CompatibilityFlags turn individual runtime behaviours on or off around that\ndate (\"nodejs_compat\"), in Cloudflare's own flag vocabulary. Absent means the\ndate alone decides.","items":{"type":"string"},"type":"array"},"mainModule":{"description":"MainModule is the module file the runtime starts at. Absent means \"worker.js\".","type":"string"},"script":{"description":"Script means two things on this route, and the document says so in both places\nit appears: the PATH segment names the Worker to publish, and the BODY field\ncarries that Worker's ES-module source — the code itself, never a name or a\nURL. A blank or absent source is refused; there is no empty Worker.","type":"string"}},"type":"object"},"cloudflare.bucketCreateIn":{"properties":{"name":{"description":"Name is the bucket name to create.","type":"string"}},"type":"object"},"cloudflare.databaseCreateIn":{"properties":{"name":{"description":"Name is the database name to create.","type":"string"}},"type":"object"},"cloudflare.domainAddIn":{"properties":{"name":{"description":"Name is the custom domain to attach, e.g. \"www.acme.com\".","type":"string"},"project":{"description":"Project is the Pages project name, from the path.","type":"string"}},"type":"object"},"cloudflare.namespaceCreateIn":{"properties":{"title":{"description":"Title is the namespace's display title. Cloudflare mints the id.","type":"string"}},"type":"object"},"cloudflare.purgeIn":{"properties":{"files":{"description":"Files purges exactly the listed URLs — at most 30, Cloudflare's per-request cap.","items":{"type":"string"},"type":"array"},"purge_everything":{"description":"Everything drops the zone's entire edge cache.","type":"boolean"},"zone":{"description":"Zone is the 32-hex Cloudflare zone id, from the path.","type":"string"}},"type":"object"},"cloudflare.routeCreateIn":{"properties":{"pattern":{"description":"Pattern is the URL pattern to bind, e.g. \"acme.com/api/*\".","type":"string"},"script":{"description":"Script is the Worker script to dispatch to. Omit it to leave the pattern\nbound to no script, which is how Cloudflare expresses \"bypass the Worker here\".","type":"string"},"zone":{"description":"Zone is the 32-hex Cloudflare zone id, from the path.","type":"string"}},"type":"object"},"cloudflare.subdomainSetIn":{"properties":{"enabled":{"description":"Enabled publishes the script on <script>.<subdomain>.workers.dev when true,\nand withdraws it when false.","type":"boolean"},"script":{"description":"Script is the Worker script name, from the path.","type":"string"}},"type":"object"},"code.askPostIn":{"properties":{"query":{"description":"Query is the question, from the BODY. Takes precedence over `?q=`.","type":"string"},"repo":{"description":"Repo is the repository narrowing, from the BODY. Takes precedence over `?repo=`.","type":"string"}},"type":"object"},"code.contextIn":{"properties":{"budgetTokens":{"description":"BudgetTokens caps the bundle's size. Clamped to [256, 32000]; 0 or absent\nuses 4000.","format":"int64","type":"integer"},"query":{"description":"Query is what to retrieve context for. Required, max 4000 bytes.","type":"string"},"repo":{"description":"Repo narrows retrieval to one repository. Empty searches every repo the org\nhas indexed.","type":"string"}},"type":"object"},"code.fileInput":{"properties":{"content":{"description":"Content is the file's full text. Max 1 MiB per file; binary files should\nsimply be omitted rather than sent.","type":"string"},"path":{"description":"Path is the file's repo-relative path, e.g. \"internal/store/db.go\".","type":"string"}},"type":"object"},"code.indexIn":{"properties":{"files":{"description":"Files is the full set of files to index. Required and non-empty; max 20000\nfiles, 1 MiB per file and 1 GiB in total. Unchanged files are skipped by\ncontent hash, so re-sending the whole tree is cheap.","items":{"$ref":"#/components/schemas/code.fileInput"},"type":"array"},"prune":{"description":"Prune deletes indexed files that are NOT in this request — which makes the\ncall a full sync of the repo rather than an upsert. Only pass it when Files\nis the complete tree.","type":"boolean"},"repo":{"description":"Repo is the repository label to index under. Required, max 200 bytes. It is\na stored column value, not a filesystem path.","type":"string"}},"type":"object"},"company.Founder":{"properties":{"decidedBy":{"description":"DecidedBy is who settled a terminal KYC status: the provider name, or a\nreviewer's user id.","type":"string"},"email":{"description":"Email is the founder's email, and the key a KYC decision addresses a founder\nby — POST /v1/company/kyc/decision matches on it.","type":"string"},"equityBps":{"description":"EquityBps is the founder's ownership in basis points, 0–10000 (1% == 100 bps,\nso 10000 is the whole company). The founders' shares seed the cap-table genesis.","format":"int64","type":"integer"},"kycRef":{"description":"KYCRef is the idv provider's session reference for this founder.","type":"string"},"kycStatus":{"description":"KYCStatus is the founder's identity-verification state: pending, verified (a\nreal idv provider reported a pass), reviewer_confirmed (a privileged reviewer\nconfirmed out-of-band) or failed. The payment stage is unreachable until every\nfounder passes.","type":"string"},"name":{"description":"Name is the founder's full legal name, as it appears on the formation documents.","type":"string"}},"type":"object"},"company.Responsible":{"properties":{"country":{"description":"Country is where they reside, ISO 3166-1 alpha-2.","type":"string"},"email":{"description":"Email reaches them for signature.","type":"string"},"name":{"description":"Name is their full legal name as the IRS will hold it.","type":"string"},"usTaxId":{"description":"USTaxID reports that they hold an SSN or ITIN. It is a BOOLEAN on purpose:\nthe number itself is never needed here and a field that could hold it is a\nfield that will eventually be logged.","type":"boolean"}},"type":"object"},"company.RoundInput":{"properties":{"name":{"description":"Name is the round's name on the cap table, e.g. \"Seed\". Required.","type":"string"},"preMoneyValuation":{"description":"PreMoneyValuation is the valuation the round prices off, before the new money.","format":"double","type":"number"},"pricePerShare":{"description":"PricePerShare is the per-share price of a priced round.","format":"double","type":"number"},"roundType":{"description":"RoundType is PRICED, SAFE or CONVERTIBLE_NOTE. Defaults to PRICED.","type":"string"},"shareClassId":{"description":"ShareClassID is the cap table's share class the round issues into.","type":"string"},"targetAmount":{"description":"TargetAmount is the amount the round is raising, recorded verbatim on the\ncanonical cap table's rounds.create contract.","format":"double","type":"number"}},"type":"object"},"company.Signer":{"properties":{"email":{"description":"Email is the address the signature request is sent to.","type":"string"},"name":{"description":"Name is the recipient's name, as it appears on the signature request.","type":"string"}},"type":"object"},"company.advanceIn":{"properties":{"to":{"description":"To is the target stage: structure, founders, payment, documents, esign,\ngenesis, import or company.","type":"string"}},"type":"object"},"company.beginIn":{"properties":{"alreadyIncorporated":{"description":"AlreadyIncorporated declares an org that already has an entity, which takes\nthe import path (POST /v1/company/skip) instead of the formation path.","type":"boolean"},"jurisdiction":{"description":"Jurisdiction is the state of formation: DE or WY.","type":"string"},"name":{"description":"Name is the proposed company name.","type":"string"},"structure":{"description":"Structure is the legal entity to form: c-corp, llc or dao-llc.","type":"string"}},"type":"object"},"company.einIn":{"properties":{"expedited":{"description":"Expedited asks for prioritised handling. Only meaningful when the\nresponsible party cannot file online.","type":"boolean"},"naics":{"description":"NAICS is the six-digit code for what the business does.","type":"string"},"responsible":{"$ref":"#/components/schemas/company.Responsible","description":"Responsible is the person the IRS holds answerable for the entity."}},"type":"object"},"company.esignCompleteIn":{"properties":{"signed":{"description":"Signed, when present, overrides what the provider reports — the manual path\nfor a provider whose webhook is not wired. Omit it to take the provider's answer.","type":"boolean"}},"type":"object"},"company.foundersIn":{"properties":{"founders":{"description":"Founders is every founding stakeholder. Each needs a name and an email, and\nequityBps between 0 and 10000 (1% == 100 bps).","items":{"$ref":"#/components/schemas/company.Founder"},"type":"array"}},"type":"object"},"company.importCapTableIn":{"properties":{"range":{"description":"Range is an optional A1 range within the sheet; empty reads the default range.","type":"string"},"spreadsheetId":{"description":"SpreadsheetID is a Google Sheets id. Required.","type":"string"}},"type":"object"},"company.importDocumentsIn":{"properties":{"folderId":{"description":"FolderID is a Google Drive folder id. Required.","type":"string"}},"type":"object"},"company.safeIn":{"properties":{"documentIds":{"description":"DocumentIDs are data room document ids to raise a signature request over. Required.","items":{"type":"string"},"type":"array"},"signers":{"description":"Signers are the recipients, each a name and an email. Required.","items":{"$ref":"#/components/schemas/company.Signer"},"type":"array"}},"type":"object"},"company.structureIn":{"properties":{"jurisdiction":{"description":"Jurisdiction is the state of formation: DE or WY.","type":"string"},"name":{"description":"Name is the proposed company name.","type":"string"},"structure":{"description":"Structure is the legal entity: c-corp, llc or dao-llc.","type":"string"}},"type":"object"},"company.tariffIn":{"properties":{"agentOfRecord":{"description":"AgentOfRecord puts us on file as the entity's agent, yearly.","type":"boolean"},"expeditedEin":{"description":"ExpeditedEIN prioritises the EIN.","type":"boolean"},"jurisdiction":{"description":"Jurisdiction is the state of formation.","type":"string"},"structure":{"description":"Structure is the entity being formed: c-corp, llc or dao-llc.","type":"string"}},"type":"object"},"compliance.accreditationDecision":{"properties":{"id":{"description":"ID is the accreditation record to decide, from the path.","type":"string"},"status":{"description":"Status is the decision being recorded: reviewer_confirmed, provider_verified,\nrejected, or expired.","type":"string"}},"type":"object"},"compliance.accreditationReq":{"properties":{"basis":{"description":"Basis is the qualification category: income, net_worth, professional_license,\nor entity.","type":"string"},"evidenceDocId":{"description":"EvidenceDocID references an evidence document in the org's sealed data room.","type":"string"},"expiresAt":{"description":"ExpiresAt is the unix second a confirmation ages out; 0 means none.","format":"int64","type":"integer"},"method":{"description":"Method is how the state was established: self_attested, third_party_letter,\nor provider_verified.","type":"string"},"note":{"description":"Note is a non-PII operator note.","type":"string"},"status":{"description":"Status may only be \"asserted\" (empty reads as asserted); every confirmed,\nrejected or expired state is recorded via the decision endpoint.","type":"string"},"subjectId":{"description":"SubjectID names the subject this record is about; it must exist within the org.","type":"string"}},"type":"object"},"compliance.subjectReq":{"properties":{"email":{"description":"Email is the subject's contact email, sealed at rest.","type":"string"},"kind":{"description":"Kind is the party type: \"individual\" (KYC) or \"business\" (KYB).","type":"string"},"name":{"description":"Name is the subject's name, sealed at rest.","type":"string"},"ref":{"description":"Ref is the org's own opaque external id for this subject.","type":"string"}},"type":"object"},"compliance.verificationDecision":{"properties":{"id":{"description":"ID is the verification to decide, from the path.","type":"string"},"status":{"description":"Status is the reviewer's decision: \"reviewer_confirmed\" (a pass) or\n\"manual_review\" (withheld for review) — never a provider status.","type":"string"}},"type":"object"},"compliance.verificationReq":{"properties":{"email":{"description":"Email is an inline subject's contact email, sealed at rest.","type":"string"},"kind":{"description":"Kind is an inline subject's party type: \"individual\" (KYC) or \"business\" (KYB).","type":"string"},"name":{"description":"Name is an inline subject's name, sealed at rest.","type":"string"},"ref":{"description":"Ref is the org's own opaque external id for an inline subject.","type":"string"},"subjectId":{"description":"SubjectID names an existing subject to verify; empty creates one inline.","type":"string"}},"type":"object"},"compute.bindAgentReq":{"properties":{"agentName":{"description":"AgentName is the cloud Agent (/v1/agent) the machine will run. Required.","type":"string"},"botVersion":{"description":"BotVersion pins the @hanzo/bot runtime version; empty takes the default.","type":"string"},"id":{"description":"ID is the machine to bind, from the URL path.","type":"string"}},"type":"object"},"compute.clusterAttach":{"properties":{"default":{"description":"Default marks this the org's default cluster for scheduling.","type":"boolean"},"kubeconfig":{"description":"Kubeconfig is the cluster's kubeconfig, verbatim. Required — a body without\none is not an attach.","type":"string"},"name":{"description":"Name is the fleet-local name for the cluster; lower-cased, and the key the\ndetach route addresses it by. Required.","type":"string"},"provider":{"description":"Provider is a free-form label for where the cluster runs (\"gke\", \"on-prem\");\nit is display only, not a routing key.","type":"string"}},"type":"object"},"compute.createClusterReq":{"properties":{"name":{"description":"Name is the cluster's name. Required.","type":"string"},"nodePool":{"description":"NodePool is the ONE pool the cluster is born with — a cluster with no nodes\nruns nothing, so it is not optional. More pools are added afterwards through\nPOST /v1/compute/clusters/:clusterId/pools.","properties":{"count":{"format":"int64","type":"integer"},"name":{"type":"string"},"size":{"type":"string"}},"type":"object"},"region":{"description":"Region is the provider region slug (e.g. \"nyc3\"). Required.","type":"string"},"version":{"description":"Version is the Kubernetes version slug; empty takes the provider default.","type":"string"}},"type":"object"},"compute.jobCancel":{"properties":{"id":{"description":"ID is the job (activity) id, from the URL path.","type":"string"},"reason":{"description":"Reason is recorded on the cancellation; empty records \"canceled from console\".","type":"string"},"run":{"description":"Run is the run id; empty defaults to the job id, which is what the dispatcher\nsets (runId == activityId == prompt_id), so the common case sends no body.","type":"string"}},"type":"object"},"compute.poolCreate":{"properties":{"autoScale":{"description":"AutoScale turns the provider's cluster autoscaler on for this pool.","type":"boolean"},"clusterId":{"description":"ClusterID is the cluster to add the pool to, from the URL path.","type":"string"},"count":{"description":"Count is how many nodes the pool starts with.","format":"int64","type":"integer"},"maxNodes":{"description":"MaxNodes is the ceiling the autoscaler may not grow the pool past, and so the\nbound on what this pool can spend. Ignored unless AutoScale is set.","format":"int64","type":"integer"},"minNodes":{"description":"MinNodes is the floor the autoscaler may not shrink the pool below. Ignored\nunless AutoScale is set.","format":"int64","type":"integer"},"name":{"description":"Name is the pool's name.","type":"string"},"provider":{"description":"Provider is the cloud the cluster lives on (e.g. \"digitalocean\"). Required —\nVisor routes the create by it. Accepted from the body or ?provider=.","type":"string"},"size":{"description":"Size is the provider size slug for each node (e.g. \"s-4vcpu-8gb\").","type":"string"}},"type":"object"},"compute.poolScale":{"properties":{"clusterId":{"description":"ClusterID is the cluster holding the pool, from the URL path.","type":"string"},"count":{"description":"Count is the node count to scale TO — an absolute target, not a delta, and\nnever negative.","format":"int64","type":"integer"},"poolId":{"description":"PoolID is the pool to resize, from the URL path — the `poolId` a cluster read\nreports for it. Required.","type":"string"},"provider":{"description":"Provider is the cloud the cluster lives on. Required; body or ?provider=.","type":"string"}},"type":"object"},"compute.sampleIngest":{"properties":{"gpuModel":{"description":"GPUModel names the representative accelerator (\"GB10\"); GPUs carries how\nmany. A heterogeneous host names its first card rather than inventing a\nsummary.","type":"string"},"gpuUtil":{"description":"GPUUtil is accelerator utilization as a fraction 0..1; the warehouse clamps\nanything outside that.","format":"double","type":"number"},"gpus":{"description":"GPUs is how many accelerators this reading covers.","format":"int64","type":"integer"},"host":{"description":"Host is the node's hostname, for display.","type":"string"},"memFree":{"description":"MemFree is host memory still available, in BYTES.","format":"int64","type":"integer"},"memUsed":{"description":"MemUsed is host memory in use, in BYTES.","format":"int64","type":"integer"},"unit":{"description":"Unit is the reporting node's own id — the same id it registered under, and\nthe key the board joins this series onto. Required.","type":"string"}},"type":"object"},"content.GenerateInput":{"properties":{"brief":{"description":"the brief/goal driving copy generation","type":"string"},"channels":{"description":"target channels (SocialPost)","type":"string"},"design":{"description":"studio design slug (asset source)","type":"string"},"doctype":{"description":"marketing.Campaign | marketing.SocialPost | marketing.Asset","type":"string"},"kind":{"description":"asset kind: ecom|product|lifestyle|hover|hero","type":"string"},"model":{"description":"optional zen model override (copy)","type":"string"},"product":{"description":"commerce product handle (copy context)","type":"string"},"project":{"description":"brand/site sub-scope (billing + tenancy axis)","type":"string"},"source_media":{"description":"asset source image (design CAD/photo)","type":"string"},"title":{"description":"optional explicit title","type":"string"},"tone":{"description":"tone override for a single draft","type":"string"},"voice":{"description":"brand-voice guidance for the copy director","type":"string"}},"type":"object"},"content.PublishInput":{"properties":{"doctype":{"description":"DocType is the content type holding the item: Campaign, SocialPost or Asset.\nAny other name is refused as an unknown content type.","type":"string"},"name":{"description":"Name is the document within that type — the item to distribute. Its caption,\nmedia and channel list come off the stored document, so this names WHICH\nitem and says nothing about what goes out.","type":"string"},"scheduleAt":{"description":"ScheduleAt hands a future go-live to the channel's own scheduler, as an\nISO-8601 time. Empty posts now.","type":"string"}},"type":"object"},"content.transitionIn":{"properties":{"doctype":{"description":"DocType is the content type to act on, from the path.","type":"string"},"name":{"description":"Name is the document to act on, from the path.","type":"string"},"scheduleAt":{"description":"ScheduleAt is an ISO-8601 go-live time handed to the channel's own scheduler;\n\"\" distributes now.","type":"string"},"to":{"description":"To is the lifecycle state to move to. Required, and the move must be a legal\nedge from the item's current state.","type":"string"}},"type":"object"},"crawl.crawlRequest":{"properties":{"url":{"description":"URL is the page to read, absolute and http or https — no other scheme is\ndialled. It is resolved from inside the cluster, so an address that turns out\nto be loopback, link-local, private or multicast is refused at the dialer,\nredirects included. Empty is not an error status: the answer comes back with\nsuccess false and the reason in error.","type":"string"}},"type":"object"},"dataroom.dataroomAddDocument":{"properties":{"documentId":{"description":"DocumentId is the document to attach. Required, and it must already exist\nin the caller's own store — this route attaches, it never uploads."},"id":{"description":"ID is the room to add to. It is the path segment: the URL is the addressing\nauthority, and the org it is resolved in comes from the caller's principal,\nso an id from another tenant is simply not found.","type":"string"},"orderIndex":{"description":"OrderIndex fixes the document's place in the viewer's list. Optional; a\nnumber or a numeric string is accepted, and anything that is not a number\nleaves the document unordered, which sorts it last."}},"type":"object"},"dataroom.dataroomCreate":{"properties":{"description":{"description":"Description is the room's description. Optional; any JSON scalar is\naccepted and stored as its text, and omitting it leaves the room with none."},"name":{"description":"Name is the room's display name. Required, and a room without one is\nrefused with the data room's own validation error."}},"type":"object"},"dataroom.dataroomLinkCreate":{"properties":{"allowDownload":{"description":"AllowDownload permits downloading rather than viewing only. Optional and\nOFF by default; any truthy JSON value turns it on."},"allowList":{"description":"AllowList narrows which addresses pass the email gate. Optional; an entry\nmay be a full address (\"[email protected]\"), an \"@domain.com\" suffix, or a\nbare \"domain.com\". An omitted or EMPTY list admits everyone, so a link with\nno list enforces the email gate alone.","items":{},"type":"array"},"dataroomId":{"description":"DataroomId is the room to share. One of dataroomId or documentId is\nrequired, and the target must exist in the caller's own store."},"denyList":{"description":"DenyList rejects addresses, in the same three forms as the allow list.\nOptional. It is checked BEFORE the allow list, so deny always wins.","items":{},"type":"array"},"documentId":{"description":"DocumentId shares a SINGLE document instead of a room. One of dataroomId or\ndocumentId is required."},"emailProtected":{"description":"EmailProtected makes a visitor state an address before entering. Optional\nand ON by default: it is disabled only by the JSON literal false, so any\nother value — including the string \"false\" — leaves the gate on."},"expiresAt":{"description":"ExpiresAt closes the link, in unix milliseconds. Optional; a number or a\nnumeric string is accepted, and omitting it means the link never expires."},"name":{"description":"Name labels the link. Optional; any JSON scalar is stored as its text."},"password":{"description":"Password gates the link. Optional; it is hashed with bcrypt before storage\nand is never readable back through any route."}},"type":"object"},"dataroom.trustAsk":{"properties":{"accept":{"description":"Accept must be true when the centre states an NDA. The text accepted is\nrecorded verbatim on the request, so a later edit to the NDA cannot rewrite\nwhat this party agreed to.","type":"boolean"},"email":{"description":"Email is where the grant will be sent, and the ONLY address the resulting\nlink admits. Required.","type":"string"},"item":{"description":"Item names one published item to ask for. Optional; omitting it asks for\neverything released on request.","type":"string"},"party":{"description":"Party is the company the asker is from. Optional, and recorded as stated.","type":"string"},"reason":{"description":"Reason is why they want it. Optional, and recorded as stated — it is what the\nperson deciding reads.","type":"string"},"slug":{"description":"Slug is the centre's public address, taken from the path.","type":"string"}},"type":"object"},"dataroom.trustDecision":{"properties":{"days":{"description":"Days is how long the grant stays open, from now. Optional; 14 by default and\n365 at most — a longer release is describing a customer relationship rather\nthan a document.","format":"int64","type":"integer"},"id":{"description":"ID is the request to answer, taken from the path.","type":"string"},"note":{"description":"Note is why. Recorded on the request either way, and it is what the record\nshows a year later.","type":"string"}},"type":"object"},"dataroom.trustEdit":{"properties":{"body":{"description":"Body replaces the item's content.","type":"string"},"document":{"description":"Document replaces the file the item points at — this is how a report is\nsuperseded by its next edition. The new document must already exist in the\ncaller org's own store.","type":"string"},"framework":{"description":"Framework replaces the standard it speaks to.","type":"string"},"id":{"description":"ID is the item to change, taken from the path.","type":"string"},"name":{"description":"Name replaces its title.","type":"string"},"retired":{"description":"Retired withdraws the item, or true→false restores it. A retired item leaves\nthe public centre at once and can no longer be granted; grants already made\nover it stand, because they are part of the record.","type":"boolean"},"summary":{"description":"Summary replaces the line about it.","type":"string"},"tier":{"description":"Tier moves it between public and gated. Moving an auditor-signed item to\npublic is refused.","type":"string"}},"type":"object"},"dataroom.trustPublish":{"properties":{"attester":{"description":"Attester is who vouched for it: \"self\" for anything the org states itself, or\n\"auditor\" for anything an independent auditor put their name to. REQUIRED, and\nanything other than \"self\" is read as \"auditor\" — the safe direction, since an\nauditor-signed item can only ever be released on request.","type":"string"},"body":{"description":"Body is the item's content for the kinds that are text rather than a file: an\narticle, a subprocessor entry, a dated note.","type":"string"},"document":{"description":"Document is a data-room document holding the item's bytes, uploaded first\nthrough POST /v1/dataroom/documents. Optional: an item can be content with no\nfile. The document must already exist in the caller org's own store.","type":"string"},"framework":{"description":"Framework is the standard it speaks to. Optional and free text — the value is\nthe org's own, not a list this API keeps.","type":"string"},"kind":{"description":"Kind is what the item is: report, letter, policy, questionnaire, subprocessor,\narticle or update. Required.","type":"string"},"name":{"description":"Name is the item's title. Required.","type":"string"},"summary":{"description":"Summary is a line about it. Optional.","type":"string"},"tier":{"description":"Tier is who may read it: \"public\" or \"gated\". It DEFAULTS TO GATED and\nanything that is not exactly \"public\" is gated, so an item published by a\ncaller that says nothing is private and someone has to release it on purpose.\n\"public\" is refused for an auditor-signed item.","type":"string"}},"type":"object"},"dataroom.trustSettings":{"properties":{"name":{"description":"Name is the centre's display name. Required to publish.","type":"string"},"nda":{"description":"Nda is the text a party must accept before asking for a document. Optional;\nempty asks for no acceptance. The text in force is copied onto each request as\nit is accepted, so editing it never changes what anyone already agreed to.","type":"string"},"publish":{"description":"Publish makes the centre answer at its public address. False withdraws it: the\naddress stops answering while every item, grant and record stays exactly as it\nwas, so withdrawing is reversible and loses nothing.","type":"boolean"},"slug":{"description":"Slug is the public address to answer at — a lowercase label of letters,\ndigits and hyphens. Required to publish, unique across the deployment, and one\norg holds one: publishing under a new address MOVES the centre rather than\nleaving the old one answering.","type":"string"}},"type":"object"},"dataset.riskDatasetSpec":{"properties":{"cuts":{"description":"Cuts are the two RFC 3339 instants dividing train | val | test. Omit them to\ntake 70% and 85% of the window by time. Splitting is TEMPORAL and then\ngrouped by subject — a random split puts one device on both sides of the\nline and the model memorises the entity instead of the behaviour.","items":{"type":"string"},"type":"array"},"dims":{"description":"Dims are the coordinates to carry, by published name. Empty takes the whole\nsurface. They are stored in the plane's own order, never the order given, so\ntwo requests naming the same dims produce identical rows.","items":{"type":"string"},"type":"array"},"from":{"description":"From is where the event window opens, RFC 3339, INCLUSIVE. The window may\nnot be longer than the source's own retention: past that, its older half is\nalready gone and the dataset would silently be shorter than it says.","type":"string"},"horizon":{"description":"Horizon is how many days a row must have aged before it may be admitted. It\nis what keeps a fact that was not yet knowable at scoring time out of a\ntraining set: a chargeback lands 30 to 120 days after the transaction it\ncondemns, so 120 for the payment lane and 14 for signup abuse. Zero admits\nthe whole window and is honest only where the outcome is immediate.","format":"int64","type":"integer"},"kind":{"description":"Kind narrows to one subject kind — person, session or account. Empty takes\nevery kind.","type":"string"},"name":{"description":"Name identifies the dataset across its versions: lower-case letters, digits\nand hyphens, starting with a letter.","type":"string"},"rows":{"description":"Rows caps the materialisation. Zero takes the plane's own bound.","format":"int64","type":"integer"},"seed":{"description":"Seed decides WHICH subjects are admitted when the window holds more rows\nthan the cap allows. It is recorded on the version, so a capped dataset is\nreproducible rather than being whichever rows the store returned first.\nOmit it to seed from the dataset's name.","type":"string"},"to":{"description":"To is where the window ends, EXCLUSIVE, so two datasets meeting at one\ninstant share no row. A materialisation reads less than this — the end is\npulled back by Horizon, and the lineage reports the window it actually read.","type":"string"}},"type":"object"},"declareEnv":{"properties":{"name":{"type":"string"},"public":{"type":"boolean"},"value":{"type":"string"}},"type":"object"},"declareReq":{"properties":{"build":{"type":"boolean"},"dockerfile":{"type":"string"},"env":{"items":{"$ref":"#/components/schemas/declareEnv"},"type":"array"},"host":{"type":"string"},"mode":{"type":"string"},"name":{"type":"string"},"org":{"type":"string"},"partOf":{"type":"string"},"port":{"type":"integer"},"ref":{"type":"string"},"replicas":{"type":"integer"},"repo":{"type":"string"},"tag":{"type":"string"}},"type":"object"},"disclosureBatch":{"properties":{"disclosures":{"description":"Disclosures are the documents to append, at most 2000.","items":{"$ref":"#/components/schemas/PatentDisclosure"},"type":"array"}},"type":"object"},"domain.Contacts":{"properties":{"admin":{"$ref":"#/components/schemas/domain.Registrant","description":"who administers it"},"billing":{"$ref":"#/components/schemas/domain.Registrant","description":"who is reached about payment"},"registrant":{"$ref":"#/components/schemas/domain.Registrant","description":"who owns the domain"},"tech":{"$ref":"#/components/schemas/domain.Registrant","description":"who is reached about technical matters"}},"type":"object"},"domain.Registrant":{"properties":{"address1":{"description":"street address","type":"string"},"address2":{"description":"second address line","type":"string"},"city":{"description":"city or locality","type":"string"},"companyName":{"description":"the organisation the contact acts for","type":"string"},"country":{"description":"ISO-3166 alpha-2, e.g. \"US\"","type":"string"},"email":{"description":"where WHOIS correspondence is sent","type":"string"},"fax":{"description":"fax number, in the same form as phone","type":"string"},"firstName":{"description":"the contact's given name","type":"string"},"lastName":{"description":"the contact's family name","type":"string"},"phone":{"description":"+NN.NNNNNNN","type":"string"},"state":{"description":"state, province or region","type":"string"},"zip":{"description":"postal code","type":"string"}},"type":"object"},"domain.order":{"properties":{"contacts":{"$ref":"#/components/schemas/domain.Contacts","description":"Contacts is the WHOIS contact set. Omit it and the registrar uses the\nreseller account's default contacts."},"domain":{"description":"Domain is the name to buy. It is required.","type":"string"},"years":{"description":"Years is the term to buy, defaulting to 1.","format":"int64","type":"integer"}},"required":["domain"],"type":"object"},"domain.renewReq":{"properties":{"domain":{"description":"Domain is the name to extend. It is required, and the caller's org must hold it.","type":"string"},"years":{"description":"Years is how much longer to hold it, defaulting to 1.","format":"int64","type":"integer"}},"required":["domain"],"type":"object"},"domain.transferReq":{"properties":{"authCode":{"description":"AuthCode is the transfer authorization the losing registrar issued. It is\nrequired.","type":"string"},"domain":{"description":"Domain is the name to move in. It is required.","type":"string"},"years":{"description":"Years is the term to buy on transfer, defaulting to 1.","format":"int64","type":"integer"}},"required":["domain","authCode"],"type":"object"},"email.SendMessageInput":{"properties":{"body":{"description":"Body is an alias for Text for backward compatibility.","type":"string"},"from":{"description":"From is the sender address. If empty, the org's provider default is used.","type":"string"},"headers":{"additionalProperties":{"type":"string"},"description":"Headers provides optional custom MIME headers.","type":"object"},"html":{"description":"HTML is the HTML body.","type":"string"},"idempotency_key":{"description":"IdempotencyKey prevents duplicate message dispatches on network retries.","type":"string"},"provider":{"description":"Provider optionally pins a provider (e.g. \"mail\", \"twilio_email\").","type":"string"},"subject":{"description":"Subject is the message subject.","type":"string"},"sync":{"description":"Sync is accepted for backwards compatibility with notify sends.","type":"string"},"template_id":{"description":"TemplateID optionally references a built-in template.","type":"string"},"template_vars":{"description":"TemplateVars carries variables for template rendering."},"text":{"description":"Text is the plain text body.","type":"string"},"to":{"description":"To lists destination recipient addresses.","items":{"type":"string"},"type":"array"}},"type":"object"},"email.VerificationInput":{"properties":{"checks":{"description":"Checks explicitly selects which checks to run.\nDefaults to [\"syntax\", \"domain\", \"mx\", \"classification\"].","items":{"type":"string"},"type":"array"},"email":{"description":"Email is the address to evaluate.","type":"string"},"from_email":{"description":"FromEmail sets sender used in MAIL FROM for SMTP probe when explicitly enabled.","type":"string"},"hello_name":{"description":"HelloName sets domain used in EHLO for SMTP probe when explicitly enabled.","type":"string"},"proxy_uri":{"description":"ProxyURI sets optional proxy for network lookups.","type":"string"},"suggestions":{"description":"Suggestions requests domain typo suggestions without altering the original email.","type":"boolean"}},"type":"object"},"entitlement.mutateReq":{"properties":{"add":{"description":"Add is the product ids to turn ON. Each must already be an ACTIVE entitlement\nof the org's plan, unless the caller is a platform super admin.","items":{"type":"string"},"type":"array"},"remove":{"description":"Remove is the product ids to turn OFF. Disabling is never gated.","items":{"type":"string"},"type":"array"}},"type":"object"},"environment.envSave":{"properties":{"install":{"description":"Install is run in every fresh checkout before the agent starts, from the\nrepository root, and must be non-interactive. Empty installs nothing.","type":"string"},"repo":{"description":"Repo is the repository's name in the caller's org.","type":"string"},"start":{"description":"Start is left running in the background after the install. Empty starts\nnothing.","type":"string"}},"type":"object"},"environment.envSecret":{"properties":{"name":{"description":"Name is the environment variable the run exports the value under.","type":"string"},"repo":{"description":"Repo is the repository's name in the caller's org.","type":"string"},"value":{"description":"Value is sealed in KMS and never answered, logged or echoed. It is never\nread from a query string, because a URL is logged in more places than a\nbody is.","type":"string"}},"type":"object"},"esign.esignFieldIn":{"properties":{"fieldMeta":{"description":"FieldMeta is your own metadata for this field — a label, a placeholder, a\nrequired flag — stored verbatim and handed back on every read of the\ndocument. Any JSON, and esign never interprets it."},"height":{"description":"Height is the field's height, defaulting to -1, which means the renderer\nchooses one when the document is sealed."},"page":{"description":"Page is the 1-based page the field sits on, defaulting to 1."},"positionX":{"description":"PositionX is the field's horizontal position on that page, defaulting to 0."},"positionY":{"description":"PositionY is the field's vertical position on that page, defaulting to 0."},"recipientId":{"description":"RecipientID is who must fill this field. Required, and it must belong to this\ndocument — a recipient from elsewhere is refused rather than silently\naccepted."},"type":{"description":"Type is what the field collects: SIGNATURE, FREE_SIGNATURE, INITIALS, NAME,\nEMAIL, DATE, TEXT, NUMBER, RADIO, CHECKBOX or DROPDOWN. Required, and\nanything else is refused."},"width":{"description":"Width is the field's width, defaulting to -1, which means the renderer\nchooses one when the document is sealed."}},"type":"object"},"esign.esignRecipientIn":{"properties":{"email":{"description":"Email is where the signing link is meant to go, lower-cased on the way in.\nRequired."},"name":{"description":"Name is the recipient's display name, also the fallback a NAME field is\nfilled with when they leave it blank. Optional."},"role":{"description":"Role is SIGNER (the default), CC, VIEWER, APPROVER or ASSISTANT; anything\nelse reads as SIGNER. A CC recipient is recorded as already complete, because\nthey are never asked to sign. SIGNER and APPROVER are the roles a document\nwaits for before it can seal."},"signingOrder":{"description":"SigningOrder is this recipient's position when the document is SEQUENTIAL —\nlower signs first, and ties fall back to the order they were added. Ignored\nby a PARALLEL document. Optional."}},"type":"object"},"esign.esignRejectIn":{"properties":{"reason":{"description":"Reason is why the signer is declining. Optional, stored, and written onto the\naudit trail with the rejection — it is what the sender sees."}},"type":"object"},"esign.esignUploadIn":{"properties":{"externalId":{"description":"ExternalID is your own identifier for this document, stored and echoed back\nso a document here can be matched to a record in your system. Optional."},"message":{"description":"Message is the covering message carried with the document. Optional, and like\nthe subject it is stored rather than sent."},"pdfBase64":{"description":"PdfBase64 is the document itself, base64-encoded; a `data:` URL prefix is\naccepted and stripped. Required. The bytes go to object storage rather than\ninto the tenant database, and this ORIGINAL is kept under its own key so it\nsurvives sealing untouched."},"signingOrder":{"description":"SigningOrder chooses PARALLEL — the default, where everyone may sign at once\n— or SEQUENTIAL, where each signer waits for the ones ahead of them. Anything\nelse reads as PARALLEL, and the choice is fixed for the document's life."},"subject":{"description":"Subject is the covering subject line carried with the document. Optional, and\nnothing in this surface emails it — delivering the signing links is the\ncaller's."},"title":{"description":"Title is the document's name, shown to every recipient and used to build the\ndownload filename. Required — a request without one is refused and nothing is\nstored."}},"type":"object"},"esign.esignValueIn":{"properties":{"isBase64":{"description":"IsBase64 marks Value as drawn signature image bytes rather than a typed\nsignature. Only a signature field reads it, and a `data:` URL prefix is\nstripped."},"value":{"description":"Value is what goes in the field. A signature takes the drawn image bytes or a\ntyped name; a DATE, NAME or EMAIL field falls back to today, the recipient's\nname or their email when this is omitted; every other type requires it."}},"type":"object"},"eval.datasetReq":{"properties":{"description":{"description":"Description is free text about what this set measures; over 64 KiB is refused.","type":"string"},"metadata":{"additionalProperties":{},"description":"Metadata is a free-form object stored with the set and echoed back verbatim.","type":"object"},"name":{"description":"Name is the dataset's org-unique handle and the segment that will address\nit, so it must match ^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$.","type":"string"}},"required":["name"],"type":"object"},"eval.evaluatorReq":{"properties":{"criteria":{"description":"Criteria is the written standard the judge applies; over 64 KiB is refused.","type":"string"},"model":{"description":"Model is the model that will do the grading.","type":"string"},"name":{"description":"Name is the judge's org-unique handle, matching\n^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$. Re-posting a name edits that judge\nrather than adding a second one.","type":"string"},"scoreName":{"description":"ScoreName is the name the resulting scores are filed under. It defaults to\nthe judge's own name and must match the same pattern.","type":"string"}},"required":["name"],"type":"object"},"eval.itemReq":{"properties":{"expectedOutput":{"description":"Expected is the answer a correct model produces, which the judge grades\nagainst, stored as raw JSON exactly as sent, up to 64 KiB."},"id":{"description":"ID makes the write idempotent — re-posting the same id replaces that example\nin place. Omit it and one is generated. An id that already exists in a\nDIFFERENT dataset is 409 rather than a move.","type":"string"},"input":{"description":"Input is what the model under test will be given, stored as raw JSON exactly\nas sent, up to 64 KiB."},"metadata":{"additionalProperties":{},"description":"Metadata is a free-form object stored with the example.","type":"object"},"status":{"description":"Status is ACTIVE (the default) or ARCHIVED. Only ACTIVE examples are fed to\na run, which is how an example is retired without being deleted.","type":"string"}},"type":"object"},"eval.judgeSpec":{"properties":{"criteria":{"description":"Criteria is the standard the judge applies, defaulting to a correctness\ncriterion.","type":"string"},"model":{"description":"Model is the model that grades. It defaults to the model under test, so a\nrun with no judge named has the model grade itself.","type":"string"},"name":{"description":"Name is the score name the judge's grades are filed under, \"llm-judge\" by\ndefault. A name that is not a legal handle falls back to that default\nrather than being stored as sent.","type":"string"}},"type":"object"},"eval.runRequest":{"properties":{"dataset":{"description":"Dataset is the set to score, which must belong to the caller's org and hold\nat least one ACTIVE example.","type":"string"},"judge":{"$ref":"#/components/schemas/eval.judgeSpec","description":"Judge is the judge to grade with. Omitted, the model under test grades\nitself against a default correctness criterion under the score name\n\"llm-judge\"."},"limit":{"description":"Limit caps how many examples this run scores. It defaults to 20, and\nanything above 100 falls back to that default.","format":"int64","type":"integer"},"model":{"description":"Model is the model under test.","type":"string"},"runName":{"description":"RunName labels the run and is generated from the clock when omitted. It\nmust match ^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$.","type":"string"}},"required":["dataset","model"],"type":"object"},"eval.scoreConfigReq":{"properties":{"categories":{"description":"Categories is the closed set of labels a CATEGORICAL score may carry. A\nCATEGORICAL rubric with none is refused.","items":{"type":"string"},"type":"array"},"dataType":{"description":"DataType is NUMERIC (the default), CATEGORICAL or BOOLEAN.","type":"string"},"maxValue":{"description":"MaxValue is the inclusive ceiling a NUMERIC score must stay under, finite.","format":"double","type":"number"},"minValue":{"description":"MinValue is the inclusive floor a NUMERIC score must clear. It must be\nfinite and must not exceed MaxValue.","format":"double","type":"number"},"name":{"description":"Name is the score name this rubric governs, matching\n^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$. The name is the key, so re-posting one\nreplaces its rules.","type":"string"}},"required":["name"],"type":"object"},"eval.scoreReq":{"properties":{"comment":{"description":"Comment is the grader's reasoning, truncated at 2000 characters.","type":"string"},"dataType":{"description":"DataType is NUMERIC, CATEGORICAL or BOOLEAN. A declared rubric overrides it\n— a caller cannot claim a type the org's rubric contradicts.","type":"string"},"datasetItemId":{"description":"ItemID attaches the score to one graded example.","type":"string"},"datasetName":{"description":"Dataset attaches the score to one dataset.","type":"string"},"name":{"description":"Name is the score name. A rubric of the same name, if the org has declared\none, decides this score's type and the values it may take.","type":"string"},"runName":{"description":"RunName attaches the score to one run.","type":"string"},"stringValue":{"description":"StringValue is the label of a CATEGORICAL score, which must be one the\nrubric allows.","type":"string"},"traceId":{"description":"TraceID attaches the score to one model call.","type":"string"},"value":{"description":"Value is the numeric score, which must be finite: NaN and Inf are refused.\nA BOOLEAN score takes 0 or 1.","format":"double","type":"number"}},"required":["name"],"type":"object"},"event.disputeIn":{"properties":{"event":{"description":"Event is the id of the economic event disputed.","type":"string"},"reason":{"description":"Reason is what the caller's org says is wrong, at most 1024 characters.","type":"string"}},"required":["event","reason"],"type":"object"},"exec.CodeFile":{"properties":{"id":{"description":"ID is the file's path RELATIVE to its session's artifact directory, which is\nalso how it is fetched: GET /v1/exec/download/{session}/{id}.","type":"string"},"name":{"description":"Name is the display name. On an ANSWER it carries the `{session}/{id}`\nidentifier whole, because the client matches on that prefix.","type":"string"},"session_id":{"description":"SessionID is the other accepted spelling of the same fact on the way IN. Both\nare read; whichever is set wins.","type":"string"},"storage_session_id":{"description":"StorageSessionID names the session holding the bytes, and is the spelling the\nanswer always uses.","type":"string"}},"type":"object"},"exec.CodeRun":{"properties":{"args":{"description":"Args become the PROGRAM's argv, never the compiler's. For the compiled\nlanguages the toolchain builds first and these are passed to the binary it\nproduced.","items":{"type":"string"},"type":"array"},"code":{"description":"Code is the WHOLE program, not a fragment: it is written to a single file and\nthat file is what runs, so a compiled language needs its entry point and an\ninterpreted one runs top to bottom.","type":"string"},"files":{"description":"Files are inputs the host already put in some session. Each names the session\nits bytes live in, which is usually — and ideally — the session this run wants.","items":{"$ref":"#/components/schemas/exec.CodeFile"},"type":"array"},"lang":{"description":"Lang selects the toolchain, and with it the filename the code is written to\nand the line that runs it: py, js, ts, bash, r, php, go, rs, c, cpp, java, d,\nf90. Anything else is refused rather than guessed at — a run in the wrong\nlanguage fails somewhere deep in a compiler, which reads as an outage.","type":"string"},"runtime_session_hint":{"description":"RuntimeSessionHint is the stateful-session hint. It is carried so a client\nthat sends it is not silently misread, and it selects nothing here: every\nsession in this implementation is already a warm sandbox, so there is no\nsecond kind of runtime for a hint to choose between.","type":"string"},"session_id":{"description":"SessionID continues an EXISTING sandbox, which is what makes runs stateful:\nthe same filesystem, so one run's output file is the next run's input. Empty\nleases a fresh sandbox and the id it got comes back on the result.","type":"string"},"user_id":{"description":"UserID attributes the run inside the caller's org. It is a label, never a\ntenant: the org is resolved from the validated principal and a value here\ncannot widen what the run may reach.","type":"string"}},"required":["lang","code"],"type":"object"},"experiment.Arm":{"properties":{"control":{"description":"true on the baseline arm every other arm is compared to","type":"boolean"},"key":{"description":"the arm's slug, unique within the experiment","type":"string"},"payload":{"description":"opaque JSON the arm carries, which the consumer interprets"},"weight":{"description":"its share of the rollout; the arms sum to 100","format":"double","type":"number"}},"type":"object"},"experiment.analyzeQuery":{"properties":{"alpha":{"description":"Alpha overrides the 0.05 two-tailed significance threshold when it lies\nstrictly between 0 and 1; anything else leaves the default in place.","format":"double","type":"number"},"days":{"description":"Days is how far back to read when no start is given: 1 to 365, 30 by\ndefault. A value outside that range leaves the default in place.","format":"int64","type":"integer"},"end":{"description":"End is the window's exclusive end in RFC3339, defaulting to now.","type":"string"},"id":{"description":"ID is the experiment the URL names.","type":"string"},"start":{"description":"Start is the window's inclusive start in RFC3339. Given, it wins over days.","type":"string"}},"type":"object"},"experiment.createBody":{"properties":{"exposureEvent":{"description":"ExposureEvent is the event that marks a subject as enrolled — the analysis\ndenominator — defaulting to the SDK's $feature_flag_called marker.","type":"string"},"flagKey":{"description":"FlagKey names the assignment flag this experiment writes, defaulting to\nexp_<id>. It must be a slug.","type":"string"},"id":{"description":"ID is the experiment's slug, claimed once per project. It must match\n[A-Za-z0-9][A-Za-z0-9._-]{0,127}.","type":"string"},"metricEvent":{"description":"MetricEvent is the event that counts as a conversion — the analysis\nnumerator.","type":"string"},"name":{"description":"Name is free text for a reader; the id is what addresses the experiment.","type":"string"},"subjectKind":{"description":"SubjectKind is the unit assigned and measured: user (the default), org,\nsession or audience.","type":"string"},"variants":{"description":"Arms are the arms, at least two. Weights that are all zero become an\neven split; otherwise they must sum to 100, and at most one arm may be\nflagged control.","items":{"$ref":"#/components/schemas/experiment.Arm"},"type":"array"}},"required":["id","metricEvent","variants"],"type":"object"},"experiment.decideBody":{"properties":{"winner":{"description":"Winner is the variant to promote. It must name one of this experiment's own\narms.","type":"string"}},"required":["winner"],"type":"object"},"flag.evaluateIn":{"properties":{"distinct_id":{"description":"DistinctID is the identity the flags are evaluated for. Required.","type":"string"},"groups":{"description":"Groups are the group-level properties, keyed by group type index."},"person_properties":{"description":"PersonProperties are the person-level properties conditions match against."}},"type":"object"},"flag.optinIn":{"properties":{"on":{"description":"On opts the caller in to every public beta, current and future, when true,\nand out when false.","type":"boolean"}},"type":"object"},"flag.orgOptinIn":{"properties":{"blocked":{"description":"Blocked turns the opt-in off for every member of the org when true, and back\non when false. It never turns a beta on for anyone.","type":"boolean"}},"type":"object"},"flow.flowCreate":{"properties":{"data":{"description":"Data is the workflow graph (the product's nodes/edges document),\nverbatim. Omit it to create an empty workflow."},"description":{"description":"Description says what the workflow does.","type":"string"},"name":{"description":"Name is the workflow's display name, unique within the org's project\n(the product de-duplicates by suffixing).","type":"string"}},"type":"object"},"flow.flowRun":{"properties":{"input":{"description":"Input is the run's chat input value, handed to the graph's input node.","type":"string"},"session":{"description":"Session groups runs into one conversation; the product mints one when\nabsent and returns it in the response.","type":"string"},"tweaks":{"description":"Tweaks override component fields for this run only (the product's\ntweaks document), verbatim."},"workflow":{"description":"Workflow is the UUID of the workflow to run.","type":"string"}},"type":"object"},"flow.flowUpdate":{"properties":{"data":{"description":"Data replaces the workflow graph when present, verbatim."},"description":{"description":"Description replaces the description when present.","type":"string"},"locked":{"description":"Locked freezes or unfreezes the workflow against edits when present.","type":"boolean"},"name":{"description":"Name renames the workflow when present.","type":"string"},"workflow":{"description":"Workflow is the workflow's UUID, taken from the path.","type":"string"}},"type":"object"},"forgeJob":{"properties":{"action":{"type":"string"},"repository":{"properties":{"name":{"type":"string"},"owner":{"properties":{"login":{"type":"string"},"username":{"type":"string"}},"type":"object"}},"type":"object"},"workflow_job":{"properties":{"id":{"type":"integer"},"labels":{"items":{"type":"string"},"type":"array"},"name":{"type":"string"},"run_id":{"type":"integer"}},"type":"object"}},"type":"object"},"framework.DocField":{"properties":{"default":{"type":"string"},"fetchFrom":{"type":"string"},"fieldname":{"type":"string"},"fieldtype":{"type":"string"},"hidden":{"type":"boolean"},"inListView":{"type":"boolean"},"label":{"type":"string"},"options":{"type":"string"},"readOnly":{"type":"boolean"},"reqd":{"type":"boolean"},"unique":{"type":"boolean"}},"type":"object"},"framework.DocPerm":{"properties":{"cancel":{"type":"boolean"},"create":{"type":"boolean"},"delete":{"type":"boolean"},"read":{"type":"boolean"},"role":{"type":"string"},"submit":{"type":"boolean"},"write":{"type":"boolean"}},"type":"object"},"framework.DocType":{"properties":{"autoname":{"type":"string"},"createdAt":{"format":"int64","type":"integer"},"fields":{"items":{"$ref":"#/components/schemas/framework.DocField"},"type":"array"},"immutable":{"type":"boolean"},"isSingle":{"type":"boolean"},"isSubmittable":{"type":"boolean"},"module":{"type":"string"},"name":{"type":"string"},"permissions":{"items":{"$ref":"#/components/schemas/framework.DocPerm"},"type":"array"},"titleField":{"type":"string"},"updatedAt":{"format":"int64","type":"integer"}},"type":"object"},"function.definition":{"properties":{"code":{"description":"Code is the source to run, capped so one function cannot amplify the store.","type":"string"},"envNames":{"description":"EnvNames are the secret NAMES to mount. Values live in the secret store and\nare never carried here.","items":{"type":"string"},"type":"array"},"environment":{"description":"Environment is a second spelling of runtime, accepted so a console that says\n\"environment\" needs no translation.","type":"string"},"handler":{"description":"Handler is the entry point within the code.","type":"string"},"image":{"description":"Image names a prebuilt image to run instead of source.","type":"string"},"memoryLimit":{"description":"MemoryLimit is the memory the function runs with, defaulting to 256Mi. It is\nalso the multiplier on the GB-seconds compute charge.","type":"string"},"name":{"description":"Name is the function's org-unique handle and the segment that addresses it,\nmatching ^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$. The names that would shadow a\ncollection route are reserved.","type":"string"},"namespace":{"description":"Namespace groups functions for display. It is cosmetic — the org is the\nisolation key — and is normalised to a DNS-safe label.","type":"string"},"runtime":{"description":"Runtime is the language the code runs under: node, python or deno.","type":"string"},"target":{"description":"Target is where the function runs: sandbox (the default) or fleet, the org's\nown GPU fleet. fleet supports runtime=python only.","type":"string"},"timeoutSec":{"description":"TimeoutSec is the per-invocation deadline, defaulting to 30 and clamped at\n900 — a larger value is capped rather than reset to the default.","format":"int64","type":"integer"}},"required":["name"],"type":"object"},"function.invokeReq":{"properties":{"input":{"description":"Input is what the function is given on stdin. It is opaque to this surface.","type":"string"}},"type":"object"},"gateway.Policy":{"properties":{"cache_paths":{"additionalProperties":{"format":"int64","type":"integer"},"description":"CachePaths overrides CacheTTLSec per path PREFIX (key \"/v1/models\" → seconds).\nThe longest matching prefix wins.","type":"object"},"cache_ttl_sec":{"description":"CacheTTLSec is the org's default edge-cache TTL for its responses, in seconds;\n0 means no caching. Unset inherits the platform default.","format":"int64","type":"integer"},"cors_origins":{"description":"CORSOrigins is the PLATFORM-scope CORS allowlist EdgeCORS admits: an exact\norigin, a bare host, or a \"*.host\" wildcard. Writable only by a SuperAdmin —\nCORS is evaluated before identity, so it has no tenant to scope to.","items":{"type":"string"},"type":"array"},"methods":{"description":"Methods is the allowlist of HTTP methods the edge accepts for this org. Empty\nmeans all are accepted.","items":{"type":"string"},"type":"array"},"mode":{"description":"Mode is the abuse gate's posture for THIS scope: \"shadow\" scores traffic and\nrecords the verdict without acting on it, \"live\" enforces it. Unset means\nshadow.\n\nIt is the one per-org field that does NOT inherit. Every other field here\nlayers a platform default under the org's own value, which is right for a\ndefault: a tenant that sets no rate ceiling should get the platform's. Mode\nis not a default, it is an ARMING DECISION — it is what makes a statistical\njudgement start refusing real traffic — and inheriting it means arming one\nscope arms every tenant that never asked for it, without a write to their\nrow and without anything in their config changing. So a tenant is live only\nif that tenant's OWN row says live, and the platform row's mode governs\nexactly one scope: the anonymous lane, which has no tenant of its own.\n\nIt is also not self-service. Writing it requires SuperAdmin (see the\n/v1/gateway config op): the subject of an abuse control does not get to\nswitch the control off.","type":"string"},"org_cap":{"description":"OrgCap is the most this organization's ceiling may be, requests per minute.\nUnset, it is the platform's org_rpm, else 60,000. Only a SuperAdmin sets it: it\nis how the platform raises one organization above the default, and the\norganization a limit governs does not get to remove it. It does not inherit\nfrom the platform row. Read back, it is the cap in force.","format":"int64","type":"integer"},"org_rpm":{"description":"OrgRPM is the org's OWN authenticated rate ceiling, requests per minute, as\nScopeRateLimit enforces it across the deployment. An organization may lower it\nbut never raise it past its cap (org_cap); unset, the org is held to its cap.\nOn the platform row it is every organization's default cap, and it does not\ninherit into any organization's own row. Read back, it is the ceiling in\nforce: the org's own, clipped to its cap.","format":"int64","type":"integer"},"per_ip_rpm":{"description":"PerIPRPM is the PLATFORM-scope flood cap: requests admitted per WindowSec from\none client IP that presents no credential, or a credential that resolves to\nnobody. A request presenting a credential is held to ten times this from its\naddress until the credential is checked; a validated caller is then held by\nits key and org ceilings instead. SuperAdmin-only, same reason.","format":"int64","type":"integer"},"updated_at":{"description":"UpdatedAt is the unix second this policy row was last written. Server-stamped;\na client-supplied value is ignored.","format":"int64","type":"integer"},"updated_by":{"description":"UpdatedBy is the validated user id that wrote this policy row. Server-stamped;\na client-supplied value is ignored.","type":"string"},"window_sec":{"description":"WindowSec is the window PerIPRPM is counted over, in seconds. SuperAdmin-only.","format":"int64","type":"integer"}},"type":"object"},"git.createReq":{"properties":{"description":{"description":"Description is a free-form blurb, max 4KiB.","type":"string"},"name":{"description":"Name is the repo's handle, unique within the scope, and the last segment of\nboth clone URLs. Must match ^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$; a trailing\n\".git\" is stripped first. Required.","type":"string"},"project":{"description":"Project narrows the repo to a sub-scope of the org. Omit it to use the\ncaller's own X-Project-Id scope; it can never widen past the caller's org.","type":"string"},"public":{"description":"Public grants ANONYMOUS read (fetch) only; push and the whole control plane\nstay org-authed. Defaults to false.","type":"boolean"}},"type":"object"},"git.linkAll":{"properties":{"owner":{"description":"Owner is the GitHub account a repository named n is looked for under, as\ngithub.com/<owner>/<n>. Empty is the account the estate's table names for\nthe org; an org it does not name must give one.","type":"string"}},"type":"object"},"git.linkReq":{"properties":{"name":{"description":"Name is the repository, from the :name path segment. It is made when the\norg has none of that name.","type":"string"},"project":{"description":"Project is the sub-scope to make it in; empty uses the caller's own.","type":"string"},"source":{"description":"Source is where its history lives: an http(s) clone address, such as\nhttps://github.com/acme/widgets.git. Its host must let the caller read it.","type":"string"}},"type":"object"},"git.mirrorTargetReq":{"properties":{"host":{"description":"Host is an optional assertion of the target's hostname. The authoritative\nhost is the one in URL; a value that disagrees with it is refused.","type":"string"},"name":{"description":"Name is the repo whose advanced refs are pushed downstream, from the :name\npath segment.","type":"string"},"url":{"description":"URL is the downstream https git remote. Must be https to an allowlisted\nhost (github.com / gitlab.com); any embedded credentials are stripped.\nRequired.","type":"string"}},"type":"object"},"git.openReq":{"properties":{"base":{"description":"Base is the branch the work is proposed INTO, by short name. Defaults to\nthe repo's default branch, which is where a proposal goes when nobody says\notherwise.","type":"string"},"body":{"description":"Body is the longer description. Optional.","type":"string"},"head":{"description":"Head is the branch holding the work, by short name (agent/fix-503).\nRequired, and must already exist.","type":"string"},"name":{"description":"Name is the repo the proposal belongs to, from the :name path segment.","type":"string"},"title":{"description":"Title is the one-line summary of what is being proposed. Required.","type":"string"}},"type":"object"},"git.patchIn":{"properties":{"name":{"description":"Name is the repo to update, from the :name path segment.","type":"string"},"public":{"description":"Public flips anonymous read access. Omit it and the request is refused —\nthere is nothing else to update yet.","type":"boolean"}},"type":"object"},"git.poolDeclare":{"properties":{"labels":{"description":"Labels are what a workflow's `runs-on:` selects this pool by. A job is\nassigned to a pool that carries EVERY label it asked for.","items":{"type":"string"},"type":"array"},"name":{"description":"Name is the pool's handle in this org, e.g. \"evo\" or \"spark\".","type":"string"}},"type":"object"},"git.pushFile":{"properties":{"content":{"description":"Content is the file's bytes, carried per Encoding.","type":"string"},"encoding":{"description":"Encoding is \"base64\", or \"utf-8\" (the default, also \"utf8\" / \"text\").","type":"string"},"path":{"description":"Path is repo-relative. Absolute or traversing paths, and paths inside .git,\nare refused. A path that changes CI (.hanzo/workflows, .github/workflows,\n.forgejo, .gitea) needs an org admin.","type":"string"}},"type":"object"},"git.pushReq":{"properties":{"branch":{"description":"Branch to advance; empty means \"main\". A fresh branch that is the repo's\nfirst also becomes HEAD.","type":"string"},"files":{"description":"Files are added to or overwritten on the branch tip — files already there\nand not listed SURVIVE. At least one, at most 5000, 32 MiB each.","items":{"$ref":"#/components/schemas/git.pushFile"},"type":"array"},"message":{"description":"Message is the commit message; empty gets a generated one.","type":"string"},"name":{"description":"Name is the repo to push into, from the :name path segment. It is CREATED\non first push if it does not exist.","type":"string"}},"type":"object"},"git.runStart":{"properties":{"ref":{"description":"Ref is the branch to run; empty means the repository's default.","type":"string"},"repo":{"description":"Repo is the repository to run.","type":"string"}},"type":"object"},"git.subscribeReq":{"properties":{"channel":{"description":"Channel is the Slack channel the notifier posts to — an id (C…/G…), a\n#name, or a bare name. Required.","type":"string"},"events":{"description":"Events narrows delivery to these lifecycle kinds (push.landed,\ndeploy.live, deploy.failed). Omit it to receive every deliverable kind; a\nkind that is never posted to Slack is refused rather than silently dropped.","items":{"type":"string"},"type":"array"},"name":{"description":"Name is the repo to subscribe, from the :name path segment.","type":"string"}},"type":"object"},"grantIn":{"properties":{"id":{"description":"ID is the record's stable id.","type":"string"},"kind":{"description":"Kind is idea, implementation or disclosure — what the id names.","type":"string"},"project":{"description":"Project locates the record inside the caller's own org.","type":"string"},"visibility":{"description":"Visibility is private, org or public.","type":"string"}},"type":"object"},"graph.graphAnswerIn":{"properties":{"as_known":{"description":"AsKnown is how much this plane had heard, RFC 3339: the answer as it would\nhave been given then, which is what makes a past answer reproducible.\nAbsent is now.","type":"string"},"as_of":{"description":"AsOf answers from the graph as it stood at an instant of the world, RFC\n3339: what held then. Absent is now.","type":"string"},"question":{"description":"Question is what to answer, in words, 1000 bytes at most. Its words also\ndecide which communities are read first, so naming the things it is about\nis what aims it.","type":"string"}},"required":["question"],"type":"object"},"graph.graphAssertIn":{"properties":{"assertions":{"description":"Assertions is the batch. Each member is judged on its own: one refusal\ndoes not discard the rest, because a caller redelivering five facts must\nnot lose four of them to one malformed fifth.","items":{"$ref":"#/components/schemas/graph.graphFact"},"type":"array"}},"required":["assertions"],"type":"object"},"graph.graphCommunitiesIn":{"properties":{"as_known":{"description":"AsKnown is how much this plane had heard, RFC 3339: the answer as it would\nhave been given then, which is what makes a past answer reproducible.\nAbsent is now.","type":"string"},"as_of":{"description":"AsOf partitions the graph as it stood at an instant of the world, RFC\n3339: the edges that held then. Absent is now.","type":"string"},"level":{"description":"Level is how fine a partition to answer with. 0, the default, is the\ncoarsest — the partition detection stops at, where modularity is highest —\nand each level above it is the pass before, finer. `levels` in the answer\nsays how many there are.","format":"int64","type":"integer"},"relation":{"description":"Relation narrows the graph to one edge relation, by its key. Absent\npartitions every edge.","type":"string"}},"type":"object"},"graph.graphDeriveIn":{"properties":{"as_known":{"description":"AsKnown is how much this plane had heard, RFC 3339 — of the statements\nand of the rules — so a past answer is reproducible. Absent is now.","type":"string"},"as_of":{"description":"AsOf derives from the graph as it stood at an instant of the world, RFC\n3339: the statements that held then. Absent is now.","type":"string"},"file":{"description":"File files each tuple Derived lists as an assertion: (subject, predicate,\nobject) from the instant it was derived at, open, its source the rule,\nits evidence the rule's ID, its confidence the decay, and an edge when\nthe object is an entity by its proof. It requires an admin of the\norganization, the graph as it stands now — no as_of, as_known or\nwithout — and predicates with two arguments. It is refused whole when a\nrelation that holds one value at a time would keep only one of the\nvalues a subject is concluded or asserted to have, and when a conclusion\nis about a `relation:` or `rule:` key. Each is judged as any assertion\nis, and the write is on the audit trail before it commits. A filed\nconclusion is an assertion like any other: it does not fall when a\nsupport later does.","type":"boolean"},"predicates":{"description":"Predicates are what to derive: every tuple the rules in force conclude of\neach, with its proof. Each must be the head of a rule in force, asserted\nas (`rule:<name>`, `rule`, `<text>`) — for example `ancestor(X, Z) :-\nparent(X, Y), ancestor(Y, Z)`. At least one, at most 256.","items":{"type":"string"},"type":"array"},"without":{"description":"Without is assertion IDs, of statements or of rules, to derive without as\nthough they had never been filed. The derivation then runs twice, and\nLost and Gained say what that changes. Each must be a row this derivation\nreads. At most 256.","items":{"type":"string"},"type":"array"}},"type":"object"},"graph.graphDiffIn":{"properties":{"entity":{"description":"Entity narrows the diff to what was asserted about one entity. Absent\ndiffs the whole graph, bounded by Limit.","type":"string"},"from":{"description":"From is the earlier instant of the world, RFC 3339. What held here is\nthe baseline, so a statement beginning exactly at From is part of it and\nnot a change. Absent is To: the diff is then of what was heard, not of\nwhat happened.","type":"string"},"from_known":{"description":"FromKnown is how much this plane had heard at the baseline, RFC 3339.\nAbsent is ToKnown: the diff is then of the world, as known once.","type":"string"},"limit":{"description":"Limit caps how many (entity, relation) pairs are examined, in key order.\nAbsent, zero, or anything above the walk ceiling is the ceiling.","format":"int64","type":"integer"},"to":{"description":"To is the later instant of the world, RFC 3339, and may not precede From.\nA statement beginning or ending exactly at To is in the diff. Absent is\nnow.","type":"string"},"to_known":{"description":"ToKnown is how much it had heard at the later point, RFC 3339, and may\nnot precede FromKnown. Absent is now.","type":"string"}},"type":"object"},"graph.graphEraseIn":{"properties":{"entity":{"description":"Entity is the key to erase. Every assertion ABOUT it and every edge\npointing AT it is removed, under every spelling it may have been filed\nunder — its NFC key, that key decomposed, and the bytes sent — so a subject\nfiled before keys were folded goes with the rest; a property whose scalar\nhappens to spell it is not a reference and stays. Required, 512 bytes at\nmost.","type":"string"},"reason":{"description":"Reason is why, as the audit trail will keep it — a request number, a legal\nbasis. It outlives the erasure, so it may not contain the entity: refused\nwhen it does. Required, 512 bytes at most.","type":"string"}},"required":["entity","reason"],"type":"object"},"graph.graphFact":{"properties":{"at":{"description":"At is when the thing was so, RFC 3339. Required, and refused when it sits\nmore than five minutes ahead of the server clock — an assertion dated\nfurther out would never mature and would skew every read until it did.","type":"string"},"confidence":{"description":"Confidence in [0,1]. A tie-breaker within the order, never a substitute\nfor it. Absent is 0, the weakest an assertion can be.","format":"double","type":"number"},"entity":{"description":"Entity is the thing being described, in the organization's own namespace.\nIt is not created: an entity exists because something was asserted about it.\nIt is a key, folded to Unicode NFC with control characters removed, so two\nspellings of one name are one entity. An entity named `relation:<name>` is\nthat relation's declaration and one named `rule:<name>` is a rule\n(graphDerive), and only an admin of the organization may assert anything\nof either. Required, 512 bytes at most.","type":"string"},"evidence":{"description":"Evidence points at the record this claim came from, 512 bytes at most. An\nassertion without one is admitted and carries no defence.","type":"string"},"names":{"description":"Names says the value is an entity. A walk reads only the edges, so this is\na declaration and never a guess about the value's shape.","type":"boolean"},"relation":{"description":"Relation is what is being asserted — `depends`, `owner`, `same`, `title`\n— and a key, folded as Entity is. It is open until the organization\ndeclares it: once `relation:<name>` has a `domain` or `range` in force,\nthe entity's `type` (and, for range, the value's) must match it. Required,\n128 bytes at most.","type":"string"},"seen":{"description":"Seen is when this assertion became knowable, RFC 3339. Defaults to At and\nmay not precede it. It is provenance and it decides nothing: the instant\nevery read uses is derived as the later of Seen and the server's own clock.","type":"string"},"source":{"description":"Source names who asserted. Required, because an assertion nobody is named\nfor cannot be weighed against one that is. Open text: this plane ranks no\nsource above another.","type":"string"},"until":{"description":"Until is when the thing stopped being so, RFC 3339, and must follow At.\nAbsent is open: the statement holds until something ends it. A term of\noffice, an employment, a membership are At and Until on one statement.","type":"string"},"value":{"description":"Value is what the relation points at. When Names is true it is another\nentity's key, folded as Entity is, and the assertion is an EDGE; otherwise\nit is a scalar, kept byte for byte, and the assertion is a property. 2048\nbytes at most, or 512 when it names an entity.","type":"string"}},"required":["entity","relation","at","source"],"type":"object"},"graph.graphNeighborsIn":{"properties":{"as_known":{"description":"AsKnown is how much this plane had heard, RFC 3339: the answer as it would\nhave been given then, which is what makes a past answer reproducible.\nAbsent is now.","type":"string"},"as_of":{"description":"AsOf walks the graph as it stood at an instant of the world, RFC 3339:\nthe edges that held then. Absent is now.","type":"string"},"depth":{"description":"Depth is how many hops. Absent is one.","format":"int64","type":"integer"},"direction":{"description":"Direction is out, in or both. Out follows an edge from its entity to its\nvalue — what the node points at; in follows it the other way — what points\nat the node; both is the union of the two, not a third rule. Absent is out.","type":"string"},"relation":{"description":"Relation narrows the walk to one edge relation. Absent follows all. Only\nedges IN FORCE are ever followed — the assertion that wins its (entity,\nrelation) at the instant — so a superseded or retracted edge is not a hop,\nand neither is a property.","type":"string"},"seeds":{"description":"Seeds is where the walk starts. At least one.","items":{"type":"string"},"type":"array"}},"required":["seeds"],"type":"object"},"graph.graphPathIn":{"properties":{"as_known":{"description":"AsKnown is how much this plane had heard, RFC 3339: the answer as it would\nhave been given then, which is what makes a past answer reproducible.\nAbsent is now.","type":"string"},"as_of":{"description":"AsOf finds the path through the graph as it stood at an instant of the\nworld, RFC 3339: an edge that did not hold then is not crossed. Absent is\nnow.","type":"string"},"direction":{"description":"Direction is out, in or both. Out crosses each edge from its entity to\nits value; in crosses it backwards; both crosses it either way. Absent is\nout.","type":"string"},"from":{"description":"From is the entity the path starts at. Required.","type":"string"},"relations":{"description":"Relations is the edge relations a path may cross. Absent crosses every\nrelation. A causal chain is this list naming the relations that mean\ncause — `caused_by` and `influenced` under the decision convention. At\nmost 256.","items":{"type":"string"},"type":"array"},"to":{"description":"To is the entity the path ends at. Required.","type":"string"}},"required":["from","to"],"type":"object"},"graph.graphResolveIn":{"properties":{"as_known":{"description":"AsKnown is how much this plane had heard, RFC 3339: the answer as it would\nhave been given then, which is what makes a past answer reproducible.\nAbsent is now.","type":"string"},"as_of":{"description":"AsOf is the instant of the world to answer about, RFC 3339: what held\nthen. Absent is now.","type":"string"},"entity":{"description":"Entity is the thing to answer about. Required.","type":"string"},"relation":{"description":"Relation is the one relation to settle. Required: this answers a single\n(entity, relation) pair, never a whole entity at once.","type":"string"}},"required":["entity","relation"],"type":"object"},"graph.graphSourceIn":{"properties":{"at":{"description":"At is when what the source says was so, RFC 3339. Required by ingest — which\nrecords — and read by nothing in extract, which records nothing. Required for\nthe same reason /v1/graph requires it: it is part of the assertion's content\naddress, so re-reading one source at one instant records one set of rows\nhowever many times it is delivered. A clock read here instead would append\nthe whole document again on every re-read.","type":"string"},"source":{"description":"Source names where the text came from — a URL, a document id, a page title.\nIt is stamped on every assertion as its source, and with the section number\nas its evidence, so a claim can be traced back to the passage that made it.\nRequired.","type":"string"},"subject":{"description":"Subject is the entity the text is about before any heading names one. A\ndocument that states relations above its first heading needs it; one whose\nevery section is headed does not.","type":"string"},"text":{"description":"Text is the document. Relations are read from it and from nothing else: a\nline written `relation:: value` states one, and prose states none. Required.","type":"string"}},"required":["source","text"],"type":"object"},"graphQLIn":{"properties":{"operationName":{"type":"string"},"query":{"type":"string"},"variables":{}},"type":"object"},"guide.chatRequest":{"properties":{"message":{"description":"Message is the founder's question for the Business AI. Required; trimmed,\nand clipped to 4 KiB so a caller cannot amplify the AI prompt.","type":"string"}},"type":"object"},"help.helpTicketIntake":{"properties":{"description":{"description":"Description is the customer's message. Optional; it becomes the ticket's\ndescription AND the opening entry of its conversation thread. Clipped at\n16 KiB.","type":"string"},"email":{"description":"Email is how the support team replies. Required; clipped at 320 characters\n(the RFC 5321 maximum). It is recorded as the ticket's customer, and it is\nnot verified.","type":"string"},"priority":{"description":"Priority is Low, Medium, High or Urgent, case-insensitively. Anything else —\nincluding omitting it — is recorded as Medium rather than refused.","type":"string"},"subject":{"description":"Subject is the one-line summary of the problem. Required; longer than 300\ncharacters is clipped rather than refused.","type":"string"}},"type":"object"},"iam.AccountItem":{"properties":{"modifyRule":{"type":"string"},"name":{"type":"string"},"regex":{"type":"string"},"tab":{"type":"string"},"viewRule":{"type":"string"},"visible":{"type":"boolean"}},"type":"object"},"iam.Address":{"properties":{"city":{"type":"string"},"line1":{"type":"string"},"line2":{"type":"string"},"region":{"type":"string"},"state":{"type":"string"},"tag":{"type":"string"},"zipCode":{"type":"string"}},"type":"object"},"iam.Application":{"properties":{"affiliationUrl":{"type":"string"},"category":{"type":"string"},"cert":{"type":"string"},"certObj":{"$ref":"#/components/schemas/iam.Cert"},"certPublicKey":{"type":"string"},"clientCert":{"type":"string"},"clientId":{"description":"ClientId is the OAuth2/OIDC client identifier and the GLOBAL key every\nconfidential-client resolver authenticates against (store.GetApplicationByClientId,\nthe mint gates, Basic auth). It MUST be globally unique across ALL owners — a\ncollision would let one app shadow another at that key. This store persists each\nentity as a JSON document in a shared table, so there is no per-field column to\ncarry a DB UNIQUE index; uniqueness is enforced at the write in\napplications.Create/Update (ensureClientIdUnique), exactly as the (owner,name)\nnatural key is, and store.GetApplicationByClientId resolves admin-preferring as\ndefense-in-depth.","type":"string"},"clientSecret":{"type":"string"},"codeResendTimeout":{"format":"int64","type":"integer"},"cookieExpireInHours":{"format":"int64","type":"integer"},"createdAt":{"format":"date-time","type":"string"},"createdTime":{"type":"string"},"customScopes":{"items":{"$ref":"#/components/schemas/iam.ScopeDescription"},"type":"array"},"defaultGroup":{"type":"string"},"deleted":{"type":"boolean"},"description":{"type":"string"},"disableSamlAttributes":{"type":"boolean"},"disableSignin":{"type":"boolean"},"displayName":{"type":"string"},"domain":{"type":"string"},"enableAutoSignin":{"type":"boolean"},"enableCodeSignin":{"type":"boolean"},"enableExclusiveSignin":{"type":"boolean"},"enableLinkWithEmail":{"type":"boolean"},"enablePassword":{"type":"boolean"},"enableSamlAssertionSignature":{"type":"boolean"},"enableSamlC14n10":{"type":"boolean"},"enableSamlCompress":{"type":"boolean"},"enableSamlPostBinding":{"type":"boolean"},"enableSignUp":{"type":"boolean"},"enableSigninSession":{"type":"boolean"},"enableWebAuthn":{"type":"boolean"},"environment":{"type":"string"},"expireInHours":{"format":"double","type":"number"},"failedSigninFrozenTime":{"format":"int64","type":"integer"},"failedSigninLimit":{"format":"int64","type":"integer"},"favicon":{"type":"string"},"footerHtml":{"type":"string"},"forcedRedirectOrigin":{"type":"string"},"forgetUrl":{"type":"string"},"formBackgroundUrl":{"type":"string"},"formBackgroundUrlMobile":{"type":"string"},"formCss":{"type":"string"},"formCssMobile":{"type":"string"},"formOffset":{"format":"int64","type":"integer"},"formSideHtml":{"type":"string"},"grantTypes":{"items":{"type":"string"},"type":"array"},"headerHtml":{"type":"string"},"homepageUrl":{"type":"string"},"id":{"description":"Persisted fields","type":"string"},"ipRestriction":{"type":"string"},"ipWhitelist":{"type":"string"},"isShared":{"type":"boolean"},"logo":{"type":"string"},"name":{"type":"string"},"order":{"format":"int64","type":"integer"},"orgChoiceMode":{"type":"string"},"organization":{"type":"string"},"organizationObj":{"$ref":"#/components/schemas/iam.Organization"},"otherDomains":{"items":{"type":"string"},"type":"array"},"owner":{"type":"string"},"platform":{"description":"Platform marks an application the platform itself declares (init_data.json):\nits own consoles and apps, never one a tenant registered. The seed stamps it on\nevery declared application at boot, and only a SuperAdmin may change it over\nthe API. It is what lets a signed-in person act through IAM with a bearer on\nthe platform's behalf — sending an invitation from the platform's own email\naccount, joining an org — which a tenant's application may not do with the\ntokens its users hand it.","type":"boolean"},"project":{"type":"string"},"providers":{"items":{"$ref":"#/components/schemas/iam.ProviderItem"},"type":"array"},"redirectUris":{"items":{"type":"string"},"type":"array"},"refreshExpireInHours":{"format":"double","type":"number"},"samlAttributes":{"items":{"$ref":"#/components/schemas/iam.SamlItem"},"type":"array"},"samlHashAlgorithm":{"type":"string"},"samlReplyUrl":{"type":"string"},"scopes":{"items":{"$ref":"#/components/schemas/iam.ScopeItem"},"type":"array"},"signinHtml":{"type":"string"},"signinItems":{"items":{"$ref":"#/components/schemas/iam.SigninItem"},"type":"array"},"signinMethods":{"items":{"$ref":"#/components/schemas/iam.SigninMethod"},"type":"array"},"signinUrl":{"type":"string"},"signupHtml":{"type":"string"},"signupItems":{"items":{"$ref":"#/components/schemas/iam.SignupItem"},"type":"array"},"signupUrl":{"type":"string"},"sslCert":{"type":"string"},"sslMode":{"type":"string"},"tags":{"items":{"type":"string"},"type":"array"},"termsOfUse":{"type":"string"},"themeData":{"$ref":"#/components/schemas/iam.ThemeData"},"title":{"type":"string"},"tokenAttributes":{"items":{"$ref":"#/components/schemas/iam.JwtItem"},"type":"array"},"tokenFields":{"items":{"type":"string"},"type":"array"},"tokenFormat":{"type":"string"},"tokenSigningMethod":{"type":"string"},"type":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"upstreamHost":{"type":"string"},"useEmailAsSamlNameId":{"type":"boolean"}},"type":"object"},"iam.CartItem":{"properties":{"displayName":{"type":"string"},"name":{"type":"string"},"owner":{"type":"string"},"price":{"format":"double","type":"number"},"quantity":{"format":"int64","type":"integer"}},"type":"object"},"iam.Cert":{"properties":{"accessKey":{"type":"string"},"accessSecret":{"type":"string"},"account":{"type":"string"},"bitSize":{"format":"int64","type":"integer"},"certificate":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"createdTime":{"type":"string"},"cryptoAlgorithm":{"type":"string"},"deleted":{"type":"boolean"},"displayName":{"type":"string"},"domainExpireTime":{"type":"string"},"expireInYears":{"format":"int64","type":"integer"},"expireTime":{"type":"string"},"id":{"description":"Persisted fields","type":"string"},"name":{"type":"string"},"owner":{"type":"string"},"provider":{"type":"string"},"scope":{"type":"string"},"type":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"}},"type":"object"},"iam.ConsentRecord":{"properties":{"application":{"type":"string"},"grantedScopes":{"items":{"type":"string"},"type":"array"}},"type":"object"},"iam.CreateInput":{"properties":{"password":{"type":"string"},"user":{"$ref":"#/components/schemas/iam.User"}},"type":"object"},"iam.CreateOrganizationInput":{"properties":{"accountItems":{"items":{"$ref":"#/components/schemas/iam.AccountItem"},"type":"array"},"accountMenu":{"type":"string"},"avatar":{"description":"How the organization appears across Hanzo — the square mark beside its\nname — as an image or as one emoji, never both. It is the pair a person\ncarries (User.Avatar) under the same names, resolved the same way, so a\nscreen draws a subject without asking which kind of subject it has. Both\nhalves live on the row: a mark that appears everywhere cannot be kept on\none device. Written through schema.MarkOf; Logo and LogoDark above are a\ndifferent thing, the wordmark a login screen draws.","type":"string"},"balanceCredit":{"format":"double","type":"number"},"balanceCurrency":{"type":"string"},"countryCodes":{"items":{"type":"string"},"type":"array"},"createdAt":{"format":"date-time","type":"string"},"createdTime":{"type":"string"},"dcrPolicy":{"type":"string"},"defaultApplication":{"type":"string"},"defaultAvatar":{"type":"string"},"defaultPassword":{"type":"string"},"deleted":{"type":"boolean"},"disableSignin":{"type":"boolean"},"displayName":{"type":"string"},"emoji":{"type":"string"},"enableSoftDeletion":{"type":"boolean"},"enableTour":{"type":"boolean"},"failedSigninFrozenTime":{"format":"int64","type":"integer"},"failedSigninLimit":{"description":"Per-organization signin throttle. Zero means \"inherit the application\ndefault\"; a non-zero value overrides it. Safe bounds are clamped by the\nresource service before persistence.","format":"int64","type":"integer"},"favicon":{"type":"string"},"founder":{"description":"Founder is the stable storage id of the identity that provisioned this org\n(self-service onboarding). It is the resume token that makes provisioning\nconverge on a backend where each write autocommits independently (no\ntransaction rollback): after a partial failure that created the org but did\nnot move the founder in, a retry recognises the org as the founder's own and\ncompletes it, instead of refusing it as \"already taken\". It also fences the\norg to ONE tenant — a different identity can never complete or join it.","type":"string"},"hasPrivilegeConsent":{"type":"boolean"},"id":{"description":"Persisted fields","type":"string"},"initScore":{"format":"int64","type":"integer"},"ipRestriction":{"type":"string"},"ipWhitelist":{"type":"string"},"isPersonal":{"type":"boolean"},"isProfilePublic":{"type":"boolean"},"kerberosKdcHost":{"type":"string"},"kerberosKeytab":{"type":"string"},"kerberosRealm":{"type":"string"},"kerberosServiceName":{"type":"string"},"languages":{"items":{"type":"string"},"type":"array"},"ldapAttributes":{"items":{"type":"string"},"type":"array"},"logo":{"type":"string"},"logoDark":{"type":"string"},"masterPassword":{"type":"string"},"masterVerificationCode":{"type":"string"},"mfaItems":{"items":{"$ref":"#/components/schemas/iam.MfaItem"},"type":"array"},"mfaRememberInHours":{"format":"int64","type":"integer"},"name":{"type":"string"},"navItems":{"items":{"type":"string"},"type":"array"},"orgBalance":{"description":"Balance fields are read-only mirrors; authoritative balances live in\nCommerce (billing.hanzo.ai). Carried for field-complete v1 parity.","format":"double","type":"number"},"owner":{"type":"string"},"passwordExpireDays":{"format":"int64","type":"integer"},"passwordObfuscatorKey":{"type":"string"},"passwordObfuscatorType":{"type":"string"},"passwordOptions":{"items":{"type":"string"},"type":"array"},"passwordSalt":{"type":"string"},"passwordType":{"type":"string"},"platform":{"description":"Platform marks an organization the platform itself declares (init_data.json):\nthe brand orgs and the others the seed creates, never one a customer made. The\nseed stamps it on every declared organization at boot, and no request sets or\nclears it. Only a SuperAdmin may delete an organization that carries it.","type":"boolean"},"tags":{"items":{"type":"string"},"type":"array"},"themeData":{"$ref":"#/components/schemas/iam.ThemeData"},"updatedAt":{"format":"date-time","type":"string"},"useEmailAsUsername":{"type":"boolean"},"usePermanentAvatar":{"type":"boolean"},"userBalance":{"format":"double","type":"number"},"userNavItems":{"items":{"type":"string"},"type":"array"},"userTypes":{"items":{"type":"string"},"type":"array"},"websiteUrl":{"type":"string"},"widgetItems":{"items":{"type":"string"},"type":"array"}},"type":"object"},"iam.CreateSessionIn":{"properties":{"application":{"type":"string"},"exclusiveSignin":{"type":"boolean"},"name":{"type":"string"},"owner":{"type":"string"},"sessionId":{"items":{"type":"string"},"type":"array"}},"required":["owner","name","application"],"type":"object"},"iam.FaceId":{"properties":{"faceIdData":{"items":{"format":"double","type":"number"},"type":"array"},"imageUrl":{"type":"string"},"name":{"type":"string"}},"type":"object"},"iam.Input":{"properties":{"createdTime":{"type":"string"},"description":{"type":"string"},"displayName":{"type":"string"},"domains":{"items":{"type":"string"},"type":"array"},"isEnabled":{"type":"boolean"},"name":{"description":"Name addresses the team on update and names it on create; every other\nfield is content and binds from the BODY, never the URL.","type":"string"},"owner":{"type":"string"},"roles":{"items":{"type":"string"},"type":"array"},"teams":{"items":{"type":"string"},"type":"array"},"users":{"items":{"type":"string"},"type":"array"}},"type":"object"},"iam.JwtItem":{"properties":{"category":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"},"value":{"type":"string"}},"type":"object"},"iam.Key":{"properties":{"accessKey":{"description":"AccessKey (pk-*) is the publishable identifier and lookup index;\nAccessSecret (sk-*) is the confidential secret.\nAccessSecret IS NOT PERSISTED for a key minted at or after the digest\nchange: it carries the secret out to its holder once, in the mint response,\nand the row keeps only AccessSecretDigest. It stays on the struct because\nthat one-time reveal is the whole point of minting, and it stays in the\nschema because rows written before the change still hold a plaintext secret\nthat the resolver drains on first use.","type":"string"},"accessSecret":{"type":"string"},"accessSecretDigest":{"description":"AccessSecretDigest is how a presented secret finds its key: the resolver\ndigests what the caller sent and looks THAT up. It is what lets the row hold\nno plaintext and still be found in one indexed read — a salted hash cannot be\nlooked up by value, which is the reason the plaintext was here.","type":"string"},"act":{"description":"Act is the durable, opt-in grant that lets this key act FOR a user in its\nown org — the credential behind as(): presenting it authorizes minting a\nshort-lived, user-bound token for a member of the key's tenant. Default\nfalse, so a server key mints nothing on anyone's behalf until the grant is\nset deliberately — the capability is never inherited by every key. It is\nconfined at mint time to the key's OWN Owner, and a reserved-org or\nSuperAdmin target is refused, so the grant reaches only ordinary members of\nthe one tenant that holds the key.","type":"boolean"},"application":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"createdTime":{"description":"CreatedTime and UpdatedTime are RFC3339 audit stamps carried as strings\nfor byte-parity with the v1 row (orm.Model separately tracks CreatedAt /\nUpdatedAt as time.Time for the store's own lifecycle).","type":"string"},"deleted":{"type":"boolean"},"displayName":{"description":"DisplayName is the human-facing label.","type":"string"},"expireTime":{"description":"ExpireTime is when the key stops being honored (empty = never). State is\nthe lifecycle flag (\"Active\", \"test\", …); \"test\" mints test-env\ncredentials instead of live ones.","type":"string"},"id":{"description":"Persisted fields","type":"string"},"name":{"type":"string"},"organization":{"type":"string"},"owner":{"description":"Owner is the tenant that holds the key; Name is unique within Owner.","type":"string"},"prefix":{"description":"Prefix is the head of the credential the holder presents — the sk- of a\nsecret key, the pk- of a publishable one — recorded when the key is minted\n(PrefixOf). It lets a listing say which string a row is, and is far too\nshort to use: the secret itself is never stored.","type":"string"},"revokeTime":{"type":"string"},"revoker":{"description":"Revoker is who revoked the key and RevokeTime when. Revoking sets State to\nKeyStateRevoked and keeps the row, so the key is still listed and its\nhistory can be read; the resolvers refuse it, and no update reopens it.","type":"string"},"scope":{"description":"Scope is the key's ACCESS CLASS, orthogonal to Type (which names the bound\nprincipal). Empty (the default, \"secret\") is a full key: a pk- publishable\nhalf AND a confidential sk- half, the sk- authenticating a server-side reader.\nKeyScopePublish is a WRITE-ONLY publishable key — a pk- half only, no secret —\nthat resolves to just an ORG (never a principal) at the ingest endpoint and is safe\nto ship in client JS. A missing value on an existing row reads as the default,\nso every pre-Scope key is a secret key unchanged.","type":"string"},"state":{"type":"string"},"type":{"description":"Type is the scope the key is bound to — \"Organization\", \"Application\",\n\"User\", or \"General\" — and Organization / Application / User name the\nconcrete principal for whichever scope Type selects.","type":"string"},"updatedAt":{"format":"date-time","type":"string"},"updatedTime":{"type":"string"},"usedTime":{"description":"UsedTime is when the key was last presented and resolved. A list read fills\nit from the key's Sighting; the key row itself never holds it, so recording a\nuse never rewrites the row a person may be editing.","type":"string"},"user":{"type":"string"}},"type":"object"},"iam.ManagedAccount":{"properties":{"application":{"type":"string"},"signinUrl":{"type":"string"},"username":{"type":"string"}},"type":"object"},"iam.MfaAccount":{"properties":{"accountName":{"type":"string"},"issuer":{"type":"string"},"origin":{"type":"string"}},"type":"object"},"iam.MfaItem":{"properties":{"name":{"type":"string"},"rule":{"type":"string"}},"type":"object"},"iam.MfaProps":{"properties":{"countryCode":{"type":"string"},"enabled":{"type":"boolean"},"isPreferred":{"type":"boolean"},"mfaRememberInHours":{"format":"int64","type":"integer"},"mfaType":{"type":"string"},"url":{"type":"string"}},"type":"object"},"iam.Organization":{"properties":{"accountItems":{"items":{"$ref":"#/components/schemas/iam.AccountItem"},"type":"array"},"accountMenu":{"type":"string"},"avatar":{"description":"How the organization appears across Hanzo — the square mark beside its\nname — as an image or as one emoji, never both. It is the pair a person\ncarries (User.Avatar) under the same names, resolved the same way, so a\nscreen draws a subject without asking which kind of subject it has. Both\nhalves live on the row: a mark that appears everywhere cannot be kept on\none device. Written through schema.MarkOf; Logo and LogoDark above are a\ndifferent thing, the wordmark a login screen draws.","type":"string"},"balanceCredit":{"format":"double","type":"number"},"balanceCurrency":{"type":"string"},"countryCodes":{"items":{"type":"string"},"type":"array"},"createdAt":{"format":"date-time","type":"string"},"createdTime":{"type":"string"},"dcrPolicy":{"type":"string"},"defaultApplication":{"type":"string"},"defaultAvatar":{"type":"string"},"defaultPassword":{"type":"string"},"deleted":{"type":"boolean"},"disableSignin":{"type":"boolean"},"displayName":{"type":"string"},"emoji":{"type":"string"},"enableSoftDeletion":{"type":"boolean"},"enableTour":{"type":"boolean"},"failedSigninFrozenTime":{"format":"int64","type":"integer"},"failedSigninLimit":{"description":"Per-organization signin throttle. Zero means \"inherit the application\ndefault\"; a non-zero value overrides it. Safe bounds are clamped by the\nresource service before persistence.","format":"int64","type":"integer"},"favicon":{"type":"string"},"founder":{"description":"Founder is the stable storage id of the identity that provisioned this org\n(self-service onboarding). It is the resume token that makes provisioning\nconverge on a backend where each write autocommits independently (no\ntransaction rollback): after a partial failure that created the org but did\nnot move the founder in, a retry recognises the org as the founder's own and\ncompletes it, instead of refusing it as \"already taken\". It also fences the\norg to ONE tenant — a different identity can never complete or join it.","type":"string"},"hasPrivilegeConsent":{"type":"boolean"},"id":{"description":"Persisted fields","type":"string"},"initScore":{"format":"int64","type":"integer"},"ipRestriction":{"type":"string"},"ipWhitelist":{"type":"string"},"isPersonal":{"type":"boolean"},"isProfilePublic":{"type":"boolean"},"kerberosKdcHost":{"type":"string"},"kerberosKeytab":{"type":"string"},"kerberosRealm":{"type":"string"},"kerberosServiceName":{"type":"string"},"languages":{"items":{"type":"string"},"type":"array"},"ldapAttributes":{"items":{"type":"string"},"type":"array"},"logo":{"type":"string"},"logoDark":{"type":"string"},"masterPassword":{"type":"string"},"masterVerificationCode":{"type":"string"},"mfaItems":{"items":{"$ref":"#/components/schemas/iam.MfaItem"},"type":"array"},"mfaRememberInHours":{"format":"int64","type":"integer"},"name":{"type":"string"},"navItems":{"items":{"type":"string"},"type":"array"},"orgBalance":{"description":"Balance fields are read-only mirrors; authoritative balances live in\nCommerce (billing.hanzo.ai). Carried for field-complete v1 parity.","format":"double","type":"number"},"owner":{"type":"string"},"passwordExpireDays":{"format":"int64","type":"integer"},"passwordObfuscatorKey":{"type":"string"},"passwordObfuscatorType":{"type":"string"},"passwordOptions":{"items":{"type":"string"},"type":"array"},"passwordSalt":{"type":"string"},"passwordType":{"type":"string"},"platform":{"description":"Platform marks an organization the platform itself declares (init_data.json):\nthe brand orgs and the others the seed creates, never one a customer made. The\nseed stamps it on every declared organization at boot, and no request sets or\nclears it. Only a SuperAdmin may delete an organization that carries it.","type":"boolean"},"tags":{"items":{"type":"string"},"type":"array"},"themeData":{"$ref":"#/components/schemas/iam.ThemeData"},"updatedAt":{"format":"date-time","type":"string"},"useEmailAsUsername":{"type":"boolean"},"usePermanentAvatar":{"type":"boolean"},"userBalance":{"format":"double","type":"number"},"userNavItems":{"items":{"type":"string"},"type":"array"},"userTypes":{"items":{"type":"string"},"type":"array"},"websiteUrl":{"type":"string"},"widgetItems":{"items":{"type":"string"},"type":"array"}},"type":"object"},"iam.Permission":{"properties":{"actions":{"items":{"type":"string"},"type":"array"},"adapter":{"type":"string"},"approveTime":{"type":"string"},"approver":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"createdTime":{"description":"Descriptive metadata.","type":"string"},"deleted":{"type":"boolean"},"description":{"type":"string"},"displayName":{"type":"string"},"domains":{"items":{"type":"string"},"type":"array"},"effect":{"type":"string"},"id":{"description":"Persisted fields","type":"string"},"isEnabled":{"type":"boolean"},"model":{"description":"Authorization model, targets, and decision. AuthzModel carries the v1\n`model` column (the named authz model); it is not the Go identifier\n`Model` because that name is taken by the embedded orm.Model[Permission]\nmixin. The HTTP contract is unchanged — json:\"model\".","type":"string"},"name":{"type":"string"},"owner":{"description":"Identity — the (owner, name) natural key.","type":"string"},"resourceType":{"type":"string"},"resources":{"items":{"type":"string"},"type":"array"},"roles":{"items":{"type":"string"},"type":"array"},"state":{"type":"string"},"submitter":{"description":"Submission / approval workflow.","type":"string"},"teams":{"items":{"type":"string"},"type":"array"},"updatedAt":{"format":"date-time","type":"string"},"users":{"description":"Subjects the grant is evaluated for.","items":{"type":"string"},"type":"array"}},"type":"object"},"iam.Provider":{"properties":{"appId":{"type":"string"},"bucket":{"type":"string"},"category":{"type":"string"},"cert":{"type":"string"},"clientId":{"type":"string"},"clientId2":{"type":"string"},"clientSecret":{"type":"string"},"clientSecret2":{"type":"string"},"content":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"createdTime":{"type":"string"},"customAuthUrl":{"type":"string"},"customLogo":{"type":"string"},"customTokenUrl":{"type":"string"},"customUserInfoUrl":{"type":"string"},"deleted":{"type":"boolean"},"disableSsl":{"type":"boolean"},"displayName":{"type":"string"},"domain":{"type":"string"},"emailRegex":{"type":"string"},"enablePkce":{"type":"boolean"},"enableProxy":{"type":"boolean"},"enableSignAuthnRequest":{"type":"boolean"},"endpoint":{"type":"string"},"host":{"type":"string"},"httpHeaders":{"additionalProperties":{"type":"string"},"type":"object"},"id":{"description":"Persisted fields","type":"string"},"idP":{"type":"string"},"intranetEndpoint":{"type":"string"},"issuerUrl":{"type":"string"},"metadata":{"type":"string"},"method":{"type":"string"},"name":{"type":"string"},"owner":{"type":"string"},"pathPrefix":{"type":"string"},"port":{"format":"int64","type":"integer"},"providerUrl":{"type":"string"},"receiver":{"type":"string"},"regionId":{"type":"string"},"scopes":{"type":"string"},"signName":{"type":"string"},"sslMode":{"type":"string"},"subType":{"type":"string"},"templateCode":{"type":"string"},"title":{"type":"string"},"type":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"userMapping":{"additionalProperties":{"type":"string"},"type":"object"}},"type":"object"},"iam.ProviderItem":{"properties":{"bindingRule":{"items":{"type":"string"},"type":"array"},"canSignIn":{"type":"boolean"},"canSignUp":{"type":"boolean"},"canUnlink":{"type":"boolean"},"countryCodes":{"items":{"type":"string"},"type":"array"},"name":{"type":"string"},"owner":{"type":"string"},"prompted":{"type":"boolean"},"provider":{"$ref":"#/components/schemas/iam.Provider"},"rule":{"type":"string"},"signupGroup":{"type":"string"}},"type":"object"},"iam.SamlItem":{"properties":{"name":{"type":"string"},"nameFormat":{"type":"string"},"value":{"type":"string"}},"type":"object"},"iam.ScopeDescription":{"properties":{"description":{"type":"string"},"displayName":{"type":"string"},"scope":{"type":"string"}},"type":"object"},"iam.ScopeItem":{"properties":{"description":{"type":"string"},"displayName":{"type":"string"},"name":{"type":"string"},"tools":{"items":{"type":"string"},"type":"array"}},"type":"object"},"iam.SetAvatarInput":{"properties":{"avatar":{"type":"string"},"emoji":{"type":"string"},"name":{"type":"string"},"owner":{"type":"string"}},"type":"object"},"iam.SetProfileInput":{"properties":{"displayName":{"type":"string"},"favicon":{"type":"string"},"name":{"type":"string"},"owner":{"type":"string"},"websiteUrl":{"type":"string"}},"type":"object"},"iam.SigninItem":{"properties":{"customCss":{"type":"string"},"isCustom":{"type":"boolean"},"label":{"type":"string"},"name":{"type":"string"},"placeholder":{"type":"string"},"rule":{"type":"string"},"visible":{"type":"boolean"}},"type":"object"},"iam.SigninMethod":{"properties":{"displayName":{"type":"string"},"name":{"type":"string"},"rule":{"type":"string"}},"type":"object"},"iam.SignupItem":{"properties":{"customCss":{"type":"string"},"label":{"type":"string"},"name":{"type":"string"},"options":{"items":{"type":"string"},"type":"array"},"placeholder":{"type":"string"},"prompted":{"type":"boolean"},"regex":{"type":"string"},"required":{"type":"boolean"},"rule":{"type":"string"},"type":{"type":"string"},"visible":{"type":"boolean"}},"type":"object"},"iam.ThemeData":{"properties":{"borderRadius":{"format":"int64","type":"integer"},"colorPrimary":{"type":"string"},"isCompact":{"type":"boolean"},"isEnabled":{"type":"boolean"},"themeType":{"type":"string"}},"type":"object"},"iam.Token":{"properties":{"accessToken":{"type":"string"},"accessTokenHash":{"type":"string"},"actor":{"description":"Actor is the SuperAdmin (\"owner/name\") who opened this grant AS its User —\nimpersonation, /v1/iam/impersonate — and Reason is why they said they did.\nBoth empty on every grant a person established themselves. A grant with an\nActor mints a short access token that names the actor in `act` and carries\n`imp`, and never a refresh token (issueTokens), and /v1/iam/signin refuses\nits code, so it cannot become a session at the issuer.","type":"string"},"application":{"type":"string"},"code":{"type":"string"},"codeChallenge":{"type":"string"},"codeChallengeMethod":{"type":"string"},"codeExpireIn":{"format":"int64","type":"integer"},"codeIsUsed":{"type":"boolean"},"createdAt":{"format":"date-time","type":"string"},"createdTime":{"type":"string"},"deleted":{"type":"boolean"},"expiresIn":{"format":"int64","type":"integer"},"id":{"description":"Persisted fields","type":"string"},"name":{"type":"string"},"nonce":{"description":"Nonce is the OIDC authorize nonce, stored on the code and echoed into the\nid_token minted at the exchange (OIDC Core §3.1.3.6) so a relying party\nbinds the id_token to its own request and detects replay.","type":"string"},"organization":{"type":"string"},"owner":{"type":"string"},"publicGrant":{"description":"PublicGrant records that this grant was established WITHOUT client\nauthentication — a PKCE code exchange from a client that presented no\nsecret. Whether a client is confidential is a property of the GRANT, not\nonly of the registration: `hanzo-cli` and every @hanzo/iam SPA keep a\nregistered secret for a BACKEND path while the surface that actually signs\nin is a public PKCE client that cannot hold one. authorizationCodeGrant\nalready makes exactly that bounded relaxation; this is the same fact,\nrecorded so refreshTokenGrant can honour it instead of demanding a secret\nthe client never had (which 401s invalid_client and kills the session at\nthe access token's expiry). Carried across rotation, so the second refresh\nbehaves like the first.","type":"boolean"},"reason":{"type":"string"},"redirectUri":{"description":"RedirectUri binds the authorization code to the exact redirect URI of the\nauthorize request (RFC 6749 §4.1.3): the token endpoint refuses a code\nredeemed with a different redirect_uri, closing code-injection across a\nclient's registered URIs.","type":"string"},"refreshConsumed":{"type":"boolean"},"refreshExpireIn":{"format":"int64","type":"integer"},"refreshFamily":{"description":"Refresh-token rotation state (v2). Each refresh belongs to a family (the\ngrant); rotation mints a new row in the same family and marks the prior\none consumed. Presenting a consumed refresh is reuse — the whole family is\nrevoked (RFC 9700 §4.14.2). RefreshExpireIn is the refresh token's own\nabsolute expiry (unix), independent of the access token's shorter life.","type":"string"},"refreshToken":{"type":"string"},"refreshTokenHash":{"type":"string"},"resource":{"description":"RFC 8707 resource indicator","type":"string"},"scope":{"type":"string"},"tokenType":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"user":{"type":"string"},"userCode":{"type":"string"}},"type":"object"},"iam.UpdateInput":{"properties":{"password":{"type":"string"},"user":{"$ref":"#/components/schemas/iam.User"}},"type":"object"},"iam.UpdateOrganizationInput":{"properties":{"accountItems":{"items":{"$ref":"#/components/schemas/iam.AccountItem"},"type":"array"},"accountMenu":{"type":"string"},"avatar":{"description":"How the organization appears across Hanzo — the square mark beside its\nname — as an image or as one emoji, never both. It is the pair a person\ncarries (User.Avatar) under the same names, resolved the same way, so a\nscreen draws a subject without asking which kind of subject it has. Both\nhalves live on the row: a mark that appears everywhere cannot be kept on\none device. Written through schema.MarkOf; Logo and LogoDark above are a\ndifferent thing, the wordmark a login screen draws.","type":"string"},"balanceCredit":{"format":"double","type":"number"},"balanceCurrency":{"type":"string"},"countryCodes":{"items":{"type":"string"},"type":"array"},"createdAt":{"format":"date-time","type":"string"},"createdTime":{"type":"string"},"dcrPolicy":{"type":"string"},"defaultApplication":{"type":"string"},"defaultAvatar":{"type":"string"},"defaultPassword":{"type":"string"},"deleted":{"type":"boolean"},"disableSignin":{"type":"boolean"},"displayName":{"type":"string"},"emoji":{"type":"string"},"enableSoftDeletion":{"type":"boolean"},"enableTour":{"type":"boolean"},"failedSigninFrozenTime":{"format":"int64","type":"integer"},"failedSigninLimit":{"description":"Per-organization signin throttle. Zero means \"inherit the application\ndefault\"; a non-zero value overrides it. Safe bounds are clamped by the\nresource service before persistence.","format":"int64","type":"integer"},"favicon":{"type":"string"},"founder":{"description":"Founder is the stable storage id of the identity that provisioned this org\n(self-service onboarding). It is the resume token that makes provisioning\nconverge on a backend where each write autocommits independently (no\ntransaction rollback): after a partial failure that created the org but did\nnot move the founder in, a retry recognises the org as the founder's own and\ncompletes it, instead of refusing it as \"already taken\". It also fences the\norg to ONE tenant — a different identity can never complete or join it.","type":"string"},"hasPrivilegeConsent":{"type":"boolean"},"id":{"description":"Persisted fields","type":"string"},"initScore":{"format":"int64","type":"integer"},"ipRestriction":{"type":"string"},"ipWhitelist":{"type":"string"},"isPersonal":{"type":"boolean"},"isProfilePublic":{"type":"boolean"},"kerberosKdcHost":{"type":"string"},"kerberosKeytab":{"type":"string"},"kerberosRealm":{"type":"string"},"kerberosServiceName":{"type":"string"},"languages":{"items":{"type":"string"},"type":"array"},"ldapAttributes":{"items":{"type":"string"},"type":"array"},"logo":{"type":"string"},"logoDark":{"type":"string"},"masterPassword":{"type":"string"},"masterVerificationCode":{"type":"string"},"mfaItems":{"items":{"$ref":"#/components/schemas/iam.MfaItem"},"type":"array"},"mfaRememberInHours":{"format":"int64","type":"integer"},"name":{"type":"string"},"navItems":{"items":{"type":"string"},"type":"array"},"orgBalance":{"description":"Balance fields are read-only mirrors; authoritative balances live in\nCommerce (billing.hanzo.ai). Carried for field-complete v1 parity.","format":"double","type":"number"},"owner":{"type":"string"},"passwordExpireDays":{"format":"int64","type":"integer"},"passwordObfuscatorKey":{"type":"string"},"passwordObfuscatorType":{"type":"string"},"passwordOptions":{"items":{"type":"string"},"type":"array"},"passwordSalt":{"type":"string"},"passwordType":{"type":"string"},"platform":{"description":"Platform marks an organization the platform itself declares (init_data.json):\nthe brand orgs and the others the seed creates, never one a customer made. The\nseed stamps it on every declared organization at boot, and no request sets or\nclears it. Only a SuperAdmin may delete an organization that carries it.","type":"boolean"},"tags":{"items":{"type":"string"},"type":"array"},"themeData":{"$ref":"#/components/schemas/iam.ThemeData"},"updatedAt":{"format":"date-time","type":"string"},"useEmailAsUsername":{"type":"boolean"},"usePermanentAvatar":{"type":"boolean"},"userBalance":{"format":"double","type":"number"},"userNavItems":{"items":{"type":"string"},"type":"array"},"userTypes":{"items":{"type":"string"},"type":"array"},"websiteUrl":{"type":"string"},"widgetItems":{"items":{"type":"string"},"type":"array"}},"type":"object"},"iam.UpdateSessionIn":{"properties":{"application":{"type":"string"},"name":{"type":"string"},"owner":{"type":"string"},"sessionId":{"items":{"type":"string"},"type":"array"}},"required":["owner","name","application"],"type":"object"},"iam.User":{"properties":{"accessKey":{"description":"API credentials. AccessSecret / AccessSecretHash / the OAuth tokens are\nbearer material, so Mask blanks them and the handler's redact() strips them\nbefore responding. They carry real json tags because a field orm never saves\nis a field that silently vanishes.\n\nA presented secret is resolved through Key.AccessSecretDigest and nowhere\nelse, so no credential is ISSUED into these columns: they hold what older\nrows left behind, and every writer that touches them clears them.","type":"string"},"accessSecret":{"type":"string"},"accessSecretHash":{"type":"string"},"accessToken":{"type":"string"},"address":{"items":{"type":"string"},"type":"array"},"addresses":{"items":{"$ref":"#/components/schemas/iam.Address"},"type":"array"},"adfs":{"type":"string"},"affiliation":{"type":"string"},"alipay":{"type":"string"},"amazon":{"type":"string"},"apple":{"type":"string"},"applicationScopes":{"items":{"$ref":"#/components/schemas/iam.ConsentRecord"},"type":"array"},"auth0":{"type":"string"},"avatar":{"type":"string"},"avatarType":{"type":"string"},"azuread":{"type":"string"},"azureadb2c":{"type":"string"},"baidu":{"type":"string"},"balance":{"description":"Balance mirrors v1 for lossless migration but is authoritative in\nCommerce (billing.hanzo.ai), not here — do not write it from IAM.","format":"double","type":"number"},"balanceCredit":{"format":"double","type":"number"},"balanceCurrency":{"type":"string"},"battlenet":{"type":"string"},"bilibili":{"type":"string"},"bio":{"type":"string"},"birthday":{"type":"string"},"bitbucket":{"type":"string"},"box":{"type":"string"},"cart":{"items":{"$ref":"#/components/schemas/iam.CartItem"},"type":"array"},"cloudfoundry":{"type":"string"},"countryCode":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"createdIp":{"description":"Sign-in provenance.","type":"string"},"createdTime":{"type":"string"},"currency":{"type":"string"},"custom":{"type":"string"},"custom10":{"type":"string"},"custom2":{"type":"string"},"custom3":{"type":"string"},"custom4":{"type":"string"},"custom5":{"type":"string"},"custom6":{"type":"string"},"custom7":{"type":"string"},"custom8":{"type":"string"},"custom9":{"type":"string"},"dailymotion":{"type":"string"},"deezer":{"type":"string"},"deleted":{"type":"boolean"},"deletedTime":{"type":"string"},"digitalocean":{"type":"string"},"dingtalk":{"type":"string"},"discord":{"type":"string"},"displayName":{"description":"Profile.","type":"string"},"douyin":{"type":"string"},"dropbox":{"type":"string"},"education":{"type":"string"},"email":{"type":"string"},"emailVerified":{"type":"boolean"},"eveonline":{"type":"string"},"externalId":{"type":"string"},"faceIds":{"items":{"$ref":"#/components/schemas/iam.FaceId"},"type":"array"},"facebook":{"type":"string"},"firstName":{"type":"string"},"fitbit":{"type":"string"},"gender":{"type":"string"},"gitea":{"type":"string"},"gitee":{"type":"string"},"github":{"description":"Linked federated-identity subjects, one column per connector (v1 parity).","type":"string"},"gitlab":{"type":"string"},"google":{"type":"string"},"hash":{"type":"string"},"heroku":{"type":"string"},"homepage":{"type":"string"},"iam":{"type":"string"},"id":{"description":"Id is the user's STABLE OPAQUE identifier — the value the OIDC `sub` claim\ncarries. It is the v1 the legacy surface per-row UUID (e.g.\n\"e7d7fda0-4c53-4508-9d35-7ec892b7e5d7\"), migrated verbatim so a user's `sub`\nis byte-identical across the cutover: every live session, external reference,\nand the downstream money-path principal keyed on `sub` survive unchanged. A\nuser minted natively in v2 is assigned a fresh UUID here on create, so the\n`sub` is ALWAYS a stable opaque id going forward — never the (Owner, Name)\npair, which is mutable (a rename would otherwise silently reissue identity).\n\nIt is distinct from the embedded orm.Model STORAGE KEY — the value the datastore\nlocks and looks a row up by — which is NOT (Owner, Name) for every row: a MIGRATED\nlegacy row is stamped \"owner/name\" (SetId in the migrator), but a v2-native\nusers.Create'd row is NOT — Create allocates rather than pinning a key, so its\nstorage key is a store-assigned surrogate id (a decimal string like\n\"17847909129933610000001\"). (Owner, Name) is therefore the natural/QUERY key\n(unique, indexed), not necessarily the storage key: resolve a row for a locked\nwrite by its REAL key (store.GetUserByName(...).Key().Encode(), which stamps both\nshapes — see internal/oidc updateUser), never by assuming \"owner/name\". This Id is\na first-class, indexed DOMAIN field; its json tag \"id\" dominates the promoted\norm.Model `Id_` (also \"id\") by shallower depth, so the persisted record's \"id\" is\nthis UUID — exactly the v1 shape. A row that carries no Id (a not-yet-assigned\npre-cutover user) falls back to the (Owner, Name) subject at mint; every other\npath resolves `sub`→user by Id.","type":"string"},"idCard":{"type":"string"},"idCardType":{"type":"string"},"influxcloud":{"type":"string"},"infoflow":{"type":"string"},"instagram":{"type":"string"},"intercom":{"type":"string"},"invitation":{"type":"string"},"invitationCode":{"type":"string"},"ipWhitelist":{"type":"string"},"isAdmin":{"type":"boolean"},"isDefaultAvatar":{"description":"State flags.","type":"boolean"},"isDeleted":{"type":"boolean"},"isForbidden":{"type":"boolean"},"isOnline":{"type":"boolean"},"isVerified":{"type":"boolean"},"kakao":{"type":"string"},"karma":{"format":"int64","type":"integer"},"kwai":{"type":"string"},"language":{"type":"string"},"lark":{"type":"string"},"lastChangePasswordTime":{"type":"string"},"lastName":{"type":"string"},"lastSigninIp":{"type":"string"},"lastSigninTime":{"type":"string"},"lastSigninWrongTime":{"type":"string"},"lastfm":{"type":"string"},"ldap":{"type":"string"},"line":{"type":"string"},"linkedin":{"type":"string"},"location":{"type":"string"},"mailru":{"type":"string"},"managedAccounts":{"items":{"$ref":"#/components/schemas/iam.ManagedAccount"},"type":"array"},"meetup":{"type":"string"},"mfaAccounts":{"items":{"$ref":"#/components/schemas/iam.MfaAccount"},"type":"array"},"mfaEmailEnabled":{"type":"boolean"},"mfaItems":{"items":{"$ref":"#/components/schemas/iam.MfaItem"},"type":"array"},"mfaPhoneEnabled":{"type":"boolean"},"mfaPushEnabled":{"type":"boolean"},"mfaPushProvider":{"type":"string"},"mfaPushReceiver":{"type":"string"},"mfaRadiusEnabled":{"type":"boolean"},"mfaRadiusProvider":{"type":"string"},"mfaRadiusUsername":{"type":"string"},"mfaRememberDeadline":{"type":"string"},"mfaRememberDigest":{"description":"MfaRememberDigest is the digest of the token held by the ONE browser the\ndeadline above applies to. Without it the deadline is account-wide and \"don't\nask again on this browser\" switches the second factor off everywhere. It is a\ndigest, never the token, so a database dump yields nothing presentable — and it\ncarries a REAL json tag because orm persists via json.Marshal, so `json:\"-\"`\nwould never be stored (the trap PasswordHash documents above); Mask() strips it\nfrom every response instead.","type":"string"},"microsoftonline":{"type":"string"},"multiFactorAuths":{"items":{"$ref":"#/components/schemas/iam.MfaProps"},"type":"array"},"name":{"type":"string"},"nameKey":{"description":"NameKey is Fold(Name), derived on every save (BeforeCreate, BeforeUpdate) and\non every open for a row saved without it (store.Prepare): the indexed key a\ncase-insensitive username lookup reads (store.GetUserByName). It is always\nwritten, empty or not, so a row that has been keyed is never mistaken for one\nthat has not.","readOnly":true,"type":"string"},"naver":{"type":"string"},"needUpdatePassword":{"type":"boolean"},"nextcloud":{"type":"string"},"okta":{"type":"string"},"onedrive":{"type":"string"},"originalRefreshToken":{"type":"string"},"originalToken":{"type":"string"},"oura":{"type":"string"},"owner":{"description":"Identity / tenancy. (Owner, Name) is the natural key.","type":"string"},"passwordHash":{"description":"Credential material. PasswordHash is a one-way bcrypt digest and is\nverify-only. It MUST be persisted (orm serializes the entity to its JSON\ndata column, so a json:\"-\" field would never be stored — that silently\nbroke login), so it carries a real json tag; the users API redact() strips\nit (and every other secret) from every response. PasswordType and\nPasswordSalt describe the digest scheme so rows hashed under the legacy\nargon2id scheme can still be verified and lazily re-hashed to bcrypt.","type":"string"},"passwordSalt":{"type":"string"},"passwordType":{"type":"string"},"patreon":{"type":"string"},"paypal":{"type":"string"},"permanentAvatar":{"type":"string"},"phone":{"type":"string"},"preHash":{"type":"string"},"preferredMfaType":{"type":"string"},"properties":{"additionalProperties":{"type":"string"},"type":"object"},"qq":{"type":"string"},"ranking":{"format":"int64","type":"integer"},"realName":{"type":"string"},"recoveryCodes":{"items":{"type":"string"},"type":"array"},"region":{"type":"string"},"registerSource":{"type":"string"},"registerType":{"type":"string"},"salesforce":{"type":"string"},"score":{"format":"int64","type":"integer"},"shopify":{"type":"string"},"signinWrongTimes":{"format":"int64","type":"integer"},"signupApplication":{"type":"string"},"slack":{"type":"string"},"soundcloud":{"type":"string"},"spotify":{"type":"string"},"steam":{"type":"string"},"strava":{"type":"string"},"stripe":{"type":"string"},"tag":{"type":"string"},"telegram":{"type":"string"},"tiktok":{"type":"string"},"title":{"type":"string"},"totpSecret":{"type":"string"},"tumblr":{"type":"string"},"twitch":{"type":"string"},"twitter":{"type":"string"},"type":{"type":"string"},"typetalk":{"type":"string"},"uber":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"updatedTime":{"type":"string"},"verificationCode":{"type":"string"},"vk":{"type":"string"},"webauthnCredentials":{"description":"Multi-factor authentication. TotpSecret and RecoveryCodes are secret\nverify-only material — the handler strips them from every response.\nWebauthnCredentials is carried as raw JSON here for lossless migration;\nthe typed passkey model is the sibling WebauthnCredential entity.","items":{},"type":"array"},"wechat":{"type":"string"},"wecom":{"type":"string"},"weibo":{"type":"string"},"wepay":{"type":"string"},"xero":{"type":"string"},"yahoo":{"type":"string"},"yammer":{"type":"string"},"yandex":{"type":"string"},"zoom":{"type":"string"}},"type":"object"},"iam.WebauthnCredential":{"properties":{"aaguid":{"contentEncoding":"base64","type":"string"},"attachment":{"type":"string"},"attestationFormat":{"description":"AttestationFormat is the statement format the authenticator attested in\n(\"packed\", \"apple\", \"none\", …), which is a DIFFERENT value from the\nattestation type above. The library reads it back when resolving the FIDO\nAppID extension, so a row that dropped it would round-trip a credential the\nverifier no longer recognises as the one it stored.","type":"string"},"attestationType":{"type":"string"},"backupEligible":{"type":"boolean"},"backupState":{"type":"boolean"},"cloneWarning":{"type":"boolean"},"createdAt":{"format":"date-time","type":"string"},"createdTime":{"type":"string"},"credentialId":{"contentEncoding":"base64","type":"string"},"deleted":{"type":"boolean"},"id":{"description":"Persisted fields","type":"string"},"name":{"type":"string"},"owner":{"type":"string"},"publicKey":{"contentEncoding":"base64","type":"string"},"signCount":{"format":"uint32","type":"integer"},"transport":{"items":{"type":"string"},"type":"array"},"updatedAt":{"format":"date-time","type":"string"},"user":{"type":"string"},"userPresent":{"type":"boolean"},"userVerified":{"type":"boolean"}},"type":"object"},"iam.acceptBody":{"properties":{"code":{"type":"string"},"emailCode":{"type":"string"},"owner":{"type":"string"}},"type":"object"},"iam.accountBody":{"properties":{"avatar":{"type":"string"},"bio":{"type":"string"},"displayName":{"type":"string"},"homepage":{"type":"string"}},"type":"object"},"iam.auditlogs.Input":{"properties":{"action":{"type":"string"},"clientIp":{"type":"string"},"createdTime":{"type":"string"},"isTriggered":{"type":"boolean"},"language":{"type":"string"},"method":{"type":"string"},"name":{"type":"string"},"object":{"type":"string"},"organization":{"type":"string"},"owner":{"type":"string"},"requestUri":{"type":"string"},"response":{"type":"string"},"statusCode":{"format":"int64","type":"integer"},"user":{"type":"string"}},"type":"object"},"iam.identifierBody":{"properties":{"clientId":{"description":"ClientId is the application's OAuth client id.","type":"string"},"identifier":{"description":"Identifier is the email address the person typed.","type":"string"}},"type":"object"},"iam.invitations.Input":{"properties":{"application":{"type":"string"},"code":{"type":"string"},"createdTime":{"type":"string"},"defaultCode":{"type":"string"},"displayName":{"type":"string"},"email":{"type":"string"},"isRegexp":{"type":"boolean"},"name":{"type":"string"},"owner":{"type":"string"},"phone":{"type":"string"},"quota":{"format":"int64","type":"integer"},"signupGroup":{"type":"string"},"state":{"type":"string"},"updatedTime":{"type":"string"},"usedCount":{"format":"int64","type":"integer"},"username":{"type":"string"}},"type":"object"},"iam.passwordBody":{"properties":{"code":{"description":"Code is the one-time code delivered to the account's own address.","type":"string"},"oldPassword":{"description":"OldPassword is the credential being replaced, the proof a signed-in caller\ngives instead of a code.","type":"string"},"organization":{"description":"The account being recovered, for a caller who cannot be signed in. Read on\nthe CODE arm only — a signed-in caller is resolved from its own session or\ntoken, never from these.","type":"string"},"password":{"description":"Password is the new credential. It must satisfy the platform floor and the\norganization's own complexity options.","type":"string"},"username":{"description":"email, username OR phone","type":"string"}},"type":"object"},"iam.person":{"properties":{"displayName":{"type":"string"},"email":{"type":"string"},"isAdmin":{"type":"boolean"},"name":{"type":"string"},"owner":{"type":"string"},"password":{"type":"string"},"passwordType":{"type":"string"},"phone":{"type":"string"}},"type":"object"},"iam.projects.Input":{"properties":{"createdTime":{"type":"string"},"description":{"type":"string"},"displayName":{"type":"string"},"isDefault":{"type":"boolean"},"metadata":{"type":"string"},"name":{"type":"string"},"organization":{"type":"string"},"owner":{"type":"string"},"tags":{"items":{"type":"string"},"type":"array"},"workspace":{"type":"string"}},"type":"object"},"iam.registration":{"properties":{"cert":{"type":"string"},"clientId":{"type":"string"},"clientSecret":{"type":"string"},"displayName":{"type":"string"},"enableCodeSignin":{"description":"EnableCodeSignin offers sign-in by an emailed or texted one-time code\nbeside the password. A POINTER for the same reason as IsShared: a plain\nbool reads as false on every reconcile that says nothing and would switch\nthe method off for every app whose caller never mentioned it.","type":"boolean"},"expireInHours":{"description":"ExpireInHours and RefreshExpireInHours are the application's token\nlifetimes. They are the ONLY declarative way to say that a refresh token\nmust OUTLIVE its access token: with neither stated, oidc.refreshTTL clamps\nthe refresh lifetime to the access lifetime, so the refresh_token grant the\nregistration advertises expires at the same instant as the token it was\nmeant to renew and can never be exercised. `hanzo-cli` sat in exactly that\nstate — a browser re-login every hour, and a live refresh returning 401.\n\nPOINTERS, for the same reason as IsShared: a plain float would read as 0 on\nevery reconcile that says nothing and reset a deliberate lifetime back to\nthe default. Nil means \"not stated, leave it\".","format":"double","type":"number"},"grantTypes":{"items":{"type":"string"},"type":"array"},"isShared":{"description":"IsShared declares that this application serves EVERY organization, not only\nthe one named in Organization. It is the honest description of a brand app —\nhanzo-id, hanzo-chat, a brand console — whose customers each live in their own\ntenant: self-service onboarding moves a founder OUT of the brand org, so\n`user.Owner != app.Organization` is the steady state and the app really does\nserve every org. Application.ServesOrg reads it as one of the three ways to\nsay yes.\n\nA POINTER because omission must PRESERVE. This upsert is the operator's\nsteady-state reconcile and most callers say nothing about sharing; a plain\nbool would read as false on every one of them and silently un-share an app —\nthe same shape of accident that de-secreted apps through update-application.\nNil means \"not stated, leave it\"; only an explicit true or false moves it.","type":"boolean"},"name":{"type":"string"},"organization":{"type":"string"},"public":{"description":"Public declares a client that CANNOT hold a credential — a browser SPA,\na CLI, a desktop app. It proves itself with PKCE instead, and the token\nendpoint treats \"no stored secret\" as exactly that (token.go: a secret is\nverified only when one is stored). Without this flag every upsert minted\na secret, so a public client could never be registered at all and its\nbrowser code->token exchange 401'd `invalid_client` forever.","type":"boolean"},"redirectUris":{"items":{"type":"string"},"type":"array"},"refreshExpireInHours":{"format":"double","type":"number"}},"type":"object"},"iam.teams.Input":{"properties":{"createdTime":{"type":"string"},"description":{"type":"string"},"displayName":{"type":"string"},"isEnabled":{"type":"boolean"},"name":{"description":"Name addresses the team on update and names it on create; every other\nfield is content and binds from the BODY, never the URL.","type":"string"},"organization":{"type":"string"},"parent":{"type":"string"},"users":{"items":{"type":"string"},"type":"array"}},"type":"object"},"iam.termsBody":{"properties":{"aup":{"type":"string"},"terms":{"type":"string"}},"type":"object"},"iam.workspaces.Input":{"properties":{"bucket":{"type":"string"},"createdTime":{"type":"string"},"description":{"type":"string"},"displayName":{"type":"string"},"isDefault":{"type":"boolean"},"metadata":{"type":"string"},"name":{"type":"string"},"organization":{"type":"string"},"owner":{"type":"string"},"tags":{"items":{"type":"string"},"type":"array"}},"type":"object"},"ideaBatch":{"properties":{"ideas":{"description":"Ideas are the entries to append, at most 2000.","items":{"$ref":"#/components/schemas/PatentIdea"},"type":"array"}},"type":"object"},"implBatch":{"properties":{"implementations":{"description":"Implementations are the records to append, at most 2000.","items":{"$ref":"#/components/schemas/PatentImplementation"},"type":"array"}},"type":"object"},"index.indexFilter":{"properties":{"filterableAttributes":{"description":"FilterableAttributes replaces the whole filterable set. Omitted leaves it\nunchanged; an empty array clears it.","items":{"type":"string"},"type":"array"}},"type":"object"},"index.indexNew":{"properties":{"primaryKey":{"description":"PrimaryKey is the document field that identifies a row. Optional — the\nfirst write establishes one when it is omitted.","type":"string"},"uid":{"description":"UID is the index's name within the org. Required.","type":"string"}},"type":"object"},"index.indexQuery":{"properties":{"filter":{"description":"Filter narrows the hits, in the dialect's filter syntax: a string, or an\narray of strings combined with AND. Only attributes named in the index's\nfilterableAttributes can be constrained. Left unconstrained here because\nthe dialect accepts both shapes and naming one would publish an API that\ncannot send the other."},"limit":{"description":"Limit is how many hits to return. Absent means 20; the ceiling is 1000.","format":"int64","type":"integer"},"offset":{"description":"Offset is where to start. Absent means 0.","format":"int64","type":"integer"},"q":{"description":"Q is the search text. Typos are forgiven. An empty Q matches everything,\nwhich is how a client lists an index by relevance rather than by insertion\norder.","type":"string"}},"type":"object"},"ingress.Backend":{"properties":{"url":{"description":"URL is the upstream server, http(s)://host[:port].","type":"string"},"weight":{"description":"Weight is this member's share of the round-robin; must be >= 0.","format":"int64","type":"integer"}},"type":"object"},"ingress.Middleware":{"properties":{"config":{"additionalProperties":{"type":"string"},"description":"Config is the transform's parameters: redirectScheme takes scheme (default\nhttps) and permanent (\"true\" ⇒ 301, else 302); stripPrefix REQUIRES\nprefixes (comma-separated, first match wins); addPrefix REQUIRES prefix;\nheaders is a header→value map set on the response.","type":"object"},"id":{"description":"ID identifies the transform within the org: [A-Za-z0-9-_.], at most 128\nchars. A create that omits it gets a generated one. Routes reference it by\nthis id.","type":"string"},"type":{"description":"Type is the transform: redirectScheme, stripPrefix, addPrefix or headers.","type":"string"}},"type":"object"},"ingress.Route":{"properties":{"host":{"description":"Host is the exact hostname this route matches, lowercased with any trailing\ndot stripped. It is a GLOBALLY unique claim — one route across the whole\nedge may hold a host, so no tenant can hijack another's.","type":"string"},"id":{"description":"ID identifies the route within the org: [A-Za-z0-9-_.], at most 128 chars.\nA create that omits it gets a generated one.","type":"string"},"middlewares":{"description":"Middlewares are the ids of the edge transforms to apply, in this order,\nbefore the request reaches the service. At most 16.","items":{"type":"string"},"type":"array"},"pathPrefix":{"description":"PathPrefix narrows the match to requests under this path; it must start\nwith \"/\". Empty matches every path on the host.","type":"string"},"priority":{"description":"Priority orders routes that share a host: higher wins, and equal priorities\nfall back to the longer PathPrefix.","format":"int64","type":"integer"},"service":{"description":"Service is the id of the backend pool this route dispatches to. A route\nnaming a service that does not exist is skipped at compile, not served.","type":"string"},"tls":{"description":"TLS asks the edge to terminate TLS for Host with an ACME-managed certificate.","type":"boolean"}},"type":"object"},"ingress.TLSConfig":{"properties":{"acmeEmail":{"description":"ACMEEmail is the ACME account email. It binds an account for the lifetime\nof an edge process, so it applies only when the edge (re)starts.","type":"string"},"extraHosts":{"description":"ExtraHosts get certificates without owning a route — at most 256. They feed\nthe ACME HostPolicy and hot-apply on the next reload.","items":{"type":"string"},"type":"array"},"staging":{"description":"Staging issues from Let's Encrypt's staging directory (untrusted certs, high\nrate limits). Like ACMEEmail it applies only when the edge (re)starts.","type":"boolean"}},"type":"object"},"ingress.Upstream":{"properties":{"backends":{"description":"Backends are the upstream servers to balance across: 1..32 of them.","items":{"$ref":"#/components/schemas/ingress.Backend"},"type":"array"},"id":{"description":"ID identifies the pool within the org: [A-Za-z0-9-_.], at most 128 chars.\nA create that omits it gets a generated one. Routes reference it by this id.","type":"string"},"passHostHeader":{"description":"PassHostHeader forwards the client's original Host header upstream instead\nof rewriting it to the backend's.","type":"boolean"}},"type":"object"},"insightsBody":{"properties":{"batch":{"items":{"$ref":"#/components/schemas/insightsEvent"},"type":"array"},"distinct_id":{"type":"string"},"event":{"type":"string"},"properties":{"additionalProperties":{},"type":"object"},"timestamp":{"type":"string"},"uuid":{"type":"string"}},"type":"object"},"insightsEvent":{"properties":{"distinct_id":{"type":"string"},"event":{"type":"string"},"properties":{"additionalProperties":{},"type":"object"},"timestamp":{"type":"string"},"uuid":{"type":"string"}},"type":"object"},"kms.kmsLogin":{"properties":{"clientId":{"description":"ClientID is the machine identity's id, as IAM issued it.","type":"string"},"clientSecret":{"description":"ClientSecret is that identity's secret. It is never logged, never echoed,\nand never carried in an error.","type":"string"}},"type":"object"},"kms.kmsPut":{"properties":{"env":{"description":"Env is the environment to write under. REQUIRED, with no default: it is\npart of the storage key, so a silently defaulted write lands in a bucket\nthe readers that resolve project, environment and path never look in, and\nthe stale value keeps being served.","type":"string"},"name":{"description":"Name is the secret's name. Required.","type":"string"},"path":{"description":"Path is an optional subpath beneath the org root, e.g. \"/ci\".","type":"string"},"value":{"description":"Value is the secret itself. It is sealed under a fresh per-secret data key\nbefore storage, so plaintext never reaches disk, and it is never echoed\nback, logged, or carried in an error.","type":"string"}},"type":"object"},"knowledge.fileIn":{"properties":{"bucket":{"description":"Bucket is one of the org's buckets, by the friendly name /v1/s3/buckets\nlists. Required.","type":"string"},"key":{"description":"Key is the object's key in that bucket, as the upload wrote it. Required.","type":"string"},"project":{"description":"Project indexes the file under one project scope. Empty is the org's own.","type":"string"}},"type":"object"},"knowledge.fileSearchIn":{"properties":{"files":{"description":"Files restricts the search to these file ids. Empty searches every file\nthe org holds.","items":{"type":"string"},"type":"array"},"limit":{"description":"Limit bounds the passages returned. Default 8, maximum 50.","format":"int64","type":"integer"},"project":{"description":"Project restricts the search to files indexed under one project scope.","type":"string"},"query":{"description":"Query is the question or phrase. Required.","type":"string"}},"type":"object"},"knowledge.retrieveIn":{"properties":{"files":{"description":"Files are the files the question is about — the files a chat message\nreferences. Empty asks the whole workspace. The graph may still reach\nfiles beyond them.","items":{"type":"string"},"type":"array"},"limit":{"description":"Limit bounds the passages drilled out of the chosen sections. Default 8,\nmaximum 24. The graph adds up to four more.","format":"int64","type":"integer"},"project":{"description":"Project restricts retrieval to files indexed under one project scope.","type":"string"},"query":{"description":"Query is the question to answer. Required.","type":"string"}},"type":"object"},"knowledge.searchIn":{"properties":{"doctypes":{"description":"DocTypes restricts retrieval to a subset of the indexed knowledge doctypes\n(kb.page, kb.memory, kb.source). An empty or foreign list reads all of them.","items":{"type":"string"},"type":"array"},"limit":{"description":"Limit bounds the hits returned. Default 10, maximum 50.","format":"int64","type":"integer"},"project":{"description":"Project narrows retrieval to one project scope.","type":"string"},"query":{"description":"Query is the natural-language question. Required.","type":"string"}},"type":"object"},"kv.bucketWrite":{"properties":{"bucket":{"description":"Bucket is the bucket's name within the org, from the path: 1–64 of\n[A-Za-z0-9_], no dash.","type":"string"},"history":{"description":"History is how many revisions each key keeps, 1–64. 0 means 1.","format":"int64","type":"integer"},"maxValue":{"description":"MaxValue caps one value's size in bytes. 0 or less means the server's\nceiling.","format":"int64","type":"integer"},"ttl":{"description":"TTL expires entries after this many SECONDS. 0 means no expiry.","format":"int64","type":"integer"}},"type":"object"},"kv.kvWrite":{"properties":{"bucket":{"description":"Bucket is the bucket, from the path.","type":"string"},"key":{"description":"Key is the key, from the path.","type":"string"},"value":{"description":"Value is the value, carried verbatim as UTF-8 text (typically JSON).","type":"string"}},"type":"object"},"label.riskDisposeIn":{"properties":{"before":{"description":"Before disposes of assertions WRITTEN before this instant, RFC 3339. It is\nmeasured against the server clock at the write and not against the event\nor observation times, both of which the asserting caller supplies — a\ntenant that could back-date could delete a compliance record on demand.","type":"string"}},"type":"object"},"label.riskHoldIn":{"properties":{"hold":{"description":"Hold is the state to put them in: true places the hold, false releases it.\nOne op both ways, because a hold that can be placed and not released pins a\ncompliance record past every retention boundary with nothing able to let it\ngo — and an operator who cannot release a hold stops placing them.","type":"boolean"},"ids":{"description":"IDs are the content digests of the records, as returned by the write and\nby the read. They name records in THIS tenant's plane; an id belonging to\nanybody else names nothing here, because the statement runs against this\ntenant's own file and there is no other file it could reach.","items":{"type":"string"},"type":"array"}},"type":"object"},"label.riskLabelEvent":{"properties":{"at":{"description":"At is the event's own instant, RFC 3339. It is part of the event's IDENTITY\nand not a filter: it is matched exactly, to the second, against the `at` the\nassertions were filed under, so an instant a second off names a different\nevent and resolves to nothing. It is also what this event's as-of is measured\nfrom — At plus the horizon.","type":"string"},"kind":{"description":"Kind is the judged entity's type, from the closed set: account, agent,\nmerchant, payout, person, session or transaction. One outside it is refused\nrather than answered `unlabelled`, because it could only ever match nothing\nand the caller would read a real absence into a typo.","type":"string"},"subject":{"description":"Subject is the entity id in the tenant's own namespace, at most 512 bytes. It\nis matched EXACTLY against what was recorded — this is a lookup, not a search,\nand no prefix, pattern or normalisation is applied.","type":"string"}},"type":"object"},"label.riskLabelFact":{"properties":{"at":{"description":"At is when the judged event happened, RFC 3339.","type":"string"},"confidence":{"description":"Confidence in [0,1]. A processor chargeback is 1; an analyst's hunch is\nnot. It breaks a tie WITHIN a precedence rank and can never lift a weak\nsource above a strong one — otherwise every caller would send 1.\n\nA litigation hold is NOT a field here. It is a fact about the record and\nnot about the world, so it is not part of what was asserted, it is not in\nthe content digest, and it has its own op — which is also the only way one\ncan be released. Carried here it was silently a no-op on any record that\nalready existed: the digest was the same, the insert was ignored, and the\ncaller was told `duplicate` while the hold it asked for was never placed.","format":"double","type":"number"},"disposition":{"description":"Disposition is productive, unproductive, or empty for an explicit\nunjudged — the AML engine's own vocabulary, verbatim.","type":"string"},"evidence":{"description":"Evidence points at the record this conclusion came from: a dispute id, a\ncase id, a decision id. Required, because a label with no evidence cannot\nbe defended when the adverse action it fed is challenged.","type":"string"},"kind":{"description":"Kind is what the subject is: account, agent, merchant, payout, person,\nsession or transaction. Closed, because a typo in an open field would shard\na tenant's labels into a partition nothing reads and nothing would say so.","type":"string"},"seen":{"description":"Seen is when this assertion became KNOWABLE, RFC 3339. It is required and\nit is not At: a chargeback lands 30 to 120 days after the transaction it\njudges, and a training set joined on At alone knows the future. Everything\nthis plane does to prevent leakage is computed from Seen.","type":"string"},"source":{"description":"Source is who asserted: chargeoff, dispute, case, refund, review or\nsample. It is the primary term of the precedence rule, so it is closed —\nan unknown source has no rank and a conflict with it could not be resolved.","type":"string"},"subject":{"description":"Subject identifies the thing being judged, in the tenant's own namespace.","type":"string"}},"type":"object"},"label.riskLabelIn":{"properties":{"labels":{"description":"Labels is the batch. Each member is judged on its own: one refusal does\nnot discard the rest, because a webhook redelivering five disputes must\nnot lose four of them to one malformed fifth.","items":{"$ref":"#/components/schemas/label.riskLabelFact"},"type":"array"}},"type":"object"},"label.riskResolveIn":{"properties":{"horizon":{"description":"Horizon is how many days an event must age before it may be resolved at\nall, and it is the whole of the no-leakage rule. 120 for the payment lane\n(past the Visa and Mastercard dispute windows), 14 for signup abuse.\nUnstated takes 120.","format":"int64","type":"integer"},"now":{"description":"Now moves the observation instant BACKWARDS, RFC 3339. It exists so a\nBACKTEST can resolve labels as the plane stood at a past moment; without it,\nevery backtest would score a model against knowledge that arrived after the\ndecision it is being scored on. An instant after the server clock is\nrefused: a backtest resolves the past, and a future one would declare\nunmatured events matured and hand a training set negatives for rows whose\nchargeback has not had time to arrive.","type":"string"},"subjects":{"description":"Subjects are the exact events being judged. Each carries its own event\ntime, because the as-of that keeps the future out is derived from that\ninstant plus the horizon — one as-of over a whole batch would give a\nJanuary row six extra months of hindsight.\n\nOne entry per DISTINCT (kind, subject, at): naming an event twice answers\nonce, because an event resolved twice would list its own winner as a\ncontrary claim and would hand a materialiser duplicate training rows.","items":{"$ref":"#/components/schemas/label.riskLabelEvent"},"type":"array"}},"type":"object"},"leaderboard.orgOptinReq":{"properties":{"display":{"description":"Display is the name shown for the org on that board: 1-40 characters of\nletters, digits, space, dot, underscore, apostrophe or hyphen. Left empty on a\nlisting opt-in it defaults to the org id.","type":"string"},"listed":{"description":"Listed publishes the org on the cross-org global board when true, and withdraws\nit when false.","type":"boolean"}},"type":"object"},"leaderboard.userOptinReq":{"properties":{"handle":{"description":"Handle is the display name shown on a listed row: 1-40 characters of letters,\ndigits, space, dot, underscore, apostrophe or hyphen. Left empty on a listing\nopt-in it defaults to the caller's username.","type":"string"},"listed":{"description":"Listed publishes the caller's row to other viewers of the board when true, and\nanonymizes it when false.","type":"boolean"}},"type":"object"},"legal.Field":{"properties":{"key":{"description":"Key is the identifier the body substitutes ({{.key}}) and the key a\ngeneration's data map must carry. snake_case by convention across the\nbuilt-ins — effective_date, company_name, governing_law. An override whose\nbody references a key no Field declares is refused on save.","type":"string"},"label":{"description":"Label is the human prompt for whoever fills the value in — \"Governing law\n(state)\". It never reaches the rendered document; only Key does.","type":"string"}},"type":"object"},"legal.filingRequest":{"properties":{"documentIds":{"description":"DocumentIDs are the documents to file. At least one is required, and every\none must belong to the caller's org — a filing can never reach across orgs.","items":{"type":"string"},"type":"array"},"jurisdiction":{"description":"Jurisdiction is the state or agency the filing is for, e.g. \"DE\".","type":"string"}},"type":"object"},"legal.generateRequest":{"properties":{"data":{"additionalProperties":{"type":"string"},"description":"Data supplies every merge field the template declares, keyed by field key.\nEvery declared field is REQUIRED: a missing one is refused with 400 rather\nthan rendered as a blank into a contract.","type":"object"},"templateId":{"description":"TemplateID is the template to render. Required; resolved for the caller's\norg, so an override wins over the built-in.","type":"string"}},"type":"object"},"legal.legalSigner":{"properties":{"email":{"description":"Email is where the provider sends the request, and the only way the signer is\nreached — a signer is a COUNTERPARTY, not necessarily a member of the org, so\nthere is no account to fall back on.","type":"string"},"name":{"description":"Name is the person as they should appear on the signature request. Passed to\nthe provider verbatim; nothing here matches it against a Hanzo user.","type":"string"}},"type":"object"},"legal.signRequest":{"properties":{"id":{"description":"ID is the document to send for signature, from the path.","type":"string"},"signers":{"description":"Signers are the people who must sign, by name and email. At least one is\nrequired.","items":{"$ref":"#/components/schemas/legal.legalSigner"},"type":"array"}},"type":"object"},"legal.templateOverride":{"properties":{"body":{"description":"Body is the text/template source. Required. Every {{.key}} it references must\nbe declared in Fields, or the save is refused rather than rendering a blank\ninto a contract later.","type":"string"},"category":{"description":"Category groups the template: formation, equity, ops or sales. Optional when\noverriding a built-in, which supplies its own.","type":"string"},"counselReview":{"description":"CounselReview marks a template whose documents must carry the counsel notice.\nIt can be raised but never lowered: a formation or equity template is always\ncounsel-review, and an override of a counsel-review built-in stays one.","type":"boolean"},"fields":{"description":"Fields declares the merge fields the body consumes. Every declared field is\nREQUIRED at generation — the engine fails closed on a missing one.","items":{"$ref":"#/components/schemas/legal.Field"},"type":"array"},"id":{"description":"ID is the template to override, from the path. Overriding a built-in id\ninherits that built-in's category, title and counsel-review posture.","type":"string"},"title":{"description":"Title is the template's display name. Required unless a built-in supplies it.","type":"string"}},"type":"object"},"library.itemPatch":{"properties":{"id":{"description":"ID is the item, from the path.","type":"string"},"name":{"description":"Name renames it.","type":"string"},"project":{"description":"Project moves it to one of the organization's projects; \"\" moves it out.","type":"string"},"shared":{"description":"Shared shows it to every member of your organization, or stops.","type":"boolean"}},"type":"object"},"library.keepIn":{"properties":{"data":{"contentEncoding":"base64","description":"Data is the bytes, base64, at most 10 MiB. Required.","type":"string"},"height":{"format":"int64","type":"integer"},"key":{"description":"Key makes the save idempotent: the same source and key answer the item\nalready kept.","type":"string"},"kind":{"description":"Kind is image, video, audio, document, slides, type, model, code or file;\nabsent derives it from mime.","type":"string"},"mime":{"description":"Mime is its media type. Required.","type":"string"},"name":{"description":"Name is what it is called, a file name. Required.","type":"string"},"origin":{"description":"Origin is the path on this site back to what made it, as /chat?thread=….","type":"string"},"pages":{"format":"int64","type":"integer"},"preview":{"contentEncoding":"base64","description":"Preview is a still that shows it, base64, at most 2 MiB.","type":"string"},"project":{"description":"Project is one of the organization's projects, by slug.","type":"string"},"ref":{"description":"Ref is what made it: the conversation, the run.","type":"string"},"seconds":{"format":"double","type":"number"},"source":{"description":"Source is the product it came from: chat, dev, studio or workflow. Required.","type":"string"},"width":{"description":"Width, Height, Seconds and Pages describe it when known.","format":"int64","type":"integer"}},"type":"object"},"licensing.DeviceSignals":{"properties":{"arch":{"type":"string"},"cpuid":{"description":"CPUID is a CPU/board identifier string.","type":"string"},"disk_serial":{"description":"DiskSerial of the boot/root volume.","type":"string"},"hostname":{"description":"Hostname is a weak signal, used only as a tiebreaker.","type":"string"},"install_id":{"description":"InstallID is a per-install random the agent persists locally on first run.","type":"string"},"machine_id":{"description":"MachineID is a stable per-host id (e.g. /etc/machine-id, IOPlatformUUID,\nMachineGuid). Strongest single signal where present.","type":"string"},"macs":{"description":"MAC addresses of stable interfaces (order-insensitive; we sort).","items":{"type":"string"},"type":"array"},"os":{"description":"OS / Arch coarse platform tags.","type":"string"}},"type":"object"},"licensing.FingerprintRequest":{"properties":{"signals":{"$ref":"#/components/schemas/licensing.DeviceSignals","description":"Signals is the host material the client agent collected. Which fields\nactually participate in the binding is deliberately unspecified — send\neverything available and let the server decide."}},"type":"object"},"licensing.IssueRequest":{"properties":{"fingerprint":{"description":"Fingerprint is a previously-registered device binding value, as returned by\nPOST /v1/licensing/fingerprint. Leave it empty and pass Signals to bind the\ndevice at issue time instead.","type":"string"},"holder":{"description":"Holder overrides who the token is issued to; defaults to the caller's own\nvalidated subject. It NAMES the token's bearer and grants nothing on its\nown — the entitlement checked is always the caller's org's.","type":"string"},"product":{"description":"Product is the licensed commerce product the caller wants a token for.","type":"string"},"release":{"description":"Release scopes the token to one signed binary release, recorded as a\n\"release:<id>\" feature so a single bad release can be revoked on its own.","type":"string"},"signals":{"$ref":"#/components/schemas/licensing.DeviceSignals","description":"Signals binds the device at issue time, as an alternative to a\npre-registered fingerprint. The raw signals are never stored or echoed —\nthey are folded immediately into the one-way binding value."},"ttl_seconds":{"description":"TTLSeconds requests a token lifetime in seconds. It is clamped to the\ndeployment maximum AND to the entitlement's own expiry — a token never\noutlives the subscription that paid for it.","format":"int64","type":"integer"}},"required":["product"],"type":"object"},"licensing.VerifyRequest":{"properties":{"app":{"description":"App overrides the app_id the token is expected to carry. Leave it empty and\nthe token's own app_id is used — an online verify is informational, and it\nis the ENGINE that enforces the app at boot.","type":"string"},"token":{"description":"Token is the license token to check.","type":"string"}},"required":["token"],"type":"object"},"link.enrollReq":{"properties":{"account":{"description":"Account is the provider-side account identifier.","type":"string"},"host":{"description":"Host is the machine's human hostname label.","type":"string"},"kind":{"description":"Kind decides how the account's inference BILLS and defaults to\nsubscription: a subscription account bills the user's own monthly plan and\nis metered here for visibility only, while an apikey account bills through\ncommerce on the gateway path.","type":"string"},"machine":{"description":"Machine is the stable machine identifier. Required, length-bounded.","type":"string"},"os":{"description":"OS is the machine's operating system label.","type":"string"},"plan":{"description":"Plan is the provider plan label (e.g. \"Claude Max\").","type":"string"},"provider":{"description":"Provider is the AI provider the account belongs to. Required, length-bounded.","type":"string"},"usage":{"description":"Usage is an optional usage snapshot, clamped and re-serialized to known\nfields; omitting it keeps the last good one."}},"type":"object"},"link.ingestReq":{"properties":{"account":{"description":"Account is the provider-side account the sample belongs to.","type":"string"},"cachedInputTokens":{"description":"CachedInputTokens is the window's cached-prompt-token count.","format":"int64","type":"integer"},"confidence":{"description":"Confidence says how real the counters are, as the meter graded itself.","type":"string"},"costCents":{"description":"CostCents is the window's spend in cents, as the provider's meter states it.","format":"int64","type":"integer"},"costLimitCents":{"description":"CostLimitCents is the window's spend cap in cents, when the meter knows one.","format":"int64","type":"integer"},"currency":{"description":"Currency is the ISO currency the cost fields are stated in.","type":"string"},"inputTokens":{"description":"InputTokens is the window's prompt-token count.","format":"int64","type":"integer"},"kind":{"description":"Kind is subscription or apikey; anything else is refused.","type":"string"},"lane":{"description":"Lane names the meter's own lane label for this measurement.","type":"string"},"machine":{"description":"Machine is the machine the collector observed the account on. Required.","type":"string"},"outputTokens":{"description":"OutputTokens is the window's completion-token count.","format":"int64","type":"integer"},"plan":{"description":"Plan is the provider plan label the account is on.","type":"string"},"provider":{"description":"Provider is the AI provider whose meter reported this sample. Required.","type":"string"},"requests":{"description":"Requests is the window's request count.","format":"int64","type":"integer"},"resetsAt":{"description":"ResetsAt is when the window resets, RFC 3339, bounded.","type":"string"},"samples":{"description":"Samples is the batch form, up to 256 samples; leave it empty to send one\nsample inline on the same fields.","items":{"$ref":"#/components/schemas/link.readingReq"},"type":"array"},"synthetic":{"description":"Synthetic marks a sample the collector derived rather than observed.","type":"boolean"},"totalTokens":{"description":"TotalTokens is the window's total token count.","format":"int64","type":"integer"},"usedPct":{"description":"UsedPct is how much of the window's allowance is consumed, clamped 0..100.","format":"double","type":"number"},"window":{"description":"Window is the window class, one of 6h, day, week, month; anything else is\nrefused rather than silently reclassified.","type":"string"},"windowMinutes":{"description":"WindowMinutes is the window's length as the meter reported it.","format":"int32","type":"integer"},"windowStart":{"description":"WindowStart is when the measured window opened, RFC 3339, bounded to a\nsane interval around now.","type":"string"}},"type":"object"},"link.readingReq":{"properties":{"account":{"description":"Account is the provider-side account the sample belongs to.","type":"string"},"cachedInputTokens":{"description":"CachedInputTokens is the window's cached-prompt-token count.","format":"int64","type":"integer"},"confidence":{"description":"Confidence says how real the counters are, as the meter graded itself.","type":"string"},"costCents":{"description":"CostCents is the window's spend in cents, as the provider's meter states it.","format":"int64","type":"integer"},"costLimitCents":{"description":"CostLimitCents is the window's spend cap in cents, when the meter knows one.","format":"int64","type":"integer"},"currency":{"description":"Currency is the ISO currency the cost fields are stated in.","type":"string"},"inputTokens":{"description":"InputTokens is the window's prompt-token count.","format":"int64","type":"integer"},"kind":{"description":"Kind is subscription or apikey; anything else is refused.","type":"string"},"lane":{"description":"Lane names the meter's own lane label for this measurement.","type":"string"},"machine":{"description":"Machine is the machine the collector observed the account on. Required.","type":"string"},"outputTokens":{"description":"OutputTokens is the window's completion-token count.","format":"int64","type":"integer"},"plan":{"description":"Plan is the provider plan label the account is on.","type":"string"},"provider":{"description":"Provider is the AI provider whose meter reported this sample. Required.","type":"string"},"requests":{"description":"Requests is the window's request count.","format":"int64","type":"integer"},"resetsAt":{"description":"ResetsAt is when the window resets, RFC 3339, bounded.","type":"string"},"synthetic":{"description":"Synthetic marks a sample the collector derived rather than observed.","type":"boolean"},"totalTokens":{"description":"TotalTokens is the window's total token count.","format":"int64","type":"integer"},"usedPct":{"description":"UsedPct is how much of the window's allowance is consumed, clamped 0..100.","format":"double","type":"number"},"window":{"description":"Window is the window class, one of 6h, day, week, month; anything else is\nrefused rather than silently reclassified.","type":"string"},"windowMinutes":{"description":"WindowMinutes is the window's length as the meter reported it.","format":"int32","type":"integer"},"windowStart":{"description":"WindowStart is when the measured window opened, RFC 3339, bounded to a\nsane interval around now.","type":"string"}},"type":"object"},"lsp.Query":{"properties":{"character":{"description":"Character is a 0-based UTF-16 code-unit offset within Line, per the LSP\nspecification — not a byte offset and not a rune index.","format":"int64","type":"integer"},"line":{"description":"Line is 0-based, per the LSP specification.","format":"int64","type":"integer"},"path":{"description":"Path is the repo-relative file, e.g. \"apps/lsp/lsp.go\".","type":"string"},"relation":{"description":"Relation refines locate: definition, reference, type or implementation.\nEmpty means definition. Every other op ignores it.","type":"string"},"repo":{"description":"Repo is the repository NAME within the caller's own org, e.g. \"cloud\".\nNot a URL and not an owner/name pair: the owner is the validated\nprincipal's org, so this names a repository the caller already owns.","type":"string"},"rev":{"description":"Rev is a branch, tag or commit sha. Empty means the default branch. It is\nresolved to a commit before anything else happens, so an answer is always\nabout one immutable tree.","type":"string"}},"type":"object"},"marketing.Address":{"properties":{"city":{"description":"City is the city. Required.","type":"string"},"country":{"description":"Country is the country. Required.","type":"string"},"postcode":{"description":"Postcode is the postal code. Optional.","type":"string"},"region":{"description":"Region is the state, province or region. Optional.","type":"string"},"street":{"description":"Street is the street address, on one line. Required.","type":"string"}},"type":"object"},"marketing.Answer":{"properties":{"answer":{"description":"Answer is what the person said; options they picked are joined by commas.","type":"string"},"question":{"description":"Question is the question as the form asked it, on one line.","type":"string"}},"type":"object"},"marketing.Audience":{"properties":{"createdAt":{"description":"CreatedAt is unix seconds when the filter was saved, server-assigned.","format":"int64","type":"integer"},"event":{"description":"Event is the analytics event a member must have fired. EMPTY MEANS NO\nFILTER: the audience is then every mailable customer in the org, and no\nwarehouse is consulted.","type":"string"},"id":{"description":"ID is the server-assigned audience id (\"aud_\" + 128 random bits).","type":"string"},"name":{"description":"Name is the audience's label. Required, trimmed, capped at 1024 bytes.","type":"string"},"updatedAt":{"description":"UpdatedAt is unix seconds of the last write, server-assigned, and the key\nthe audience list is ordered by (newest first). A saved audience has no\nupdate route, so in practice it stays equal to CreatedAt: to change a\nfilter you save another one.","format":"int64","type":"integer"},"windowDays":{"description":"WindowDays is how far back the event counts, ending now. 0 means 30 and\nnothing above 3650 is honoured. Ignored when Event is empty.","format":"int64","type":"integer"}},"type":"object"},"marketing.BetaActIn":{"properties":{"action":{"description":"Action is star or follow.","type":"string"},"github":{"description":"GitHub is the person's GitHub login, for a star. Once a star is counted it\nis the record's, and another login is refused.","type":"string"},"target":{"description":"Target is the repository starred (hanzoai/<name>) or the founder's link\nfollowed (antje or zach, then github, linkedin or x: zach/github).","type":"string"}},"type":"object"},"marketing.BetaAnswer":{"properties":{"answer":{"description":"Answer is what the person answered: one entry for a typed answer or a single\nchoice, one entry per option for several.","items":{"type":"string"},"type":"array"},"id":{"description":"ID is the question's id on the form, such as \"builds\".","type":"string"},"question":{"description":"Question is the question as the form asked it.","type":"string"}},"type":"object"},"marketing.BetaIn":{"properties":{"answers":{"description":"Answers replace the record's answers.","items":{"$ref":"#/components/schemas/marketing.BetaAnswer"},"type":"array"},"betas":{"description":"Betas replace the ids of the unreleased products the account asked for.","items":{"type":"string"},"type":"array"},"lead":{"description":"Lead is the reference the application was filed under as a lead\n(POST /v1/marketing/leads), so the record and the lead are one person's.","type":"string"},"program":{"description":"Program is the program applied to: beta, research or partner.","type":"string"}},"type":"object"},"marketing.BetaInviteFailure":{"properties":{"id":{"description":"ID is the invite's id.","type":"string"},"why":{"description":"Why is the mailbox's reason, at most 200 characters.","type":"string"}},"type":"object"},"marketing.BetaInviteIn":{"properties":{"to":{"description":"To is the addresses to invite, at most 50. Each is trimmed and lower-cased;\none named twice is one.","items":{"type":"string"},"type":"array"}},"type":"object"},"marketing.BetaInviteSentIn":{"properties":{"failed":{"description":"Failed are the invites that did not go out.","items":{"$ref":"#/components/schemas/marketing.BetaInviteFailure"},"type":"array"},"ids":{"description":"IDs are the invites sent.","items":{"type":"string"},"type":"array"}},"type":"object"},"marketing.BetaRequest":{"properties":{"betas":{"description":"Betas are the ids of the unreleased products to add.","items":{"type":"string"},"type":"array"}},"type":"object"},"marketing.CalendarPost":{"properties":{"body":{"description":"Body is the post text. Required.","type":"string"},"channel":{"description":"Channel is the target network: x, facebook, instagram, linkedin, tiktok,\nyoutube or threads. Required — a post must name where it goes.","type":"string"},"createdAt":{"description":"CreatedAt is unix seconds when the post was added, server-assigned and\nnever rewritten.","format":"int64","type":"integer"},"error":{"description":"Error is the exact reason the last publish attempt failed — the honest\nrecord behind a \"failed\" status, never a faked success.","type":"string"},"id":{"description":"ID is the server-assigned post id (\"cal_\" + 128 random bits).","type":"string"},"publishedAt":{"description":"PublishedAt is when the publish succeeded; 0 until it does.","format":"int64","type":"integer"},"scheduledAt":{"description":"ScheduledAt is the unix publish time; 0 leaves the post a draft, and any\nvalue makes it \"scheduled\" for the durable sweep to pick up.","format":"int64","type":"integer"},"status":{"description":"Status is draft, scheduled, published, failed or canceled. Server-owned.","type":"string"},"title":{"description":"Title is the post's internal label, capped at 1024 bytes.","type":"string"},"updatedAt":{"description":"UpdatedAt is unix seconds of the last write, server-assigned. The durable\nsweep writes too — claiming a due post, publishing it and recording a\nfailure each bump it — so this moves without anyone editing the post.","format":"int64","type":"integer"}},"type":"object"},"marketing.Campaign":{"properties":{"budget":{"description":"Budget is what the campaign is allowed to cost, in USD cents. A negative\nvalue is clamped to 0; nothing enforces the ceiling here.","format":"int64","type":"integer"},"channel":{"description":"Channel is the delivery surface: email, sms, social, meta, google or\ntiktok. Empty means email.","type":"string"},"createdAt":{"description":"CreatedAt is unix seconds when the campaign was registered. Server-assigned\nand never rewritten — an update leaves it as it was.","format":"int64","type":"integer"},"id":{"description":"ID is the server-assigned campaign id (\"camp_\" + 128 random bits).","type":"string"},"name":{"description":"Name is the campaign's label. Required, trimmed, capped at 1024 bytes.","type":"string"},"objective":{"description":"Objective is the free-text goal (\"signups\"), capped at 1024 bytes.","type":"string"},"scheduledAt":{"description":"ScheduledAt is the unix send time; 0 means unscheduled. Setting it on a\ncampaign with no explicit status makes that status \"scheduled\".","format":"int64","type":"integer"},"spend":{"description":"Spend is what the campaign has cost so far, in USD cents, clamped to >= 0.\nThe CALLER owns it: no send, ad buy or invoice moves it, so it changes only\nwhen create or update carries a new value. It is summed across the org's\ncampaigns into GET /v1/marketing/summary.","format":"int64","type":"integer"},"status":{"description":"Status is the lifecycle: draft, scheduled, active, paused or completed.\nEmpty means draft.","type":"string"},"updatedAt":{"description":"UpdatedAt is unix seconds of the last write. Server-assigned on create and\non every update or schedule change, and the campaign list is ordered by it,\nnewest first.","format":"int64","type":"integer"}},"type":"object"},"marketing.EnrollInput":{"properties":{"address":{"description":"Address is a single recipient, normalized (lower-cased, trimmed) before\nuse. Give this OR audienceId, never both and never neither.","type":"string"},"audienceId":{"description":"AudienceID fans the sequence out over a saved audience, resolved live to\nthe org's mailable customers. Email only.","type":"string"},"channel":{"description":"Channel is the delivery surface; empty means email. An audience resolves\nmailboxes, so an audience enroll must be email.","type":"string"},"id":{"description":"ID is the sequence id from the path.","type":"string"}},"type":"object"},"marketing.EsignDocument":{"properties":{"externalId":{"description":"ExternalID is the reference the document was made under: the lead's.","type":"string"},"id":{"description":"ID is the document's id in eSign.","format":"int64","type":"integer"},"recipients":{"description":"Recipients are the document's signers.","items":{"$ref":"#/components/schemas/marketing.EsignRecipient"},"type":"array"}},"type":"object"},"marketing.EsignEvent":{"properties":{"event":{"description":"Event is what happened: DOCUMENT_SIGNED (a recipient signed),\nDOCUMENT_COMPLETED, DOCUMENT_REJECTED or DOCUMENT_CANCELLED. Any other event\nchanges nothing.","type":"string"},"payload":{"$ref":"#/components/schemas/marketing.EsignDocument","description":"Payload is the document as it stands after the event."}},"type":"object"},"marketing.EsignRecipient":{"properties":{"signingOrder":{"description":"SigningOrder is the signer's turn: 1 is the investor, 2 the countersigner.","format":"int64","type":"integer"},"signingStatus":{"description":"SigningStatus is NOT_SIGNED, SIGNED or REJECTED.","type":"string"}},"type":"object"},"marketing.LeadIn":{"properties":{"address":{"$ref":"#/components/schemas/marketing.Address","description":"Address is where an investor lives, or where the entity they invest\nthrough is: street, city and country required, each at most 200 characters."},"amount":{"description":"Amount is what an investor invests, as a JSON number of whole US dollars: at\nleast 25000, which a smaller amount is refused as \"The minimum investment is\n$25,000.\", and at most 1000000000."},"answers":{"description":"Answers is the application question by question, as the form asked it:\nat most 40, each question clipped at 200 characters and each answer at\n2 KiB. Recorded on the lead as they came; optional.","items":{"$ref":"#/components/schemas/marketing.Answer"},"type":"array"},"campaign":{"$ref":"#/components/schemas/marketing.Tags","description":"Campaign is the utm_* tags of the link the visit arrived on, recorded on\nthe lead. Optional."},"company":{"description":"Company is the person's company. Optional; clipped at 200 characters.","type":"string"},"consent":{"description":"Consent is the applicant ticking \"Keep me posted about roles and news at\nHanzo. Unsubscribe any time.\" Unticked, they hear nothing but the reply to\ntheir application. Read only with Job.","type":"boolean"},"country":{"description":"Country is where the person is. Optional; clipped at 200 characters.","type":"string"},"coupon":{"description":"Coupon is the offer code the visitor's page held: letters, digits, dash and\nunderscore, at most 32. Any other value is recorded as none. Optional.","type":"string"},"department":{"description":"Department is the opening's department. Read only with Job.","type":"string"},"email":{"description":"Email is where sales replies: the person's work email. Required, and it\nmust look like an address. It is not verified.","type":"string"},"entity":{"description":"Entity is the legal name of the entity an investor invests through; empty,\nthey invest in their own name. At most 200 characters. Read only with program\ninvestor, as are Title, Amount, Phone and Address.","type":"string"},"job":{"description":"Job is the opening a careers form applies to, by its id on the careers page\n(senior-backend-engineer). A body naming one is a job application: it is\nfiled as a candidate, never as a lead, so it is offered no call and no code,\nno ad platform hears of it, and the brand's careers mailbox is told instead\nof sales. Name, Email, Role (the opening's title), Country (where the person\nis), Need (what they wrote about themselves), Source and Answers carry over.\nOptional; clipped at 200 characters.","type":"string"},"links":{"description":"Links are https addresses the applicant gave: a portfolio, a profile, a\nsite. At most five, each at most 500 characters; any other value is\ndropped. Read only with Job.","items":{"type":"string"},"type":"array"},"name":{"description":"Name is the person's name. Optional, and clipped at 200 characters, except\nfor an investor, who must give it, in at most 200.","type":"string"},"need":{"description":"Need is what the person wants from sales, in their own words. Optional;\nclipped at 4 KiB.","type":"string"},"phone":{"description":"Phone is an investor's phone number: 3 to 20 digits, an optional leading +,\nand any spaces, dots, dashes or brackets between them. Optional.","type":"string"},"program":{"description":"Program is the program the person applies to: beta, research or partner.\nAny other value is recorded as none. An application is mailed a code for\n50% off the first three months, once per address (offer.go). Optional.\n\"investor\" is an investor's subscription (investor.go): it is mailed no\ncode, it is sent a SAFE, and Name, Amount and Address are required.","type":"string"},"resume":{"description":"Resume is an https address the applicant gave for their resume. Read only\nwith Job; any other value is recorded as none.","type":"string"},"resume_file":{"description":"ResumeFile is the key POST /v1/marketing/leads/resume handed out for the\nresume the applicant uploaded. Any other value is recorded as none. Read\nonly with Job.","type":"string"},"role":{"description":"Role is the person's job title. Optional; clipped at 200 characters.","type":"string"},"size":{"description":"Size is the company's headcount band: 1-49, 50-249, 250-999, 1000-4999 or\n5000+. Any other value is recorded as unstated rather than refused.","type":"string"},"source":{"description":"Source is the page the form was filed from, such as hanzo.ai/contact-sales.\nOptional; clipped at 200 characters.","type":"string"},"title":{"description":"Title is the investor's title at Entity, as the SAFE's signature block\nnames it. At most 200 characters; read only with Entity.","type":"string"},"visit":{"$ref":"#/components/schemas/marketing.Visit","description":"Visit is what the visitor's page knows about the ad click that brought them\nand the consent they gave, so the lead reaches the ad platforms matched to\nthe click and under the visitor's own choice. Optional."}},"type":"object"},"marketing.MailIn":{"properties":{"body":{"description":"Body is the mail as plain text, at most 20000 characters; a blank line\nseparates paragraphs.","type":"string"},"person":{"description":"Person is the CRM person the mail is written to. Empty, the mail goes on the\ntimeline of the person the org holds for the address, if any.","type":"string"},"subject":{"description":"Subject is the subject line, at most 200 characters on one line.","type":"string"},"to":{"description":"To is the one address the mail goes to.","type":"string"}},"type":"object"},"marketing.RedeemInput":{"properties":{"code":{"description":"Code is the promo code from the path.","type":"string"},"instrument":{"description":"Instrument identifies the payment method. It is the anti-farming key: one\nredemption per instrument, fleet-wide, and it is REQUIRED — an absent\ninstrument is refused, never waved through.","type":"string"}},"type":"object"},"marketing.ResumeIn":{"properties":{"name":{"description":"Name is the file's name; its extension must be .pdf, .doc or .docx.","type":"string"},"size":{"description":"Size is the file's size in bytes, at most 10 MB.","format":"int64","type":"integer"},"type":{"description":"Type is the file's content type, which must be that extension's.","type":"string"}},"type":"object"},"marketing.ScheduleInput":{"properties":{"id":{"description":"ID is the campaign id from the path.","type":"string"},"scheduledAt":{"description":"ScheduledAt is the unix send time. 0 clears the schedule.","format":"int64","type":"integer"}},"type":"object"},"marketing.Sequence":{"properties":{"createdAt":{"description":"CreatedAt is unix seconds when the sequence was registered, server-assigned\nand never rewritten.","format":"int64","type":"integer"},"id":{"description":"ID is the server-assigned sequence id (\"seq_\" + 128 random bits).","type":"string"},"name":{"description":"Name is the sequence's label. Required, trimmed, capped at 1024 bytes.","type":"string"},"status":{"description":"Status is the lifecycle: draft, active or archived. Empty means draft, and\nONLY an active sequence accepts enrollments.","type":"string"},"updatedAt":{"description":"UpdatedAt is unix seconds of the last status flip, server-assigned, and the\nkey the sequence list is ordered by (newest first). Adding a step or\nenrolling a contact does NOT touch it — only draft/active/archived does —\nso it tracks activation rather than activity.","format":"int64","type":"integer"}},"type":"object"},"marketing.SequenceStatus":{"properties":{"id":{"description":"ID is the sequence id from the path.","type":"string"},"status":{"description":"Status is draft, active or archived. Required; there is no default here,\nunlike on create. Only an active sequence accepts enrollments.","type":"string"}},"type":"object"},"marketing.StepInput":{"properties":{"body":{"description":"Body is the message text. Required.","type":"string"},"delaySeconds":{"description":"DelaySeconds is how long after the previous step this one sends (after\nenrollment, for the first step). Must be >= 0.","format":"int64","type":"integer"},"id":{"description":"SequenceID is the sequence id from the path (the route's :id).","type":"string"},"subject":{"description":"Subject is the email subject line, capped at 1024 bytes.","type":"string"}},"type":"object"},"marketing.Suppression":{"properties":{"address":{"description":"Address is the recipient, normalized (lower-cased, trimmed) so an opt-out\ncannot be slipped past on a case or whitespace difference. Required. An\nentry \"@example.com\" opts out everyone at that domain, a company's\nunsubscribe; a free mail provider's domain is refused.","type":"string"},"channel":{"description":"Channel is the surface opted out of: email, sms, social, meta, google or\ntiktok. Empty means email. Opting out of one leaves the others reachable.","type":"string"},"createdAt":{"description":"CreatedAt is unix seconds, server-assigned.","format":"int64","type":"integer"},"reason":{"description":"Reason is a free-text note, capped at 1024 bytes. The public one-click\nendpoint records \"one-click unsubscribe\".","type":"string"}},"type":"object"},"marketing.Tags":{"properties":{"utm_campaign":{"description":"Name is utm_campaign: the campaign's own name.","type":"string"},"utm_content":{"description":"Content is utm_content: which link of several in one placement.","type":"string"},"utm_medium":{"description":"Medium is utm_medium: the kind of placement, such as cpc or email.","type":"string"},"utm_source":{"description":"Source is utm_source: where the link was placed, such as google.","type":"string"},"utm_term":{"description":"Term is utm_term: the paid search term.","type":"string"}},"type":"object"},"marketing.Visit":{"properties":{"cid":{"description":"Cid is the Google Analytics client id, the last two fields of _ga.","type":"string"},"clicked":{"description":"Clicked is when the page captured the click, in unix seconds.","format":"int64","type":"integer"},"consent":{"description":"Consent is the Cookie Preferences the visitor granted, comma separated:\nany of analytics, marketing and ads. Empty is a visitor who refused them\nall, which is a choice; absent is one who stated none. It counts only from a\nbrowser, and a browser that sends GPC or DNT has allowed nothing.","type":"string"},"fbc":{"description":"Fbc is Meta's click cookie, fb.1.<ms>.<fbclid>.","type":"string"},"fbclid":{"description":"Fbclid is the Meta click id the visitor arrived with.","type":"string"},"fbp":{"description":"Fbp is Meta's browser cookie, fb.1.<ms>.<random>.","type":"string"},"gbraid":{"description":"Gbraid is the Google Ads click id for an iOS app click.","type":"string"},"gclid":{"description":"Gclid is the Google Ads click id the visitor arrived with.","type":"string"},"tags":{"description":"Tags is which of the page's ad tags already saw this lead: ga, meta.","type":"string"},"url":{"description":"URL is the page the form was filed from, in full.","type":"string"},"userAgent":{"description":"UserAgent is the visitor's browser, as navigator.userAgent reads.","type":"string"},"wbraid":{"description":"Wbraid is the Google Ads click id for an iOS web click.","type":"string"}},"type":"object"},"marketplace.declineIn":{"properties":{"id":{"description":"ID is the job, from the path.","type":"string"},"reason":{"description":"Reason is the seller's words to the buyer, at most 4096 characters.","type":"string"}},"type":"object"},"marketplace.deliverIn":{"properties":{"hash":{"description":"Hash is the seller's own commitment to what was delivered, 32 bytes as 0x\nhex; the SHA-256 of the note and URL when empty.","type":"string"},"id":{"description":"ID is the job, from the path.","type":"string"},"note":{"description":"Note says what was delivered. Required, at most 4096 characters.","type":"string"},"url":{"description":"URL is where it is, https.","type":"string"}},"type":"object"},"marketplace.disputeIn":{"properties":{"id":{"description":"ID is the job, from the path.","type":"string"},"reason":{"description":"Reason is the disputing party's words. Required, at most 4096 characters.","type":"string"}},"type":"object"},"marketplace.feedbackIn":{"properties":{"comment":{"description":"Comment is the party's words, at most 4096 characters.","type":"string"},"id":{"description":"ID is the job, from the path.","type":"string"},"rating":{"description":"Rating is 1 to 5 stars. Required.","format":"int64","type":"integer"}},"type":"object"},"marketplace.hireIn":{"properties":{"amount":{"description":"Amount is what the job pays, U.S. dollars to the cent: \"250.00\".","type":"string"},"attempt":{"description":"Attempt is the buyer's own key for this hire: chosen once, when the hire\nstarts — a random id, 1 to 128 letters, digits, dots, colons, dashes or\nunderscores — and sent with every request it makes, the quote and the\npayment alike, with the rest of the request unchanged. The same attempt\nanswers the same job: the quote's terms to sign until it is paid, the job\nonce it opened, whatever it has come to since. Another request under an\nattempt already used is refused (422): a new hire is a new attempt.","type":"string"},"brief":{"description":"Brief is what the buyer asks for, and what delivered looks like. Required,\nat most 4096 characters.","type":"string"},"category":{"description":"Category is what the payment is for: service (the default), goods,\ntransfer or royalty.","type":"string"},"deadline":{"description":"Deadline is when delivery must land by, unix seconds. Without one, it is\nthe latest the payment leaves room for: its expiry, less the review window,\nfourteen days for a ruling on a dispute, and a day for the clock.","format":"int64","type":"integer"},"listing":{"description":"Listing is the public listing the job is hired through. Empty for a direct\noffer, which names Seller instead.","type":"string"},"payment":{"description":"Payment is the buyer's signed x402 authorization for the job — the value\nPAYMENT-SIGNATURE carries, for a caller that sends no headers of its own,\nover MCP or the command line. The header wins when both are sent.","type":"string"},"performed":{"description":"Performed is where the work is performed, ISO 3166-1 alpha-2. It decides\nwhether a foreign seller's pay is U.S.-source.","type":"string"},"rail":{"description":"Rail is x402 (the default) or chain.","type":"string"},"review":{"description":"Review is how many seconds the buyer has after delivery to release or\ndispute: three days by default, thirty at most.","format":"int64","type":"integer"},"seller":{"description":"Seller is the org offered the job directly; only without a listing.","type":"string"},"title":{"description":"Title names a direct offer; a listing's job takes the listing's title.","type":"string"},"wallet":{"description":"Wallet is the buyer's wallet the payment is signed from. When named, the\nauthorization must be signed by its address.","type":"string"}},"type":"object"},"marketplace.installReq":{"properties":{"tool":{"description":"Tool is the registry name of the capability to activate (or deactivate) for\nthe caller's own org and project. Required.","type":"string"}},"type":"object"},"marketplace.patchReq":{"properties":{"category":{"description":"Category groups the listing in the shop window.","type":"string"},"currency":{"description":"Currency denominates Price.","type":"string"},"description":{"description":"Description is the long copy, at most 4096 characters.","type":"string"},"docs":{"description":"Docs is where the listing's documentation lives; empty clears it.","type":"string"},"id":{"description":"ID is the listing to edit, from the path.","type":"string"},"price":{"description":"Price is the decimal USD price, exact to 18 places; \"0\" makes it free.","type":"string"},"public":{"description":"Public makes the listing discoverable by other orgs, or withdraws it.","type":"boolean"},"recipient":{"description":"Recipient is the payout wallet id, in the publishing org.","type":"string"},"title":{"description":"Title is the shop-window name, 1-200 characters.","type":"string"}},"type":"object"},"marketplace.payoutIn":{"properties":{"wallet":{"description":"Wallet is one of the caller org's wallets. Required.","type":"string"}},"type":"object"},"marketplace.publishReq":{"properties":{"category":{"description":"Category groups the listing in the shop window.","type":"string"},"currency":{"description":"Currency denominates Price.","type":"string"},"description":{"description":"Description is the long copy, at most 4096 characters.","type":"string"},"docs":{"description":"Docs is where the listing's documentation lives: an https URL or a path on\ndocs.hanzo.ai.","type":"string"},"kind":{"description":"Kind is what is sold: agent, persona, app, skill, mcp or tool (the default).\nA tool is a platform tool, sold per call by the platform alone.","type":"string"},"price":{"description":"Price is the price as a decimal USD string, exact to 18 places — per call\nfor a tool, what a job is offered at otherwise. \"0.0025\" is a quarter of a\ncent and stays one. Empty or \"0\" publishes it free; a positive price\nrequires Recipient.","type":"string"},"public":{"description":"Public makes the listing discoverable by other orgs. Private otherwise.","type":"boolean"},"recipient":{"description":"Recipient is the seller's payout wallet id, in the publishing org — the\nwallet x402 pays. Required for a monetized listing.","type":"string"},"title":{"description":"Title is the shop-window name, 1-200 characters. Required.","type":"string"},"tool":{"description":"Tool names the thing sold, in the seller's own org: an agent's name or id,\nan app's project slug or id, a skill's name or id, an MCP server's name or\nid registered by hand, or a platform tool's registry name. It must be the\nseller's — there are no phantom listings.","type":"string"}},"type":"object"},"marketplace.verifyIn":{"properties":{"signature":{"description":"Signature is the wallet's 65-byte signature over the challenge's message\n(EIP-191), 0x hex. Required.","type":"string"}},"type":"object"},"meet.recordIn":{"properties":{"room":{"description":"Room is the LiveKit room, named the way the office client names one\n(`<space>_<name>_<id>`). Its leading segment is what binds the room to a\ntenant, and it is the segment the caller's membership is checked against.","type":"string"}},"required":["room"],"type":"object"},"ml.mlCreate":{"properties":{"labels":{"additionalProperties":{"type":"string"},"description":"Labels are extra labels to set on the object, merged UNDER the tenancy\nlabels this plane derives from the validated principal — so a label naming\nanother org's scope cannot displace the real one.","type":"object"},"name":{"description":"Name is the resource's name: a DNS-1123 label\n(^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$), lowercased and trimmed. It is the\nname the resource answers to for the life of the caller's org.","type":"string"},"spec":{"description":"Spec is the resource's own spec, passed to Kubernetes unchanged. Required —\nan empty spec is 400 rather than an empty resource."}},"type":"object"},"mq.Config":{"properties":{"max_age":{"description":"MaxAge caps message age, e.g. \"24h\" or \"7d\"; \"0\" (default) is unlimited.","type":"string"},"max_bytes":{"description":"MaxBytes caps the stream's total stored bytes; -1 (default) is unlimited.","format":"int64","type":"integer"},"max_msg_size":{"description":"MaxMsgSize caps one message's size in bytes; -1 (default) is the broker's limit.","format":"int32","type":"integer"},"max_msgs":{"description":"MaxMsgs caps the number of stored messages; -1 (default) is unlimited.","format":"int64","type":"integer"},"name":{"description":"Name is the stream name, unique within the org (alphanumeric, hyphens, underscores).","type":"string"},"num_replicas":{"description":"Replicas is the number of stream replicas (1–5); this plane runs 1.","format":"int64","type":"integer"},"retention":{"description":"Retention is the retention policy: limits (default), interest, or workqueue.","type":"string"},"storage":{"description":"Storage is the storage backend: file (default) or memory.","type":"string"},"subjects":{"description":"Subjects are the org-relative subjects bound to this stream (wildcards supported). Default: the stream name.","items":{"type":"string"},"type":"array"}},"type":"object"},"mq.Purge":{"properties":{"filter":{"description":"Filter purges only messages on this org-relative subject (wildcards supported).","type":"string"},"keep":{"description":"Keep retains that many newest messages.","format":"uint64","type":"integer"},"name":{"description":"Name is the stream name, from the path.","type":"string"}},"type":"object"},"mq.makeIn":{"properties":{"ack_policy":{"description":"Ack is the acknowledgment policy: explicit (default), all, or none.","type":"string"},"ack_wait":{"description":"AckWait is how long the broker waits for an ack before redelivering, e.g. \"30s\" (default).","type":"string"},"deliver_policy":{"description":"Deliver is where delivery starts: all (default), last, new, by_start_sequence, by_start_time, or last_per_subject.","type":"string"},"description":{"description":"Description says what this consumer is for.","type":"string"},"durable_name":{"description":"Name is the durable consumer name (alphanumeric, hyphens, underscores).","type":"string"},"filter_subject":{"description":"Filter delivers only messages on this org-relative subject (wildcards supported).","type":"string"},"max_ack_pending":{"description":"MaxAckPending caps unacknowledged messages in flight (default 1000).","format":"int64","type":"integer"},"max_deliver":{"description":"MaxDeliver caps delivery attempts per message; -1 (default) is unlimited.","format":"int64","type":"integer"},"opt_start_seq":{"description":"StartSeq is the starting sequence for deliver_policy by_start_sequence.","format":"uint64","type":"integer"},"opt_start_time":{"description":"StartTime is the starting instant for deliver_policy by_start_time.","format":"date-time","type":"string"},"replay_policy":{"description":"Replay is the replay pacing: instant (default) or original.","type":"string"},"stream":{"description":"Stream is the stream name, from the path.","type":"string"}},"type":"object"},"mq.nextIn":{"properties":{"batch":{"description":"Batch is how many messages to pull (1–1000, default 1).","format":"int64","type":"integer"},"expires":{"description":"Expires is how long to wait for messages, e.g. \"5s\" (default \"30s\", max \"60s\").","type":"string"},"name":{"description":"Name is the consumer name, from the path.","type":"string"},"no_wait":{"description":"NoWait answers immediately with whatever is available instead of waiting.","type":"boolean"},"stream":{"description":"Stream is the stream name, from the path.","type":"string"}},"type":"object"},"network.identityIn":{"properties":{"name":{"description":"Name is the identity's name within the org — a DNS label, stored on the\nfabric as \"<name>.<org>\". Absent, the identity is named by the caller's\nIAM subject. It is set when the identity is first made; an identity that\nalready exists keeps its name.","type":"string"},"roles":{"description":"Roles are extra role attributes for the identity, each scoped to the\ncaller's org on the way in (\"k3s-host\" is written as \"k3s-host.<org>\") so\nno caller can claim an attribute another tenant's policy selects. A role\nof the form \"<service>-host\" makes this identity a HOST of that published\nservice — the bind policy from POST /v1/network/services selects exactly\nthat attribute — and is refused when the org has no such service. Only a\nsteward (an admin of the org or its own machine client) takes roles; a\nplain member asking for one is 403.","items":{"type":"string"},"type":"array"}},"type":"object"},"network.serviceIn":{"properties":{"host":{"description":"Host is where the HOSTING identity forwards a connection — an address the\nhost device itself can reach, \"127.0.0.1\" for a server on the device.","type":"string"},"name":{"description":"Name is the service's name within the org — a DNS label. The fabric knows\nthe service as \"<name>.<org>\" and answers for it at \"<name>.<org>.zt\".","type":"string"},"port":{"description":"Port is the port beside Host, and the one the DNS name intercepts.","format":"int64","type":"integer"}},"type":"object"},"notify.notifyCredential":{"properties":{"key":{"description":"Key is one of the credentials that provider reads, such as auth-token or\nsmtp-host. A key the provider does not read is refused.","type":"string"},"provider":{"description":"Provider is the delivery provider the credential is for: twilio, plivo,\ntwilio_email or mail.","type":"string"},"value":{"description":"Value is sealed in KMS and never answered, logged or echoed. It is never\nread from a query string, because a URL is logged in more places than a\nbody is.","type":"string"}},"type":"object"},"notify.notifySend":{"properties":{"body":{"description":"Body is the message text, sent verbatim when present — the no-template path.","type":"string"},"channel":{"description":"Channel selects the delivery channel, sms or email. The per-channel routes\n(/send/sms, /send/email) pin it, overriding whatever the body names; on the\ngeneric route it is required.","type":"string"},"event":{"description":"Event is the event name, which doubles as the template id when TemplateID is\nempty — the IAM OTP path sends event=iam.otp_sent and nothing else.","type":"string"},"provider":{"description":"Provider pins a provider service name (twilio, plivo, twilio_email, mail).\nEmpty picks the one whose org credentials are actually configured in KMS.","type":"string"},"subject":{"description":"Subject is the message subject, carried on the email channel only.","type":"string"},"sync":{"description":"Sync must be exactly \"true\": delivery here is synchronous, and anything else\nanswers 503 because the queue plane that would run an async dispatch is owned\nelsewhere. Over REST it rides as ?sync=true (the URL binds over the body); a\nby-name call states it in its arguments.","type":"string"},"template_id":{"description":"TemplateID selects a built-in template when Body is empty.","type":"string"},"template_vars":{"description":"TemplateVars carries the values the selected template renders against, as\na raw JSON object. Raw on purpose: the by-name call plane computes an\ninput's layout before reading any payload and refuses a map field\noutright, which would make every typed call to these ops fail — and that\ncall is the reason they are typed at all (IAM's OTP sender). deliver\ndecodes it right before the template renders, so REST bodies decode\nbyte-identically to the map this replaced."},"to":{"description":"To is the destination address per recipient — a phone number for sms, an\nemail address for email. Several recipients fan out into one provider call\neach, and the response shape follows the count (see the items field).","items":{"type":"string"},"type":"array"}},"type":"object"},"o11y.AWSAccountConfig":{"properties":{"regions":{"items":{"type":"string"},"type":"array"}},"type":"object"},"o11y.AWSPostableAccountConfig":{"properties":{"deploymentRegion":{"type":"string"},"regions":{"items":{"type":"string"},"type":"array"}},"type":"object"},"o11y.AWSServiceConfig":{"properties":{"logs":{"$ref":"#/components/schemas/o11y.AWSServiceLogsConfig"},"metrics":{"$ref":"#/components/schemas/o11y.AWSServiceMetricsConfig"}},"type":"object"},"o11y.AWSServiceLogsConfig":{"properties":{"enabled":{"type":"boolean"},"s3Buckets":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object"}},"type":"object"},"o11y.AWSServiceMetricsConfig":{"properties":{"enabled":{"type":"boolean"}},"type":"object"},"o11y.AttributeKey":{"properties":{"dataType":{"type":"string"},"isColumn":{"type":"boolean"},"isJSON":{"type":"boolean"},"key":{"type":"string"},"type":{"type":"string"}},"type":"object"},"o11y.Authorization":{"properties":{"credentials":{},"credentials_file":{"type":"string"},"credentials_ref":{"description":"CredentialsRef is the name of the secret within the secret manager to use as credentials.","type":"string"},"type":{"type":"string"}},"type":"object"},"o11y.AzureAccountConfig":{"properties":{"deploymentRegion":{"type":"string"},"resourceGroups":{"items":{"type":"string"},"type":"array"}},"type":"object"},"o11y.AzureServiceConfig":{"properties":{"logs":{"$ref":"#/components/schemas/o11y.AzureServiceLogsConfig"},"metrics":{"$ref":"#/components/schemas/o11y.AzureServiceMetricsConfig"}},"type":"object"},"o11y.AzureServiceLogsConfig":{"properties":{"enabled":{"type":"boolean"}},"type":"object"},"o11y.AzureServiceMetricsConfig":{"properties":{"enabled":{"type":"boolean"}},"type":"object"},"o11y.BasicAuth":{"properties":{"password":{},"password_file":{"type":"string"},"password_ref":{"description":"PasswordRef is the name of the secret within the secret manager to use as the password.","type":"string"},"username":{"type":"string"},"username_file":{"type":"string"},"username_ref":{"description":"UsernameRef is the name of the secret within the secret manager to use as the username.","type":"string"}},"type":"object"},"o11y.BuilderQuery":{"properties":{"IsAnomaly":{"type":"boolean"},"QueriesUsedInFormula":{"items":{"type":"string"},"type":"array"},"ShiftBy":{"format":"int64","type":"integer"},"aggregateAttribute":{"$ref":"#/components/schemas/o11y.AttributeKey"},"aggregateOperator":{"type":"string"},"dataSource":{"type":"string"},"disabled":{"type":"boolean"},"expression":{"type":"string"},"filters":{"$ref":"#/components/schemas/o11y.FilterSet"},"functions":{"items":{"$ref":"#/components/schemas/o11y.Function"},"type":"array"},"groupBy":{"items":{"$ref":"#/components/schemas/o11y.AttributeKey"},"type":"array"},"having":{"items":{"$ref":"#/components/schemas/o11y.Having"},"type":"array"},"legend":{"type":"string"},"limit":{"format":"uint64","type":"integer"},"offset":{"format":"uint64","type":"integer"},"orderBy":{"items":{"$ref":"#/components/schemas/o11y.OrderBy"},"type":"array"},"pageSize":{"format":"uint64","type":"integer"},"queryName":{"type":"string"},"reduceTo":{"type":"string"},"selectColumns":{"items":{"$ref":"#/components/schemas/o11y.AttributeKey"},"type":"array"},"seriesAggregation":{"type":"string"},"spaceAggregation":{"type":"string"},"stepInterval":{"format":"int64","type":"integer"},"temporality":{"type":"string"},"timeAggregation":{"type":"string"}},"type":"object"},"o11y.ClusterListRequest":{"properties":{"end":{"description":"epoch time in ms","format":"int64","type":"integer"},"filters":{"$ref":"#/components/schemas/o11y.FilterSet"},"groupBy":{"items":{"$ref":"#/components/schemas/o11y.AttributeKey"},"type":"array"},"limit":{"format":"int64","type":"integer"},"offset":{"format":"int64","type":"integer"},"orderBy":{"$ref":"#/components/schemas/o11y.OrderBy"},"start":{"description":"epoch time in ms","format":"int64","type":"integer"}},"type":"object"},"o11y.CompositeQuery":{"properties":{"queries":{"description":"Queries is the queries to use for the request.","items":{"$ref":"#/components/schemas/o11y.QueryEnvelope"},"type":"array"}},"type":"object"},"o11y.Credentials":{"properties":{"ingestionKey":{"type":"string"},"ingestionUrl":{"type":"string"},"o11yApiKey":{"description":"PAT","type":"string"},"o11yApiUrl":{"type":"string"}},"type":"object"},"o11y.DaemonSetListRequest":{"properties":{"end":{"description":"epoch time in ms","format":"int64","type":"integer"},"filters":{"$ref":"#/components/schemas/o11y.FilterSet"},"groupBy":{"items":{"$ref":"#/components/schemas/o11y.AttributeKey"},"type":"array"},"limit":{"format":"int64","type":"integer"},"offset":{"format":"int64","type":"integer"},"orderBy":{"$ref":"#/components/schemas/o11y.OrderBy"},"start":{"description":"epoch time in ms","format":"int64","type":"integer"}},"type":"object"},"o11y.DatastoreQuery":{"properties":{"disabled":{"type":"boolean"},"legend":{"type":"string"},"query":{"type":"string"}},"type":"object"},"o11y.DeploymentListRequest":{"properties":{"end":{"description":"epoch time in ms","format":"int64","type":"integer"},"filters":{"$ref":"#/components/schemas/o11y.FilterSet"},"groupBy":{"items":{"$ref":"#/components/schemas/o11y.AttributeKey"},"type":"array"},"limit":{"format":"int64","type":"integer"},"offset":{"format":"int64","type":"integer"},"orderBy":{"$ref":"#/components/schemas/o11y.OrderBy"},"start":{"description":"epoch time in ms","format":"int64","type":"integer"}},"type":"object"},"o11y.DiscordConfig":{"properties":{"NotifierConfig":{"$ref":"#/components/schemas/o11y.NotifierConfig"},"avatar_url":{"type":"string"},"content":{"type":"string"},"http_config":{"$ref":"#/components/schemas/o11y.HTTPClientConfig"},"message":{"type":"string"},"title":{"type":"string"},"username":{"type":"string"},"webhook_url":{},"webhook_url_file":{"type":"string"}},"type":"object"},"o11y.EmailConfig":{"properties":{"NotifierConfig":{"$ref":"#/components/schemas/o11y.NotifierConfig"},"auth_identity":{"type":"string"},"auth_password":{},"auth_password_file":{"type":"string"},"auth_secret":{},"auth_secret_file":{"type":"string"},"auth_username":{"type":"string"},"force_implicit_tls":{"description":"ForceImplicitTLS controls whether to use implicit TLS (direct TLS connection).\ntrue: force use of implicit TLS (direct TLS connection)\nfalse: force disable implicit TLS (use explicit TLS/STARTTLS if required)\nnil (default): auto-detect based on port (465=implicit, other=explicit) for backward compatibility","type":"boolean"},"from":{"type":"string"},"headers":{"additionalProperties":{"type":"string"},"type":"object"},"hello":{"type":"string"},"html":{"type":"string"},"require_tls":{"type":"boolean"},"smarthost":{},"text":{"type":"string"},"threading":{"$ref":"#/components/schemas/o11y.ThreadingConfig"},"tls_config":{"$ref":"#/components/schemas/o11y.TLSConfig"},"to":{"description":"Email address to notify.","type":"string"}},"type":"object"},"o11y.Filter":{"properties":{"expression":{"description":"expression to filter by following the filter syntax","type":"string"}},"type":"object"},"o11y.FilterAttributeValueRequest":{"properties":{"aggregateAttribute":{"type":"string"},"aggregateOperator":{"type":"string"},"dataSource":{"type":"string"},"endTimeMillis":{"format":"int64","type":"integer"},"existingFilterItems":{"items":{"$ref":"#/components/schemas/o11y.FilterItem"},"type":"array"},"filterAttributeKey":{"type":"string"},"filterAttributeKeyDataType":{"type":"string"},"includeRelated":{"type":"boolean"},"limit":{"format":"int64","type":"integer"},"metricNames":{"items":{"type":"string"},"type":"array"},"searchText":{"type":"string"},"startTimeMillis":{"format":"int64","type":"integer"},"tagType":{"type":"string"}},"type":"object"},"o11y.FilterItem":{"properties":{"key":{"$ref":"#/components/schemas/o11y.AttributeKey"},"op":{"type":"string"},"value":{}},"type":"object"},"o11y.FilterSet":{"properties":{"items":{"items":{"$ref":"#/components/schemas/o11y.FilterItem"},"type":"array"},"op":{"type":"string"}},"type":"object"},"o11y.FormatOptions":{"properties":{"fillGaps":{"type":"boolean"},"formatTableResultForUI":{"type":"boolean"}},"type":"object"},"o11y.Function":{"properties":{"args":{"items":{},"type":"array"},"name":{"type":"string"},"namedArgs":{"additionalProperties":{},"type":"object"}},"type":"object"},"o11y.FunnelStep":{"properties":{"description":{"description":"step description","type":"string"},"filters":{"$ref":"#/components/schemas/o11y.FilterSet"},"has_errors":{"type":"boolean"},"id":{},"latency_pointer":{"type":"string"},"latency_type":{"type":"string"},"name":{"description":"step name","type":"string"},"service_name":{"type":"string"},"span_name":{"type":"string"},"step_order":{"format":"int64","type":"integer"}},"type":"object"},"o11y.GCPAccountConfig":{"properties":{"deploymentProjectId":{"description":"Project ID where central pub/sub for logs exist","type":"string"},"deploymentRegion":{"description":"Project ID where otel collector will be deployed","type":"string"},"projectIds":{"description":"List of project IDs to monitor","items":{"type":"string"},"type":"array"}},"type":"object"},"o11y.GCPServiceConfig":{"properties":{"logs":{"$ref":"#/components/schemas/o11y.GCPServiceLogsConfig"},"metrics":{"$ref":"#/components/schemas/o11y.GCPServiceMetricsConfig"}},"type":"object"},"o11y.GCPServiceLogsConfig":{"properties":{"enabled":{"type":"boolean"}},"type":"object"},"o11y.GCPServiceMetricsConfig":{"properties":{"enabled":{"type":"boolean"}},"type":"object"},"o11y.GoogleChatReceiverConfig":{"properties":{"NotifierConfig":{"$ref":"#/components/schemas/o11y.NotifierConfig"},"http_config":{"$ref":"#/components/schemas/o11y.HTTPClientConfig"},"text":{"type":"string"},"title":{"type":"string"},"webhook_url":{}},"type":"object"},"o11y.GroupByKey":{"properties":{"description":{"type":"string"},"fieldContext":{},"fieldDataType":{},"name":{"type":"string"},"signal":{},"unit":{"type":"string"}},"required":["name"],"type":"object"},"o11y.HTTPClientConfig":{"properties":{"authorization":{"$ref":"#/components/schemas/o11y.Authorization","description":"The HTTP authorization credentials for the targets."},"basic_auth":{"$ref":"#/components/schemas/o11y.BasicAuth","description":"The HTTP basic authentication credentials for the targets."},"bearer_token":{"description":"The bearer token for the targets. Deprecated in favour of\nAuthorization.Credentials."},"bearer_token_file":{"description":"The bearer token file for the targets. Deprecated in favour of\nAuthorization.CredentialsFile.","type":"string"},"enable_http2":{"description":"EnableHTTP2 specifies whether the client should configure HTTP2.\nThe omitempty flag is not set, because it would be hidden from the\nmarshalled configuration when set to false.","type":"boolean"},"follow_redirects":{"description":"FollowRedirects specifies whether the client should follow HTTP 3xx redirects.\nThe omitempty flag is not set, because it would be hidden from the\nmarshalled configuration when set to false.","type":"boolean"},"http_headers":{"description":"HTTPHeaders specify headers to inject in the requests. Those headers\ncould be marshalled back to the users."},"no_proxy":{"description":"NoProxy contains addresses that should not use a proxy.","type":"string"},"oauth2":{"$ref":"#/components/schemas/o11y.OAuth2","description":"The OAuth2 client credentials used to fetch a token for the targets."},"proxy_connect_header":{"additionalProperties":{"items":{},"type":"array"},"description":"ProxyConnectHeader optionally specifies headers to send to\nproxies during CONNECT requests. Assume that at least _some_ of\nthese headers are going to contain secrets and use Secret as the\nvalue type instead of string.","type":"object"},"proxy_from_environment":{"description":"ProxyFromEnvironment makes use of net/http ProxyFromEnvironment function\nto determine proxies.","type":"boolean"},"proxy_url":{"description":"HTTP proxy server to use to connect to the targets."},"tls_config":{"$ref":"#/components/schemas/o11y.TLSConfig","description":"TLSConfig to use to connect to the targets."}},"type":"object"},"o11y.Having":{"properties":{"columnName":{"type":"string"},"op":{"type":"string"},"value":{}},"type":"object"},"o11y.HostFilter":{"properties":{"Filter":{"$ref":"#/components/schemas/o11y.Filter"},"filterByStatus":{}},"type":"object"},"o11y.HostListRequest":{"properties":{"end":{"description":"epoch time in ms","format":"int64","type":"integer"},"filters":{"$ref":"#/components/schemas/o11y.FilterSet"},"groupBy":{"items":{"$ref":"#/components/schemas/o11y.AttributeKey"},"type":"array"},"limit":{"format":"int64","type":"integer"},"offset":{"format":"int64","type":"integer"},"orderBy":{"$ref":"#/components/schemas/o11y.OrderBy"},"start":{"description":"epoch time in ms","format":"int64","type":"integer"}},"type":"object"},"o11y.IncidentioConfig":{"properties":{"NotifierConfig":{"$ref":"#/components/schemas/o11y.NotifierConfig"},"alert_source_token":{"description":"AlertSourceToken is the key used to authenticate with the alert source in incident.io."},"alert_source_token_file":{"type":"string"},"http_config":{"$ref":"#/components/schemas/o11y.HTTPClientConfig"},"max_alerts":{"description":"MaxAlerts is the maximum number of alerts to be sent per incident.io message.\nAlerts exceeding this threshold will be truncated. Setting this to 0\nallows an unlimited number of alerts. Note that if the payload exceeds\nincident.io's size limits, you will receive a 429 response and alerts\nwill not be ingested.","format":"uint64","type":"integer"},"timeout":{"description":"Timeout is the maximum time allowed to invoke incident.io. Setting this to 0\ndoes not impose a timeout.","format":"int64","type":"integer"},"url":{"description":"URL to send POST request to."},"url_file":{"type":"string"}},"type":"object"},"o11y.InstallIntegrationRequest":{"properties":{"config":{"additionalProperties":{},"type":"object"},"integration_id":{"type":"string"}},"type":"object"},"o11y.JiraConfig":{"properties":{"NotifierConfig":{"$ref":"#/components/schemas/o11y.NotifierConfig"},"api_type":{"type":"string"},"api_url":{},"custom_fields":{"additionalProperties":{},"type":"object"},"description":{"$ref":"#/components/schemas/o11y.JiraFieldConfig"},"http_config":{"$ref":"#/components/schemas/o11y.HTTPClientConfig"},"issue_type":{"type":"string"},"labels":{"items":{"type":"string"},"type":"array"},"priority":{"type":"string"},"project":{"type":"string"},"reopen_duration":{},"reopen_transition":{"type":"string"},"resolve_transition":{"type":"string"},"summary":{"$ref":"#/components/schemas/o11y.JiraFieldConfig"},"wont_fix_resolution":{"type":"string"}},"type":"object"},"o11y.JiraFieldConfig":{"properties":{"enable_update":{"description":"EnableUpdate indicates whether this field should be omitted when updating an existing issue.","type":"boolean"},"template":{"description":"Template is the template string used to render the field.","type":"string"}},"type":"object"},"o11y.JobListRequest":{"properties":{"end":{"description":"epoch time in ms","format":"int64","type":"integer"},"filters":{"$ref":"#/components/schemas/o11y.FilterSet"},"groupBy":{"items":{"$ref":"#/components/schemas/o11y.AttributeKey"},"type":"array"},"limit":{"format":"int64","type":"integer"},"offset":{"format":"int64","type":"integer"},"orderBy":{"$ref":"#/components/schemas/o11y.OrderBy"},"start":{"description":"epoch time in ms","format":"int64","type":"integer"}},"type":"object"},"o11y.LimitConfig":{"properties":{"day":{"$ref":"#/components/schemas/o11y.LimitValue"},"second":{"$ref":"#/components/schemas/o11y.LimitValue"}},"type":"object"},"o11y.LimitValue":{"properties":{"count":{"format":"int64","type":"integer"},"size":{"format":"int64","type":"integer"}},"type":"object"},"o11y.MSTeamsConfig":{"properties":{"NotifierConfig":{"$ref":"#/components/schemas/o11y.NotifierConfig"},"http_config":{"$ref":"#/components/schemas/o11y.HTTPClientConfig"},"summary":{"type":"string"},"text":{"type":"string"},"title":{"type":"string"},"webhook_url":{},"webhook_url_file":{"type":"string"}},"type":"object"},"o11y.MSTeamsV2Config":{"properties":{"NotifierConfig":{"$ref":"#/components/schemas/o11y.NotifierConfig"},"http_config":{"$ref":"#/components/schemas/o11y.HTTPClientConfig"},"text":{"type":"string"},"title":{"type":"string"},"webhook_url":{},"webhook_url_file":{"type":"string"}},"type":"object"},"o11y.MattermostAttachment":{"properties":{"author_icon":{"type":"string"},"author_link":{"type":"string"},"author_name":{"type":"string"},"color":{"type":"string"},"fallback":{"type":"string"},"fields":{"items":{"$ref":"#/components/schemas/o11y.MattermostField"},"type":"array"},"footer":{"type":"string"},"footer_icon":{"type":"string"},"image_url":{"type":"string"},"pretext":{"type":"string"},"text":{"type":"string"},"thumb_url":{"type":"string"},"title":{"type":"string"},"title_link":{"type":"string"}},"type":"object"},"o11y.MattermostConfig":{"properties":{"NotifierConfig":{"$ref":"#/components/schemas/o11y.NotifierConfig"},"attachments":{"items":{"$ref":"#/components/schemas/o11y.MattermostAttachment"},"type":"array"},"channel":{"type":"string"},"http_config":{"$ref":"#/components/schemas/o11y.HTTPClientConfig"},"icon_emoji":{"type":"string"},"icon_url":{"type":"string"},"priority":{"$ref":"#/components/schemas/o11y.MattermostPriority"},"props":{"$ref":"#/components/schemas/o11y.MattermostProps"},"text":{"type":"string"},"type":{"type":"string"},"username":{"type":"string"},"webhook_url":{},"webhook_url_file":{"type":"string"}},"type":"object"},"o11y.MattermostField":{"properties":{"short":{"type":"boolean"},"title":{"type":"string"},"value":{"type":"string"}},"type":"object"},"o11y.MattermostPriority":{"properties":{"persistent_notifications":{"type":"boolean"},"priority":{"type":"string"},"requested_ack":{"type":"boolean"}},"type":"object"},"o11y.MattermostProps":{"properties":{"card":{"type":"string"}},"type":"object"},"o11y.NamespaceListRequest":{"properties":{"end":{"description":"epoch time in ms","format":"int64","type":"integer"},"filters":{"$ref":"#/components/schemas/o11y.FilterSet"},"groupBy":{"items":{"$ref":"#/components/schemas/o11y.AttributeKey"},"type":"array"},"limit":{"format":"int64","type":"integer"},"offset":{"format":"int64","type":"integer"},"orderBy":{"$ref":"#/components/schemas/o11y.OrderBy"},"start":{"description":"epoch time in ms","format":"int64","type":"integer"}},"type":"object"},"o11y.NodeListRequest":{"properties":{"end":{"description":"epoch time in ms","format":"int64","type":"integer"},"filters":{"$ref":"#/components/schemas/o11y.FilterSet"},"groupBy":{"items":{"$ref":"#/components/schemas/o11y.AttributeKey"},"type":"array"},"limit":{"format":"int64","type":"integer"},"offset":{"format":"int64","type":"integer"},"orderBy":{"$ref":"#/components/schemas/o11y.OrderBy"},"start":{"description":"epoch time in ms","format":"int64","type":"integer"}},"type":"object"},"o11y.NotifierConfig":{"properties":{"send_resolved":{"type":"boolean"}},"type":"object"},"o11y.O11yAPIKeyCreateIn":{"properties":{"expiresAt":{"description":"ExpiresAt is when the key stops working, as a unix timestamp in seconds.\nZero means it never expires; a past timestamp is refused.","format":"uint64","type":"integer"},"name":{"description":"Name is the key's name: a lowercase letter followed by lowercase letters,\ndigits or hyphens, at most 80 characters. Required.","type":"string"}},"type":"object"},"o11y.O11yAPIKeyUpdateIn":{"properties":{"expiresAt":{"description":"ExpiresAt is when the key stops working, as a unix timestamp in seconds.\nZero means it never expires; a past timestamp is refused.","format":"uint64","type":"integer"},"name":{"description":"Name is the key's new name, under the same rules it was created with.\nRequired.","type":"string"}},"type":"object"},"o11y.O11yAgentCheckInIn":{"properties":{"account_id":{"description":"following are backward compatible fields for older running agents, hence snake case JSON keys.\nWhich get mapped to new fields in AgentCheckInRequest","type":"string"},"cloudIntegrationId":{},"cloud_account_id":{"description":"=> ProviderAccountID","type":"string"},"data":{"additionalProperties":{},"type":"object"},"providerAccountId":{"type":"string"}},"type":"object"},"o11y.O11yAnalyzeIn":{"properties":{"query":{"description":"Query is the query text. Required.","type":"string"},"queryType":{"description":"QueryType says which language the query is in — promql or the datastore's\nSQL dialect. Required.","type":"string"}},"required":["query","queryType"],"type":"object"},"o11y.O11yApdexSetIn":{"properties":{"excludeStatusCodes":{"description":"ExcludeStatusCodes are status codes excluded from the score, comma\nseparated.","type":"string"},"serviceName":{"description":"ServiceName is the service the threshold applies to.","type":"string"},"threshold":{"description":"Threshold is the satisfied-response time in seconds.","format":"double","type":"number"}},"type":"object"},"o11y.O11yChannelUpdateIn":{"properties":{"Receiver":{"$ref":"#/components/schemas/o11y.Receiver"},"googlechat_configs":{"items":{"$ref":"#/components/schemas/o11y.GoogleChatReceiverConfig"},"type":"array"}},"type":"object"},"o11y.O11yCreateAccountIn":{"properties":{"config":{"$ref":"#/components/schemas/o11y.PostableAccountConfig"},"credentials":{"$ref":"#/components/schemas/o11y.Credentials"}},"type":"object"},"o11y.O11yCreateLimitIn":{"properties":{"config":{"$ref":"#/components/schemas/o11y.LimitConfig"},"signal":{"type":"string"},"tags":{"items":{"type":"string"},"type":"array"}},"type":"object"},"o11y.O11yDashboardPatchIn":{"properties":{"id":{"description":"ID is the dashboard id from the path.","type":"string"},"ops":{"description":"Ops are the JSON Patch operations, applied in order. On the wire this IS the\nrequest body — a bare array, not an object.","items":{"$ref":"#/components/schemas/o11y.O11yDashboardPatchOp"},"type":"array"}},"type":"object"},"o11y.O11yDashboardPatchOp":{"properties":{"from":{"description":"From is the source JSON Pointer for move and copy; ignored otherwise.","type":"string"},"op":{"description":"Op is the verb: add, remove, replace, move, copy or test.","type":"string"},"path":{"description":"Path is a JSON Pointer into the postable dashboard, e.g.\n/spec/display/name, /spec/panels/<id>, /tags/-.","type":"string"},"value":{"description":"Value is the value to add/replace/test; its type depends on Path. Required\nfor add, replace and test; ignored otherwise."}},"type":"object"},"o11y.O11yDashboardPostable":{"properties":{"generateName":{"description":"GenerateName derives a fresh unique name from spec.display.name instead of\ntaking Name.","type":"boolean"},"image":{"description":"Image is an optional cover image reference.","type":"string"},"name":{"description":"Name is the dashboard's unique internal name (a DNS-1123 label). Omit it\nwith generateName to derive one from the display name.","type":"string"},"schemaVersion":{"description":"SchemaVersion is the dashboard schema version; must be the current v6.","type":"string"},"spec":{"description":"Spec is the Perses dashboard spec (display, variables, panels, layouts,\ndatasources). Its plugin-defined leaves are open JSON, carried verbatim."},"tags":{"description":"Tags are the dashboard's tags; at most ten, and none may use a reserved DSL\nkey.","items":{"$ref":"#/components/schemas/o11y.O11yDashboardPostableTag"},"type":"array"}},"type":"object"},"o11y.O11yDashboardPostableTag":{"properties":{"key":{"description":"Key is the tag key.","type":"string"},"value":{"description":"Value is the tag value.","type":"string"}},"type":"object"},"o11y.O11yDashboardUpdateIn":{"properties":{"id":{"description":"ID is the dashboard id from the path.","type":"string"},"image":{"description":"Image is an optional cover image reference.","type":"string"},"name":{"description":"Name must equal the dashboard's existing name — it is immutable.","type":"string"},"schemaVersion":{"description":"SchemaVersion is the dashboard schema version; must be the current v6.","type":"string"},"spec":{"description":"Spec is the replacement Perses spec, carried verbatim as open JSON."},"tags":{"description":"Tags replace the dashboard's tags; at most ten.","items":{"$ref":"#/components/schemas/o11y.O11yDashboardPostableTag"},"type":"array"}},"type":"object"},"o11y.O11yDashboardVarsIn":{"properties":{"query":{"description":"Query is the variable query to evaluate. Required.","type":"string"},"variables":{"additionalProperties":{},"description":"Variables are the current values of the other dashboard variables, for\nqueries that reference them.","type":"object"}},"required":["query"],"type":"object"},"o11y.O11yDashboardViewData":{"properties":{"order":{"description":"Order is the captured sort direction.","type":"string"},"query":{"description":"Query is the captured filter DSL.","type":"string"},"sort":{"description":"Sort is the captured sort field.","type":"string"},"version":{"description":"Version is the saved-view schema version; must be v1.","type":"string"}},"type":"object"},"o11y.O11yDashboardViewPostable":{"properties":{"data":{"$ref":"#/components/schemas/o11y.O11yDashboardViewData","description":"Data is the listing state the view captures."},"name":{"description":"Name is the saved view's name; at most 32 characters, no surrounding space.","type":"string"}},"type":"object"},"o11y.O11yDashboardViewUpdateIn":{"properties":{"data":{"$ref":"#/components/schemas/o11y.O11yDashboardViewData","description":"Data is the listing state the view captures."},"id":{"description":"ID is the saved view id from the path.","type":"string"},"name":{"description":"Name is the saved view's name; at most 32 characters, no surrounding space.","type":"string"}},"type":"object"},"o11y.O11yDependencyGraphIn":{"properties":{"end":{"description":"End is the window end, as epoch nanoseconds. Required.","type":"string"},"start":{"description":"Start is the window start, as epoch nanoseconds. Required.","type":"string"},"tags":{"description":"Tags narrow the graph to spans matching every condition.","items":{"$ref":"#/components/schemas/o11y.O11yTagFilter"},"type":"array"}},"required":["start","end"],"type":"object"},"o11y.O11yDiscoverIn":{"properties":{"aggregations":{"description":"Aggregations are the measures to compute per group. Empty means a count.","items":{"type":"string"},"type":"array"},"filters":{"description":"Filters narrow the scan; each is a field, an operator (eq, neq, like) and\na value, and they combine with AND.","items":{"$ref":"#/components/schemas/o11y.O11yFilter"},"type":"array"},"groupBy":{"description":"GroupBy are the columns to group the rows by.","items":{"type":"string"},"type":"array"},"limit":{"description":"Limit caps how many rows come back.","format":"int64","type":"integer"},"orderBy":{"description":"OrderBy is the column or aggregation to sort the rows on.","type":"string"},"orderDir":{"description":"OrderDir is asc or desc.","type":"string"},"period":{"description":"Period is the window to read, relative to now — 1h, 24h, 7d, 14d, 30d.","type":"string"},"project":{"description":"Project is the project to read, as its id. Required.","type":"string"}},"required":["project"],"type":"object"},"o11y.O11yDomainFilter":{"properties":{"expression":{"description":"Expression is the predicate, e.g. `http.status_code >= 500`.","type":"string"}},"type":"object"},"o11y.O11yDomainGroupBy":{"properties":{"description":{"description":"Description describes the field, when known.","type":"string"},"fieldContext":{"description":"FieldContext says which plane the field lives on, e.g. attribute,\nresource, span.","type":"string"},"fieldDataType":{"description":"FieldDataType is the field's type: string, int64, float64 or bool.","type":"string"},"name":{"description":"Name is the field's name. Required.","type":"string"},"signal":{"description":"Signal is the telemetry signal the field belongs to, e.g. traces.","type":"string"},"unit":{"description":"Unit is the field's unit, when known.","type":"string"}},"type":"object"},"o11y.O11yDomainsIn":{"properties":{"domain":{"description":"Domain narrows the read to one external domain (the domain view requires\nit).","type":"string"},"end":{"description":"End is the window's end, epoch milliseconds.","format":"uint64","type":"integer"},"endpoint":{"description":"Endpoint narrows the domain view to one endpoint.","type":"string"},"filter":{"$ref":"#/components/schemas/o11y.O11yDomainFilter","description":"Filter is an additional predicate in the query-builder filter syntax."},"groupBy":{"description":"GroupBy adds grouping columns to the result.","items":{"$ref":"#/components/schemas/o11y.O11yDomainGroupBy"},"type":"array"},"show_ip":{"description":"ShowIP keeps rows whose domain is a bare IP address; they are dropped\notherwise.","type":"boolean"},"start":{"description":"Start is the window's start, epoch milliseconds.","format":"uint64","type":"integer"}},"type":"object"},"o11y.O11yDowntimeUpdateIn":{"properties":{"alertIds":{"items":{"type":"string"},"type":"array"},"description":{"type":"string"},"name":{"type":"string"},"schedule":{},"scope":{"type":"string"}},"type":"object"},"o11y.O11yDraftFunnelIn":{"properties":{"end_time":{"description":"EndTime is the end of the window, as a millisecond epoch.","format":"int64","type":"integer"},"start_time":{"description":"StartTime is the start of the window, as a millisecond epoch.","format":"int64","type":"integer"},"step_end":{"description":"StepEnd is the step the transition runs to, 1-based.","format":"int64","type":"integer"},"step_start":{"description":"StepStart is the step the transition runs from, 1-based. Ignored by the\nreads that span the whole funnel.","format":"int64","type":"integer"},"steps":{"description":"Steps are the funnel's steps, in order. At least two are needed.","items":{"$ref":"#/components/schemas/o11y.FunnelStep"},"type":"array"}},"type":"object"},"o11y.O11yErrorUpdateIssueIn":{"properties":{"assignee":{"description":"Assignee is who the issue is assigned to.","type":"string"},"id":{"description":"ID is the issue id.","type":"string"},"status":{"description":"Status is the new lifecycle state: unresolved, resolved or ignored.","type":"string"}},"required":["id"],"type":"object"},"o11y.O11yErrorsCountIn":{"properties":{"end":{"description":"End is the window end, as a nanosecond epoch spelled as a string.","type":"string"},"exceptionType":{"description":"ExceptionType narrows to one exception type.","type":"string"},"serviceName":{"description":"ServiceName narrows to one reporting service.","type":"string"},"start":{"description":"Start is the window start, as a nanosecond epoch spelled as a string.","type":"string"},"tags":{"description":"Tags narrow the scan to spans carrying the given tag values.","items":{"$ref":"#/components/schemas/o11y.O11yTagQuery"},"type":"array"}},"type":"object"},"o11y.O11yErrorsListIn":{"properties":{"end":{"description":"End is the window end, as a nanosecond epoch spelled as a string.","type":"string"},"exceptionType":{"description":"ExceptionType narrows to one exception type.","type":"string"},"limit":{"description":"Limit caps how many exception groups come back. Required, non-zero.","format":"int64","type":"integer"},"offset":{"description":"Offset is how many groups to skip.","format":"int64","type":"integer"},"order":{"description":"Order is the direction: ascending or descending.","type":"string"},"orderParam":{"description":"OrderParam is the column to order by, e.g. exceptionCount, lastSeen.","type":"string"},"serviceName":{"description":"ServiceName narrows to one reporting service.","type":"string"},"start":{"description":"Start is the window start, as a nanosecond epoch spelled as a string.","type":"string"},"tags":{"description":"Tags narrow the scan to spans carrying the given tag values.","items":{"$ref":"#/components/schemas/o11y.O11yTagQuery"},"type":"array"}},"type":"object"},"o11y.O11yEventIn":{"properties":{"attributes":{"additionalProperties":{},"description":"Attributes are free-form event properties.","type":"object"},"eventName":{"description":"EventName names the event; required for track events.","type":"string"},"eventType":{"description":"EventType is the kind of event — track, identify or group. Required.","type":"string"},"rateLimited":{"description":"RateLimited marks an event the reporting client rate-limited.","type":"boolean"}},"required":["eventType"],"type":"object"},"o11y.O11yFieldSetting":{"properties":{"dataType":{"description":"DataType is the field's data type, e.g. string, int64, float64, bool.\nRequired.","type":"string"},"index":{"description":"Index is the index expression to put on the column, e.g. minmax,\nset(N), bloom_filter(P), tokenbf_v1(S,H,SEED). Empty keeps the default.","type":"string"},"indexGranularity":{"description":"IndexGranularity is the index granularity in rows.","format":"int64","type":"integer"},"name":{"description":"Name is the field to tune. Required.","type":"string"},"selected":{"description":"Selected materializes the field as its own column when true.","type":"boolean"},"type":{"description":"Type is where the field lives: attributes or resources. Required.","type":"string"}},"required":["name","dataType","type"],"type":"object"},"o11y.O11yFilter":{"properties":{"field":{"description":"Field is the column to test.","type":"string"},"op":{"description":"Op is how to test it: eq, neq or like.","type":"string"},"value":{"description":"Value is what to test it against.","type":"string"}},"type":"object"},"o11y.O11yFilterKey":{"properties":{"dataType":{"description":"DataType is the attribute's value type — string, int64, float64 or bool.","type":"string"},"isColumn":{"description":"IsColumn marks an attribute stored as its own column.","type":"boolean"},"isJSON":{"description":"IsJSON marks an attribute read out of a JSON body.","type":"boolean"},"key":{"description":"Key is the attribute name.","type":"string"},"type":{"description":"Type says where the attribute lives — tag or resource.","type":"string"}},"type":"object"},"o11y.O11yFunnelCreateIn":{"properties":{"funnel_name":{"description":"Name is the funnel's name.","type":"string"},"timestamp":{"description":"Timestamp is when the funnel was created, as a millisecond epoch. Zero\ntakes the runtime's own clock.","format":"int64","type":"integer"}},"type":"object"},"o11y.O11yFunnelStepWindowIn":{"properties":{"end_time":{"format":"int64","type":"integer"},"start_time":{"format":"int64","type":"integer"},"step_end":{"format":"int64","type":"integer"},"step_start":{"format":"int64","type":"integer"}},"type":"object"},"o11y.O11yFunnelStepsUpdateIn":{"properties":{"description":{"description":"Description replaces the funnel's description. Empty leaves it as it was.","type":"string"},"funnel_id":{"description":"FunnelID is the funnel to update.","type":"string"},"funnel_name":{"description":"Name replaces the funnel's name. Empty leaves it as it was.","type":"string"},"steps":{"description":"Steps are the funnel's steps, in order. At least two are needed before\nany analytics read will answer.","items":{"$ref":"#/components/schemas/o11y.FunnelStep"},"type":"array"},"timestamp":{"description":"Timestamp is when the change was made, as a millisecond epoch.","format":"int64","type":"integer"}},"type":"object"},"o11y.O11yFunnelUpdateIn":{"properties":{"description":{"description":"Description replaces the funnel's description. Empty leaves it as it was.","type":"string"},"funnel_name":{"description":"Name replaces the funnel's name. Empty leaves it as it was.","type":"string"},"timestamp":{"description":"Timestamp is when the change was made, as a millisecond epoch.","format":"int64","type":"integer"}},"type":"object"},"o11y.O11yFunnelWindowIn":{"properties":{"end_time":{"format":"int64","type":"integer"},"start_time":{"format":"int64","type":"integer"}},"type":"object"},"o11y.O11yLLMIngestAnnotation":{"properties":{"content":{"description":"Content is the note itself. Required.","type":"string"},"observationId":{"description":"ObservationID is the single observation the annotation attaches to, when\nnarrowed to one.","type":"string"},"queue":{"description":"Queue is the review queue to file the annotation in.","type":"string"},"status":{"description":"Status is the annotation's initial review status. Defaults to PENDING.","type":"string"},"traceId":{"description":"TraceID is the trace the annotation attaches to. Required.","type":"string"}},"type":"object"},"o11y.O11yLLMIngestScore":{"properties":{"comment":{"description":"Comment is a free-text note.","type":"string"},"dataType":{"description":"DataType is the score's kind — NUMERIC or CATEGORICAL. Defaults from the\nvalue when empty.","type":"string"},"name":{"description":"Name is the score's name, e.g. helpfulness. Required.","type":"string"},"observationId":{"description":"ObservationID is the single observation the score attaches to, when\nnarrowed to one.","type":"string"},"source":{"description":"Source is where the score came from, e.g. API, EVAL. Defaults to API.","type":"string"},"stringValue":{"description":"StringValue is the categorical score, when the score is categorical.","type":"string"},"traceId":{"description":"TraceID is the trace the score attaches to. Required.","type":"string"},"value":{"description":"Value is the numeric score.","format":"double","type":"number"}},"type":"object"},"o11y.O11yLLMPricingCacheCosts":{"properties":{"mode":{"description":"Mode is how cached tokens are counted — subtract (inside input_tokens,\nOpenAI-style), additive (reported separately, Anthropic-style) or unknown.","type":"string"},"read":{"description":"Read is the cost per unit of cache-read tokens.","format":"double","type":"number"},"write":{"description":"Write is the cost per unit of cache-write tokens.","format":"double","type":"number"}},"type":"object"},"o11y.O11yLLMRulePricing":{"properties":{"cache":{"$ref":"#/components/schemas/o11y.O11yLLMPricingCacheCosts","description":"Cache is the cost of cached tokens, when the model prices them."},"input":{"description":"Input is the cost per unit of input tokens.","format":"double","type":"number"},"output":{"description":"Output is the cost per unit of output tokens.","format":"double","type":"number"}},"type":"object"},"o11y.O11yLLMUpdatablePricingRule":{"properties":{"enabled":{"description":"Enabled turns the rule on.","type":"boolean"},"id":{"description":"ID matches an existing rule by its id.","type":"string"},"isOverride":{"description":"IsOverride pins the rule so the sync job skips it. Omit to leave a matched\noverride untouched.","type":"boolean"},"modelName":{"description":"Model is the model the rule prices. Required.","type":"string"},"modelPattern":{"description":"ModelPattern are the model-name globs the rule matches. Required.","items":{"type":"string"},"type":"array"},"pricing":{"$ref":"#/components/schemas/o11y.O11yLLMRulePricing","description":"Pricing is the per-unit cost. Required."},"provider":{"description":"Provider is the model's provider. Required.","type":"string"},"sourceId":{"description":"SourceID matches an existing rule by its upstream source id.","type":"string"},"unit":{"description":"Unit is the pricing unit, e.g. per_million_tokens. Required.","type":"string"}},"type":"object"},"o11y.O11yLLMUpdatablePricingRules":{"properties":{"rules":{"description":"Rules are the rules to create or update, matched per rule.","items":{"$ref":"#/components/schemas/o11y.O11yLLMUpdatablePricingRule"},"type":"array"}},"type":"object"},"o11y.O11yLogFilter":{"properties":{"items":{"description":"Items are the predicates.","items":{"$ref":"#/components/schemas/o11y.O11yLogFilterItem"},"type":"array"},"op":{"description":"Op combines the items: AND or OR.","type":"string"}},"type":"object"},"o11y.O11yLogFilterItem":{"properties":{"key":{"$ref":"#/components/schemas/o11y.O11yLogFilterKey","description":"Key is the field the predicate tests."},"op":{"description":"Op is the comparison, e.g. =, !=, in, contains.","type":"string"},"value":{"description":"Value is what it tests against, in the value's own JSON type."}},"type":"object"},"o11y.O11yLogFilterKey":{"properties":{"dataType":{"description":"DataType is the field's data type, e.g. string, int64, float64, bool.","type":"string"},"isColumn":{"description":"IsColumn marks a field materialized as its own column.","type":"boolean"},"isJSON":{"description":"IsJSON marks a path into the record's JSON body.","type":"boolean"},"key":{"description":"Key is the field's name.","type":"string"},"type":{"description":"Type is where the field lives: tag or resource.","type":"string"}},"type":"object"},"o11y.O11yLogParseFrom":{"properties":{"parse_from":{"description":"ParseFrom is the field to read.","type":"string"}},"type":"object"},"o11y.O11yLogPipeline":{"properties":{"alias":{"description":"Alias is the pipeline's short name.","type":"string"},"config":{"description":"Config is the pipeline's processors, in order.","items":{"$ref":"#/components/schemas/o11y.O11yLogPipelineOperator"},"type":"array"},"createdAt":{"description":"CreatedAt is when the pipeline was created.","format":"date-time","type":"string"},"createdBy":{"description":"CreatedBy is the id of who created the pipeline.","type":"string"},"description":{"description":"Description says what the pipeline is for.","type":"string"},"enabled":{"description":"Enabled says whether the pipeline is on.","type":"boolean"},"filter":{"$ref":"#/components/schemas/o11y.O11yLogFilter","description":"Filter selects which records the pipeline processes."},"id":{"description":"ID is the pipeline's id.","type":"string"},"name":{"description":"Name is the pipeline's display name.","type":"string"},"orderId":{"description":"OrderID is the pipeline's 1-based position in the set.","format":"int64","type":"integer"},"updatedAt":{"description":"UpdatedAt is when the pipeline last changed.","format":"date-time","type":"string"},"updatedBy":{"description":"UpdatedBy is the id of who last changed it.","type":"string"}},"type":"object"},"o11y.O11yLogPipelineCreateIn":{"properties":{"pipelines":{"description":"Pipelines are the pipelines the new version holds, in order.","items":{"$ref":"#/components/schemas/o11y.O11yLogPostablePipeline"},"type":"array"}},"type":"object"},"o11y.O11yLogPipelineOperator":{"properties":{"default":{"description":"Default is the id of the processor a router falls through to.","type":"string"},"enable_flattening":{"description":"EnableFlattening flattens parsed JSON one level when true.","type":"boolean"},"enable_paths":{"description":"EnablePaths keeps the JSON path in flattened keys when true.","type":"boolean"},"enabled":{"description":"Enabled turns the processor on.","type":"boolean"},"expr":{"description":"Expr is a router route's expression.","type":"string"},"field":{"description":"Field is the field an add/remove processor works on.","type":"string"},"fields":{"description":"Fields are the fields a retain processor keeps.","items":{"type":"string"},"type":"array"},"from":{"description":"From is the source field of a move or copy.","type":"string"},"id":{"description":"ID is the processor's id, unique within the pipeline.","type":"string"},"if":{"description":"If gates the processor on an expression.","type":"string"},"layout":{"description":"Layout is a time parser's layout.","type":"string"},"layout_type":{"description":"LayoutType is the layout's kind, e.g. strptime, gotime, epoch.","type":"string"},"mapping":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"description":"Mapping maps severity levels (or flattened keys) to the values that\nmean them.","type":"object"},"name":{"description":"Name is the processor's display name.","type":"string"},"on_error":{"description":"OnError says what to do when the processor fails, e.g. send, drop.","type":"string"},"orderId":{"description":"OrderID is the processor's 1-based position in the pipeline.","format":"int64","type":"integer"},"output":{"description":"Output is the id of the processor that runs next.","type":"string"},"overwrite_text":{"description":"OverwriteSeverityText rewrites the severity text alongside the number\nwhen true.","type":"boolean"},"parse_from":{"description":"ParseFrom is where a parser reads from.","type":"string"},"parse_to":{"description":"ParseTo is where a parser writes its result.","type":"string"},"path_prefix":{"description":"PathPrefix prefixes flattened keys.","type":"string"},"pattern":{"description":"Pattern is a grok parser's pattern.","type":"string"},"regex":{"description":"Regex is a regex parser's expression.","type":"string"},"routes":{"description":"Routes are a router processor's routes.","items":{"$ref":"#/components/schemas/o11y.O11yLogPipelineRoute"},"type":"array"},"span_id":{"$ref":"#/components/schemas/o11y.O11yLogParseFrom","description":"SpanID says where a trace parser reads the span id from."},"to":{"description":"To is the destination field of a move or copy.","type":"string"},"trace_flags":{"$ref":"#/components/schemas/o11y.O11yLogParseFrom","description":"TraceFlags says where a trace parser reads the trace flags from."},"trace_id":{"$ref":"#/components/schemas/o11y.O11yLogParseFrom","description":"TraceID says where a trace parser reads the trace id from."},"type":{"description":"Type is the processor type, e.g. grok_parser, regex_parser, json_parser,\ntrace_parser, time_parser, severity_parser, add, remove, move, copy.","type":"string"},"value":{"description":"Value is the value an add processor writes.","type":"string"}},"type":"object"},"o11y.O11yLogPipelinePreviewIn":{"properties":{"logs":{"description":"Logs are the sample records to transform.","items":{"$ref":"#/components/schemas/o11y.O11yLogRecord"},"type":"array"},"pipelines":{"description":"Pipelines are the pipelines to simulate, in order.","items":{"$ref":"#/components/schemas/o11y.O11yLogPipeline"},"type":"array"}},"type":"object"},"o11y.O11yLogPipelineRoute":{"properties":{"expr":{"description":"Expr is the expression that selects the route.","type":"string"},"output":{"description":"Output is the id of the processor the route sends to.","type":"string"}},"type":"object"},"o11y.O11yLogPostablePipeline":{"properties":{"alias":{"description":"Alias is the pipeline's short name.","type":"string"},"config":{"description":"Config is the pipeline's processors, in order.","items":{"$ref":"#/components/schemas/o11y.O11yLogPipelineOperator"},"type":"array"},"description":{"description":"Description says what the pipeline is for.","type":"string"},"enabled":{"description":"Enabled turns the pipeline on.","type":"boolean"},"filter":{"$ref":"#/components/schemas/o11y.O11yLogFilter","description":"Filter selects which records the pipeline processes."},"id":{"description":"ID is the pipeline's id. Empty on a new pipeline; the id it was listed\nwith to keep an existing one.","type":"string"},"name":{"description":"Name is the pipeline's display name.","type":"string"},"orderId":{"description":"OrderID is the pipeline's 1-based position in the set.","format":"int64","type":"integer"}},"type":"object"},"o11y.O11yLogPromoteIndex":{"properties":{"fieldDataType":{"description":"FieldDataType is the path's data type, e.g. string, number, bool.","type":"string"},"granularity":{"description":"Granularity is the index granularity in rows.","format":"int64","type":"integer"},"type":{"description":"Type is the index type, e.g. minmax, set(N), bloom_filter(P).","type":"string"}},"type":"object"},"o11y.O11yLogPromotePath":{"properties":{"indexes":{"description":"Indexes are the indexes to put on the path.","items":{"$ref":"#/components/schemas/o11y.O11yLogPromoteIndex"},"type":"array"},"path":{"description":"Path is the body path, e.g. body.user.id on the way in; listed without\nthe body. prefix.","type":"string"},"promote":{"description":"Promote lifts the path into its own column when true.","type":"boolean"}},"type":"object"},"o11y.O11yLogRecord":{"properties":{"attributes_bool":{"additionalProperties":{"type":"boolean"},"description":"AttributesBool are the record's boolean attributes.","type":"object"},"attributes_float":{"additionalProperties":{"format":"double","type":"number"},"description":"AttributesFloat are the record's float attributes.","type":"object"},"attributes_int":{"additionalProperties":{"format":"int64","type":"integer"},"description":"AttributesInt are the record's integer attributes.","type":"object"},"attributes_string":{"additionalProperties":{"type":"string"},"description":"AttributesString are the record's string attributes.","type":"object"},"body":{"description":"Body is the record's body.","type":"string"},"id":{"description":"ID is the record's id.","type":"string"},"resources_string":{"additionalProperties":{"type":"string"},"description":"ResourcesString are the record's string resource attributes.","type":"object"},"severity_number":{"description":"SeverityNumber is the record's severity as a number.","format":"uint8","type":"integer"},"severity_text":{"description":"SeverityText is the record's severity as text, e.g. ERROR.","type":"string"},"span_id":{"description":"SpanID is the span the record belongs to.","type":"string"},"timestamp":{"description":"Timestamp is the record's time as a nanosecond epoch.","format":"uint64","type":"integer"},"trace_flags":{"description":"TraceFlags are the record's trace flags.","format":"uint32","type":"integer"},"trace_id":{"description":"TraceID is the trace the record belongs to.","type":"string"}},"type":"object"},"o11y.O11yMetricField":{"properties":{"description":{"description":"Description describes the field.","type":"string"},"fieldContext":{"description":"FieldContext is the context the field lives in, e.g. resource, attribute.","type":"string"},"fieldDataType":{"description":"FieldDataType is the field's data type.","type":"string"},"name":{"description":"Name is the field's name.","type":"string"},"signal":{"description":"Signal is the telemetry signal the field belongs to.","type":"string"},"unit":{"description":"Unit is the field's unit.","type":"string"}},"type":"object"},"o11y.O11yMetricFilter":{"properties":{"expression":{"description":"Expression is the filter, in the query-builder filter syntax.","type":"string"}},"type":"object"},"o11y.O11yMetricInspectIn":{"properties":{"end":{"description":"End is the end of the window as a Unix timestamp in milliseconds, at most\nthirty minutes after start. Required.","format":"int64","type":"integer"},"filter":{"$ref":"#/components/schemas/o11y.O11yMetricFilter","description":"Filter narrows the series returned."},"metricName":{"description":"MetricName is the metric to inspect. Required.","type":"string"},"start":{"description":"Start is the start of the window as a Unix timestamp in milliseconds. Required.","format":"int64","type":"integer"}},"required":["metricName","start","end"],"type":"object"},"o11y.O11yMetricMetadataSaveIn":{"properties":{"description":{"description":"Description describes the metric.","type":"string"},"isMonotonic":{"description":"IsMonotonic marks a sum that only ever increases.","type":"boolean"},"metricName":{"description":"MetricName is the metric to update. Required.","type":"string"},"temporality":{"description":"Temporality is delta or cumulative.","type":"string"},"type":{"description":"Type is the metric type, e.g. gauge, sum, histogram.","type":"string"},"unit":{"description":"Unit is the metric's unit.","type":"string"}},"required":["metricName"],"type":"object"},"o11y.O11yMetricOrder":{"properties":{"direction":{"description":"Direction is asc or desc.","type":"string"},"key":{"$ref":"#/components/schemas/o11y.O11yMetricField","description":"Key is the field to order by."}},"type":"object"},"o11y.O11yMetricStatsIn":{"properties":{"end":{"description":"End is the end of the window as a Unix timestamp in milliseconds. Required.","format":"int64","type":"integer"},"filter":{"$ref":"#/components/schemas/o11y.O11yMetricFilter","description":"Filter narrows the metrics counted."},"limit":{"description":"Limit caps how many metrics come back, between 1 and 5000. Required.","format":"int64","type":"integer"},"offset":{"description":"Offset is how many metrics to skip, for paging.","format":"int64","type":"integer"},"orderBy":{"$ref":"#/components/schemas/o11y.O11yMetricOrder","description":"OrderBy sorts the page, by samples or timeseries."},"start":{"description":"Start is the start of the window as a Unix timestamp in milliseconds. Required.","format":"int64","type":"integer"}},"required":["start","end","limit"],"type":"object"},"o11y.O11yMetricTreemapIn":{"properties":{"end":{"description":"End is the end of the window as a Unix timestamp in milliseconds. Required.","format":"int64","type":"integer"},"filter":{"$ref":"#/components/schemas/o11y.O11yMetricFilter","description":"Filter narrows the metrics counted."},"limit":{"description":"Limit caps how many entries come back, between 1 and 5000. Required.","format":"int64","type":"integer"},"mode":{"description":"Mode picks the measure: timeseries or samples. Required.","type":"string"},"start":{"description":"Start is the start of the window as a Unix timestamp in milliseconds. Required.","format":"int64","type":"integer"}},"required":["start","end","limit","mode"],"type":"object"},"o11y.O11yMyServiceAccountUpdateIn":{"properties":{"name":{"description":"Name is the account's new name, under the same rules it was created with.\nRequired.","type":"string"}},"type":"object"},"o11y.O11yObject":{"properties":{"resource":{"$ref":"#/components/schemas/o11y.O11yResourceRef","description":"Resource is the resource's type and kind."},"selector":{"description":"Selector picks the instance — an FGA object string, wildcard allowed.","type":"string"}},"type":"object"},"o11y.O11yObjectGroup":{"properties":{"resource":{"$ref":"#/components/schemas/o11y.O11yResourceRef","description":"Resource is the objects' type and kind."},"selectors":{"description":"Selectors pick the instances; a wildcard selects them all.","items":{"type":"string"},"type":"array"}},"type":"object"},"o11y.O11yOperationsIn":{"properties":{"end":{"description":"End is the window's end, epoch nanoseconds as a string.","type":"string"},"limit":{"description":"Limit caps how many operations come back.","format":"int64","type":"integer"},"service":{"description":"Service is the service whose operations are read.","type":"string"},"start":{"description":"Start is the window's start, epoch nanoseconds as a string.","type":"string"},"tags":{"description":"Tags narrow the spans counted, each a span-attribute predicate.","items":{"$ref":"#/components/schemas/o11y.O11yServiceTag"},"type":"array"}},"type":"object"},"o11y.O11yOrganization":{"properties":{"alias":{"description":"Alias is an alternate name the org also answers to.","type":"string"},"createdAt":{"description":"CreatedAt is when the org was created.","format":"date-time","type":"string"},"displayName":{"description":"DisplayName is what the console shows for the org.","type":"string"},"id":{"description":"ID is the org id. On update it is ignored: the call always addresses the\ncaller's own org.","type":"string"},"key":{"description":"Key is the org's stable numeric key, derived from its id.","format":"uint32","type":"integer"},"name":{"description":"Name is the org's short name.","type":"string"},"updatedAt":{"description":"UpdatedAt is when it last changed.","format":"date-time","type":"string"}},"type":"object"},"o11y.O11yPublicDashboardWriteIn":{"properties":{"defaultTimeRange":{"description":"DefaultTimeRange is the fixed window as a Go duration, e.g. 1h, 30m.","type":"string"},"id":{"description":"ID is the dashboard id from the path.","type":"string"},"timeRangeEnabled":{"description":"TimeRangeEnabled lets the public page pick its own time range; when false\nthe share fixes DefaultTimeRange.","type":"boolean"}},"type":"object"},"o11y.O11yQueryRangePreviewIn":{"properties":{"compositeQuery":{"$ref":"#/components/schemas/o11y.CompositeQuery","description":"CompositeQuery is the composite query to use for the request."},"end":{"description":"End is the end time of the query in epoch milliseconds.","format":"uint64","type":"integer"},"formatOptions":{"$ref":"#/components/schemas/o11y.FormatOptions"},"noCache":{"description":"NoCache is a flag to disable caching for the request.","type":"boolean"},"requestType":{"description":"RequestType is the type of the request."},"schemaVersion":{"description":"SchemaVersion is the version of the schema to use for the request payload.","type":"string"},"start":{"description":"Start is the start time of the query in epoch milliseconds.","format":"uint64","type":"integer"},"variables":{"additionalProperties":{"$ref":"#/components/schemas/o11y.VariableItem"},"description":"Variables is the variables to use for the request.","type":"object"},"verbose":{"description":"Verbose selects the answer's depth. Empty or \"true\" renders the underlying\nDatastore SQL with EXPLAIN and granule analysis; \"false\" returns only the\nper-query valid/error/warnings verdict with no Datastore round trips.","type":"string"}},"type":"object"},"o11y.O11yQueueFilterKey":{"properties":{"dataType":{"description":"DataType is the attribute's type: string, int64, float64 or bool.","type":"string"},"isColumn":{"description":"IsColumn marks an attribute materialized as its own store column.","type":"boolean"},"isJSON":{"description":"IsJSON marks an attribute read out of the span's JSON body.","type":"boolean"},"key":{"description":"Key is the attribute name.","type":"string"},"type":{"description":"Type says which plane the attribute lives on: tag or resource.","type":"string"}},"type":"object"},"o11y.O11yQueueFilterRule":{"properties":{"key":{"$ref":"#/components/schemas/o11y.O11yQueueFilterKey","description":"Key names the attribute the predicate tests."},"op":{"description":"Op is the comparison, e.g. =, !=, in, contains.","type":"string"},"value":{"description":"Value is the operand; its JSON type follows the attribute's dataType."}},"type":"object"},"o11y.O11yQueueFilterSet":{"properties":{"items":{"description":"Items are the predicates.","items":{"$ref":"#/components/schemas/o11y.O11yQueueFilterRule"},"type":"array"},"op":{"description":"Op combines the items: AND or OR.","type":"string"}},"type":"object"},"o11y.O11yQueueIn":{"properties":{"end":{"description":"End is the window's end, epoch nanoseconds.","format":"int64","type":"integer"},"eval_time":{"description":"EvalTime bounds the span-evaluation scan, nanoseconds; only the\nspan/evaluation view reads it.","format":"int64","type":"integer"},"start":{"description":"Start is the window's start, epoch nanoseconds.","format":"int64","type":"integer"},"variables":{"additionalProperties":{"type":"string"},"description":"Variables name what the view drills into — topic, partition, service,\nconsumer_group — keyed by the name the view expects.","type":"object"}},"type":"object"},"o11y.O11yQueueListIn":{"properties":{"end":{"description":"End is the window's end, epoch nanoseconds.","format":"int64","type":"integer"},"filters":{"$ref":"#/components/schemas/o11y.O11yQueueFilterSet","description":"Filters narrow the rows by span attribute; null means all rows."},"limit":{"description":"Limit caps how many rows come back.","format":"int64","type":"integer"},"start":{"description":"Start is the window's start, epoch nanoseconds.","format":"int64","type":"integer"}},"type":"object"},"o11y.O11yReductionRuleCreateIn":{"properties":{"labels":{"description":"Labels are the label names the rule matches. Required, at least one.","items":{"type":"string"},"type":"array"},"matchType":{"description":"MatchType is drop or keep: drop the named labels, or keep only them. Required.","type":"string"},"metricName":{"description":"MetricName is the metric the rule governs; one rule per metric. Required.","type":"string"}},"required":["metricName","matchType","labels"],"type":"object"},"o11y.O11yReductionRulePreviewIn":{"properties":{"labels":{"description":"Labels are the label names the rule would match. Required, at least one.","items":{"type":"string"},"type":"array"},"lookbackMs":{"description":"LookbackMs is how far back to sample when estimating.","format":"int64","type":"integer"},"matchType":{"description":"MatchType is drop or keep. Required.","type":"string"},"metricName":{"description":"MetricName is the metric the rule would govern. Required.","type":"string"}},"required":["metricName","matchType","labels"],"type":"object"},"o11y.O11yReductionRuleSaveIn":{"properties":{"id":{"description":"ID is the rule's id.","type":"string"},"labels":{"description":"Labels are the label names the rule matches. Required, at least one.","items":{"type":"string"},"type":"array"},"matchType":{"description":"MatchType is drop or keep. Required.","type":"string"}},"required":["id","matchType","labels"],"type":"object"},"o11y.O11yResourceRef":{"properties":{"kind":{"description":"Kind is the resource kind the type belongs to.","type":"string"},"type":{"description":"Type is the resource type, e.g. role, dashboard, serviceaccount.","type":"string"}},"type":"object"},"o11y.O11yRetentionMatch":{"properties":{"key":{"description":"Key is the label to test.","type":"string"},"values":{"description":"Values are the label values the rule matches.","items":{"type":"string"},"type":"array"}},"type":"object"},"o11y.O11yRetentionRule":{"properties":{"conditions":{"description":"Conditions all have to hold for the rule to match.","items":{"$ref":"#/components/schemas/o11y.O11yRetentionMatch"},"type":"array"},"ttlDays":{"description":"TTLDays is the retention applied when it does, in days.","format":"int64","type":"integer"}},"type":"object"},"o11y.O11yRetentionSetIn":{"properties":{"coldStorageDurationDays":{"description":"ColdStorageDurationDays is how old data must be before it moves, in days.","format":"int64","type":"integer"},"coldStorageVolume":{"description":"ColdStorageVolume names the volume aged data moves to, when set.","type":"string"},"defaultTTLDays":{"description":"DefaultTTLDays is the retention for data no rule matches, in days.","format":"int64","type":"integer"},"ttlConditions":{"description":"TTLConditions are ordered per-label rules; the first matching rule wins.","items":{"$ref":"#/components/schemas/o11y.O11yRetentionRule"},"type":"array"},"type":{"description":"Type is the signal the policy applies to — traces, metrics or logs.","type":"string"}},"type":"object"},"o11y.O11yRoleCreateIn":{"properties":{"description":{"description":"Description says what the role is for.","type":"string"},"name":{"description":"Name is the role's name: lowercase letters and hyphens, at most 50\ncharacters, not starting with the reserved managed-role prefix. Required.","type":"string"},"transactionGroups":{"description":"TransactionGroups are the grants the role carries.","items":{"$ref":"#/components/schemas/o11y.O11yTransactionGroup"},"type":"array"}},"type":"object"},"o11y.O11yRoleUpdateIn":{"properties":{"description":{"description":"Description says what the role is for. Required — send an empty string to\nclear it.","type":"string"},"transactionGroups":{"description":"TransactionGroups are the grants the role carries. Required — send an\nempty array to clear them.","items":{"$ref":"#/components/schemas/o11y.O11yTransactionGroup"},"type":"array"}},"type":"object"},"o11y.O11yRoutePolicyUpdateIn":{"properties":{"channels":{"items":{"type":"string"},"type":"array"},"description":{"type":"string"},"expression":{"type":"string"},"kind":{},"name":{"type":"string"},"tags":{"items":{"type":"string"},"type":"array"}},"type":"object"},"o11y.O11yRuleHistoryQueryIn":{"properties":{"end":{"format":"int64","type":"integer"},"filters":{"$ref":"#/components/schemas/o11y.FilterSet"},"limit":{"format":"int64","type":"integer"},"offset":{"format":"int64","type":"integer"},"order":{"type":"string"},"start":{"format":"int64","type":"integer"},"state":{"type":"string"}},"type":"object"},"o11y.O11ySavedViewUpdateIn":{"properties":{"category":{"type":"string"},"compositeQuery":{"$ref":"#/components/schemas/o11y.v3.CompositeQuery"},"createdAt":{"format":"date-time","type":"string"},"createdBy":{"type":"string"},"extraData":{"description":"ExtraData is JSON encoded data used by frontend to store additional data","type":"string"},"id":{},"name":{"type":"string"},"sourcePage":{"type":"string"},"tags":{"items":{"type":"string"},"type":"array"},"updatedAt":{"format":"date-time","type":"string"},"updatedBy":{"type":"string"},"viewId":{"description":"ViewID is the id of the view to replace, taken from the URL.","type":"string"}},"type":"object"},"o11y.O11ySentryPostableProject":{"properties":{"name":{"description":"Name is the project's display name. Required.","type":"string"},"platform":{"description":"Platform is the reporting runtime, e.g. go, python, javascript.","type":"string"},"slug":{"description":"Slug is the project's short name. Server-assigned from Name when empty.","type":"string"}},"required":["name"],"type":"object"},"o11y.O11ySentryUpdateIssueIn":{"properties":{"assignee":{"description":"Assignee is who the issue is assigned to.","type":"string"},"id":{"description":"ID is the issue id.","type":"string"},"status":{"description":"Status is the new lifecycle state: unresolved, resolved or ignored.","type":"string"}},"required":["id"],"type":"object"},"o11y.O11yServiceAccountCreateIn":{"properties":{"name":{"description":"Name is the account's name: a lowercase letter followed by lowercase\nletters, digits or hyphens, at most 50 characters. Required.","type":"string"}},"type":"object"},"o11y.O11yServiceAccountRoleGrantIn":{"properties":{"id":{"description":"RoleID is the id of the role to assign. Required.","type":"string"}},"type":"object"},"o11y.O11yServiceAccountUpdateIn":{"properties":{"name":{"description":"Name is the account's new name, under the same rules it was created with.\nRequired.","type":"string"}},"type":"object"},"o11y.O11yServiceTag":{"properties":{"BoolValues":{"description":"BoolValues are the boolean operands, when the attribute is a bool.","items":{"type":"boolean"},"type":"array"},"Key":{"description":"Key is the span attribute to test.","type":"string"},"NumberValues":{"description":"NumberValues are the numeric operands, when the attribute is a number.","items":{"format":"double","type":"number"},"type":"array"},"Operator":{"description":"Operator is how to test it, e.g. in, not_in.","type":"string"},"StringValues":{"description":"StringValues are the string operands, when the attribute is a string.","items":{"type":"string"},"type":"array"},"TagType":{"description":"TagType says which plane the attribute lives on, e.g. tag or resource.","type":"string"}},"type":"object"},"o11y.O11yServicesIn":{"properties":{"end":{"description":"End is the window's end, epoch nanoseconds as a string.","type":"string"},"start":{"description":"Start is the window's start, epoch nanoseconds as a string.","type":"string"},"tags":{"description":"Tags narrow the spans counted, each a span-attribute predicate.","items":{"$ref":"#/components/schemas/o11y.O11yServiceTag"},"type":"array"}},"type":"object"},"o11y.O11ySpanMapperCreateIn":{"properties":{"config":{"$ref":"#/components/schemas/o11y.SpanMapperConfig"},"enabled":{"type":"boolean"},"fieldContext":{},"name":{"type":"string"}},"type":"object"},"o11y.O11ySpanMapperGroupUpdateIn":{"properties":{"condition":{"$ref":"#/components/schemas/o11y.SpanMapperGroupCondition"},"enabled":{"type":"boolean"},"name":{"type":"string"}},"type":"object"},"o11y.O11ySpanMapperUpdateIn":{"properties":{"config":{"$ref":"#/components/schemas/o11y.SpanMapperConfig"},"enabled":{"type":"boolean"},"fieldContext":{}},"type":"object"},"o11y.O11ySpanPercentileIn":{"properties":{"end":{"description":"End is the window end, as epoch nanoseconds.","format":"uint64","type":"integer"},"name":{"description":"Name is the span name whose peers are compared. Required.","type":"string"},"resourceAttributes":{"additionalProperties":{"type":"string"},"description":"ResourceAttributes narrow the peer group to spans carrying them all.","type":"object"},"serviceName":{"description":"ServiceName is the service the span belongs to. Required.","type":"string"},"spanDuration":{"description":"SpanDuration is the span's duration in nanoseconds.","format":"int64","type":"integer"},"start":{"description":"Start is the window start, as epoch nanoseconds.","format":"uint64","type":"integer"}},"required":["name","serviceName"],"type":"object"},"o11y.O11yTagFilter":{"properties":{"boolValues":{"description":"BoolValues are the values matched when the tag holds booleans.","items":{"type":"boolean"},"type":"array"},"key":{"description":"Key is the tag to test.","type":"string"},"numberValues":{"description":"NumberValues are the values matched when the tag holds numbers.","items":{"format":"double","type":"number"},"type":"array"},"operator":{"description":"Operator is the comparison to apply — in, not_in, equals, contains and\nthe other operators the trace filter grammar names.","type":"string"},"stringValues":{"description":"StringValues are the values matched when the tag holds strings.","items":{"type":"string"},"type":"array"},"tagType":{"description":"TagType says which kind of value the tag holds: string, number or bool.","type":"string"}},"type":"object"},"o11y.O11yTagQuery":{"properties":{"boolValues":{"description":"BoolValues are the boolean values to test against.","items":{"type":"boolean"},"type":"array"},"key":{"description":"Key is the tag to test.","type":"string"},"numberValues":{"description":"NumberValues are the numeric values to test against.","items":{"format":"double","type":"number"},"type":"array"},"operator":{"description":"Operator is the comparison, e.g. in, nin, contains, exists.","type":"string"},"stringValues":{"description":"StringValues are the string values to test against.","items":{"type":"string"},"type":"array"},"tagType":{"description":"TagType is where the tag lives, e.g. ResourceAttribute, SpanAttribute.","type":"string"}},"type":"object"},"o11y.O11yTopLevelOpsIn":{"properties":{"end":{"description":"End is the window's end, epoch nanoseconds as a string; empty means\nunbounded.","type":"string"},"service":{"description":"Service narrows the map to one service when set.","type":"string"},"start":{"description":"Start is the window's start, epoch nanoseconds as a string; empty means\nunbounded.","type":"string"}},"type":"object"},"o11y.O11yTraceAggregationsIn":{"properties":{"aggregations":{"items":{"$ref":"#/components/schemas/o11y.SpanAggregation"},"type":"array"}},"type":"object"},"o11y.O11yTraceFlamegraphIn":{"properties":{"selectFields":{"items":{"$ref":"#/components/schemas/o11y.TelemetryFieldKey"},"type":"array"},"selectedSpanId":{"type":"string"}},"type":"object"},"o11y.O11yTraceWaterfallIn":{"properties":{"selectedSpanId":{"type":"string"},"uncollapsedSpans":{"items":{"type":"string"},"type":"array"}},"type":"object"},"o11y.O11yTransaction":{"properties":{"object":{"$ref":"#/components/schemas/o11y.O11yObject","description":"Object is the resource the verb would act on."},"relation":{"description":"Relation is the verb being asked about, e.g. read, create, update, delete.","type":"string"}},"type":"object"},"o11y.O11yTransactionGroup":{"properties":{"objectGroup":{"$ref":"#/components/schemas/o11y.O11yObjectGroup","description":"ObjectGroup is the set of objects it allows the verb on."},"relation":{"description":"Relation is the verb the grant allows.","type":"string"}},"type":"object"},"o11y.O11yUpdatablePreference":{"properties":{"value":{"description":"Value is the value to set; its JSON type must match the preference's\ndeclared value type."}},"type":"object"},"o11y.O11yUpdatableQuickFilters":{"properties":{"filters":{"description":"Filters are the attributes to offer, in the order to offer them.","items":{"$ref":"#/components/schemas/o11y.O11yFilterKey"},"type":"array"},"signal":{"description":"Signal is the signal whose filters are being replaced.","type":"string"}},"type":"object"},"o11y.O11yUpdateAccountIn":{"properties":{"config":{"$ref":"#/components/schemas/o11y.UpdatableAccountConfig"}},"type":"object"},"o11y.O11yUpdateIngestionKeyIn":{"properties":{"expires_at":{"format":"date-time","type":"string"},"name":{"type":"string"},"tags":{"items":{"type":"string"},"type":"array"}},"type":"object"},"o11y.O11yUpdateLimitIn":{"properties":{"config":{"$ref":"#/components/schemas/o11y.LimitConfig"},"tags":{"items":{"type":"string"},"type":"array"}},"type":"object"},"o11y.O11yUpdateServiceIn":{"properties":{"config":{"$ref":"#/components/schemas/o11y.ServiceConfig"}},"type":"object"},"o11y.OAuth2":{"properties":{"TLSConfig":{"$ref":"#/components/schemas/o11y.TLSConfig"},"audience":{"description":"Audience optionally specifies the intended audience of the\nrequest. If empty, the value of TokenURL is used as the\nintended audience. Only used if\nGrantType is set to \"urn:ietf:params:oauth:grant-type:jwt-bearer\".","type":"string"},"claims":{"additionalProperties":{},"description":"Claims is a map of claims to be added to the JWT token. Only used if\nGrantType is set to \"urn:ietf:params:oauth:grant-type:jwt-bearer\".","type":"object"},"client_certificate_key":{},"client_certificate_key_file":{"type":"string"},"client_certificate_key_id":{"type":"string"},"client_certificate_key_ref":{"description":"ClientCertificateKeyRef is the name of the secret within the secret manager to use as the client\nsecret.","type":"string"},"client_id":{"type":"string"},"client_secret":{},"client_secret_file":{"type":"string"},"client_secret_ref":{"description":"ClientSecretRef is the name of the secret within the secret manager to use as the client\nsecret.","type":"string"},"endpoint_params":{"additionalProperties":{"type":"string"},"type":"object"},"grant_type":{"description":"GrantType is the OAuth2 grant type to use. It can be one of\n\"client_credentials\" or \"urn:ietf:params:oauth:grant-type:jwt-bearer\" (RFC 7523).\nDefault value is \"client_credentials\"","type":"string"},"iss":{"description":"Iss is the OAuth client identifier used when communicating with\nthe configured OAuth provider. Default value is client_id. Only used if\nGrantType is set to \"urn:ietf:params:oauth:grant-type:jwt-bearer\".","type":"string"},"no_proxy":{"description":"NoProxy contains addresses that should not use a proxy.","type":"string"},"proxy_connect_header":{"additionalProperties":{"items":{},"type":"array"},"description":"ProxyConnectHeader optionally specifies headers to send to\nproxies during CONNECT requests. Assume that at least _some_ of\nthese headers are going to contain secrets and use Secret as the\nvalue type instead of string.","type":"object"},"proxy_from_environment":{"description":"ProxyFromEnvironment makes use of net/http ProxyFromEnvironment function\nto determine proxies.","type":"boolean"},"proxy_url":{"description":"HTTP proxy server to use to connect to the targets."},"scopes":{"items":{"type":"string"},"type":"array"},"signature_algorithm":{"description":"SignatureAlgorithm is the RSA algorithm used to sign JWT token. Only used if\nGrantType is set to \"urn:ietf:params:oauth:grant-type:jwt-bearer\".\nDefault value is RS256 and valid values RS256, RS384, RS512","type":"string"},"token_url":{"type":"string"}},"type":"object"},"o11y.OpsGenieConfig":{"properties":{"NotifierConfig":{"$ref":"#/components/schemas/o11y.NotifierConfig"},"actions":{"type":"string"},"api_key":{},"api_key_file":{"type":"string"},"api_url":{},"description":{"type":"string"},"details":{"additionalProperties":{"type":"string"},"type":"object"},"entity":{"type":"string"},"http_config":{"$ref":"#/components/schemas/o11y.HTTPClientConfig"},"message":{"type":"string"},"note":{"type":"string"},"priority":{"type":"string"},"responders":{"items":{"$ref":"#/components/schemas/o11y.OpsGenieConfigResponder"},"type":"array"},"source":{"type":"string"},"tags":{"type":"string"},"update_alerts":{"type":"boolean"}},"type":"object"},"o11y.OpsGenieConfigResponder":{"properties":{"id":{"description":"One of those 3 should be filled.","type":"string"},"name":{"type":"string"},"type":{"description":"team, user, escalation, schedule etc.","type":"string"},"username":{"type":"string"}},"type":"object"},"o11y.OrderBy":{"properties":{"columnName":{"type":"string"},"order":{"type":"string"}},"type":"object"},"o11y.OrderByKey":{"properties":{"description":{"type":"string"},"fieldContext":{},"fieldDataType":{},"name":{"type":"string"},"signal":{},"unit":{"type":"string"}},"required":["name"],"type":"object"},"o11y.PagerdutyConfig":{"properties":{"NotifierConfig":{"$ref":"#/components/schemas/o11y.NotifierConfig"},"class":{"type":"string"},"client":{"type":"string"},"client_url":{"type":"string"},"component":{"type":"string"},"description":{"type":"string"},"details":{"additionalProperties":{},"type":"object"},"group":{"type":"string"},"http_config":{"$ref":"#/components/schemas/o11y.HTTPClientConfig"},"images":{"items":{"$ref":"#/components/schemas/o11y.PagerdutyImage"},"type":"array"},"links":{"items":{"$ref":"#/components/schemas/o11y.PagerdutyLink"},"type":"array"},"routing_key":{},"routing_key_file":{"type":"string"},"service_key":{},"service_key_file":{"type":"string"},"severity":{"type":"string"},"source":{"type":"string"},"timeout":{"description":"Timeout is the maximum time allowed to invoke the pagerduty. Setting this to 0\ndoes not impose a timeout.","format":"int64","type":"integer"},"url":{}},"type":"object"},"o11y.PagerdutyImage":{"properties":{"alt":{"type":"string"},"href":{"type":"string"},"src":{"type":"string"}},"type":"object"},"o11y.PagerdutyLink":{"properties":{"href":{"type":"string"},"text":{"type":"string"}},"type":"object"},"o11y.PodListRequest":{"properties":{"end":{"description":"epoch time in ms","format":"int64","type":"integer"},"filters":{"$ref":"#/components/schemas/o11y.FilterSet"},"groupBy":{"items":{"$ref":"#/components/schemas/o11y.AttributeKey"},"type":"array"},"limit":{"format":"int64","type":"integer"},"offset":{"format":"int64","type":"integer"},"orderBy":{"$ref":"#/components/schemas/o11y.OrderBy"},"start":{"description":"epoch time in ms","format":"int64","type":"integer"}},"type":"object"},"o11y.PostableAccountConfig":{"properties":{"AgentVersion":{"description":"as agent version is common for all providers, we can keep it at top level of this struct","type":"string"},"aws":{"$ref":"#/components/schemas/o11y.AWSPostableAccountConfig"},"azure":{"$ref":"#/components/schemas/o11y.AzureAccountConfig"},"gcp":{"$ref":"#/components/schemas/o11y.GCPAccountConfig"}},"type":"object"},"o11y.PostableChannel":{"properties":{"Receiver":{"$ref":"#/components/schemas/o11y.Receiver"},"googlechat_configs":{"items":{"$ref":"#/components/schemas/o11y.GoogleChatReceiverConfig"},"type":"array"}},"type":"object"},"o11y.PostableClusters":{"properties":{"end":{"format":"int64","type":"integer"},"filter":{"$ref":"#/components/schemas/o11y.Filter"},"groupBy":{"items":{"$ref":"#/components/schemas/o11y.GroupByKey"},"type":"array"},"limit":{"format":"int64","type":"integer"},"offset":{"format":"int64","type":"integer"},"orderBy":{"$ref":"#/components/schemas/o11y.querybuildertypesv5.OrderBy"},"start":{"format":"int64","type":"integer"}},"type":"object"},"o11y.PostableDaemonSets":{"properties":{"end":{"format":"int64","type":"integer"},"filter":{"$ref":"#/components/schemas/o11y.Filter"},"groupBy":{"items":{"$ref":"#/components/schemas/o11y.GroupByKey"},"type":"array"},"limit":{"format":"int64","type":"integer"},"offset":{"format":"int64","type":"integer"},"orderBy":{"$ref":"#/components/schemas/o11y.querybuildertypesv5.OrderBy"},"start":{"format":"int64","type":"integer"}},"type":"object"},"o11y.PostableDeployments":{"properties":{"end":{"format":"int64","type":"integer"},"filter":{"$ref":"#/components/schemas/o11y.Filter"},"groupBy":{"items":{"$ref":"#/components/schemas/o11y.GroupByKey"},"type":"array"},"limit":{"format":"int64","type":"integer"},"offset":{"format":"int64","type":"integer"},"orderBy":{"$ref":"#/components/schemas/o11y.querybuildertypesv5.OrderBy"},"start":{"format":"int64","type":"integer"}},"type":"object"},"o11y.PostableHost":{"properties":{"name":{"type":"string"}},"type":"object"},"o11y.PostableHosts":{"properties":{"end":{"format":"int64","type":"integer"},"filter":{"$ref":"#/components/schemas/o11y.HostFilter"},"groupBy":{"items":{"$ref":"#/components/schemas/o11y.GroupByKey"},"type":"array"},"limit":{"format":"int64","type":"integer"},"offset":{"format":"int64","type":"integer"},"orderBy":{"$ref":"#/components/schemas/o11y.querybuildertypesv5.OrderBy"},"start":{"format":"int64","type":"integer"}},"type":"object"},"o11y.PostableIngestionKey":{"properties":{"expires_at":{"format":"date-time","type":"string"},"name":{"type":"string"},"tags":{"items":{"type":"string"},"type":"array"}},"type":"object"},"o11y.PostableJobs":{"properties":{"end":{"format":"int64","type":"integer"},"filter":{"$ref":"#/components/schemas/o11y.Filter"},"groupBy":{"items":{"$ref":"#/components/schemas/o11y.GroupByKey"},"type":"array"},"limit":{"format":"int64","type":"integer"},"offset":{"format":"int64","type":"integer"},"orderBy":{"$ref":"#/components/schemas/o11y.querybuildertypesv5.OrderBy"},"start":{"format":"int64","type":"integer"}},"type":"object"},"o11y.PostableNamespaces":{"properties":{"end":{"format":"int64","type":"integer"},"filter":{"$ref":"#/components/schemas/o11y.Filter"},"groupBy":{"items":{"$ref":"#/components/schemas/o11y.GroupByKey"},"type":"array"},"limit":{"format":"int64","type":"integer"},"offset":{"format":"int64","type":"integer"},"orderBy":{"$ref":"#/components/schemas/o11y.querybuildertypesv5.OrderBy"},"start":{"format":"int64","type":"integer"}},"type":"object"},"o11y.PostableNodes":{"properties":{"end":{"format":"int64","type":"integer"},"filter":{"$ref":"#/components/schemas/o11y.Filter"},"groupBy":{"items":{"$ref":"#/components/schemas/o11y.GroupByKey"},"type":"array"},"limit":{"format":"int64","type":"integer"},"offset":{"format":"int64","type":"integer"},"orderBy":{"$ref":"#/components/schemas/o11y.querybuildertypesv5.OrderBy"},"start":{"format":"int64","type":"integer"}},"type":"object"},"o11y.PostablePlannedMaintenance":{"properties":{"alertIds":{"items":{"type":"string"},"type":"array"},"description":{"type":"string"},"name":{"type":"string"},"schedule":{},"scope":{"type":"string"}},"type":"object"},"o11y.PostablePods":{"properties":{"end":{"format":"int64","type":"integer"},"filter":{"$ref":"#/components/schemas/o11y.Filter"},"groupBy":{"items":{"$ref":"#/components/schemas/o11y.GroupByKey"},"type":"array"},"limit":{"format":"int64","type":"integer"},"offset":{"format":"int64","type":"integer"},"orderBy":{"$ref":"#/components/schemas/o11y.querybuildertypesv5.OrderBy"},"start":{"format":"int64","type":"integer"}},"type":"object"},"o11y.PostableProfile":{"properties":{"existing_observability_tool":{"type":"string"},"has_existing_observability_tool":{"type":"boolean"},"logs_scale_per_day_in_gb":{"format":"int64","type":"integer"},"number_of_hosts":{"format":"int64","type":"integer"},"number_of_services":{"format":"int64","type":"integer"},"reasons_for_interest_in_o11y":{"items":{"type":"string"},"type":"array"},"timeline_for_migrating_to_o11y":{"type":"string"},"uses_otel":{"type":"boolean"},"where_did_you_discover_o11y":{"type":"string"}},"type":"object"},"o11y.PostableRoutePolicy":{"properties":{"channels":{"items":{"type":"string"},"type":"array"},"description":{"type":"string"},"expression":{"type":"string"},"kind":{},"name":{"type":"string"},"tags":{"items":{"type":"string"},"type":"array"}},"type":"object"},"o11y.PostableSpanMapperGroup":{"properties":{"condition":{"$ref":"#/components/schemas/o11y.SpanMapperGroupCondition"},"enabled":{"type":"boolean"},"name":{"type":"string"}},"type":"object"},"o11y.PostableStatefulSets":{"properties":{"end":{"format":"int64","type":"integer"},"filter":{"$ref":"#/components/schemas/o11y.Filter"},"groupBy":{"items":{"$ref":"#/components/schemas/o11y.GroupByKey"},"type":"array"},"limit":{"format":"int64","type":"integer"},"offset":{"format":"int64","type":"integer"},"orderBy":{"$ref":"#/components/schemas/o11y.querybuildertypesv5.OrderBy"},"start":{"format":"int64","type":"integer"}},"type":"object"},"o11y.PostableVolumes":{"properties":{"end":{"format":"int64","type":"integer"},"filter":{"$ref":"#/components/schemas/o11y.Filter"},"groupBy":{"items":{"$ref":"#/components/schemas/o11y.GroupByKey"},"type":"array"},"limit":{"format":"int64","type":"integer"},"offset":{"format":"int64","type":"integer"},"orderBy":{"$ref":"#/components/schemas/o11y.querybuildertypesv5.OrderBy"},"start":{"format":"int64","type":"integer"}},"type":"object"},"o11y.ProcessListRequest":{"properties":{"end":{"description":"epoch time in ms","format":"int64","type":"integer"},"filters":{"$ref":"#/components/schemas/o11y.FilterSet"},"groupBy":{"items":{"$ref":"#/components/schemas/o11y.AttributeKey"},"type":"array"},"limit":{"format":"int64","type":"integer"},"offset":{"format":"int64","type":"integer"},"orderBy":{"$ref":"#/components/schemas/o11y.OrderBy"},"start":{"description":"epoch time in ms","format":"int64","type":"integer"}},"type":"object"},"o11y.PromQuery":{"properties":{"disabled":{"type":"boolean"},"legend":{"type":"string"},"query":{"type":"string"},"stats":{"type":"string"}},"type":"object"},"o11y.PushoverConfig":{"properties":{"NotifierConfig":{"$ref":"#/components/schemas/o11y.NotifierConfig"},"device":{"type":"string"},"expire":{"format":"int64","type":"integer"},"html":{"type":"boolean"},"http_config":{"$ref":"#/components/schemas/o11y.HTTPClientConfig"},"message":{"type":"string"},"monospace":{"type":"boolean"},"priority":{"type":"string"},"retry":{"format":"int64","type":"integer"},"sound":{"type":"string"},"title":{"type":"string"},"token":{},"token_file":{"type":"string"},"ttl":{"format":"int64","type":"integer"},"url":{"type":"string"},"url_title":{"type":"string"},"user_key":{},"user_key_file":{"type":"string"}},"type":"object"},"o11y.QueryEnvelope":{"properties":{"spec":{"description":"Spec is the deferred decoding of the query if any."},"type":{"description":"Type is the type of the query."}},"type":"object"},"o11y.QueryRangeParamsV3":{"properties":{"compositeQuery":{"$ref":"#/components/schemas/o11y.v3.CompositeQuery"},"end":{"format":"int64","type":"integer"},"formatForWeb":{"type":"boolean"},"noCache":{"type":"boolean"},"start":{"format":"int64","type":"integer"},"step":{"description":"step is in seconds; used for prometheus queries","format":"int64","type":"integer"},"variables":{"additionalProperties":{},"type":"object"}},"type":"object"},"o11y.QueryRangeRequest":{"properties":{"compositeQuery":{"$ref":"#/components/schemas/o11y.CompositeQuery","description":"CompositeQuery is the composite query to use for the request."},"end":{"description":"End is the end time of the query in epoch milliseconds.","format":"uint64","type":"integer"},"formatOptions":{"$ref":"#/components/schemas/o11y.FormatOptions"},"noCache":{"description":"NoCache is a flag to disable caching for the request.","type":"boolean"},"requestType":{"description":"RequestType is the type of the request."},"schemaVersion":{"description":"SchemaVersion is the version of the schema to use for the request payload.","type":"string"},"start":{"description":"Start is the start time of the query in epoch milliseconds.","format":"uint64","type":"integer"},"variables":{"additionalProperties":{"$ref":"#/components/schemas/o11y.VariableItem"},"description":"Variables is the variables to use for the request.","type":"object"}},"type":"object"},"o11y.Receiver":{"properties":{"discord_configs":{"items":{"$ref":"#/components/schemas/o11y.DiscordConfig"},"type":"array"},"email_configs":{"items":{"$ref":"#/components/schemas/o11y.EmailConfig"},"type":"array"},"incidentio_configs":{"items":{"$ref":"#/components/schemas/o11y.IncidentioConfig"},"type":"array"},"jira_configs":{"items":{"$ref":"#/components/schemas/o11y.JiraConfig"},"type":"array"},"mattermost_configs":{"items":{"$ref":"#/components/schemas/o11y.MattermostConfig"},"type":"array"},"msteams_configs":{"items":{"$ref":"#/components/schemas/o11y.MSTeamsConfig"},"type":"array"},"msteamsv2_configs":{"items":{"$ref":"#/components/schemas/o11y.MSTeamsV2Config"},"type":"array"},"name":{"description":"A unique identifier for this receiver.","type":"string"},"opsgenie_configs":{"items":{"$ref":"#/components/schemas/o11y.OpsGenieConfig"},"type":"array"},"pagerduty_configs":{"items":{"$ref":"#/components/schemas/o11y.PagerdutyConfig"},"type":"array"},"pushover_configs":{"items":{"$ref":"#/components/schemas/o11y.PushoverConfig"},"type":"array"},"rocketchat_configs":{"items":{"$ref":"#/components/schemas/o11y.RocketchatConfig"},"type":"array"},"slack_configs":{"items":{"$ref":"#/components/schemas/o11y.SlackConfig"},"type":"array"},"sns_configs":{"items":{"$ref":"#/components/schemas/o11y.SNSConfig"},"type":"array"},"telegram_configs":{"items":{"$ref":"#/components/schemas/o11y.TelegramConfig"},"type":"array"},"victorops_configs":{"items":{"$ref":"#/components/schemas/o11y.VictorOpsConfig"},"type":"array"},"webex_configs":{"items":{"$ref":"#/components/schemas/o11y.WebexConfig"},"type":"array"},"webhook_configs":{"items":{"$ref":"#/components/schemas/o11y.WebhookConfig"},"type":"array"},"wechat_configs":{"items":{"$ref":"#/components/schemas/o11y.WechatConfig"},"type":"array"}},"type":"object"},"o11y.RocketchatAttachmentAction":{"properties":{"image_url":{"type":"string"},"is_webview":{"type":"boolean"},"msg":{"type":"string"},"msg_in_chat_window":{"type":"boolean"},"msg_processing_type":{"type":"string"},"text":{"type":"string"},"type":{"type":"string"},"url":{"type":"string"},"webview_height_ratio":{"type":"string"}},"type":"object"},"o11y.RocketchatAttachmentField":{"properties":{"short":{"type":"boolean"},"title":{"type":"string"},"value":{"type":"string"}},"type":"object"},"o11y.RocketchatConfig":{"properties":{"NotifierConfig":{"$ref":"#/components/schemas/o11y.NotifierConfig"},"actions":{"items":{"$ref":"#/components/schemas/o11y.RocketchatAttachmentAction"},"type":"array"},"api_url":{},"channel":{"description":"RocketChat channel override, (like #other-channel or @username).","type":"string"},"color":{"type":"string"},"emoji":{"type":"string"},"fields":{"items":{"$ref":"#/components/schemas/o11y.RocketchatAttachmentField"},"type":"array"},"http_config":{"$ref":"#/components/schemas/o11y.HTTPClientConfig"},"icon_url":{"type":"string"},"image_url":{"type":"string"},"link_names":{"type":"boolean"},"short_fields":{"type":"boolean"},"text":{"type":"string"},"thumb_url":{"type":"string"},"title":{"type":"string"},"title_link":{"type":"string"},"token":{},"token_file":{"type":"string"},"token_id":{},"token_id_file":{"type":"string"}},"type":"object"},"o11y.SNSConfig":{"properties":{"NotifierConfig":{"$ref":"#/components/schemas/o11y.NotifierConfig"},"api_url":{"type":"string"},"attributes":{"additionalProperties":{"type":"string"},"type":"object"},"http_config":{"$ref":"#/components/schemas/o11y.HTTPClientConfig"},"message":{"type":"string"},"phone_number":{"type":"string"},"sigv4":{"$ref":"#/components/schemas/o11y.SigV4Config"},"subject":{"type":"string"},"target_arn":{"type":"string"},"topic_arn":{"type":"string"}},"type":"object"},"o11y.SavedView":{"properties":{"category":{"type":"string"},"compositeQuery":{"$ref":"#/components/schemas/o11y.v3.CompositeQuery"},"createdAt":{"format":"date-time","type":"string"},"createdBy":{"type":"string"},"extraData":{"description":"ExtraData is JSON encoded data used by frontend to store additional data","type":"string"},"id":{},"name":{"type":"string"},"sourcePage":{"type":"string"},"tags":{"items":{"type":"string"},"type":"array"},"updatedAt":{"format":"date-time","type":"string"},"updatedBy":{"type":"string"}},"type":"object"},"o11y.ServiceConfig":{"properties":{"aws":{"$ref":"#/components/schemas/o11y.AWSServiceConfig"},"azure":{"$ref":"#/components/schemas/o11y.AzureServiceConfig"},"gcp":{"$ref":"#/components/schemas/o11y.GCPServiceConfig"}},"type":"object"},"o11y.SigV4Config":{"properties":{"AccessKey":{"type":"string"},"ExternalID":{"type":"string"},"Profile":{"type":"string"},"Region":{"type":"string"},"RoleARN":{"type":"string"},"SecretKey":{},"ServiceName":{"type":"string"},"UseFIPSSTSEndpoint":{"type":"boolean"}},"type":"object"},"o11y.SlackAction":{"properties":{"confirm":{"$ref":"#/components/schemas/o11y.SlackConfirmationField"},"name":{"type":"string"},"style":{"type":"string"},"text":{"type":"string"},"type":{"type":"string"},"url":{"type":"string"},"value":{"type":"string"}},"type":"object"},"o11y.SlackConfig":{"properties":{"NotifierConfig":{"$ref":"#/components/schemas/o11y.NotifierConfig"},"actions":{"items":{"$ref":"#/components/schemas/o11y.SlackAction"},"type":"array"},"api_url":{},"api_url_file":{"type":"string"},"app_token":{},"app_token_file":{"type":"string"},"app_url":{},"callback_id":{"type":"string"},"channel":{"description":"Slack channel override, (like #other-channel or @username).","type":"string"},"color":{"type":"string"},"fallback":{"type":"string"},"fields":{"items":{"$ref":"#/components/schemas/o11y.SlackField"},"type":"array"},"footer":{"type":"string"},"http_config":{"$ref":"#/components/schemas/o11y.HTTPClientConfig"},"icon_emoji":{"type":"string"},"icon_url":{"type":"string"},"image_url":{"type":"string"},"link_names":{"type":"boolean"},"message_text":{"type":"string"},"mrkdwn_in":{"items":{"type":"string"},"type":"array"},"pretext":{"type":"string"},"short_fields":{"type":"boolean"},"text":{"type":"string"},"thumb_url":{"type":"string"},"timeout":{"description":"Timeout is the maximum time allowed to invoke the slack. Setting this to 0\ndoes not impose a timeout.","format":"int64","type":"integer"},"title":{"type":"string"},"title_link":{"type":"string"},"username":{"type":"string"}},"type":"object"},"o11y.SlackConfirmationField":{"properties":{"dismiss_text":{"type":"string"},"ok_text":{"type":"string"},"text":{"type":"string"},"title":{"type":"string"}},"type":"object"},"o11y.SlackField":{"properties":{"short":{"type":"boolean"},"title":{"type":"string"},"value":{"type":"string"}},"type":"object"},"o11y.SpanAggregation":{"properties":{"aggregation":{},"field":{"$ref":"#/components/schemas/o11y.TelemetryFieldKey"}},"type":"object"},"o11y.SpanMapperConfig":{"properties":{"sources":{"items":{"$ref":"#/components/schemas/o11y.SpanMapperSource"},"type":"array"}},"type":"object"},"o11y.SpanMapperGroupCondition":{"properties":{"attributes":{"items":{"type":"string"},"type":"array"},"resource":{"items":{"type":"string"},"type":"array"}},"type":"object"},"o11y.SpanMapperSource":{"properties":{"context":{},"key":{"type":"string"},"operation":{},"priority":{"format":"int64","type":"integer"}},"type":"object"},"o11y.StatefulSetListRequest":{"properties":{"end":{"description":"epoch time in ms","format":"int64","type":"integer"},"filters":{"$ref":"#/components/schemas/o11y.FilterSet"},"groupBy":{"items":{"$ref":"#/components/schemas/o11y.AttributeKey"},"type":"array"},"limit":{"format":"int64","type":"integer"},"offset":{"format":"int64","type":"integer"},"orderBy":{"$ref":"#/components/schemas/o11y.OrderBy"},"start":{"description":"epoch time in ms","format":"int64","type":"integer"}},"type":"object"},"o11y.TLSConfig":{"properties":{"ca":{"description":"Text of the CA cert to use for the targets.","type":"string"},"ca_file":{"description":"The CA cert to use for the targets.","type":"string"},"ca_ref":{"description":"CARef is the name of the secret within the secret manager to use as the CA cert for the\ntargets.","type":"string"},"cert":{"description":"Text of the client cert file for the targets.","type":"string"},"cert_file":{"description":"The client cert file for the targets.","type":"string"},"cert_ref":{"description":"CertRef is the name of the secret within the secret manager to use as the client cert for\nthe targets.","type":"string"},"insecure_skip_verify":{"description":"Disable target certificate validation.","type":"boolean"},"key":{"description":"Text of the client key file for the targets."},"key_file":{"description":"The client key file for the targets.","type":"string"},"key_ref":{"description":"KeyRef is the name of the secret within the secret manager to use as the client key for\nthe targets.","type":"string"},"max_version":{"description":"Maximum TLS version."},"min_version":{"description":"Minimum TLS version."},"server_name":{"description":"Used to verify the hostname for the targets.","type":"string"}},"type":"object"},"o11y.TelegramConfig":{"properties":{"NotifierConfig":{"$ref":"#/components/schemas/o11y.NotifierConfig"},"api_url":{},"chat":{"format":"int64","type":"integer"},"chat_file":{"type":"string"},"disable_notifications":{"type":"boolean"},"http_config":{"$ref":"#/components/schemas/o11y.HTTPClientConfig"},"message":{"type":"string"},"message_thread_id":{"format":"int64","type":"integer"},"parse_mode":{"type":"string"},"token":{},"token_file":{"type":"string"}},"type":"object"},"o11y.TelemetryFieldKey":{"properties":{"description":{"type":"string"},"fieldContext":{},"fieldDataType":{},"name":{"type":"string"},"signal":{},"unit":{"type":"string"}},"required":["name"],"type":"object"},"o11y.ThreadingConfig":{"properties":{"enabled":{"type":"boolean"},"thread_by_date":{"type":"string"}},"type":"object"},"o11y.UninstallIntegrationRequest":{"properties":{"integration_id":{"type":"string"}},"type":"object"},"o11y.UpdatableAccountConfig":{"properties":{"aws":{"$ref":"#/components/schemas/o11y.AWSAccountConfig"},"azure":{"$ref":"#/components/schemas/o11y.UpdatableAzureAccountConfig"},"gcp":{"$ref":"#/components/schemas/o11y.UpdatableGCPAccountConfig"}},"type":"object"},"o11y.UpdatableAzureAccountConfig":{"properties":{"resourceGroups":{"items":{"type":"string"},"type":"array"}},"type":"object"},"o11y.UpdatableGCPAccountConfig":{"properties":{"deploymentProjectId":{"description":"Project ID where central pub/sub for logs exist","type":"string"},"deploymentRegion":{"description":"Compute service region where otel collector will be deployed","type":"string"},"projectIds":{"description":"List of project IDs to monitor","items":{"type":"string"},"type":"array"}},"type":"object"},"o11y.VariableItem":{"properties":{"type":{},"value":{}},"type":"object"},"o11y.VictorOpsConfig":{"properties":{"NotifierConfig":{"$ref":"#/components/schemas/o11y.NotifierConfig"},"api_key":{},"api_key_file":{"type":"string"},"api_url":{},"custom_fields":{"additionalProperties":{"type":"string"},"type":"object"},"entity_display_name":{"type":"string"},"http_config":{"$ref":"#/components/schemas/o11y.HTTPClientConfig"},"message_type":{"type":"string"},"monitoring_tool":{"type":"string"},"routing_key":{"type":"string"},"state_message":{"type":"string"}},"type":"object"},"o11y.VolumeListRequest":{"properties":{"end":{"description":"epoch time in ms","format":"int64","type":"integer"},"filters":{"$ref":"#/components/schemas/o11y.FilterSet"},"groupBy":{"items":{"$ref":"#/components/schemas/o11y.AttributeKey"},"type":"array"},"limit":{"format":"int64","type":"integer"},"offset":{"format":"int64","type":"integer"},"orderBy":{"$ref":"#/components/schemas/o11y.OrderBy"},"start":{"description":"epoch time in ms","format":"int64","type":"integer"}},"type":"object"},"o11y.WebexConfig":{"properties":{"NotifierConfig":{"$ref":"#/components/schemas/o11y.NotifierConfig"},"api_url":{},"http_config":{"$ref":"#/components/schemas/o11y.HTTPClientConfig"},"message":{"type":"string"},"room_id":{"type":"string"}},"type":"object"},"o11y.WebhookConfig":{"properties":{"NotifierConfig":{"$ref":"#/components/schemas/o11y.NotifierConfig"},"http_config":{"$ref":"#/components/schemas/o11y.HTTPClientConfig"},"max_alerts":{"description":"MaxAlerts is the maximum number of alerts to be sent per webhook message.\nAlerts exceeding this threshold will be truncated. Setting this to 0\nallows an unlimited number of alerts.","format":"uint64","type":"integer"},"timeout":{"description":"Timeout is the maximum time allowed to invoke the webhook. Setting this to 0\ndoes not impose a timeout.","format":"int64","type":"integer"},"url":{"description":"URL to send POST request to."},"url_file":{"type":"string"}},"type":"object"},"o11y.WechatConfig":{"properties":{"NotifierConfig":{"$ref":"#/components/schemas/o11y.NotifierConfig"},"agent_id":{"type":"string"},"api_secret":{},"api_secret_file":{"type":"string"},"api_url":{},"corp_id":{"type":"string"},"http_config":{"$ref":"#/components/schemas/o11y.HTTPClientConfig"},"message":{"type":"string"},"message_type":{"type":"string"},"to_party":{"type":"string"},"to_tag":{"type":"string"},"to_user":{"type":"string"}},"type":"object"},"o11y.addItemsIn":{"properties":{"id":{"description":"ID is the annotation queue to add to, from the path.","type":"string"},"items":{"description":"Items are the objects to enqueue for review, 1–200 per request. Each names\nexactly one object.","items":{"$ref":"#/components/schemas/o11y.itemInput"},"type":"array"}},"type":"object"},"o11y.alertmanagertypes.Receiver":{"properties":{"Receiver":{"$ref":"#/components/schemas/o11y.Receiver"},"googlechat_configs":{"items":{"$ref":"#/components/schemas/o11y.GoogleChatReceiverConfig"},"type":"array"}},"type":"object"},"o11y.createQueueReq":{"properties":{"description":{"description":"Description is optional free text, up to 512 characters.","type":"string"},"name":{"description":"Name is the queue's display handle, 1–128 printable characters. It must be\nunique within the org's project. Required.","type":"string"},"scoreConfigIds":{"description":"ScoreConfigIDs are the eval score-configs reviewers grade against.","items":{"type":"string"},"type":"array"}},"type":"object"},"o11y.itemInput":{"properties":{"assignee":{"description":"Assignee is the reviewer this item is for, up to 512 characters.","type":"string"},"objectId":{"description":"ObjectID is the referenced object's id, paired with objectType.","type":"string"},"objectType":{"description":"ObjectType is TRACE, OBSERVATION or SESSION — the generic form, paired\nwith objectId.","type":"string"},"observationId":{"description":"ObservationID references an observation — the console-friendly form of\nobjectType=OBSERVATION.","type":"string"},"sessionId":{"description":"SessionID references a session — the console-friendly form of\nobjectType=SESSION.","type":"string"},"traceId":{"description":"TraceID references a trace — the console-friendly form of\nobjectType=TRACE.","type":"string"}},"type":"object"},"o11y.querybuildertypesv5.OrderBy":{"properties":{"direction":{"description":"direction to order by"},"key":{"$ref":"#/components/schemas/o11y.OrderByKey","description":"key to order by"}},"type":"object"},"o11y.updateItemIn":{"properties":{"assignee":{"description":"Assignee replaces the reviewer this item is for, up to 512 characters.","type":"string"},"id":{"description":"ID is the annotation queue the item belongs to, from the path.","type":"string"},"itemId":{"description":"ItemID is the item to update, from the path.","type":"string"},"status":{"description":"Status is the item's new review state: PENDING or COMPLETED. Required.","type":"string"}},"type":"object"},"o11y.updateQueueIn":{"properties":{"description":{"description":"Description replaces the free text when present, up to 512 characters.","type":"string"},"id":{"description":"ID is the annotation queue to update, from the path.","type":"string"},"name":{"description":"Name replaces the queue's display handle when present, 1–128 printable\ncharacters and unique within the project.","type":"string"},"scoreConfigIds":{"description":"ScoreConfigIDs replaces the whole score-config set when present.","items":{"type":"string"},"type":"array"}},"type":"object"},"o11y.v3.CompositeQuery":{"properties":{"builderQueries":{"additionalProperties":{"$ref":"#/components/schemas/o11y.BuilderQuery"},"type":"object"},"chQueries":{"additionalProperties":{"$ref":"#/components/schemas/o11y.DatastoreQuery"},"type":"object"},"fillGaps":{"description":"FillGaps is used to fill the gaps in the time series data","type":"boolean"},"panelType":{"type":"string"},"promQueries":{"additionalProperties":{"$ref":"#/components/schemas/o11y.PromQuery"},"type":"object"},"queries":{"items":{"$ref":"#/components/schemas/o11y.QueryEnvelope"},"type":"array"},"queryType":{"type":"string"},"unit":{"description":"Unit for the time series data shown in the graph\nThis is used in alerts to format the value and threshold","type":"string"}},"type":"object"},"openai.ChatCompletionMessage":{"properties":{"MultiContent":{"items":{"$ref":"#/components/schemas/openai.ChatMessagePart"},"type":"array"},"content":{"type":"string"},"function_call":{"$ref":"#/components/schemas/openai.FunctionCall"},"name":{"type":"string"},"reasoning_content":{"type":"string"},"refusal":{"type":"string"},"role":{"type":"string"},"tool_call_id":{"type":"string"},"tool_calls":{"items":{"$ref":"#/components/schemas/openai.ToolCall"},"type":"array"}},"type":"object"},"openai.ChatCompletionRequest":{"properties":{"frequency_penalty":{"type":"number"},"function_call":{},"functions":{"items":{"$ref":"#/components/schemas/openai.FunctionDefinition"},"type":"array"},"logit_bias":{"additionalProperties":{"type":"integer"},"type":"object"},"logprobs":{"type":"boolean"},"max_completion_tokens":{"type":"integer"},"max_tokens":{"type":"integer"},"messages":{"items":{"$ref":"#/components/schemas/openai.ChatCompletionMessage"},"type":"array"},"metadata":{"additionalProperties":{"type":"string"},"type":"object"},"model":{"type":"string"},"n":{"type":"integer"},"parallel_tool_calls":{},"presence_penalty":{"type":"number"},"reasoning_effort":{"type":"string"},"response_format":{"$ref":"#/components/schemas/openai.ChatCompletionResponseFormat"},"seed":{"type":"integer"},"stop":{"items":{"type":"string"},"type":"array"},"store":{"type":"boolean"},"stream":{"type":"boolean"},"stream_options":{"$ref":"#/components/schemas/openai.StreamOptions"},"temperature":{"type":"number"},"tool_choice":{},"tools":{"items":{"$ref":"#/components/schemas/openai.Tool"},"type":"array"},"top_logprobs":{"type":"integer"},"top_p":{"type":"number"},"user":{"type":"string"}},"type":"object"},"openai.ChatCompletionResponseFormat":{"properties":{"json_schema":{"$ref":"#/components/schemas/openai.ChatCompletionResponseFormatJSONSchema"},"type":{"type":"string"}},"type":"object"},"openai.ChatCompletionResponseFormatJSONSchema":{"properties":{"description":{"type":"string"},"name":{"type":"string"},"schema":{},"strict":{"type":"boolean"}},"type":"object"},"openai.ChatMessageImageURL":{"properties":{"detail":{"type":"string"},"url":{"type":"string"}},"type":"object"},"openai.ChatMessagePart":{"properties":{"image_url":{"$ref":"#/components/schemas/openai.ChatMessageImageURL"},"text":{"type":"string"},"type":{"type":"string"}},"type":"object"},"openai.EmbeddingRequest":{"properties":{"dimensions":{"type":"integer"},"encoding_format":{"type":"string"},"input":{},"model":{"type":"string"},"user":{"type":"string"}},"type":"object"},"openai.FunctionCall":{"properties":{"arguments":{"type":"string"},"name":{"type":"string"}},"type":"object"},"openai.FunctionDefinition":{"properties":{"description":{"type":"string"},"name":{"type":"string"},"parameters":{},"strict":{"type":"boolean"}},"type":"object"},"openai.StreamOptions":{"properties":{"include_usage":{"type":"boolean"}},"type":"object"},"openai.Tool":{"properties":{"function":{"$ref":"#/components/schemas/openai.FunctionDefinition"},"type":{"type":"string"}},"type":"object"},"openai.ToolCall":{"properties":{"function":{"$ref":"#/components/schemas/openai.FunctionCall"},"id":{"type":"string"},"index":{"type":"integer"},"type":{"type":"string"}},"type":"object"},"patrol.patrolAlarmIn":{"properties":{"account":{"description":"Account is the alarm-panel account number that reported. It is what an\nactivation matches a site on when no site is named.","type":"string"},"raw":{"description":"Raw is the activation exactly as it arrived, kept verbatim up to 16 KiB.\nA panel's own idea of the time rides in here; when the activation was\nreceived is the server's stamp, which is the fact an insurer and a court\nread off it and the one every SLA clock runs from."},"ref":{"description":"Ref is the receiving centre's own reference for the activation.","type":"string"},"site":{"description":"Site names the site directly, by document name, when the caller already\nknows it.","type":"string"},"source":{"description":"Source is which receiver or operator the activation came through.","type":"string"},"trigger":{"description":"Trigger is what the panel reported.","type":"string"},"zone":{"description":"Zone is the panel zone that fired.","type":"string"}},"type":"object"},"patrol.patrolConfirmIn":{"properties":{"lat":{"description":"Lat is the latitude the confirmation was taken at.","format":"double","type":"number"},"lon":{"description":"Lon is the longitude the confirmation was taken at.","format":"double","type":"number"},"method":{"description":"Method is how presence was proved: tag, scan, fence, manual or photo.","type":"string"},"name":{"description":"Name is the checkpoint's document name, from the path.","type":"string"},"photo":{"description":"Photo is the object key of a photo taken there, never the bytes.","type":"string"}},"type":"object"},"patrol.patrolEventIn":{"properties":{"detail":{"description":"Detail is the longer account.","type":"string"},"level":{"description":"Level is red, amber, green or cyan.","type":"string"},"site":{"description":"Site is the site it is about, by document name.","type":"string"},"source":{"description":"Source is what raised it.","type":"string"},"title":{"description":"Title is the one line the feed shows.","type":"string"},"unit":{"description":"Unit is the unit it is about, by call sign.","type":"string"}},"type":"object"},"patrol.patrolFixIn":{"properties":{"at":{"description":"At is not a caller's to fill. A position report is stamped by the server,\nand a body naming it is refused rather than silently restamped: the trail is\nthe proof of where a unit was, so a report that thought it was dating itself\nmust learn otherwise.","type":"string"},"lat":{"description":"Lat is the latitude in degrees.","format":"double","type":"number"},"lon":{"description":"Lon is the longitude in degrees.","format":"double","type":"number"},"name":{"description":"Name is the unit's call sign, from the path.","type":"string"}},"type":"object"},"patrol.patrolIncidentAct":{"properties":{"act":{"description":"Act is VERIFY, DISPATCH, ROLL, ARRIVE, CHECK, SECURE, FILE, CLOSE or\nESCALATE.","type":"string"},"detail":{"description":"Detail is what to write on the trail with this act.","type":"string"},"false":{"description":"False says the activation turned out to be nothing, read by CLOSE.","type":"boolean"},"name":{"description":"Name is the incident's document name, from the path.","type":"string"},"outcome":{"description":"Outcome is what the incident came to, read by CLOSE.","type":"string"},"unit":{"description":"Unit is the call sign to send, read by DISPATCH.","type":"string"}},"type":"object"},"patrol.patrolIncidentIn":{"properties":{"ref":{"description":"Ref is the receiving centre's own reference.","type":"string"},"site":{"description":"Site is where it is happening, by document name.","type":"string"},"trigger":{"description":"Trigger is what was reported.","type":"string"},"zone":{"description":"Zone is the panel zone that reported.","type":"string"}},"type":"object"},"patrol.patrolMoveIn":{"properties":{"act":{"description":"Act is out, in or audit.","type":"string"},"holder":{"description":"Holder is who the keys went to. Who SIGNED for the move is the caller, and\nis stamped from the request rather than read from here.","type":"string"},"job":{"description":"Job is the work the keys were drawn for.","type":"string"},"name":{"description":"Name is the key set's reference, from the path.","type":"string"}},"type":"object"},"patrol.patrolNoteIn":{"properties":{"body":{"description":"Body is the remark.","type":"string"},"subject":{"description":"Subject is what the note is about.","type":"string"}},"type":"object"},"patrol.patrolReportIn":{"properties":{"client":{"description":"Client is the customer to report on, read by kind client. Naming one files\nan account that customer may download; leaving it empty covers every\ncustomer, which is an account of the operation and stays with it.","type":"string"},"from":{"description":"From is the start of the window to cover.","type":"string"},"incident":{"description":"Incident is the incident to report on, required for kind incident.","type":"string"},"kind":{"description":"Kind is shift, incident or client.","type":"string"},"to":{"description":"To is the end of that window.","type":"string"}},"type":"object"},"patrol.patrolSiteEdit":{"properties":{"category":{"description":"Category is what kind of premises this is.","type":"string"},"contact":{"description":"Contact is the keyholder to reach.","type":"string"},"eircode":{"description":"Eircode is the postal code.","type":"string"},"name":{"description":"Name is the site's document name, from the path.","type":"string"},"notes":{"description":"Notes is the standing brief for the site.","type":"string"},"sector":{"description":"Sector is the patrol sector the site sits in.","type":"string"},"sla":{"description":"SLA is the contracted response time in minutes.","format":"int64","type":"integer"},"status":{"description":"Status is ok, fault, alarm or offline.","type":"string"},"tier":{"description":"Tier is the contracted service tier.","type":"string"},"town":{"description":"Town is the town the site is in.","type":"string"}},"type":"object"},"patrol.patrolUnitStateIn":{"properties":{"name":{"description":"Name is the unit's call sign, from the path.","type":"string"},"state":{"description":"State is available, assigned, enroute, onsite, offline, break or emergency.","type":"string"}},"type":"object"},"platform.EnvVarJSON":{"properties":{"key":{"description":"Key is the variable's name in the container, which must match\n`^[A-Za-z_][A-Za-z0-9_]*$`. For a sealed value it is also the last segment\nof the KMS ref, so it is what identifies the value across a round trip.","type":"string"},"secret":{"description":"Secret says the value lives in KMS and never in the database. A caller may\nonly ADD secrecy: the server seals a value whose key or shape looks like a\ncredential anyway (secretshape.go), so an entry can come back secret that\nwas not sent that way.","type":"boolean"},"value":{"description":"Value is the plaintext, and it is WRITE-ONLY once the entry is secret: a\nsealed value reads back as \"\", and sending \"\" again KEEPS what is sealed\nrather than wiping it. Only a non-empty value seals a new one.","type":"string"}},"type":"object"},"platform.addDomainReq":{"properties":{"app":{"description":"App is the application's slug, from the path.","type":"string"},"host":{"description":"Host is the hostname to attach. Required, and must be a valid DNS hostname.","type":"string"},"project":{"description":"Project is the project the application lives under, from the path.","type":"string"}},"type":"object"},"platform.appMove":{"properties":{"app":{"description":"App is the declaration's name, from the path.","type":"string"},"mode":{"description":"Mode is `branch` (the default) or `commit`.","type":"string"},"org":{"description":"Org is the values directory the app lives in, defaulting to the caller's own\norg.","type":"string"},"partOf":{"description":"PartOf is the project to move it to. A name nothing names yet creates it.","type":"string"}},"type":"object"},"platform.binarySpec":{"properties":{"image":{"description":"Image is the toolchain image the recipe runs in, a Go bookworm image by\ndefault. It is the one field the GitHub lane ignores: there the runner IS\nthe toolchain, and a cluster has to be told what a runner already is.","type":"string"},"ldflags":{"description":"Ldflags are the Go linker flags, `-s -w` when the recipe names none, on one\nline. Go lane only.","type":"string"},"main":{"description":"Main is the Go package to build, repo-relative (`.` or `./cmd/x`), and it\nselects the GO LANE. Defaults to `.` when neither lane is named; declaring\nit together with `run` is refused.","type":"string"},"name":{"description":"Name is the artifact's base name: the prefix of every file published for\nthis entry, and the name a host later asks for. It must match\n`^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$`, which is what makes it safe as both a\nfilename and a URL path segment.","type":"string"},"out":{"description":"Out is the glob of files `run` produced, relative to the repo root; matching\nnothing FAILS the build rather than publishing an empty entry. It expands\nunquoted, so it is bounded to path and glob characters. The Go lane names\nits own files and ignores this.","type":"string"},"platforms":{"description":"Platforms are the `<os>/<arch>` pairs the Go lane cross-compiles, [linux/amd64]\nby default. Each one publishes as `<name>-<os>-<arch>`, which is the shape a\nhost resolves a binary BY — so the list is what a caller can ask for later.","items":{"type":"string"},"type":"array"},"run":{"description":"Run is any other toolchain's build command, run by `sh -c` in this entry's\nimage, and it selects the OTHER LANE. Arbitrary shell is the point — it is\nthe same trust as a Dockerfile RUN — which is why it executes with no\nobject-store credential and no service-account token. It requires `out`.","type":"string"}},"type":"object"},"platform.createAppReq":{"properties":{"buildType":{"description":"BuildType is `pack` — the zero-config default that detects any project —\nor `dockerfile`, the explicit escape hatch. An image app never builds.","type":"string"},"description":{"description":"Description is free text about what the application is.","type":"string"},"dockerfile":{"description":"Dockerfile is the path to build from, for buildType `dockerfile`.","type":"string"},"domains":{"description":"Domains are extra ingress hosts. The canonical default host is always\nattached; a bare custom host is refused here and must go through\nadd-domain → verify first.","items":{"type":"string"},"type":"array"},"env":{"description":"Env is the application's environment. Keys must match\n`^[A-Za-z_][A-Za-z0-9_]*$`; a variable marked `secret: true` is sealed into\nKMS and its plaintext is never written to the database.","items":{"$ref":"#/components/schemas/platform.EnvVarJSON"},"type":"array"},"environment":{"description":"Environment is the deploy target this app names (\"production\" by default).","type":"string"},"image":{"$ref":"#/components/schemas/platform.imageOrigin","description":"Image is the container image to run, for source `image`."},"name":{"description":"Name is the application's display name. Required; the slug is derived from\nit when none is given.","type":"string"},"port":{"description":"Port is the container port the app listens on.","format":"int64","type":"integer"},"project":{"description":"Project is the project to create the application under, from the path.","type":"string"},"replicas":{"description":"Replicas is how many copies to run; clamped to the deployment's limit\nrather than refused.","format":"int64","type":"integer"},"repo":{"$ref":"#/components/schemas/platform.gitOrigin","description":"Repo is the git source to build from, for source `git`."},"slug":{"description":"Slug is the app's identity in the cluster — its CR name and part of its\nhost. Given or derived from Name, it must match\n`^[a-z0-9]([a-z0-9-]{0,38}[a-z0-9])?$`, and one already used in this\nproject is 409.","type":"string"},"source":{"description":"Source is `git`, which requires repo.url, or `image`, which requires\nimage.repository. Anything else is 400.","type":"string"},"storageGb":{"description":"StorageGB is the persistent volume size in GiB; absent means stateless.\nClamped to the deployment's limit rather than refused.","format":"int64","type":"integer"}},"type":"object"},"platform.declRef":{"properties":{"name":{"description":"Name is the declaration's name, the file's basename.","type":"string"},"org":{"description":"Org is the values directory the declaration lives in.","type":"string"}},"type":"object"},"platform.deployReq":{"properties":{"app":{"description":"App is the application's slug, from the path.","type":"string"},"commit":{"description":"Commit is the git commit or ref to build, for a git-source app. Defaults to\nthe app's branch.","type":"string"},"project":{"description":"Project is the project the application lives under, from the path.","type":"string"},"tag":{"description":"Tag is the image tag to deploy, for an image-source app. Defaults to the\napp's tag, then `latest`.","type":"string"}},"type":"object"},"platform.gitOrigin":{"properties":{"branch":{"description":"Branch is the branch to build; defaults to `main` for a git source.","type":"string"},"url":{"description":"URL is the repository clone URL. Required for source `git`, and validated\nagainst the same allowlist the privileged build enforces.","type":"string"}},"type":"object"},"platform.imageOrigin":{"properties":{"repository":{"description":"Repository is the image repository. Required for source `image`.","type":"string"},"tag":{"description":"Tag is the image tag to deploy; `latest` when omitted.","type":"string"}},"type":"object"},"platform.previewReq":{"properties":{"app":{"description":"App is the parent application's slug, from the path.","type":"string"},"branch":{"description":"Branch is the branch to preview; defaults to the parent app's branch.","type":"string"},"image":{"description":"Image is the already-built image ref to deploy. Required — a preview never\nbuilds.","type":"string"},"project":{"description":"Project is the project the parent application lives under, from the path.","type":"string"}},"type":"object"},"platform.projectCreate":{"properties":{"apps":{"description":"Apps are the declarations it starts with, each by values directory (`org`,\ndefaulting to the caller's own) and name. At least one: a project is the apps\nthat name it.","items":{"$ref":"#/components/schemas/platform.declRef"},"type":"array"},"mode":{"description":"Mode is `branch` (the default: a review branch, nothing deploys) or `commit`\n(main).","type":"string"},"name":{"description":"Name is the project, a DNS-1123 label; it becomes each app's `partOf`.","type":"string"},"org":{"description":"Org names the project's owner, defaulting to the caller's own scope; naming\nanother is an act-as only a SuperAdmin has.","type":"string"}},"type":"object"},"platform.projectRename":{"properties":{"mode":{"description":"Mode is `branch` (the default) or `commit`.","type":"string"},"name":{"description":"Name is its new name, which no app may already name.","type":"string"},"org":{"description":"Org names the project's owner, defaulting to the caller's own scope.","type":"string"},"project":{"description":"Project is the project to rename, from the path.","type":"string"}},"type":"object"},"platform.promoteReq":{"properties":{"app":{"description":"App is the application's slug, from the path.","type":"string"},"deploymentId":{"description":"DeploymentID promotes that deployment's exact built image. One of this and\nTag is required.","type":"string"},"project":{"description":"Project is the project the application lives under, from the path.","type":"string"},"tag":{"description":"Tag promotes an image tag, resolved the same way a deploy resolves one.","type":"string"}},"type":"object"},"platform.rollbackReq":{"properties":{"app":{"description":"App is the application's slug, from the path.","type":"string"},"deploymentId":{"description":"DeploymentID is the deployment to redeploy. Omit it to return to the\nprevious release.","type":"string"},"project":{"description":"Project is the project the application lives under, from the path.","type":"string"}},"type":"object"},"platform.runReq":{"properties":{"env":{"description":"Env is the run's environment. Keys must match `^[A-Za-z_][A-Za-z0-9_]*$`;\na variable marked `secret: true` is sealed into KMS.","items":{"$ref":"#/components/schemas/platform.EnvVarJSON"},"type":"array"},"gpu":{"description":"GPU is how many GPUs the run asks for; a negative value is 400.","format":"int64","type":"integer"},"image":{"description":"Image is the container image to run. Required.","type":"string"},"maxScale":{"description":"MaxScale above the floor declares an autoscaling ceiling; 0 means no\nautoscaler at all — a fixed run at the floor.","format":"int64","type":"integer"},"minScale":{"description":"MinScale is the replica floor, clamped to the deployment's limit.","format":"int64","type":"integer"},"name":{"description":"Name is the run's name, and the slug is derived from it. Required, and it\nmust resolve to `^[a-z0-9]([a-z0-9-]{0,38}[a-z0-9])?$`. Re-running the same\nname updates that run in place.","type":"string"},"port":{"description":"Port is the container port the run listens on.","format":"int64","type":"integer"},"runtime":{"description":"Runtime is accepted for the client contract and echoed nowhere: the image\nIS the runtime unit.","type":"string"},"shape":{"description":"Shape is a compute size label, echoed back; sizing is the operator's\ndefault. Defaults to \"auto\".","type":"string"}},"type":"object"},"platform.runnerBuildReq":{"properties":{"arch":{"description":"Arch is the target architecture for the artifact lane.","type":"string"},"args":{"additionalProperties":{"type":"string"},"description":"Args are --build-arg values. They are what lets several images off ONE\nDockerfile mean different things — the sandbox classes are three entries\ndiffering only by STAGE. Validated at the k8s choke point, with VERSION and\nREVISION taking precedence: those are receipts the builder derives from the\ntag and the commit, and a caller that could overwrite them could make an\nimage lie about which commit it is.","type":"object"},"binaries":{"description":"Binaries selects the ARTIFACT lane (artifact.go): build what the repo's\nhanzo.yml `binaries:` block declares — a Go binary, an npm tarball, a Rust\nbinary — and publish it to hanzoai/s3 instead of pushing an image. It is the\nsame recipe hanzoai/ci reads, sent verbatim, so `image` is meaningless here\nand must be absent.","items":{"$ref":"#/components/schemas/platform.binarySpec"},"type":"array"},"branch":{"description":"Branch is the branch to build when no SHA or Ref is given.","type":"string"},"bucket":{"description":"Bucket mirrors hanzo.yml's `bucket:` — where the artifact lane publishes.","type":"string"},"context":{"description":"Context is the build context path within the repo.","type":"string"},"dockerTarget":{"description":"DockerTarget is the multi-stage build target to stop at.","type":"string"},"dockerfile":{"description":"Dockerfile is the path to build from; empty uses the zero-config frontend.","type":"string"},"image":{"description":"Image is the output image ref to push. Required on the image lane, and it\nmust target a registry namespace the caller's org owns.","type":"string"},"os":{"description":"OS is the target operating system for the artifact lane.","type":"string"},"platforms":{"description":"Platforms are the `<os>/<arch>` pairs the image is built for. EMPTY MEANS\nEVERY ARCHITECTURE THE FLEET HAS — each built on a node of that\narchitecture, joined by ONE manifest index, so a single tag serves both.\nName one to build only that one.","items":{"type":"string"},"type":"array"},"ref":{"description":"Ref is the git ref to build when no SHA is given.","type":"string"},"repo":{"description":"Repo is the repository clone URL to build. Required on the image lane.","type":"string"},"sha":{"description":"SHA is the commit to pin; it wins over Ref and Branch.","type":"string"},"tag":{"description":"Tag is the publish path segment, so both entry points write ONE index at ONE\nURL. It defaults to the pinned ref, and must be named explicitly for a\nbranch.","type":"string"},"tags":{"description":"Tags are more tags of Image's own repository, pushed onto the same manifest\nby the same export, so every one names the digest Image does — by\nconstruction, not by a second push agreeing with the first. Bare tags\n(`v1.2.3`, `latest`), at most 8, and only beside a tag Image: a digest names\nan image that already exists. Duplicates and Image's own tag are dropped;\nthe answer's `tags` lists what will be written.","items":{"type":"string"},"type":"array"}},"type":"object"},"platform.setEnvReq":{"properties":{"app":{"description":"App is the application's slug, from the path.","type":"string"},"env":{"description":"Env is the app's whole environment set, REPLACING what it had. Keys must\nmatch `^[A-Za-z_][A-Za-z0-9_]*$`; a variable marked `secret: true` is\nsealed into KMS and blanked in the database.","items":{"$ref":"#/components/schemas/platform.EnvVarJSON"},"type":"array"},"project":{"description":"Project is the project the application lives under, from the path.","type":"string"}},"type":"object"},"principal.clearIn":{"properties":{"amount":{"description":"Amount is the gross amount in U.S. dollars, e.g. \"1250.00\".","type":"string"},"category":{"description":"Category is what is bought: services, attorney, rents, royalties, other or\nmerchandise. Services when omitted.","type":"string"},"payee":{"description":"Payee is the org id of the org to be paid.","type":"string"},"performed":{"description":"Performed is where the service is performed — for rents, where the property\nis; for royalties, where it is used — as an ISO 3166-1 alpha-2 code. It\ndecides the source of a foreign payee's income, and so its withholding.","type":"string"},"platform":{"description":"Platform is whether the caller operates the platform through which the payee\nprovides this to the platform's users, which decides platform-operator\nreporting. Omitted, it is asked back as a fact when it matters.","type":"boolean"},"rail":{"description":"Rail is how it will move: x402, ledger, chain, ach, wire, card, network or\nother — the rails an economic event names. Ledger when omitted.","type":"string"}},"type":"object"},"project.projectsBuildSite":{"properties":{"brief":{"description":"Brief is what the site should be, in plain language. It is the whole input the\nmodel gets and it is size-bounded.","type":"string"},"model":{"description":"Model names which model writes the site. Absent takes the deployment's\ndefault — this route spends inference on the caller's org either way.","type":"string"},"name":{"description":"Name is the site's display name. Taken from what the model writes when omitted.","type":"string"},"slug":{"description":"Slug is the handle and public host label to publish under. Derived from the\nname, or from the brief, when omitted.","type":"string"}},"type":"object"},"project.projectsComplete":{"properties":{"bytes":{"description":"Bytes is their total size in bytes.","format":"int64","type":"integer"},"commit":{"description":"Commit is the revision that was built, recorded on the deployment.","type":"string"},"copy":{"description":"Copy lists the keys to take from CopyFrom's prefix, relative to it. They are\nalso named in Keys, which stays the whole release.","items":{"type":"string"},"type":"array"},"copyFrom":{"description":"CopyFrom names another site of the same org whose prefix already holds the\nbytes of Copy. A host that shares a build with another differs from it by a\npage or two, so CI uploads those and asks for the rest to be copied inside\nthe object store instead of sent again over the runner's link.","type":"string"},"files":{"description":"Files is how many objects CI published.","format":"int64","type":"integer"},"id":{"description":"ID is the queued deployment to complete, from the path.","type":"string"},"keys":{"description":"Keys is the manifest CI just uploaded, RELATIVE to the deployment prefix. It\nis what replaces `aws s3 sync --delete`: an upload grant authorizes writes\nonly, so CI cannot remove a file, and cloud reconciles the prefix against\nthis list instead (grant.go). Omit it and nothing is deleted — the prefix\nonly grows, which is the old pre-grant behaviour and a safe default.","items":{"type":"string"},"type":"array"},"liveUrl":{"description":"LiveURL is a HINT at the address the site should serve at. The public host is\nclaimed by cloud first, so this can refine the URL a deployment reports but\ncan never assert a subdomain another tenant holds.","type":"string"},"message":{"description":"Message is what happened, in words — on an error completion, why it failed.","type":"string"},"slug":{"description":"Slug is the project the deployment belongs to, from the path.","type":"string"},"status":{"description":"Status is how the build ended: `live` if it succeeded, `error` if it did not.\nNothing else is accepted.","type":"string"}},"type":"object"},"project.projectsCreate":{"properties":{"analytics":{"description":"Analytics is the opt-OUT for the wired-by-default analytics beacon: absent\n(nil) ⇒ ON (the default); explicit false ⇒ off. A pointer so \"unset\" is\ndistinguishable from \"false\" — the only way to turn the default off.","type":"boolean"},"description":{"description":"Description is the one-line summary, copied onto anything forked from this\nproject.","type":"string"},"framework":{"description":"Framework is a BUILD HINT from a closed set, defaulting to static. It tells CI\nhow to build a linked repo and never gates a deploy.","type":"string"},"license":{"description":"License is the terms that upstream work carries.","type":"string"},"name":{"description":"Name is the project's display name and the only REQUIRED field. When slug is\nomitted it is also what the slug is derived from.","type":"string"},"repo":{"description":"Repo links a git source, so pushes to it rebuild this project. Omit it for a\nproject deployed by uploading an artifact.","properties":{"branch":{"type":"string"},"url":{"type":"string"}},"type":"object"},"slug":{"description":"Slug is the handle everything else addresses this project by: the public host\n`<slug>.hanzo.app`, the object-store key segment, and the path parameter of\nevery later call. Derived from the name when omitted. It is a hostname label,\nso it is constrained and reserved labels such as `api` or `admin` are refused.","type":"string"},"upstream":{"description":"Upstream credits the third-party work this project was published from. It is\naccepted from any caller: giving away credit can only cost the publisher, so\nit needs no gate.","type":"string"},"visibility":{"description":"Visibility is \"public\" (the default when absent) or \"private\". Publishing\npublicly is ungated — that is the point of a community. Going PRIVATE is\nthe paid feature, so an unfunded org asking for it is refused rather than\nsilently downgraded (see resolve).","type":"string"}},"type":"object"},"project.projectsDeploySite":{"properties":{"files":{"description":"Files is the whole site, inline — every file it consists of. It REPLACES what\nis there rather than merging, so an omitted file is a deleted one.","items":{"$ref":"#/components/schemas/project.projectsFile"},"type":"array"},"name":{"description":"Name is the site's display name.","type":"string"},"slug":{"description":"Slug is the handle and public host label to publish under.","type":"string"}},"type":"object"},"project.projectsDeployStart":{"properties":{"commit":{"description":"Commit is the git sha this build was produced from, recorded on the\ndeployment so a released site can be traced back to its source. Optional.\n\nIt is the ONLY field here, and deliberately: the predecessor also accepted\n`source` and `branch`. `source` was the Content-Type discriminator this\nsplit removed. `branch` was accepted and DISCARDED — there is no branch\ncolumn on a deployment, and the lifecycle event derives the branch from the\nproject's own linked one — so declaring it would publish a settable field\nthat does nothing into the document, every generated SDK and the MCP input\nschema. A field that is read by nothing is not described as if it were.\n\n`url:\"-\"` because zip binds the query string OVER a decoded body, so\nwithout it a `?commit=` the caller never sent would outrank the one it did.","type":"string"},"slug":{"description":"Slug is the site to deploy, from the path.","type":"string"}},"type":"object"},"project.projectsDomainsBind":{"properties":{"domains":{"description":"Domains are the custom hostnames to attach, in order. An empty list is a\n400 rather than a clear — releasing a host is its own call.","items":{"type":"string"},"type":"array"},"slug":{"description":"Slug is the site the hosts attach to, from the path.","type":"string"}},"type":"object"},"project.projectsFile":{"properties":{"content":{"description":"Content is the file's whole text, inline. There is no upload step and no\nreference to fetch: a site is sent as its bytes, and each file and the site as\na whole are size-bounded.","type":"string"},"path":{"description":"Path is where the file lands in the site, RELATIVE to its root — so\n\"index.html\" is the page served at /. Leading slashes and any attempt to\nescape the root are refused.","type":"string"}},"type":"object"},"project.projectsFork":{"properties":{"name":{"description":"target project name (optional; defaults to the parent's title)","type":"string"},"slug":{"description":"parent slug to fork — catalog template or published project (required)","type":"string"},"target":{"description":"Target overrides the derived project slug (optional; defaults to the\nparent slug). Kept distinct from Slug so callers can rename on fork.","type":"string"},"variant":{"description":"Variant picks a template's format/page/theme (optional; defaults to the\ntemplate's first shape). This is the axis the catalog used to spend\nsibling slugs on, so it is expressed here, where the user's preference is.","type":"string"}},"type":"object"},"project.projectsPublish":{"properties":{"slug":{"description":"Slug is the site to publish, from the path.","type":"string"},"source":{"description":"Source is the build output to promote, as a path RELATIVE to your org's own\nstorage space — never a URL and never a bucket. The org segment is prepended\nserver-side from the validated principal, so the worst a hostile source can\naddress is something your own org already owns.","type":"string"}},"type":"object"},"project.projectsUpdate":{"properties":{"cacheControl":{"description":"CacheControl replaces the Cache-Control policy the edge serves this site's\nHTML under. Absent leaves it.","type":"string"},"description":{"description":"Description replaces the one-line summary. Absent leaves it.","type":"string"},"dropLocal":{"description":"DropLocal turns the drop of localhost events at ingest on or off. Absent leaves it.","type":"boolean"},"framework":{"description":"Framework replaces the build hint. It affects the NEXT build only — nothing\nalready deployed is rebuilt.","type":"string"},"hidden":{"description":"Hidden is MODERATION, and the only admin-gated field on this body: it pulls\na public project out of the catalogue from admin.hanzo.ai without editing\nthe publisher's own visibility choice, so un-hiding restores exactly what\nthey asked for. A tenant sending it is ignored.","type":"boolean"},"hiddenReason":{"description":"HiddenReason records WHY moderation hid it, so the action can be explained\nand reviewed later. Admin-gated like hidden itself.","type":"string"},"internalNetworks":{"description":"InternalNetworks replaces the site's own addresses: CIDRs or bare addresses, at\nmost 64. Absent leaves them; send [] to clear.","items":{"type":"string"},"type":"array"},"license":{"description":"License is the terms that upstream work carries, with the same clear-versus-\nleave rule.","type":"string"},"name":{"description":"Name replaces the display name. Absent leaves it; the slug never moves with it.","type":"string"},"repo":{"description":"Repo relinks the git source. Absent leaves the existing link.","properties":{"branch":{"type":"string"},"url":{"type":"string"}},"type":"object"},"slug":{"description":"Slug is the project to update, from the path. The URL is the addressing\nauthority — a `slug` in the body cannot move the write to another project.","type":"string"},"tags":{"additionalProperties":{"type":"string"},"description":"Tags sets the site's browser tag config: platform slug → non-secret pixel id\n(e.g. {\"ga4\":\"G-…\",\"meta\":\"…\"}). track.js injects these first-party and the\nserver CAPI reads them, per site. Absent LEAVES them; a present object REPLACES\nthe set (send {} to clear). The ids are public — they ship in the page — so this\nis not the SECRET path (a CAPI token is sealed via POST /v1/destination).","type":"object"},"upstream":{"description":"Upstream credits the third-party work this project was published from, and is\nsettable after the fact because the live demos are the ones that most need\ncrediting. An explicit empty string CLEARS the credit; absent leaves it.","type":"string"},"visibility":{"description":"Visibility flips an existing project between \"public\" and \"private\". Same\nONE rule as at create: public is free, private needs a paid plan.","type":"string"}},"type":"object"},"prompt.promptReq":{"properties":{"labels":{"description":"Labels is free-form taxonomy, each up to 64 characters, capped at 32 entries.","items":{"type":"string"},"type":"array"},"name":{"description":"Name is the org-unique handle AND the URL segment the prompt is addressed by:\n1-64 characters matching ^[A-Za-z0-9][A-Za-z0-9._-]*$. \"metrics\", \"new\" and\n\"catalog\" are reserved. A name that already exists appends a new version.","type":"string"},"prompt":{"description":"Prompt is the template body, capped at 64 KiB. It holds template text only —\nnever a secret.","type":"string"},"tags":{"description":"Tags is free-form taxonomy under the same bounds as Labels.","items":{"type":"string"},"type":"array"},"type":{"description":"Type labels the template's kind; defaults to \"text\".","type":"string"}},"type":"object"},"provider.connectIn":{"properties":{"accountId":{"description":"AccountID is the provider account the credential should be scoped to, for the\nproviders whose Verify needs one (Cloudflare). Ignored by the OAuth path.","type":"string"},"fields":{"additionalProperties":{"type":"string"},"description":"Fields are the named inputs of a credential connector whose form is more\nthan one key (the connector's published fields). Their presence selects\nthe credential path exactly as Token's does. Never logged or echoed.","type":"object"},"provider":{"description":"Provider is the connector's registry id, from the :provider path segment.","type":"string"},"return":{"description":"Return is the page the OAuth callback sends the person back to, with\nconnected=<provider>&account=<label> or error=<provider>&reason=<why> added\nto its query. It must name one of this deployment's return pages (on\napi.hanzo.ai: https://hanzo.ai/?at=-/settings/integrations,\nhttps://console.hanzo.ai/connectors, https://platform.hanzo.ai/connectors);\nanything else, or nothing, returns to the console's /connectors. Ignored by\nthe credential path.","type":"string"},"token":{"description":"Token is the customer's provider credential. Its PRESENCE — not its value —\nis what selects the apikey seal over the OAuth flow for a provider that\noffers both: {\"token\":\"…\"}, even empty, is an apikey attempt (→ verify, which\nanswers the \"token required\" 400 on an empty value), while a body with no\ntoken key (the console Connect button, `hanzo connector add` with no --token)\nstarts OAuth. Read on STDIN by the CLI, never argv; never logged or echoed.","type":"string"}},"type":"object"},"provider.credentialIn":{"properties":{"accountId":{"description":"AccountID scopes the credential where the provider's Verify needs one.","type":"string"},"label":{"description":"Label names this connection; empty means \"default\".","type":"string"},"oauth":{"$ref":"#/components/schemas/provider.oauthBundleIn","description":"OAuth is a bundle the CLI already obtained through its own local PKCE flow.\nPresent ⇒ the Adopt path; absent ⇒ the Token path."},"provider":{"description":"Provider is the user-scoped provider's registry id, from the path.","type":"string"},"token":{"description":"Token is the customer-held credential for the Verify path. Read on STDIN by\nthe CLI, never argv; never logged, echoed, or stored outside KMS.","type":"string"}},"type":"object"},"provider.deviceStartIn":{"properties":{"label":{"description":"Label names this connection so one user can hold several per provider\n(\"work\", \"personal\"). Empty means \"default\". 1-64 of [A-Za-z0-9._-].","type":"string"},"provider":{"description":"Provider is the user-scoped provider's registry id, from the path.","type":"string"}},"type":"object"},"provider.githubBackfillIn":{"properties":{"repo":{"description":"Repo narrows the pass to ONE granted repository, named `owner/name` or\nbare `name` (case-insensitive). Empty walks every granted repository. A\nproject page syncs its own issues with this; the org-wide pass stays the\ndefault. A name the connection does not grant is a 404, never a silent\nempty pass that reads as \"this repository has no issues\".","type":"string"},"state":{"description":"State is the GitHub issue state to walk: \"open\" (the default), \"closed\" or\n\"all\". Anything else is a 400.","type":"string"}},"type":"object"},"provider.githubForkReq":{"properties":{"org":{"description":"Org is the GitHub account to fork INTO; empty forks to the installation's\nown account, which is the common case.","type":"string"},"repo":{"description":"Repo is a repository the org's installation was GRANTED, by name.","type":"string"}},"type":"object"},"provider.githubImportIn":{"properties":{"all":{"description":"All imports every repository the installation grants, instead of naming\nthem. Archived and disabled repositories are skipped either way — they\ncannot be fetched.","type":"boolean"},"repos":{"description":"Repos names the repositories to import, either owner-qualified\n(\"hanzo-apps/ai\") or as a bare name (\"ai\"); a trailing \".git\" is stripped.\nA bare name that matches more than one granted repository is an error\nrather than a guess, because one Hanzo org may hold several GitHub\ninstallations and a name is only unique within an owner.\nIgnored when all is true.","items":{"type":"string"},"type":"array"}},"type":"object"},"provider.githubPagesEnableReq":{"properties":{"branch":{"description":"Branch is the legacy source branch; empty defaults to the repo's own default\nbranch. Ignored when buildType is \"workflow\".","type":"string"},"buildType":{"description":"BuildType selects the builder: \"workflow\" builds via GitHub Actions, anything\nelse builds from the branch source above.","type":"string"},"path":{"description":"Path is the source directory within the branch: \"/\" (the default) or \"/docs\".\nGitHub allows no others.","type":"string"},"repo":{"description":"Repo is the repository, from the :repo path segment.","type":"string"}},"type":"object"},"provider.githubPagesUpdateReq":{"properties":{"branch":{"description":"Branch switches the legacy source branch. Empty leaves the source alone.","type":"string"},"buildType":{"description":"BuildType switches the builder: \"legacy\" or \"workflow\". Empty leaves it.","type":"string"},"cname":{"description":"CNAME is the custom domain. Omit to leave it alone, \"\" to clear it, or a\nvalid FQDN to set it.","type":"string"},"httpsEnforced":{"description":"HTTPSEnforced toggles GitHub's enforce-HTTPS bit. Omit to leave it alone.","type":"boolean"},"path":{"description":"Path is the source directory to pair with Branch: \"/\" (the default) or\n\"/docs\". Read only when Branch is given.","type":"string"},"repo":{"description":"Repo is the repository, from the :repo path segment.","type":"string"}},"type":"object"},"provider.githubSearchReq":{"properties":{"limit":{"description":"Limit caps the answer; 0 takes the default and anything above the ceiling\nis clamped rather than refused.","format":"int64","type":"integer"},"q":{"description":"Q is GitHub's own search syntax, passed through: \"tetris language:go\",\n\"org:hanzoai stars:>10\". Passing it through rather than inventing a\nvocabulary means one thing to learn, and it is theirs.","type":"string"}},"type":"object"},"provider.githubUserCompleteIn":{"properties":{"grant":{"description":"Grant is the id the callback handed the console in its redirect. It is\nsingle-use, lives ten minutes, and is readable only by the person who\nstarted the flow.","type":"string"}},"type":"object"},"provider.githubUserConnectIn":{"properties":{"return":{"description":"Return is the page the callback sends the person back to, with\ncomplete=github&grant=<id> (or error=github&reason=<why>) added to its\nquery. It must name one of this deployment's return pages (on\napi.hanzo.ai: https://hanzo.ai/?at=-/settings/integrations,\nhttps://console.hanzo.ai/connectors, https://platform.hanzo.ai/connectors);\nanything else, or nothing, returns to the console's /connectors.","type":"string"}},"type":"object"},"provider.googleUserCompleteIn":{"properties":{"grant":{"description":"Grant is the id the callback handed the page in its redirect. It is\nsingle-use, lives ten minutes, and is readable only by the person who\nstarted the flow.","type":"string"}},"type":"object"},"provider.googleUserConnectIn":{"properties":{"return":{"description":"Return is the page the callback sends the person back to, with\ncomplete=google&grant=<id> (or error=google&reason=<why>) added to its\nquery. It must name one of this deployment's return pages; anything else,\nor nothing, returns to the console's /connectors.","type":"string"}},"type":"object"},"provider.linearBackfillIn":{"properties":{"state":{"description":"State is the set of issues to walk: \"open\" (the default), \"closed\" or \"all\".","type":"string"}},"type":"object"},"provider.linearClaimIn":{"properties":{"secret":{"description":"Secret is the signing secret configured on the webhook in Linear. Claiming\nagain with a new value rotates it.","type":"string"}},"type":"object"},"provider.linearCommentIn":{"properties":{"body":{"description":"Body is the comment, Markdown.","type":"string"},"issue":{"description":"Issue is the issue's identifier (ENG-123) or its id.","type":"string"}},"type":"object"},"provider.oauthBundleIn":{"properties":{"access":{"description":"Access is the access token.","type":"string"},"account":{"description":"Account is the account label the flow reported; sanitized on ingest.","type":"string"},"refresh":{"description":"Refresh is the refresh token. It is sealed and NEVER handed back out.","type":"string"}},"type":"object"},"provider.runIn":{"properties":{"action":{"description":"Action is the action's name, as GET /v1/provider/{provider} lists it.","type":"string"},"input":{"additionalProperties":{},"description":"Input is the action's props, by name.","type":"object"},"provider":{"description":"Provider is the connector, from the path.","type":"string"}},"type":"object"},"provider.slackReactIn":{"properties":{"channel":{"description":"Channel is a Slack channel ID, name (#hanzo-gtm), or channel mention.","type":"string"},"name":{"description":"Name is the emoji's name WITHOUT colons — \"eyes\", not \":eyes:\".","type":"string"},"ts":{"description":"TS is the exact timestamp of the message to react to.","type":"string"}},"type":"object"},"provider.slackSearchIn":{"properties":{"count":{"description":"Count bounds the page, 1-100. Zero means 20.","format":"int64","type":"integer"},"page":{"description":"Page is the 1-based page of results. Zero means the first.","format":"int64","type":"integer"},"query":{"description":"Query is Slack's own search syntax — bare words, or in:#channel,\nfrom:@someone, before:2026-09-01, has:link.","type":"string"}},"type":"object"},"provider.slackSendMessageIn":{"properties":{"channel":{"description":"Channel is a Slack channel ID, name (#hanzo-gtm), or Slack channel mention.","type":"string"},"text":{"description":"Text is the message to post as Hanzo, up to 40000 characters.","type":"string"},"thread_ts":{"description":"ThreadTS optionally replies under this parent message's exact ts.","type":"string"}},"type":"object"},"provider.slackUpdateMessageIn":{"properties":{"channel":{"description":"Channel is a Slack channel ID, name (#hanzo-gtm), or channel mention.","type":"string"},"text":{"description":"Text is the replacement, up to 40000 characters.","type":"string"},"ts":{"description":"TS is the exact timestamp of the message to rewrite.","type":"string"}},"type":"object"},"provisioning.provisionRequest":{"properties":{"instance":{"description":"Instance binds a DEDICATED add-on to the app instance whose\n<instance>-addons Secret receives the <KIND>_URL (e.g. \"commerce\").\nOptional: empty means \"not instance-bound\" — the DSN is returned once and\nwired by the caller.","type":"string"},"name":{"description":"Name is the org-unique slug for the new resource, matching\n^[a-z0-9]([a-z0-9-]{0,38}[a-z0-9])?$. Every physical name derives from it.","type":"string"}},"type":"object"},"pubsub.busPublish":{"properties":{"data":{"description":"Data is the payload, carried verbatim as UTF-8 text (typically JSON).\nBinary payloads belong on the NATS port.","type":"string"},"headers":{"additionalProperties":{"type":"string"},"description":"Headers are optional message headers, one value per name. A Nats-Msg-Id\nheader is JetStream's deduplication key: a repeat within the stream's\ndedup window is acknowledged as duplicate rather than stored twice.","type":"object"},"subject":{"description":"Subject is the subject to publish to, in the org's own namespace — e.g.\norders.created. No wildcards.","type":"string"}},"type":"object"},"pubsub.busRequest":{"properties":{"data":{"description":"Data is the request payload, carried verbatim as UTF-8 text.","type":"string"},"headers":{"additionalProperties":{"type":"string"},"description":"Headers are optional request headers, one value per name.","type":"object"},"subject":{"description":"Subject is the subject a responder listens on, in the org's namespace.","type":"string"},"timeoutMs":{"description":"TimeoutMs bounds the wait for a reply. 0 or less means the default of\n5000; anything above 30000 is clamped to 30000.","format":"int64","type":"integer"}},"type":"object"},"reference.ReferenceOverrideIn":{"properties":{"key":{"description":"Key is the member: a domain, a CIDR or address, an issuer prefix, a\ndevice digest. It is matched the same way the baseline is, so a deny on\ntempbox.example also covers mail.tempbox.example.","type":"string"},"note":{"description":"Note is why, in your own words. Optional, bounded to 512 bytes.","type":"string"},"verdict":{"description":"Verdict is allow or deny, and nothing else. An override is a decision —\nunlike a baseline entry, which states facts and leaves the decision to your\npolicy — because your organisation is the only party entitled to say \"for\nus, this one is fine\".","type":"string"}},"type":"object"},"reference.ResolveReferenceIn":{"properties":{"keys":{"description":"Keys are the values to look up, at most 100 per call: email addresses or\ndomains, IP addresses, card prefixes, user-agent strings, autonomous system\nnumbers, device digests.","items":{"type":"string"},"type":"array"},"sets":{"description":"Sets narrows which sets to consult. Empty consults every set whose matcher\ncan read the keys given.","items":{"type":"string"},"type":"array"}},"type":"object"},"reference.SetReferenceIn":{"properties":{"entries":{"description":"Entries are the overrides to write, up to 1000 per call.","items":{"$ref":"#/components/schemas/reference.ReferenceOverrideIn"},"type":"array"}},"type":"object"},"referral.claimRequest":{"properties":{"code":{"description":"Code is the referrer's referral code, as it appeared in their ?ref= link.\nCase and surrounding whitespace do not matter.","type":"string"},"invite":{"description":"Invite is the beta invite the referee's link carried (its utm_content),\nwhen it carried one. Optional; it only lets the referrer's invite be marked\njoined, and never changes who the referral credits.","type":"string"}},"type":"object"},"referral.setCodeRequest":{"properties":{"code":{"description":"Code is the custom referral code to assign to the caller's org (2-32 uppercase alphanumeric, hyphen, or underscore characters).","type":"string"}},"type":"object"},"registry.registryMint":{"properties":{"image":{"description":"Image is the repository name inside the org's namespace (e.g. \"cloud\").","type":"string"}},"type":"object"},"replayBody":{"properties":{"consent":{},"distinctId":{"type":"string"},"events":{"items":{},"type":"array"},"sessionId":{"type":"string"},"windowId":{"type":"string"}},"type":"object"},"risk.riskAdoptIn":{"properties":{"address":{"description":"Address is one of YOUR organisation's own published values (GET\n/v1/risk/state reports them, and a search reports the one it fitted for you).\nAn address your organisation has not published is NOT FOUND — including one\nanother organisation published, because an address names a value and never\nauthorises reading it.","type":"string"}},"type":"object"},"risk.riskAppetiteIn":{"properties":{"live":{"description":"Live turns the model out of shadow. It defaults to FALSE on every call, so\ngoing live is always an explicit act and never a side effect of changing a\nnumber.\n\nSetting it requires an ADMIN of this organisation. Arming decides whether the\nmodel may change an outcome at all — a payment frozen, a grant refused — for\nevery customer this organisation has, which is a governance act rather than a\ntuning one. Stating the appetite and the sample needs no admin.","type":"boolean"},"review":{"description":"Review is the share of the stream that may be sent for examination, in\n(0, 0.5]. The alert threshold is derived from it as a quantile of the scores\nactually observed, so the level is governed rather than tuned.","format":"double","type":"number"},"sample":{"description":"Sample is the share of below-the-line events retained for review, in\n[0, 1]. It is the instrument that measures what the model missed; there are\nno labels, so nothing else can.","format":"double","type":"number"}},"type":"object"},"risk.riskEvent":{"properties":{"at":{"description":"At is when it happened, RFC 3339. Empty means now. It must sit inside the\nthirty-day window the aggregates keep and no more than two minutes ahead of\nthis plane's clock; anything outside that is REFUSED rather than quietly\naccepted, because a future timestamp moves the aggregates' leading edge and\nleaves every later event for that subject reading as though it never\nhappened. History older than the window is folded in from your own event\nsurface, not through this endpoint.","type":"string"},"device":{"description":"Device is the device fingerprint, if any. It is the axis that surfaces\nseveral nominally unrelated subjects acting as one.","type":"string"},"id":{"description":"ID is the caller's own stable identifier for the event. It selects the\nbelow-the-line review sample by hash, so a counter would make the sample\nsteerable — use the id the event already has.","type":"string"},"kind":{"description":"Kind is whose behaviour this is: person, session or account. It namespaces\nthe subject, so a person and an account that share an identifier stay two\nsubjects.","type":"string"},"nano":{"description":"Nano is the value moved, in nano-USD. Omit it for an event that moves no\nmoney: the value features then read BLIND rather than being told the amount\nwas zero, and the difference is reported on the model state.","format":"int64","type":"integer"},"peer":{"description":"Peer is the counterparty, if any. It is an aggregation axis of its own —\n\"unfamiliar\" is a fact about a relationship and not about either party.","type":"string"},"subject":{"description":"Subject is the identifier on that kind.","type":"string"}},"type":"object"},"risk.riskLearnIn":{"properties":{"events":{"description":"Events are the things that happened, oldest first. An empty batch is\nrefused: learning nothing is not an operation.","items":{"$ref":"#/components/schemas/risk.riskEvent"},"type":"array"}},"type":"object"},"risk.riskScoreIn":{"properties":{"event":{"$ref":"#/components/schemas/risk.riskEvent","description":"Event is the thing to judge. It is judged against the caller's OWN model\nand nothing is learned from it."}},"type":"object"},"risk.riskSearchIn":{"properties":{"days":{"description":"Days is how much of the organisation's own history to replay, 1 to 400.\nZero takes thirty.","format":"int64","type":"integer"}},"type":"object"},"runner.DeclareIn":{"properties":{"capabilities":{"description":"Capabilities are the optional protocol behaviours this runner\nunderstands, e.g. \"cancelling\".","items":{"type":"string"},"type":"array"},"labels":{"description":"Labels replace what the forge holds, so a relabelled runner follows its\nconfiguration without re-registering.","items":{"type":"string"},"type":"array"},"version":{"description":"Version is the runner build now running.","type":"string"}},"type":"object"},"runner.Line":{"properties":{"content":{"description":"Content is the line itself, without its terminator.","type":"string"},"time":{"description":"Time is when the line was written, in unix nanoseconds.","format":"int64","type":"integer"}},"type":"object"},"runner.LogIn":{"properties":{"index":{"description":"Index is the position of the first line in that log, so a resent batch\noverlaps rather than duplicates.","format":"int64","type":"integer"},"last":{"description":"Last seals the log and moves it to storage. Appending past a seal is an\nerror; resending one is acknowledged.","type":"boolean"},"lines":{"description":"Lines is the batch itself.","items":{"$ref":"#/components/schemas/runner.Line"},"type":"array"},"task":{"description":"Task is whose log this is.","format":"int64","type":"integer"}},"type":"object"},"runner.Pair":{"properties":{"name":{"description":"Name is what the value is filed under.","type":"string"},"value":{"description":"Value is the value itself, always a string on this wire.","type":"string"}},"type":"object"},"runner.RegisterIn":{"properties":{"capabilities":{"description":"Capabilities are the optional protocol behaviours this runner\nunderstands, e.g. \"cancelling\".","items":{"type":"string"},"type":"array"},"ephemeral":{"description":"Ephemeral declares that this runner takes ONE job and exits.","type":"boolean"},"labels":{"description":"Labels are what a workflow's `runs-on:` will select this runner by.","items":{"type":"string"},"type":"array"},"name":{"description":"Name is what to call this runner. Required.","type":"string"},"token":{"description":"Token is the REGISTRATION secret, a different secret from the runner\ntoken the reply carries. Required.","type":"string"},"version":{"description":"Version is the runner build asking to register.","type":"string"}},"type":"object"},"runner.State":{"properties":{"id":{"description":"ID is the task this is about.","format":"int64","type":"integer"},"result":{"description":"Result is how it finished; empty means it has not.","type":"string"},"started":{"description":"Started is when it began, in unix nanoseconds; 0 is unset.","format":"int64","type":"integer"},"steps":{"description":"Steps is each step's own progress, in the order the workflow declares.","items":{"$ref":"#/components/schemas/runner.Step"},"type":"array"},"stopped":{"description":"Stopped is when it finished, in unix nanoseconds; 0 is unset.","format":"int64","type":"integer"}},"type":"object"},"runner.StateIn":{"properties":{"outputs":{"description":"Outputs are values the job has published since the last report.","items":{"$ref":"#/components/schemas/runner.Pair"},"type":"array"},"state":{"$ref":"#/components/schemas/runner.State","description":"State is the task's progress and that of each of its steps."}},"type":"object"},"runner.Step":{"properties":{"id":{"description":"ID is the step's position in the job, counting from 0.","format":"int64","type":"integer"},"log_index":{"description":"LogIndex is the first line of the task log this step wrote.","format":"int64","type":"integer"},"log_length":{"description":"LogLength is how many lines it wrote from there.","format":"int64","type":"integer"},"result":{"description":"Result is how the step finished; empty means it has not.","type":"string"},"started":{"description":"Started is when it began, in unix nanoseconds; 0 is unset.","format":"int64","type":"integer"},"stopped":{"description":"Stopped is when it finished, in unix nanoseconds; 0 is unset.","format":"int64","type":"integer"}},"type":"object"},"runner.TaskIn":{"properties":{"queue":{"description":"Queue is the queue version the runner last saw. When it equals the\nforge's, nothing has been queued since.","format":"int64","type":"integer"}},"type":"object"},"s3.bucketIn":{"properties":{"name":{"description":"Name is the bucket's friendly name, matching\n^[a-z0-9]([a-z0-9-]{0,38}[a-z0-9])?$. It is validated AS GIVEN and never\nlower-cased for you: a client that creates \"Photos\" and then lists \"photos\"\nwould be reading a bucket it did not make, so mixed case is a clean 400.","type":"string"}},"type":"object"},"s3.uploadIn":{"properties":{"bucket":{"description":"Bucket is the bucket to upload into, from the path.","type":"string"},"key":{"description":"Key is the object key relative to the bucket root. It is path-cleaned, so a\n\"../\" cannot escape the bucket, and an empty or unclean key is 400.","type":"string"}},"type":"object"},"s3.uploadParts":{"properties":{"bucket":{"description":"Bucket is the bucket, from the path.","type":"string"},"key":{"description":"Key is the object key the upload was started on.","type":"string"},"parts":{"description":"Parts are the part numbers to mint URLs for, from 1. At most 64 a call.","items":{"format":"int64","type":"integer"},"type":"array"},"upload":{"description":"Upload is the upload's id, from the path.","type":"string"}},"type":"object"},"s3.uploadRef":{"properties":{"bucket":{"description":"Bucket is the bucket, from the path.","type":"string"},"key":{"description":"Key is the object key the upload was started on. In the query for a read\nor an abandon, in the body to complete.","type":"string"},"upload":{"description":"Upload is the upload's id, from the path.","type":"string"}},"type":"object"},"s3.uploadStart":{"properties":{"bucket":{"description":"Bucket is the bucket to upload into, from the path.","type":"string"},"key":{"description":"Key is the object key the upload will become, relative to the bucket\nroot. It is path-cleaned, so a \"../\" cannot escape the bucket.","type":"string"},"type":{"description":"Type is the object's media type, kept with it once it is assembled.","type":"string"}},"type":"object"},"sandbox.EndIn":{"properties":{"id":{"description":"ID is the sandbox whose lease ends, from an earlier lease.","type":"string"},"purge":{"description":"Purge deletes the project's DISK as well. It is opt-in because the disk holds\nthe only copy of the checkout: ending a lease is cheap and reversible,\ndeleting someone's uncommitted work is neither.","type":"boolean"}},"type":"object"},"sandbox.LeaseIn":{"properties":{"class":{"description":"Class is what KIND of computer to lease, and the set is closed:\n\n\texec a throwaway one that keeps nothing. Seconds to minutes.\n\tdev a coding one, with the project's own disk attached. Hours.\n\tdesktop a dev one that also has a screen.\n\tandroid a desktop with a phone running on that screen.\n\nEmpty leases an `exec`, which is the right answer for running a program and\nthe wrong one for working on a repository, because it keeps nothing.\n\nAn `android` needs a node that can virtualise a CPU, so it is the one class\na deployment may not be able to place. Where the fleet has none, the lease\nsucceeds and the pod stays Pending naming the device it is waiting for —\nwhich is the honest answer, because the alternative is an emulator running\non an interpreted CPU and never finishing its boot.","type":"string"},"cluster":{"description":"Cluster names one of the org's ATTACHED clusters to run the lease on —\nthe fleet-local name a BYO cluster was registered under. Empty runs where\nleases have always run, the home cluster. The named cluster must carry\nthe sandbox namespace and the gvisor runtime class; a name the org has\nnot attached is refused 404.","type":"string"},"disk":{"description":"Disk gives a sandbox with no Project a disk of its OWN, so what it writes\nsurvives a park: small — the size its working directory always had — billed\nas storage for as long as it exists, and deleted with the lease. Without it a\nproject-less sandbox keeps its files in the pod and loses them with it. A\nproject sandbox has the project's disk and ignores this.","type":"boolean"},"id":{"description":"ID names a sandbox to RESUME, and is the id an earlier lease answered with.\nEmpty asks for a new one. A caller that holds an id and omits it does not get\na second view of the same computer, it gets a second computer.","type":"string"},"project":{"description":"Project names the disk to attach, and is REQUIRED for every class but `exec`.\n\nOne live sandbox per project: the disk attaches to one computer at a time, so\na second lease over a project that already has one is refused by name rather\nthan handed a silently empty disk.","type":"string"},"runtime":{"description":"Runtime is the isolation boundary asked for: `gvisor` shares a filesystem\nand holds a project volume, `kata-fc` is a microVM that boots slower and\nreads files faster but has no shared filesystem at all. Empty asks for the\nfleet's default, which is the right answer unless you are measuring.\n\nIt is a REQUEST. The owner decides, and refuses a combination it cannot\nhonour — a volume under a runtime with no shared filesystem would write\ninto a tmpfs and lose the bytes at exit. Read Leased.Runtime for what the\nsandbox actually got.","type":"string"},"ttlSec":{"description":"TTLSec bounds the lease in seconds. Unset takes the class default. Nothing\nruns forever, because a sandbox is somebody else's code on our nodes.","format":"int64","type":"integer"}},"type":"object"},"sandbox.PathIn":{"properties":{"id":{"description":"ID is the sandbox to read from, from an earlier lease.","type":"string"},"path":{"description":"Path is read relative to the sandbox's working directory unless it is\nabsolute, and a path that climbs out of it is refused rather than rewritten.\nEmpty names the working directory itself, which lists it.","type":"string"}},"type":"object"},"sandbox.RunIn":{"properties":{"argv":{"description":"Argv is the program and its arguments, already split — the form no shell can\nmisread. Give this or Command, not both.","items":{"type":"string"},"type":"array"},"blind":{"description":"Blind is the set of secrets this command must never publish.\n\nIt exists because output is redacted where it is PRODUCED or not at all. A\ncaller that scrubbed the returned result would still have streamed the\nunredacted bytes into the session as they were written — to a durable event\nstore, an SSE feed and a chat thread — because the narration leaves the\nsandbox by a different path from the result. Nothing downstream can take a\nsecret back out of a message that has already been delivered.\n\nThe sandbox holds these only for the life of the one command, applies them\nto every stream leaving it, and never logs or stores them.","items":{"type":"string"},"type":"array"},"command":{"description":"Command is a shell line, run by `sh -c`. Use it when a pipeline or a\nredirection is the point, and Argv when it is not.","type":"string"},"dir":{"description":"Dir runs the command somewhere other than the sandbox's working directory,\nwhich Leased.Workdir names.","type":"string"},"events":{"description":"Events says the command writes JSON lines to stdout, one event each, as an\nagent harness's --json does: each is appended to Session as one `event`, in\nthe shape the command wrote it, and stderr is narrated as output.","type":"boolean"},"id":{"description":"ID is the sandbox to run in, from an earlier lease.","type":"string"},"session":{"description":"Session is the live agent session this command narrates into: its output is\nappended there AS IT IS PRODUCED, so every surface watching that session\nwatches the command work instead of a blank pause. A long run is otherwise a\nsilence with a verdict at the end.\n\nIt names a SESSION and never a tenant. The org is the one the caller already\nproved, so a session belonging to somebody else is simply absent from the org\nthis call acts for and the append is refused there. Empty means nothing is\nwatching, and then nothing is sent.","type":"string"},"stdin":{"description":"Stdin is fed to the program on standard input. This is how bytes reach a file\nwithout being quoted into a shell line: `cat > path` with the contents here\nwrites them exactly.","type":"string"},"timeoutSec":{"description":"TimeoutSec bounds this ONE command, so a wedged program holds the caller for\nits own timeout rather than for the whole lease.","format":"int64","type":"integer"}},"type":"object"},"sandbox.StopIn":{"properties":{"id":{"description":"ID is the sandbox to interrupt, from an earlier lease. Every command running\nin it stops; the lease itself survives, so the checkout and the half-written\nfiles are still there to read. Use EndIn to give the computer back.","type":"string"}},"type":"object"},"sandbox.WriteIn":{"properties":{"data":{"contentEncoding":"base64","description":"Data is the file's bytes, and replaces whatever was there.","type":"string"},"id":{"description":"ID is the sandbox to write into, from an earlier lease.","type":"string"},"path":{"description":"Path is confined the same way PathIn.Path is. Missing parent directories are\ncreated.","type":"string"}},"type":"object"},"sandbox.execRequest":{"properties":{"argv":{"description":"Argv is the command as an argument vector, which is the honest form: it\ncannot be word-split by accident. Send this OR Command, not both.","items":{"type":"string"},"type":"array"},"command":{"description":"Command is a shell line, for a caller that holds one. It is a convenience\nover Argv and is the only input that ever reaches a shell.","type":"string"},"dir":{"description":"Dir is the working directory to run in. Empty runs in the class's own\nworkdir — /mnt/data for exec, /work for dev.","type":"string"},"id":{"description":"ID is the sandbox to run in, from the path.","type":"string"},"stdin":{"description":"Stdin is fed to the command on its standard input.","type":"string"},"timeoutSec":{"description":"TimeoutSec bounds the run in seconds. Zero takes the default.","format":"int64","type":"integer"}},"type":"object"},"sandbox.previewIn":{"properties":{"id":{"description":"ID is the sandbox, from the path.","type":"string"},"port":{"description":"Port is the TCP port inside the sandbox to open, 1 to 65535. Whatever\nlistens on it on localhost is what the address serves.","format":"int64","type":"integer"}},"type":"object"},"sandbox.sandboxIn":{"properties":{"class":{"description":"Class is what the sandbox is FOR: \"exec\" for a code-interpreter call,\n\"dev\" for a workspace bound to a project, \"desktop\" for one with a screen.\nIt decides the image, the working directory and the isolation.","type":"string"},"cluster":{"description":"Cluster names one of the org's attached clusters to run the sandbox on —\nthe fleet-local name it was registered under. Empty runs on the home\ncluster. The named cluster must carry the sandbox namespace and the\nvisor runtime class; a name the org has not attached is 404.","type":"string"},"image":{"description":"Image overrides the image the class would pick. Honoured only for a caller\nthe policy admits, and the sandbox that comes back names the image it GOT.","type":"string"},"project":{"description":"Project binds the sandbox to one of the org's projects. Required for a dev\nor desktop class, which are single-attach per project; an exec sandbox\ncarries none.","type":"string"},"runtime":{"description":"Runtime asks for an isolation: runc, visor, kata-clh or kata-fc. It is a\nREQUEST, not a guarantee — the sandbox that comes back carries the runtime\nit was actually given, which is the field to read.","type":"string"},"ttlSec":{"description":"TTLSec is how long the lease runs before the reaper may take it, in\nseconds. Zero takes the class's own default.","format":"int64","type":"integer"}},"type":"object"},"search.Request":{"properties":{"doctypes":{"description":"DocTypes restricts the semantic leg to a subset of indexed knowledge types.","items":{"type":"string"},"type":"array"},"index":{"description":"Index names the lexical index to query. Defaults to \"kb\".","type":"string"},"limit":{"description":"Limit bounds the FUSED result set (default 10, max 50).","format":"int64","type":"integer"},"mode":{"description":"Mode selects the legs: auto (default) | text | semantic | hybrid.","type":"string"},"offset":{"description":"Offset pages the fused result set.","format":"int64","type":"integer"},"project":{"description":"Project narrows to one project scope within the org.","type":"string"},"query":{"description":"Query is the natural-language or keyword query. Required.","type":"string"}},"type":"object"},"security.scan":{"properties":{"content":{"description":"Content is the source to scan. It is NEVER stored: what persists is the\nfinding, with a masked preview and a fingerprint.","type":"string"},"path":{"description":"Path is where the file lives, recorded on any finding so a result can be\nlocated in the tree it came from.","type":"string"}},"type":"object"},"security.submitReq":{"properties":{"files":{"description":"Files is the batch to scan, at most 500 files and 8 MiB of content in total.","items":{"$ref":"#/components/schemas/security.scan"},"type":"array"},"project":{"description":"Project names the sub-scope the scan is filed under. It must be a slug; omit\nit and the caller's project header is used instead.","type":"string"}},"required":["files"],"type":"object"},"seo.seoAuditIn":{"properties":{"url":{"description":"URL is the page, absolute and http or https.","type":"string"}},"type":"object"},"seo.seoBacklinkIn":{"properties":{"target":{"description":"Target is a domain, a subdomain or a single page URL. A domain summarises the\nwhole site; a URL summarises that page.","type":"string"}},"type":"object"},"seo.seoCompetitorIn":{"properties":{"keywords":{"description":"Keywords are the phrases. At least one; blanks are dropped.","items":{"type":"string"},"type":"array"},"language":{"description":"Language is the ISO code. Defaults to \"en\".","type":"string"},"limit":{"description":"Limit is how many domains to return, 1 to 1000. Defaults to 100.","format":"int64","type":"integer"},"location":{"description":"Location is the market, as the upstream's numeric code. Defaults to 2840.","format":"int64","type":"integer"}},"type":"object"},"seo.seoIdeaIn":{"properties":{"keywords":{"description":"Keywords are the seeds. At least one; blanks are dropped.","items":{"type":"string"},"type":"array"},"language":{"description":"Language is the ISO code. Defaults to \"en\".","type":"string"},"limit":{"description":"Limit is how many phrases to return, 1 to 1000. Defaults to 100. It is what\nthis call is priced on, because the upstream charges per row.","format":"int64","type":"integer"},"location":{"description":"Location is the market, as the upstream's numeric code. Defaults to 2840.","format":"int64","type":"integer"}},"type":"object"},"seo.seoKeywordIn":{"properties":{"keywords":{"description":"Keywords are the phrases. At least one; blanks are dropped.","items":{"type":"string"},"type":"array"},"language":{"description":"Language is the ISO code. Defaults to \"en\".","type":"string"},"location":{"description":"Location is the market, as the upstream's numeric code. Defaults to 2840,\nthe United States.","format":"int64","type":"integer"}},"type":"object"},"seo.seoRankIn":{"properties":{"domain":{"description":"Domain is the site, with or without a subdomain — \"hanzo.ai\", \"docs.hanzo.ai\".","type":"string"},"language":{"description":"Language is the ISO code. Defaults to \"en\".","type":"string"},"limit":{"description":"Limit is how many placements to return, 1 to 1000. Defaults to 100.","format":"int64","type":"integer"},"location":{"description":"Location is the market, as the upstream's numeric code. Defaults to 2840.","format":"int64","type":"integer"}},"type":"object"},"settings.settingsReq":{"properties":{"config":{"additionalProperties":{},"description":"Config is the product's non-secret configuration, stored verbatim. Bounded at\n64 KiB once serialized. Omit it to store an empty object.","type":"object"},"product":{"description":"Product is the catalog slug, from the PATH. zip binds the path last, so the\nURL names the product being written whatever a body field claims.","type":"string"},"secrets":{"additionalProperties":{"type":"string"},"description":"Secrets are the secret fields, by name. Each VALUE is sealed into KMS and\nnever reaches this deployment's database; a value that is empty or equal to\nthe mask the read path returns means \"unchanged\" and is skipped, so a console\nround-trip cannot blank a stored secret. A key must match\n^[a-z0-9][a-z0-9._-]{0,62}$, a value is bounded at 8 KiB, and an org may hold\nat most 64 secret fields per product.","type":"object"}},"type":"object"},"social.socialAccountBody":{"properties":{"handle":{"description":"Handle is the account's public name on the network, as the customer knows it\n(`@acme`). Trimmed and bounded at 1024 characters.\n\nExample: \"@acme\"","type":"string"},"provider":{"description":"Provider is the network this account is on: x, facebook, instagram, linkedin,\ntiktok, youtube or threads. Omitted means x. Anything else is refused rather\nthan coerced, because a stored account on a network that does not exist can\nnever be published through.\n\nExample: \"x\"","type":"string"},"status":{"description":"Status is the connection lifecycle: connected, disconnected or error.\nOmitted means connected. Only a connected account is a publish target.","type":"string"}},"type":"object"},"social.socialAccountWrite":{"properties":{"handle":{"description":"Handle is the account's public name on the network. Omitting it BLANKS the\nstored handle: this is a replacement, not a merge.\n\nExample: \"@acme\"","type":"string"},"provider":{"description":"Provider is the network this account is on: x, facebook, instagram, linkedin,\ntiktok, youtube or threads. Omitted means x.\n\nExample: \"x\"","type":"string"},"status":{"description":"Status is the connection lifecycle: connected, disconnected or error.\nOmitting it RESETS the account to connected.","type":"string"}},"type":"object"},"social.socialPostBody":{"properties":{"channel":{"description":"Channel is the network to publish to: x, facebook, instagram, linkedin,\ntiktok, youtube or threads. Omitted means x.\n\nExample: \"x\"","type":"string"},"content":{"description":"Content is the post's text. Required — an empty body is a 400 — and bounded\nat 8192 characters, comfortably above every network's own limit.\n\nExample: \"Shipping today.\"","type":"string"},"media":{"description":"Media is the post's attached media as URLs, at most 10, each bounded at 1024\ncharacters. Blank entries are dropped. Omitting it CLEARS any stored media.","items":{"type":"string"},"type":"array"},"scheduleAt":{"description":"ScheduleAt is when to publish, as a unix timestamp in SECONDS. 0 means\nunscheduled. A negative value is clamped to 0. It only matters for a post\nwhose status is scheduled.","format":"int64","type":"integer"},"status":{"description":"Status is the post's lifecycle state: draft, scheduled, published or failed.\nOmitted means draft. The transient publishing claim is never settable here —\naccepting it from a request would let a caller wedge or replay the guard that\nstops two publishers double-posting the same row.","type":"string"}},"type":"object"},"social.socialPostWrite":{"properties":{"channel":{"description":"Channel is the network to publish to: x, facebook, instagram, linkedin,\ntiktok, youtube or threads. Omitted means x.\n\nExample: \"x\"","type":"string"},"content":{"description":"Content is the post's text. Required on every update, and bounded at 8192\ncharacters.\n\nExample: \"Shipping today.\"","type":"string"},"media":{"description":"Media is the post's attached media as URLs, at most 10. Omitting it CLEARS\nany stored media: this is a replacement, not a merge.","items":{"type":"string"},"type":"array"},"scheduleAt":{"description":"ScheduleAt is when to publish, as a unix timestamp in SECONDS. 0 means\nunscheduled. Moving it into the past here does NOT publish the post — that is\nthe scheduler's to notice, or the publish operation's.","format":"int64","type":"integer"},"status":{"description":"Status is the post's lifecycle state: draft, scheduled, published or failed.\nOmitting it RESETS the post to draft.","type":"string"}},"type":"object"},"space.driveIn":{"properties":{"name":{"description":"Name is the drive's name, matching the same shape a space name does. It\nbecomes the FIRST SEGMENT of every key the drive holds, which is why it may\ncarry no \"/\".","type":"string"},"space":{"description":"Space is the space to create the drive in, from the path. It carries NO\n`url:\"-\"`, unlike the field below it, and the difference is the whole reason\nboth tags are written out: zip's binder skips a field tagged \"-\" for EVERY\nURL source, path params included, so a path-borne value that carried it\nwould arrive empty and the create would refuse a perfectly good address.","type":"string"}},"type":"object"},"space.spaceIn":{"properties":{"name":{"description":"Name is the space's name, matching ^[a-z0-9]([a-z0-9-]{0,38}[a-z0-9])?$ — the\nshape a drive name takes too, so a caller learns one rule. It is validated AS\nGIVEN and never lower-cased for you: a client that creates \"Photos\" and then\nlists \"photos\" would be reading a space it did not make, so mixed case is a\nclean 400.","type":"string"}},"type":"object"},"standing.upkeepIn":{"properties":{"agentOfRecord":{"description":"AgentOfRecord includes our agent fee, which most entities owe someone.","type":"boolean"},"jurisdiction":{"description":"Jurisdiction is the state the entity stands in.","type":"string"},"structure":{"description":"Structure is the entity kind: c-corp, llc or dao-llc.","type":"string"}},"type":"object"},"studio.BrandPatch":{"properties":{"id":{"type":"string"},"logos":{"items":{"type":"string"},"type":"array"},"name":{"type":"string"},"shared":{"type":"boolean"},"tokens":{"additionalProperties":{},"type":"object"}},"type":"object"},"studio.BrandWrite":{"properties":{"logos":{"items":{"type":"string"},"type":"array"},"name":{"type":"string"},"shared":{"type":"boolean"},"tokens":{"additionalProperties":{},"type":"object"}},"type":"object"},"studio.DocumentPatch":{"properties":{"brand":{"type":"string"},"id":{"type":"string"},"ir":{"$ref":"#/components/schemas/studio.IR"},"shared":{"type":"boolean"},"title":{"type":"string"}},"type":"object"},"studio.DocumentWrite":{"properties":{"brand":{"type":"string"},"ir":{"$ref":"#/components/schemas/studio.IR"},"kind":{"description":"Kind is doc or deck.","type":"string"},"shared":{"type":"boolean"},"title":{"type":"string"}},"type":"object"},"studio.FlowPatch":{"properties":{"description":{"type":"string"},"graph":{"$ref":"#/components/schemas/studio.Graph"},"id":{"type":"string"},"inputs":{"additionalProperties":{},"type":"object"},"kind":{"type":"string"},"name":{"type":"string"},"shared":{"type":"boolean"}},"type":"object"},"studio.FlowWrite":{"properties":{"description":{"type":"string"},"graph":{"$ref":"#/components/schemas/studio.Graph"},"inputs":{"additionalProperties":{},"type":"object"},"kind":{"type":"string"},"name":{"type":"string"},"shared":{"type":"boolean"}},"type":"object"},"studio.Graph":{"properties":{"steps":{"description":"Steps are the graph's steps, 1 to 64 of them.","items":{"$ref":"#/components/schemas/studio.Spec"},"type":"array"}},"type":"object"},"studio.IR":{"properties":{"blocks":{"items":{"additionalProperties":{},"type":"object"},"type":"array"},"slides":{"items":{"additionalProperties":{},"type":"object"},"type":"array"}},"type":"object"},"studio.RunCreate":{"properties":{"brand":{"description":"Brand is a brand id; its tokens are brand.* in the graph.","type":"string"},"flow":{"description":"Flow is a flow id.","type":"string"},"graph":{"$ref":"#/components/schemas/studio.Graph"},"input":{"additionalProperties":{},"description":"Input are the values the inputs schema asks for.","type":"object"},"parent":{"description":"Parent makes this run the next version of that run.","type":"string"},"shared":{"type":"boolean"},"template":{"description":"Template is a template id.","type":"string"},"title":{"type":"string"}},"type":"object"},"studio.RunPatch":{"properties":{"id":{"type":"string"},"shared":{"type":"boolean"},"title":{"type":"string"}},"type":"object"},"studio.Spec":{"properties":{"each":{"description":"Each fans the step out: a {{path}} naming an array, run once per item (at\nmost 64), its outputs the items' outputs in order.","type":"string"},"id":{"description":"ID names the step within its graph: a lowercase letter, then up to 31\nlowercase letters, digits or underscores.","type":"string"},"op":{"description":"Op is what the step does: chat, image.generate, image.edit, voice.speak,\nmusic.generate, video.generate, model.generate, studio.render, render.html,\nrender.document, render.slides, render.composition or video.edit.","type":"string"},"title":{"description":"Title is what a person sees for the step.","type":"string"},"with":{"additionalProperties":{},"description":"With are the op's parameters. Values may reference other steps.","type":"object"}},"type":"object"},"studio.TemplatePatch":{"properties":{"description":{"type":"string"},"graph":{"$ref":"#/components/schemas/studio.Graph"},"id":{"type":"string"},"inputs":{"additionalProperties":{},"type":"object"},"preview":{"type":"string"},"shared":{"type":"boolean"},"title":{"type":"string"}},"type":"object"},"studio.TemplateWrite":{"properties":{"description":{"type":"string"},"graph":{"$ref":"#/components/schemas/studio.Graph"},"inputs":{"additionalProperties":{},"type":"object"},"kind":{"type":"string"},"preview":{"type":"string"},"shared":{"type":"boolean"},"title":{"type":"string"}},"type":"object"},"sync.endpointReq":{"properties":{"connector":{"description":"Connector names the stored credential to reach this endpoint with.","type":"string"},"locator":{"description":"Locator addresses the resource. For a git source it is the https clone URL on\nthe provider's own host, with no embedded credentials; for a native target it\nis the repository name.","type":"string"},"provider":{"description":"Provider is the platform: github or gitlab for a source; a target defaults to\nthe native Hanzo Git plane.","type":"string"}},"type":"object"},"sync.patchSyncIn":{"properties":{"actor":{"description":"Actor is the loop-guard identity the sync writes as. Omitted, the stored actor\nstands.","type":"string"},"direction":{"description":"Direction is both, pull, push or off. Omitted, the stored direction stands.","type":"string"},"id":{"description":"ID is the sync to update, from the path.","type":"string"},"kind":{"description":"Kind names a different kind of sync, and is refused, for the same reason.","type":"string"},"source":{"$ref":"#/components/schemas/sync.endpointReq","description":"Source, Target and Kind are DECLARED HERE IN ORDER TO BE REFUSED.\n\nThey are immutable by design — re-pointing a sync is a delete and a create, so\na link can never silently start syncing somewhere else — but an UNDECLARED\nfield is dropped by the binder before the handler sees it, so a request asking\nto repoint answered 200, changed nothing, and said nothing. The operator then\nbelieves a moved repository has been repointed and it has not.\n\nLive: a sync still naming github.com/hanzoai/cloud after the repository moved\nto hanzo-inc/cloud failed every reconcile with \"Repository not found\", and the\nPATCH that appeared to fix it did nothing at all. Declaring the fields is what\nlets the documented immutability actually answer.\nSource names a new upstream, and is refused. Delete this sync and create the\none you want."},"target":{"$ref":"#/components/schemas/sync.endpointReq","description":"Target names a new native repository, and is refused, for the same reason."},"trigger":{"description":"Trigger is webhook, poll or manual. Omitted, the stored trigger stands.","type":"string"}},"type":"object"},"sync.syncReq":{"properties":{"actor":{"description":"Actor is the identity the sync writes as, used as the loop guard so its own\nwrites do not re-trigger it. Defaults to the deployment's GIT_SYNC_ACTOR.","type":"string"},"direction":{"description":"Direction is both (the default), pull, push or off.","type":"string"},"kind":{"description":"Kind is what is being synced. Only \"git\" today, which is also the default.","type":"string"},"run":{"description":"Run reconciles once immediately after the upsert, in the background.","type":"boolean"},"source":{"$ref":"#/components/schemas/sync.endpointReq","description":"Source is the upstream end. Required."},"target":{"$ref":"#/components/schemas/sync.endpointReq","description":"Target is the downstream end. Optional for git: a native repository named\nafter the source is derived when it is omitted."},"trigger":{"description":"Trigger is what starts a reconcile: webhook (the default), poll or manual.","type":"string"}},"type":"object"},"task.Reply":{"properties":{"channel":{"description":"Channel is the room inside that workspace, and it is what decides whether\nthere is an address at all. Empty is the ordinary case: a caller of\n/v1/agent/coding holds a session id and reads the stream instead.","type":"string"},"provider":{"description":"Provider is the transport the conversation is on — slack, discord,\ntelegram, teams — and it is what decides who can carry the text at all. An\naddress without it names a room in no particular workspace.","type":"string"},"thread":{"description":"Thread narrows the address to one thread inside the channel — on Slack the\nparent message's ts, the same value a reply carries as thread_ts. Empty\nputs the text at the top level of the channel.","type":"string"},"turn":{"description":"Turn is the turn that renders a run started here: the session whose one\nmessage the run's progress and its outcome are shown in. A run with a Turn\nposts nothing of its own — one question, one message. The dispatcher writes\nit (apps/agents/replyto.go); a model never does.","type":"string"},"user":{"description":"User is the platform's id for the person the conversation is with — whose\nrun it is. A run's buttons name them to anyone else who presses one; it is\nnever what decides who may (that is the chat identity).","type":"string"}},"type":"object"},"task.issueEdit":{"properties":{"assignee":{"description":"Assignee hands the work to somebody — a person or an agent, by the name\nthey are known by on the forge. \"\" TAKES IT OFF whoever holds it, which is\nwhy this is a pointer: absent leaves the holder alone.\n\nIt is the other half of `claim`, which that handler already named: a claim\ntakes work for the CALLER and refuses to name anyone else, because giving\nwork away is a different act with different authority. This is that act,\nand until it existed a board could only be worked by whoever clicked\nfirst — an agent could never be given anything.\n\n`me` is you, by the GitHub account IAM links to you (or your forge login).\n`agent` hands the issue to the coding agent: it is labelled `agent`, and a\ncoding run starts on its repository with the issue as the task, narrating\nin the thread the hand-off was asked in; its pull request closes the issue.\nLabelling an issue `agent` on GitHub does the same.","type":"string"},"comment":{"description":"Comment is posted on the issue, after every other change — what a person in\nthe issue's thread wants said on it.","type":"string"},"description":{"description":"Description rewrites the body.","type":"string"},"key":{"description":"Key is the board — the repository name, from the path.","type":"string"},"num":{"description":"Num is the issue number on that repository, from the path.","format":"int64","type":"integer"},"priority":{"description":"Priority re-prioritises it.","type":"string"},"reply":{"$ref":"#/components/schemas/task.Reply","description":"Reply is the conversation the edit was asked for in, written by a chat turn\nand never chosen (see newIssue). An issue bound to no thread is bound to\nthis one, and a run the edit starts narrates here."},"status":{"description":"Status moves the card to another column.","type":"string"},"title":{"description":"Title renames the work item.","type":"string"}},"type":"object"},"task.newIssue":{"properties":{"description":{"description":"Description becomes the issue body.","type":"string"},"key":{"description":"Key is the board — the repository name, from the path. `owner/name`, or\n`github.com/owner/name`, names a repository on GitHub that no board on the\nforge stands for.","type":"string"},"priority":{"description":"Priority is one of none, urgent, high, medium or low.","type":"string"},"reply":{"$ref":"#/components/schemas/task.Reply","description":"Reply is the conversation the issue was asked for in. A chat turn writes\nits own thread here, over anything else (apps/agents replyto.go); it is not\na value to choose. The issue is bound to it, and what happens to the issue\nnext — comments, closing, who holds it, a pull request that closes it — is\nsaid there."},"status":{"description":"Status is the board column to open into: backlog, todo, in_progress, done\nor canceled. Empty opens into backlog.","type":"string"},"title":{"description":"Title is the one line the card is read by on the board. Blank or whitespace\nis refused — an untitled card cannot be told apart from any other.","type":"string"}},"type":"object"},"tax.Address":{"properties":{"city":{"description":"City is the city or town.","type":"string"},"country":{"description":"Country is ISO 3166-1 alpha-2; \"US\" when absent.","type":"string"},"line1":{"description":"Line1 is the number, street, and apartment or suite. No periods or \"#\":\nIRIS rejects them in an address line.","type":"string"},"line2":{"description":"Line2 continues the street address, when there is more of it.","type":"string"},"state":{"description":"State is the two-letter state or territory code.","type":"string"},"zip":{"description":"ZIP is five or nine digits.","type":"string"}},"type":"object"},"tax.Amount":{"properties":{"box":{"description":"Box is the box number, e.g. \"1a\".","type":"string"},"cents":{"description":"Cents is the amount in cents.","format":"int64","type":"integer"},"label":{"description":"Label is the box's caption on the form.","type":"string"}},"type":"object"},"tax.Treaty":{"properties":{"article":{"description":"Article is the treaty article and paragraph claimed, e.g. \"12(2)\".","type":"string"},"conditions":{"description":"Conditions is the explanation the form asks for: the conditions of the\narticle the beneficial owner meets.","type":"string"},"country":{"description":"Country is the treaty country the beneficial owner is resident in.","type":"string"},"income":{"description":"Income is the type of income the claim covers: services, rents, royalties\nor other.","type":"string"},"lob":{"description":"LOB is W-8BEN-E line 14b: the treaty's limitation on benefits provision the\nentity meets. Required on a W-8BEN-E treaty claim; a W-8BEN has no line 14b.","type":"string"},"rateBps":{"description":"RateBps is the claimed withholding rate in basis points: 0 is exempt,\n1000 is 10%.","format":"int64","type":"integer"}},"type":"object"},"tax.W8":{"properties":{"birth":{"description":"Birth is W-8BEN line 8, the individual's date of birth, YYYY-MM-DD.","type":"string"},"capacity":{"description":"Capacity is the capacity in which the signer signs for the beneficial owner\n— \"Director\", \"Authorized officer\". Required on a W-8BEN-E; on a W-8BEN, empty\nwhen the beneficial owner signs.","type":"string"},"chapter3":{"description":"Chapter3 is W-8BEN-E line 4. A W-8BEN's beneficial owner is an individual\nand states none.","type":"string"},"chapter4":{"description":"Chapter4 is W-8BEN-E line 5, the FATCA status.","type":"string"},"country":{"description":"Country is line 2: the country of citizenship (W-8BEN) or of incorporation\nor organization (W-8BEN-E), ISO 3166-1 alpha-2.","type":"string"},"giin":{"description":"GIIN is W-8BEN-E line 9a, when the chapter 4 status carries one.","type":"string"},"noForeignTin":{"description":"NoForeignTIN is W-8BEN line 6b / W-8BEN-E line 9b's alternative: the\njurisdiction of residence does not require or issue a foreign TIN.","type":"boolean"},"treaty":{"$ref":"#/components/schemas/tax.Treaty","description":"Treaty is the claim of treaty benefits (W-8BEN Part II lines 9-10, W-8BEN-E\nPart III lines 14-15), when one is made."}},"type":"object"},"tax.correctIn":{"properties":{"boxes":{"description":"Boxes are the corrected amounts, by box. Omitted, the boxes are derived\nagain from the payments and the payee's W-9 is read again — which is also how a\nwrong name or TIN is corrected. Zero in every box withdraws the return.","items":{"$ref":"#/components/schemas/tax.Amount"},"type":"array"},"id":{"description":"ID is the furnished form to correct, from the path.","type":"string"},"reason":{"description":"Reason says what was wrong. Required; it goes on the record.","type":"string"}},"type":"object"},"tax.exportIn":{"properties":{"kind":{"description":"Kind is 1099-NEC or 1099-MISC.","type":"string"},"year":{"description":"Year is the tax year.","format":"int64","type":"integer"}},"type":"object"},"tax.matchIn":{"properties":{"id":{"description":"ID is the relationship, from the path.","type":"string"},"result":{"description":"Result is what IRS TIN Matching answered for this payee's name and TIN:\nmatched or mismatched.","type":"string"}},"type":"object"},"tax.prepareIn":{"properties":{"year":{"description":"Year is the calendar year the payments were made in.","format":"int64","type":"integer"}},"type":"object"},"tax.profileIn":{"properties":{"address":{"$ref":"#/components/schemas/tax.Address","description":"Address is W-9 lines 5 and 6, or a W-8's line 3 permanent residence address\noutside the United States (state and zip where the country uses them).\nRequired: a statement owed on paper is mailed there."},"businessName":{"description":"BusinessName is line 2, when it differs from line 1.","type":"string"},"classification":{"description":"Classification is W-9 line 3a: individual, c_corp, s_corp, partnership,\ntrust_estate, llc_c, llc_s or llc_p. Required on a W-9; absent on a W-8.","type":"string"},"electronicConsent":{"description":"ElectronicConsent gives (true) or withdraws (false) consent to receive 1099s\nin the Hanzo inbox, against the disclosure every profile answers with.\nOmitted, the stored consent stands.","type":"boolean"},"exemptPayee":{"description":"ExemptPayee is the exempt payee code, 1–13. Entities only.","type":"string"},"fatca":{"description":"FATCA is the FATCA exemption code, A–M. Entities only.","type":"string"},"foreignOwners":{"description":"ForeignOwners is line 3b; only a partnership, trust/estate or llc_p may set it.","type":"boolean"},"foreignTin":{"description":"ForeignTIN is a W-8's foreign tax identifying number (W-8BEN line 6a,\nW-8BEN-E line 9b), as the jurisdiction of residence issues it. Omitted\nafterwards, the stored number is kept; the empty string with\nw8.noForeignTin clears it.","type":"string"},"form":{"description":"Form is w9 (a U.S. person), w8ben (a foreign individual) or w8bene (a\nforeign entity). w9 when omitted.","type":"string"},"name":{"description":"Name is line 1: the name on the income tax return, or the foreign\nindividual's or organization's name. Required.","type":"string"},"phone":{"description":"Phone is printed on the 1099s this org files as payer.","type":"string"},"tin":{"description":"TIN is W-9 Part I, or a W-8's U.S. TIN (W-8BEN line 5, W-8BEN-E line 8),\ndigits with or without hyphens. Required on a W-9's first write; on a W-8,\nonly for a treaty claim with no foreign TIN. Omitted afterwards, the stored\nnumber is kept, so an address change never re-sends it.","type":"string"},"tinType":{"description":"TINType is ssn (an SSN or ITIN) or ein. An entity other than an individual\nstates an EIN.","type":"string"},"w8":{"$ref":"#/components/schemas/tax.W8","description":"W8 is the rest of a W-8: the country of citizenship or incorporation, the\nchapter 3 and chapter 4 statuses of an entity, a date of birth, the treaty\nclaim, and the signer's capacity. Required on a W-8; absent on a W-9."}},"type":"object"},"tax.receiptIn":{"properties":{"id":{"description":"ID is the filing, from the path.","type":"string"},"receiptId":{"description":"ReceiptID is the Receipt ID IRIS returned for the submission.","type":"string"},"status":{"description":"Status is submitted (IRIS returned a Receipt ID), accepted,\naccepted_with_errors or rejected (IRIS's acknowledgment).","type":"string"},"tcc":{"description":"TCC is the IRIS Transmitter Control Code the payer submitted under: five\nuppercase letters and digits.","type":"string"}},"type":"object"},"tax.w9Request":{"properties":{"category":{"description":"Category is what the caller pays it for: services, attorney, rents,\nroyalties, other or merchandise. Services when omitted.","type":"string"},"payee":{"description":"Payee is the org id of the company asked. The caller must have paid it on\nHanzo's rails.","type":"string"}},"type":"object"},"taxonomy.categoryIn":{"properties":{"brands":{"description":"Brands are the brands whose console shows it. Omit for every brand.","items":{"type":"string"},"type":"array"},"id":{"description":"ID is the category slug to write, from the path.","type":"string"},"label":{"description":"Label is the display name. Required.","type":"string"},"order":{"description":"Order is where the category sits among its siblings, ascending.","format":"int64","type":"integer"},"summary":{"description":"Summary is the one line describing what the category groups.","type":"string"}},"type":"object"},"taxonomy.taxonIn":{"properties":{"brands":{"description":"Brands are the brands whose console shows it. Omit for every brand its\ncategory admits.","items":{"type":"string"},"type":"array"},"category":{"description":"Category is the id of an EXISTING category to file it under. Required.","type":"string"},"description":{"description":"Description is the one line shown beneath the name.","type":"string"},"href":{"description":"Href is the absolute URL an external product launches. Give this or route,\nnever both.","type":"string"},"icon":{"description":"Icon names the icon the surface renders, e.g. \"Database\".","type":"string"},"id":{"description":"ID is the taxon slug to write, from the path.","type":"string"},"name":{"description":"Name is the display name. Required.","type":"string"},"order":{"description":"Order is where it sits within its category, ascending.","format":"int64","type":"integer"},"published":{"description":"Published is whether it is shown. Omitted means published — a taxon someone\ntook the trouble to write is meant to be seen, and hiding one is the\ndeliberate act.","type":"boolean"},"route":{"description":"Route is the in-console path it opens, e.g. \"/vector\". Give this or href,\nnever both.","type":"string"},"tags":{"description":"Tags are free-form labels for search and grouping across categories.","items":{"type":"string"},"type":"array"}},"type":"object"},"team.collabPayload":{"properties":{"content":{"additionalProperties":{"type":"string"},"description":"Content maps a document field to its ProseMirror markup JSON.","type":"object"},"source":{"description":"Source is the blob ref a getContent reads the snapshot from. Absent means\nthere is no snapshot to read, which answers empty content.","type":"string"},"updates":{"additionalProperties":{"type":"string"},"description":"Updates carries, per field, a base64 Y.js state update encoding the SAME\nmarkup — the front computes it (markupToYDoc → encodeStateAsUpdate) so a\ncreateContent seeds the live-editing lane's update log, not just the\nsnapshot blob. Without it a dialog-created description is invisible in the\ncollaborative editor, which replays the ydoc log, never the snapshot.","type":"object"}},"type":"object"},"team.collabRequest":{"properties":{"documentId":{"description":"DocumentID addresses the document field, as\n\"<spaceUuid>|<objectClass>|<objectId>|<objectAttr>\" — the\ncollaborator-client encodeDocumentId shape, from the path.","type":"string"},"method":{"description":"Method is the verb: createContent, updateContent or getContent.","type":"string"},"payload":{"$ref":"#/components/schemas/team.collabPayload","description":"Payload is the verb's argument."}},"type":"object"},"team.teamCommentWrite":{"properties":{"files":{"description":"Files attaches blobs already uploaded to the space.","items":{"$ref":"#/components/schemas/team.teamFileIn"},"type":"array"},"id":{"description":"ID is the document, from the path.","type":"string"},"space":{"description":"Space is the space uuid holding it. Body-only.","type":"string"},"text":{"description":"Text is the comment, with the same `<@account-uuid>` mentions a message\ntakes.","type":"string"}},"type":"object"},"team.teamDirectOpen":{"properties":{"members":{"description":"Members are the account uuids to talk to — people or agents of the space.\nThe caller is always in the conversation and need not name themselves; an\nempty list is the caller's own notes-to-self conversation.","items":{"type":"string"},"type":"array"},"space":{"description":"Space is the space uuid. Optional for a caller in exactly one space.","type":"string"}},"type":"object"},"team.teamDocEdit":{"properties":{"id":{"description":"ID is the document, from the path.","type":"string"},"parent":{"description":"Parent moves the document under another one; \"\" moves it to the top of\nits teamspace. It goes after its new siblings.","type":"string"},"space":{"description":"Space is the space uuid holding it. Body-only.","type":"string"},"teamspace":{"description":"Teamspace moves the document — with everything nested under it — to\nanother teamspace, at the top unless Parent names a document there.","type":"string"},"title":{"description":"Title renames the document. Empty reads \"Untitled\".","type":"string"}},"type":"object"},"team.teamDocNew":{"properties":{"parent":{"description":"Parent nests the new document under another one.","type":"string"},"space":{"description":"Space is the space uuid. Optional for a caller in exactly one space.","type":"string"},"teamspace":{"description":"Teamspace is where the document goes. Optional: a document nested under a\nparent goes in the parent's teamspace, and a space with exactly one\nteamspace the caller can write needs no name — with none, the first\ndocument opens a public \"General\" teamspace for the whole space.","type":"string"},"title":{"description":"Title is the document's title. Empty reads \"Untitled\", as in the Team\nclient.","type":"string"}},"type":"object"},"team.teamFileIn":{"properties":{"file":{"description":"File is the blob id — the uuid the file was uploaded under with\nPOST /v1/team/files/{space}. A blob of another space cannot be named: the\ndownload is keyed by this message's space, so a foreign id resolves to\nnothing.","type":"string"},"name":{"description":"Name is the file's name as a person should see it.","type":"string"},"size":{"description":"Size is the file's length in bytes.","format":"int64","type":"integer"},"type":{"description":"Type is the file's media type, e.g. \"image/png\".","type":"string"}},"type":"object"},"team.teamInboxAll":{"properties":{"space":{"description":"Space is the space uuid. Optional for a caller in exactly one space.","type":"string"}},"type":"object"},"team.teamInboxAt":{"properties":{"id":{"description":"ID is the notification, from the path.","type":"string"},"space":{"description":"Space is the space uuid it was filed in. Body-only.","type":"string"}},"type":"object"},"team.teamMessageEdit":{"properties":{"id":{"description":"ID is the message, from the path.","type":"string"},"space":{"description":"Space names the space holding it. Body-only.","type":"string"},"text":{"description":"Text is the message's new text, with the same `<@account-uuid>` mentions\na new message takes. Somebody newly mentioned is notified; somebody already\nmentioned is not notified twice.","type":"string"}},"type":"object"},"team.teamMessageWrite":{"properties":{"files":{"description":"Files attaches blobs already uploaded to the space. A message may be\nfiles alone, with no text.","items":{"$ref":"#/components/schemas/team.teamFileIn"},"type":"array"},"id":{"description":"ID is the room to say it in, from the path.","type":"string"},"space":{"description":"Space names the space holding the room. Body-only: a query string may not\nredirect a write.","type":"string"},"text":{"description":"Text is what to say, as plain text. It is wrapped in the client's markup on\nthe way in, so a caller writes words rather than HTML. `<@account-uuid>`\nmentions a member of the space: it is stored as the platform's mention, so\nthey are notified, and an agent mentioned this way answers.","type":"string"}},"type":"object"},"team.teamReactionWrite":{"properties":{"emoji":{"description":"Emoji is the reaction, from the path (percent-encoded on the wire).","type":"string"},"id":{"description":"ID is the message, from the path.","type":"string"},"space":{"description":"Space names the space holding the message. Body-only.","type":"string"}},"type":"object"},"team.teamReplyWrite":{"properties":{"files":{"description":"Files attaches blobs already uploaded to the space.","items":{"$ref":"#/components/schemas/team.teamFileIn"},"type":"array"},"id":{"description":"ID is the message being answered, from the path.","type":"string"},"space":{"description":"Space names the space holding it. Body-only.","type":"string"},"text":{"description":"Text is the reply, with the same `<@account-uuid>` mentions a message\ntakes.","type":"string"}},"type":"object"},"team.teamRoomBind":{"properties":{"bindings":{"description":"Bindings REPLACES what the room is about, wholly. It is a replace and\nnot a merge because a caller that cannot remove a binding would have no way\nto correct a wrong one, and an empty list sent explicitly is how a room\nis unbound. Absent (null) leaves the existing list alone.","items":{"type":"string"},"type":"array"},"id":{"description":"ID is the room to bind, from the path. The URL is the authority; a body\ncarrying another id cannot redirect the write.","type":"string"},"life":{"description":"Life sets the lifecycle intent: \"standing\" or \"bound\". Any other\nvalue is refused rather than stored, so a reader never has to interpret a\nthird one. Empty leaves the current intent unchanged.","type":"string"},"space":{"description":"Space names the space holding the room. It is required, because\na room id is unique only within one and searching every space for a\nmatching id would make the write's target depend on iteration order.","type":"string"}},"type":"object"},"team.teamRoomEdit":{"properties":{"archived":{"description":"Archived closes the room (true) or reopens it (false). An archived room\nkeeps its history and takes no new messages.","type":"boolean"},"id":{"description":"ID is the room, from the path.","type":"string"},"name":{"description":"Name renames a channel. A direct message has no name.","type":"string"},"space":{"description":"Space is the space uuid holding it. Body-only.","type":"string"},"topic":{"description":"Topic sets the channel's one-line subject; \"\" clears it.","type":"string"}},"type":"object"},"team.teamRoomJoin":{"properties":{"id":{"description":"ID is the room, from the path.","type":"string"},"members":{"description":"Members are the account uuids to add — people or agents of the space.\nNaming only yourself joins a public channel.","items":{"type":"string"},"type":"array"},"space":{"description":"Space is the space uuid holding it. Body-only.","type":"string"}},"type":"object"},"team.teamRoomNew":{"properties":{"bindings":{"description":"Bindings are what the room is about, each \"<kind>:<ref>\".","items":{"type":"string"},"type":"array"},"life":{"description":"Life is the lifecycle intent, \"standing\" or \"bound\"; empty reads standing.","type":"string"},"members":{"description":"Members are the account uuids in the room. A public room may open empty —\nanyone in the org can find it — and a private one that names nobody is\nrefused rather than created unreachable.","items":{"type":"string"},"type":"array"},"name":{"description":"Name is what a person sees in a sidebar — \"bugfix-1010\", not \"#bugfix-1010\".\nThe sigil is how a client DRAWS a room, and storing it would put it in the\nname twice the first time a client added its own.","type":"string"},"private":{"description":"Private restricts the room to its members. Public is the default because a\nroom nobody can find is the more surprising of the two.","type":"boolean"},"space":{"description":"Space is where the room is opened. Optional: an org with one space has no\nchoice to make, so it does not have to state one. An org with several must,\nbecause picking for it would make the room's home depend on iteration order.","type":"string"},"topic":{"description":"Topic is the room's one-line subject.","type":"string"}},"type":"object"},"tel.buyInput":{"properties":{"e164":{"description":"E164 is the number to buy, in E.164 (a leading + and digits), exactly as the\nsearch returned it. This is the number itself, not the id from a search result.","type":"string"}},"type":"object"},"tel.callInput":{"properties":{"agent":{"description":"Agent hands the answered call to a Hanzo assistant by name instead of\nconnecting it to a person. Empty places an ordinary call.","type":"string"},"from":{"description":"From is the number to call FROM, in E.164. It must be one this org holds.","type":"string"},"record":{"description":"Record is a per-call flag rather than a product. Where a recording lands and\nhow long it is kept is the org's retention policy, not this call's.","type":"boolean"},"to":{"description":"To is the number to call, in E.164.","type":"string"},"webhook":{"description":"Webhook is a URL the carrier posts this call's events to as it progresses.\nEmpty means the call's outcome is only visible by reading it back.","type":"string"}},"type":"object"},"tel.messageInput":{"properties":{"from":{"description":"From is the number to send FROM, in E.164. It must be one this org holds and it\nmust be sms-capable.","type":"string"},"media":{"description":"Media are URLs to attach. A message with any is an MMS to the carrier — the\ndistinction is the carrier's to make, not something the caller declares.","items":{"type":"string"},"type":"array"},"text":{"description":"Text is the message body. It may be empty when Media carries the message.","type":"string"},"to":{"description":"To is the number to send to, in E.164.","type":"string"}},"type":"object"},"template.Variant":{"properties":{"framework":{"description":"only when it differs from the template's","type":"string"},"id":{"description":"selector, unique within the template (\"react\", \"grid-3-fluid\")","type":"string"},"kind":{"description":"the axis it varies: format | page | theme","type":"string"},"label":{"description":"human label for the picker","type":"string"},"source":{"description":"the repository this shape is forked from; the synthesized default shape carries the template's own","type":"string"}},"type":"object"},"template.publishKitIn":{"properties":{"category":{"description":"Category groups the kit in the gallery browser.","type":"string"},"demo":{"description":"Demo is the deployed site itself, when there is one.","type":"string"},"description":{"description":"Description is the browse-card blurb, max 4096 characters.","type":"string"},"features":{"description":"Features are the highlights the card lists, at most 32.","items":{"type":"string"},"type":"array"},"framework":{"description":"Framework is the stack the kit is built on (\"Next.js 14\").","type":"string"},"preview":{"description":"Preview is the still image the browse card renders, max 4096 characters.","type":"string"},"slug":{"description":"Slug is the kit's identity — lowercase alphanumeric with dashes, max 40.","type":"string"},"source":{"description":"Source is the repository the kit is forked from, max 4096 characters.","type":"string"},"title":{"description":"Title is the display name. Required, max 200 characters.","type":"string"},"useCase":{"description":"UseCase is what the kit is for, in a phrase.","type":"string"},"variants":{"description":"Variants are the shapes this kit ships in, at most 32; the fork picks one.","items":{"$ref":"#/components/schemas/template.Variant"},"type":"array"}},"type":"object"},"template.replaceKitIn":{"properties":{"category":{"description":"Category groups the kit in the gallery browser.","type":"string"},"demo":{"description":"Demo is the deployed site itself, when there is one.","type":"string"},"description":{"description":"Description is the browse-card blurb, max 4096 characters.","type":"string"},"features":{"description":"Features are the highlights the card lists, at most 32.","items":{"type":"string"},"type":"array"},"framework":{"description":"Framework is the stack the kit is built on (\"Next.js 14\").","type":"string"},"preview":{"description":"Preview is the still image the browse card renders, max 4096 characters.","type":"string"},"slug":{"description":"Slug is the kit to replace, from the path.","type":"string"},"source":{"description":"Source is the repository the kit is forked from, max 4096 characters.","type":"string"},"title":{"description":"Title is the display name. Required, max 200 characters.","type":"string"},"useCase":{"description":"UseCase is what the kit is for, in a phrase.","type":"string"},"variants":{"description":"Variants are the shapes this kit ships in, at most 32; the fork picks one.","items":{"$ref":"#/components/schemas/template.Variant"},"type":"array"}},"type":"object"},"tool.activationReq":{"properties":{"activate":{"description":"Activate switches these tool names on for the caller's org and project.","items":{"type":"string"},"type":"array"},"deactivate":{"description":"Deactivate switches these tool names off.","items":{"type":"string"},"type":"array"}},"type":"object"},"tool.buildRequest":{"properties":{"name":{"description":"Name is the plugin's name: one lowercase path segment (a-z0-9, _ or -),\nand the id the runtime loads it by.","type":"string"},"provider":{"description":"Provider is the connectors provider whose credential the plugin reads at\nrun time. Empty for a plugin that needs none.","type":"string"},"source":{"description":"Source is TypeScript to build as-is. Exactly one of Source or Spec.","type":"string"},"spec":{"description":"Spec is API documentation — an OpenAPI document, or prose describing the\nendpoints — that the generator turns into Source. The generated source is\nreturned in the response, so a caller can read what will run before it runs.","type":"string"}},"type":"object"},"tool.createServerReq":{"properties":{"authHeader":{"description":"AuthHeader is the request header the credential is injected into, e.g.\n\"Authorization\". Empty means the server needs no credential.","type":"string"},"listing":{"description":"Listing enables a CATALOG entry instead — the id from GET /v1/tool/catalog.\nThe endpoint is the listing's own streamable-http remote, so a listing that\nonly ships a stdio package is refused: there is nothing to reach yet.","type":"string"},"name":{"description":"Name labels the server for the org. Required with URL; with Listing it\ndefaults to the listing's own title.","type":"string"},"secret":{"description":"Secret is the credential VALUE. It is sealed into KMS under a per-org ref\nand never stored in SQLite, never listed, and never returned.","type":"string"},"url":{"description":"URL is the server's JSON-RPC endpoint. It must be an http(s) URL naming a\nPUBLIC host: loopback, link-local, private and cloud-metadata addresses are\nrefused here and again when the dialer connects. A URL carrying a credential\n(user:password@) is refused: the credential is the secret.","type":"string"}},"type":"object"},"tool.muteReq":{"properties":{"mute":{"description":"Mute takes these out of the caller's runs: a skill (skill_<name>), a\nserver's tool (<server>_<tool>) or a whole server (<server>), each one the\norg's kit carries.","items":{"type":"string"},"type":"array"},"unmute":{"description":"Unmute gives these back, as far as the org's kit carries them.","items":{"type":"string"},"type":"array"}},"type":"object"},"tool.skillIn":{"properties":{"content":{"description":"Content is the SKILL.md body. Required, at most 256 KiB.","type":"string"},"description":{"description":"Description is the one-line summary discovery shows for the skill.","type":"string"},"name":{"description":"Name is the skill's id within the org: one lowercase path segment\n(a-z0-9, _ or -). Writing an existing name REVISES that skill.","type":"string"}},"type":"object"},"tool.toolCall":{"properties":{"arguments":{"additionalProperties":{},"description":"Arguments is the tool's own input object, passed through verbatim to\nwhichever source owns it.","type":"object"},"name":{"description":"Name is the tool to run, exactly as GET /v1/tool reports it.","type":"string"}},"type":"object"},"train.Adaptation":{"properties":{"alpha":{"description":"Alpha is an adapter's scale.","format":"double","type":"number"},"basis":{"description":"Basis is a basis artifact, by sha256 or `basis://<base>/<name>`.","type":"string"},"chose":{"$ref":"#/components/schemas/train.Chose","description":"Chose is what auto resolved to and why; absent unless auto was asked."},"mode":{"description":"Mode is full, readout (the head alone, over the frozen base), lora, qlora,\nbasis or auto.","type":"string"},"rank":{"description":"Rank is an adapter's rank, or how many of a basis's directions are used.","format":"int64","type":"integer"},"residual_rank":{"description":"ResidualRank is the rank of an orthonormal residual learned beside a basis's\ncoefficients; 0 trains the coefficients alone.","format":"int64","type":"integer"},"sources":{"description":"Sources are lora artifacts (sha256) a basis is built from, in place of Basis.","items":{"type":"string"},"type":"array"},"targets":{"description":"Targets are the modules an adapter or a basis attaches to.","items":{"type":"string"},"type":"array"}},"type":"object"},"train.Budget":{"properties":{"accuracy":{"description":"Accuracy is the largest accuracy drop allowed.","format":"double","type":"number"},"ece":{"description":"ECE is the largest calibration-error rise allowed.","format":"double","type":"number"}},"type":"object"},"train.Chose":{"properties":{"mode":{"description":"Mode is the mode the job runs.","type":"string"},"why":{"description":"Why says what decided it.","type":"string"}},"type":"object"},"train.Dataset":{"properties":{"splits":{"additionalProperties":{"type":"string"},"description":"Splits maps a role (train, validation) to the dataset's own split name.","type":"object"},"uri":{"description":"URI names the data.","type":"string"}},"type":"object"},"train.Evaluation":{"properties":{"suites":{"description":"Suites are the suites the job is meant to improve.","items":{"type":"string"},"type":"array"}},"type":"object"},"train.Objective":{"properties":{"loss":{"description":"Loss is `cross_entropy`.","type":"string"},"terms":{"description":"Terms are added to each row's loss.","items":{"$ref":"#/components/schemas/train.Term"},"type":"array"}},"type":"object"},"train.Options":{"properties":{"labels":{"description":"Labels are its option labels, in order: a choice's criteria, a score's levels\nas text, a noul's two sides.","items":{"type":"string"},"type":"array"},"type":{"description":"Type is choice, score or noul.","type":"string"}},"type":"object"},"train.Output":{"properties":{"kind":{"description":"Kind is checkpoint, lora, capability, basis or merged.","type":"string"},"name":{"description":"Name labels it.","type":"string"}},"type":"object"},"train.Projection":{"properties":{"strength":{"description":"Strength is λ in [0, 1]; absent is 1, the whole of P g removed.","format":"double","type":"number"}},"type":"object"},"train.Protect":{"properties":{"budget":{"$ref":"#/components/schemas/train.Budget","description":"Budget bounds the regression per protected suite."},"capabilities":{"description":"Capabilities are capability artifacts, by sha256.","items":{"type":"string"},"type":"array"},"distillation":{"description":"Distillation adds KL to the base's answers on a preservation set drawn from\nthe suites.","type":"boolean"},"projection":{"$ref":"#/components/schemas/train.Projection","description":"Projection projects every update off the protected directions — the suites'\ngradient subspace at the base and each named capability's subspace — by its\nstrength; absent is no projection."},"suites":{"description":"Suites are capabilities the base already has, by suite.","items":{"type":"string"},"type":"array"}},"type":"object"},"train.Resources":{"properties":{"budget":{"description":"Budget bounds what the job's compute costs, in US cents; 0 is none beyond\nthe payer's balance. Only a job Hanzo runs costs anything, so only it takes one.","format":"int64","type":"integer"},"devices":{"description":"Devices are the accelerator kinds the job may run on — cuda, rocm, metal,\nvulkan, cpu; none named is any its base runs.","items":{"type":"string"},"type":"array"},"machines":{"description":"Machines are the org's linked machines by name; the first leads. When it\nnames none, Hanzo's executor runs the job and its compute is charged by the\ndevice-second.","items":{"type":"string"},"type":"array"},"max_seconds":{"description":"MaxSeconds bounds the device-seconds the job's tasks use together; 0 is none.","format":"int64","type":"integer"},"steps":{"description":"Steps bounds optimizer steps; 0 runs the plan.","format":"int64","type":"integer"}},"type":"object"},"train.Route":{"properties":{"keys":{"description":"Keys are the question keys it answers.","items":{"type":"string"},"type":"array"},"options":{"additionalProperties":{"$ref":"#/components/schemas/train.Options"},"description":"Options narrows a key to one question: a question under that key routes here\nonly when its type and option labels are exactly these. A key not named here\nroutes whatever its question.","type":"object"}},"type":"object"},"train.Spec":{"properties":{"adaptation":{"$ref":"#/components/schemas/train.Adaptation","description":"Adaptation is how the update is parameterized."},"base_model":{"description":"BaseModel is the base the capability is taught to: `kai`, or a model the engine\nloads for a client.","type":"string"},"dataset":{"$ref":"#/components/schemas/train.Dataset","description":"Dataset is what the job trains on."},"evaluation":{"$ref":"#/components/schemas/train.Evaluation","description":"Evaluation names the target suites the result reports."},"from":{"description":"From is an artifact the job starts from, by sha256.","type":"string"},"objective":{"$ref":"#/components/schemas/train.Objective","description":"Objective is the loss and the terms beside it."},"output":{"$ref":"#/components/schemas/train.Output","description":"Output is what the job produces."},"protect":{"$ref":"#/components/schemas/train.Protect","description":"Protect names what the base already does that must hold, and the budget."},"resources":{"$ref":"#/components/schemas/train.Resources","description":"Resources places and bounds the run."},"revision":{"description":"Revision pins the base. For kai: a finished run's name on the executor, or\n`hub:<repo>@<rev>`.","type":"string"}},"type":"object"},"train.Supports":{"properties":{"adaptations":{"description":"Adaptations are the modes it runs.","items":{"type":"string"},"type":"array"},"outputs":{"description":"Outputs are the output kinds it produces.","items":{"type":"string"},"type":"array"},"protect":{"description":"Protect are the protections it runs: projection, distillation, capabilities.","items":{"type":"string"},"type":"array"},"terms":{"description":"Terms are the objective terms it runs.","items":{"type":"string"},"type":"array"}},"type":"object"},"train.Term":{"properties":{"kind":{"description":"Kind names the term.","type":"string"},"margin":{"description":"Margin is a hinge's margin, in logits.","format":"double","type":"number"},"weight":{"description":"Weight scales it; 0 is off.","format":"double","type":"number"}},"type":"object"},"train.captureIn":{"properties":{"on":{"type":"boolean"}},"type":"object"},"train.claimIn":{"properties":{"bases":{"description":"Bases are the base models its trainer runs.","items":{"type":"string"},"type":"array"},"devices":{"description":"Devices are its accelerators, one entry per device: cuda, rocm, metal,\nvulkan, cpu. A task runs on those of one kind its job allows.","items":{"type":"string"},"type":"array"},"machine":{"description":"Machine is the machine claiming, by name: one of the org's linked machines,\nor for a platform claim the Hanzo host.","type":"string"},"platform":{"description":"Platform claims for Hanzo's executor: a task of any org's job that names no\nmachines. A SuperAdmin's claim alone, and on the platform's audit trail.","type":"boolean"},"supports":{"$ref":"#/components/schemas/train.Supports","description":"Supports is what its build runs."}},"type":"object"},"train.createClientIn":{"properties":{"adaptation":{"$ref":"#/components/schemas/train.Adaptation","description":"Adaptation is lora, the one mode clients run; its shape is lora_config."},"base_model":{"description":"BaseModel is a model the engine loads: a Hugging Face repo id or a local path.","type":"string"},"lora_config":{"description":"LoraConfig is the adapter's shape, as the engine's wire takes it."},"protect":{"$ref":"#/components/schemas/train.Protect","description":"Protect is refused: clients protect nothing yet."}},"type":"object"},"train.createIn":{"properties":{"corrections":{"description":"Corrections are the corrections it is taught from: captured corrections of\none question, which becomes its route.","items":{"type":"string"},"type":"array"},"name":{"description":"Name is its name: lowercase words joined by hyphens, at most 64.","type":"string"}},"type":"object"},"train.forwardIn":{"properties":{"data":{"description":"Data are the examples: {prompt, completion} text, or tokenized datums.","items":{},"type":"array"},"id":{"description":"ID names the client.","type":"string"}},"type":"object"},"train.optimIn":{"properties":{"adam_params":{"description":"AdamParams are the optimizer's parameters for this step."},"id":{"description":"ID names the client.","type":"string"}},"type":"object"},"train.publishCapIn":{"properties":{"name":{"type":"string"},"version":{"description":"Version is the version to install; the newest that passed when absent.","format":"int64","type":"integer"}},"type":"object"},"train.publishIn":{"properties":{"force":{"description":"Force publishes a rejected job's output, and is recorded.","type":"boolean"},"id":{"description":"ID names the job.","type":"string"},"name":{"description":"Name is the published name; the output's name when absent. Publishing a\nname the org already published replaces that capability.","type":"string"},"route":{"$ref":"#/components/schemas/train.Route","description":"Route is which questions the capability answers: required to publish a\ncapability, refused for any other output."}},"type":"object"},"train.registerIn":{"properties":{"id":{"description":"ID names the job, from the path.","type":"string"},"kind":{"description":"Kind is checkpoint, lora, capability, basis or merged.","type":"string"},"lease":{"description":"Lease is the task's lease.","type":"string"},"meta":{"additionalProperties":{},"description":"Meta describes it: its base and revision, its modules, a basis's address.","type":"object"},"name":{"description":"Name labels it.","type":"string"},"sha256":{"description":"SHA256 is the hex digest of the bytes.","type":"string"},"size":{"description":"Size is the byte count.","format":"int64","type":"integer"},"task":{"description":"Task is the reporting task.","type":"string"}},"type":"object"},"train.reportIn":{"properties":{"events":{"description":"Events are the task's new events, in order.","items":{},"type":"array"},"id":{"description":"ID names the job, from the path.","type":"string"},"lease":{"description":"Lease is the task's lease, as the claim answered it.","type":"string"},"task":{"description":"Task is the reporting task.","type":"string"}},"type":"object"},"train.sampleIn":{"properties":{"id":{"description":"ID names the client.","type":"string"},"num_samples":{"description":"NumSamples is how many sequences to decode.","format":"int64","type":"integer"},"prompt":{"description":"Prompt is a text prompt; exactly one of prompt and tokens.","type":"string"},"sampling_params":{"description":"SamplingParams are the decoding parameters."},"tokens":{"description":"Tokens is a tokenized prompt.","items":{"format":"uint32","type":"integer"},"type":"array"}},"type":"object"},"train.saveIn":{"properties":{"id":{"description":"ID names the client.","type":"string"},"name":{"description":"Name is the adapter's name.","type":"string"},"output":{"$ref":"#/components/schemas/train.Output","description":"Output is lora, the one kind a client writes."}},"type":"object"},"train.trainIn":{"properties":{"corrections":{"description":"Corrections, when given, replace the corrections it is taught from: captured\ncorrections of its question.","items":{"type":"string"},"type":"array"},"name":{"type":"string"}},"type":"object"},"train.uploadIn":{"properties":{"kind":{"description":"Kind is dataset: JSON Lines rows a job reads as `artifact:<sha256>`.","type":"string"},"name":{"description":"Name labels it.","type":"string"},"sha256":{"description":"SHA256 is the hex digest of the bytes.","type":"string"},"size":{"description":"Size is the byte count.","format":"int64","type":"integer"}},"type":"object"},"translate.ReviewRequest":{"properties":{"format":{"description":"Format is the markup the source carries: text (the default), html or markdown.\nPart of the entry's identity.","type":"string"},"glossary":{"additionalProperties":{"type":"string"},"description":"Glossary is the terminology the entry was translated under. Its VERSION — the\ndigest of the sorted terms — is part of the entry's identity, so editing a term\nyields a new entry rather than overwriting the old rendering.","type":"object"},"lang":{"description":"Lang is the source language the translate calls this entry serves declare\n(their `source`), empty for calls that let the engine detect it. Part of the\nentry's identity; an entry with none also serves calls that declare one.","type":"string"},"model":{"description":"Model is the quality-tier model the translate calls this entry serves name;\nempty for the default. Part of the entry's identity, and refused with bulk.","type":"string"},"source":{"description":"Source is the ORIGINAL string this entry translates. Required; part of the\nentry's identity, so a different source is a different entry.","type":"string"},"state":{"description":"State is the entry's new position on the review ladder: suggested, approved or\npublished. `machine` is engine-only and is refused here — a human may not demote\na string back into the churn.","type":"string"},"target":{"description":"Target is the target language tag (BCP-47, e.g. \"es\" or \"pt-BR\"). Required;\npart of the entry's identity.","type":"string"},"text":{"description":"Text is the reviewed translation to store. A human write always wins over the\nstored value.","type":"string"},"tier":{"description":"Tier is the engine tier the entry belongs to, quality (the default) or bulk.\nPart of the entry's identity: the two tiers keep separate renderings.","type":"string"}},"type":"object"},"trust.sectionWrite":{"properties":{"data":{"description":"Data is the record. What may be in it depends on the section, and every\nsection's required fields are validated: a control is held to the same rule\na committed one is, a subprocessor must say what it is for, an update must\ncarry the date it describes."},"id":{"description":"ID is the record's id. Omit it on a create and one is minted; the\nsingle-valued sections (profile, risk) hold one record whatever is named.","type":"string"},"kind":{"description":"Kind is the section being written. The URL is the authority.","type":"string"},"ord":{"description":"Ord orders this record within its section, ascending, ties broken by id.\nIt is the organization's own ordering — the page renders in it.","format":"int64","type":"integer"}},"type":"object"},"usage.reportReq":{"properties":{"account":{"description":"Account is the linked account the window was metered from.","type":"string"},"cachedInputTokens":{"description":"CachedInputTokens is the prompt tokens the provider served from cache.","format":"int64","type":"integer"},"confidence":{"description":"Confidence says how much the counters below mean.","type":"string"},"costCents":{"description":"CostCents is what the window cost on the PROVIDER's own plan, in US cents.","format":"int64","type":"integer"},"costLimitCents":{"description":"CostLimitCents is the plan's spend ceiling for the window, in US cents.","format":"int64","type":"integer"},"currency":{"description":"Currency is the provider's currency when it is not US cents.","type":"string"},"inputTokens":{"description":"InputTokens is prompt tokens consumed in the window.","format":"int64","type":"integer"},"kind":{"description":"Kind is subscription or apikey. Empty is accepted; anything else is\nrefused.","type":"string"},"lane":{"description":"Lane is the meter lane within the account.","type":"string"},"machine":{"description":"Machine is the host whose meter read the window. Required on every sample.","type":"string"},"outputTokens":{"description":"OutputTokens is completion tokens produced in the window.","format":"int64","type":"integer"},"plan":{"description":"Plan is the subscription plan the account is on, as the provider names it.","type":"string"},"provider":{"description":"Provider is the upstream the account belongs to, e.g. anthropic. Required\non every sample.","type":"string"},"requests":{"description":"Requests is how many requests the window covers.","format":"int64","type":"integer"},"resetsAt":{"description":"ResetsAt is when the measured window rolls over, RFC3339.","type":"string"},"samples":{"description":"Samples is the batch form: every lane a poller measured, in one call. When\nit is non-empty the top-level sample fields are ignored.","items":{"$ref":"#/components/schemas/usage.sampleReq"},"type":"array"},"synthetic":{"description":"Synthetic marks a window the meter inferred rather than read.","type":"boolean"},"totalTokens":{"description":"TotalTokens is the window's total tokens.","format":"int64","type":"integer"},"usedPct":{"description":"UsedPct is how much of the window's allowance is consumed, 0–100.","format":"double","type":"number"},"window":{"description":"Window is the window class: 6h, day, week or month. Required, and a class\nthis surface does not know is refused rather than rewritten.","type":"string"},"windowMinutes":{"description":"WindowMinutes is the window's real length in minutes, as the meter reports\nit.","format":"int32","type":"integer"},"windowStart":{"description":"WindowStart is when the measured window opened, RFC3339. This is how a\nbackfill states WHICH window it measured; the server always owns the\nobservation clock, so there is no timestamp field.","type":"string"}},"type":"object"},"usage.sampleReq":{"properties":{"account":{"description":"Account is the linked account the window was metered from.","type":"string"},"cachedInputTokens":{"description":"CachedInputTokens is the prompt tokens the provider served from cache.","format":"int64","type":"integer"},"confidence":{"description":"Confidence says how much the counters below mean.","type":"string"},"costCents":{"description":"CostCents is what the window cost on the PROVIDER's own plan, in US cents.","format":"int64","type":"integer"},"costLimitCents":{"description":"CostLimitCents is the plan's spend ceiling for the window, in US cents.","format":"int64","type":"integer"},"currency":{"description":"Currency is the provider's currency when it is not US cents.","type":"string"},"inputTokens":{"description":"InputTokens is prompt tokens consumed in the window.","format":"int64","type":"integer"},"kind":{"description":"Kind is subscription or apikey. Empty is accepted; anything else is\nrefused.","type":"string"},"lane":{"description":"Lane is the meter lane within the account.","type":"string"},"machine":{"description":"Machine is the host whose meter read the window. Required.","type":"string"},"outputTokens":{"description":"OutputTokens is completion tokens produced in the window.","format":"int64","type":"integer"},"plan":{"description":"Plan is the subscription plan the account is on, as the provider names it.","type":"string"},"provider":{"description":"Provider is the upstream the account belongs to, e.g. anthropic. Required.","type":"string"},"requests":{"description":"Requests is how many requests the window covers.","format":"int64","type":"integer"},"resetsAt":{"description":"ResetsAt is when the measured window rolls over, RFC3339. Empty is\nallowed; anything else that is not RFC3339 is refused.","type":"string"},"synthetic":{"description":"Synthetic marks a window the meter inferred rather than read.","type":"boolean"},"totalTokens":{"description":"TotalTokens is the window's total tokens.","format":"int64","type":"integer"},"usedPct":{"description":"UsedPct is how much of the window's allowance is consumed, 0–100.","format":"double","type":"number"},"window":{"description":"Window is the window class: 6h, day, week or month. Required, and a class\nthis surface does not know is refused rather than rewritten.","type":"string"},"windowMinutes":{"description":"WindowMinutes is the window's real length in minutes, as the meter reports\nit.","format":"int32","type":"integer"},"windowStart":{"description":"WindowStart is when the measured window opened, RFC3339. Empty is allowed;\nanything else that is not RFC3339 is refused.","type":"string"}},"type":"object"},"validator.validatorClaim":{"properties":{"nonce":{"description":"Nonce is the value GET /v1/validator/challenge issued for this slot.","type":"string"},"signature":{"description":"Signature is the wallet's personal_sign over the challenge message, hex with\na 0x prefix.","type":"string"},"tokenId":{"description":"TokenID is the Validator-tier GenesisNFT token id being claimed. It IS the\nvalidator slot.","format":"uint64","type":"integer"}},"type":"object"},"wallet.createAccountIn":{"properties":{"name":{"description":"Name is the account's label. Required, trimmed; it groups wallets and is\nnot itself a key.","type":"string"}},"type":"object"},"wallet.createWalletIn":{"properties":{"accountId":{"description":"AccountID is the account this wallet belongs to. Required, and it must be\nan account of the caller's own org — an unknown one is a 404.","type":"string"},"agent":{"description":"Agent optionally narrows the wallet to one agent within the org. It becomes\na segment of the key ref, so it must be a url-safe segment with no slash.","type":"string"},"chain":{"description":"Chain is the EVM chain this wallet is for, as \"eip155:<n>\" or a bare\ndecimal chain id. Optional; a Safe defaults to the Hanzo L1 (36963).","type":"string"},"custody":{"description":"Custody selects the signing backend: \"kms\" (in-process, always available),\n\"mpc\" or \"treasury\" (the deployed MPC ring), or \"safe\" (a Safe smart wallet\nowned by an MPC key). Empty uses the deployment's default. A backend that is\nnot configured fails CLOSED with 503 rather than fabricating a signature.","type":"string"},"name":{"description":"Name is the wallet's display label. Optional.","type":"string"},"tier":{"description":"Tier is the MPC wallet tier: hot, warm, cold, gas, bridge, contract_admin,\nvalidator, quarantine or disaster_recovery. Empty defaults to hot.","type":"string"}},"type":"object"},"wallet.safeTxIn":{"properties":{"chainId":{"description":"ChainID is the EVM chain the Safe transaction is bound to. 0 uses the\nwallet's own chain, or the Hanzo L1 (36963) when it is chain-agnostic.","format":"int64","type":"integer"},"data":{"description":"Data is the call data, hex-encoded.","type":"string"},"nonce":{"description":"Nonce is the Safe's transaction nonce.","format":"int64","type":"integer"},"to":{"description":"To is the transaction's target address.","type":"string"},"value":{"description":"Value is the native-token amount to send, as a decimal string in wei.","type":"string"}},"type":"object"},"wallet.signIn":{"properties":{"digest":{"description":"Digest is a pre-computed 32-byte digest as hex, with or without the 0x\nprefix. When present it is signed verbatim and message is ignored.","type":"string"},"message":{"description":"Message is arbitrary text to hash with Keccak256 and sign. Used only when\ndigest is empty.","type":"string"}},"type":"object"},"web3.rpcIn":{"properties":{"chain":{"description":"Chain is the registry id, from the URL.","type":"string"},"id":{"description":"ID is echoed back untouched."},"jsonrpc":{"description":"JSONRPC must be \"2.0\" when present.","type":"string"},"method":{"description":"Method is the RPC method, e.g. eth_getBalance.","type":"string"},"params":{"description":"Params is the method's parameters, passed through unread."}},"type":"object"},"webhook.createEndpointIn":{"properties":{"description":{"description":"Description is a free-text label for the console. Optional, clipped to 1024 bytes.","type":"string"},"events":{"description":"Events are NATS subject patterns to subscribe to (e.g. \"commerce.order.>\").\nAn empty or omitted list means EVERY event on the platform bus. Max 64\npatterns, each max 256 bytes.","items":{"type":"string"},"type":"array"},"status":{"description":"Status is \"active\" or \"disabled\". Empty defaults to active. A disabled\nendpoint receives no bus deliveries, but can still be exercised with\nPOST /v1/webhook/{id}/test.","type":"string"},"url":{"description":"URL is the https:// address each matching event is POSTed to. Required,\nmax 2048 bytes; http:// and every other scheme is refused, because a\nwebhook carries signed event data and must not travel in the clear.","type":"string"}},"type":"object"},"webhook.updateEndpointIn":{"properties":{"description":{"description":"Description is a free-text label for the console. Optional, clipped to 1024 bytes.","type":"string"},"events":{"description":"Events are NATS subject patterns to subscribe to. An empty or omitted list\nmeans EVERY event. Max 64 patterns, each max 256 bytes.","items":{"type":"string"},"type":"array"},"status":{"description":"Status is \"active\" or \"disabled\". Empty defaults to active.","type":"string"},"url":{"description":"URL is the https:// address each matching event is POSTed to. Required,\nmax 2048 bytes; http:// and every other scheme is refused.","type":"string"}},"type":"object"},"websearch.searchEngineKey":{"properties":{"key":{"description":"Key is the API key. Sealed in KMS and never returned, logged or echoed.\nNever read from the query string.","type":"string"},"name":{"description":"Name is the engine, from the path.","type":"string"}},"type":"object"},"websearch.searchEngineOptions":{"properties":{"count":{"description":"Count is how many hits the engine is asked for per search. 0 or absent on\na write means the engine's default; a read reports the value in force.","format":"int64","type":"integer"},"language":{"description":"Language is the default language the engine is asked in, as a tag like\n`en` or `en-US`. A search that names its own language overrides it.","type":"string"},"region":{"description":"Region is a two-letter country code the engine favours, like `GB`.\nStored upper case.","type":"string"}},"type":"object"},"websearch.searchEnginesSet":{"properties":{"enabled":{"description":"Enabled are the engines searches run, in order. At least one, each a\nregistered engine named once, and at least one of them must be available.","items":{"type":"string"},"type":"array"},"options":{"additionalProperties":{"$ref":"#/components/schemas/websearch.searchEngineOptions"},"description":"Options are each engine's values, by engine name — for any registered\nengine, enabled or not. An engine or a field left out takes its default:\nthe setting replaces the stored one whole.","type":"object"}},"type":"object"},"websearch.webSearchQuery":{"properties":{"language":{"description":"Language narrows the engines to a locale, BCP-47-ish (\"en\", \"ja\", \"de\").\nEmpty means no narrowing.","type":"string"},"q":{"description":"Q is the query. Required — an empty one is refused rather than answered\nwith the whole web.","type":"string"}},"type":"object"},"world.Filters":{"properties":{"keywords":{"description":"Keywords keeps only items whose TITLE contains one of these,\ncase-insensitively. They are also the GDELT queries the feed fans out to,\none per keyword of three characters or more — so a keyword both widens what\nis fetched and narrows what is kept.","items":{"type":"string"},"type":"array"},"regions":{"description":"Regions keeps only items whose TITLE contains one of these, matched\ncase-insensitively as a substring. Empty keeps every region.","items":{"type":"string"},"type":"array"},"sources":{"description":"Sources keeps only items whose outlet name contains one of these,\ncase-insensitively. Empty keeps every outlet.","items":{"type":"string"},"type":"array"}},"type":"object"},"world.pipelineReq":{"properties":{"feeds":{"description":"Feeds is the RSS/Atom feed URLs to read, at most 64. Each must be an\nhttp(s) URL whose host is on the server's allowlist — the SSRF guard is\napplied here, at the write, so a stored pipeline can never name a host the\nfetcher would refuse. Blank entries are dropped and duplicates collapse.","items":{"type":"string"},"type":"array"},"filters":{"$ref":"#/components/schemas/world.Filters","description":"Filters narrows the merged feed. Terms are trimmed, de-duplicated\ncase-insensitively, and capped at 64 per axis."}},"type":"object"}}},"info":{"description":"Generated by `cargo run --features genspec --bin genspec`. The SOURCE is the Hanzo Cloud API document hanzo-inc/cloud@11ab80d643a650a15efe062bc557fef4634def1e sha256:baceaf03e56ad0ba8572aa612977804086ea66903e344a03336fe51f41535106, and it is the ONLY source: it enumerates the operations, and carries their prose and their reflected shapes. Nothing is joined in — an operation absent here is an operation no cloud router registers, which is what makes a phantom command impossible rather than rare. Never hand-edited: `genproduct` derives src/commands/product/generated.rs from this and nothing else. RELAY DOORS, 0: a /v1/<product>/{wildcardN} route is the document declaring a subtree reachable without naming what is behind it, and those addresses are the only places a generated CLI knowingly falls short of what cloud serves. There are none.","title":"Hanzo Cloud — the CLI's command surface","version":"v1"},"openapi":"3.1.0","paths":{"/v1/account/appearance":{"get":{"summary":"Returns the signed-in caller's own appearance preference — text size, density and accent — read from their IAM account so it is the same on every device and every Hanzo surface."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/account.appearance"}}}},"summary":"Stores the caller's appearance preference on their IAM account, preserving every other field of the row."}},"/v1/account/avatar":{"post":{"summary":"Set your profile photo"}},"/v1/account/avatar/{org}/{user}/{digest}":{"get":{"parameters":[{"in":"path","name":"org","required":true,"schema":{"type":"string"}},{"in":"path","name":"user","required":true,"schema":{"type":"string"}},{"in":"path","name":"digest","required":true,"schema":{"type":"string"}}],"summary":"Fetch a profile photo"}},"/v1/account/csrf":{"get":{"summary":"Mints the anti-forgery token a browser echoes as X-CSRF-Token on every change it asks for."}},"/v1/account/embed":{"get":{"parameters":[{"description":"App is the embedded app to report on: cms (Content Studio), erp or help.","example":"cms","in":"query","name":"app","required":false,"schema":{"type":"string"}}],"summary":"Reports whether one of this brand's shared embedded apps (cms, erp, help) may be framed by the caller and is actually running, so a console module can choose between the embed and the provision panel."}},"/v1/account/keys":{"get":{"summary":"Returns the API keys the caller may see, newest first: their own, or every key the org holds when the caller administers it."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/account.keyIn"}}}},"summary":"Creates a NEW API key and returns its secret ONCE."}},"/v1/account/keys/{id}":{"delete":{"parameters":[{"description":"ID is the key to act on, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Revokes exactly one API key, by id."},"patch":{"parameters":[{"description":"ID is the key to edit, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/account.keyEdit"}}}},"summary":"Changes one key's name, permissions, budget, rate or expiry."}},"/v1/account/orgs":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/account.onboardReq"}}}},"summary":"Creates an organization and makes the caller its owner."}},"/v1/ad/campaigns":{"get":{"parameters":[{"description":"Status filters to one lifecycle state (draft, active, paused, completed).\nEmpty returns every campaign the org has.","example":"active","in":"query","name":"status","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many campaigns come back: default 200, maximum 1000. A\nvalue that is not a positive integer reads as the default.","example":50,"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns the caller org's ad campaigns, most recently updated first, optionally narrowed to one lifecycle status."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ad.campaignInput"}}}},"summary":"Registers a new ad campaign for the caller's org and answers 201 with the stored row."}},"/v1/ad/campaigns/{id}":{"delete":{"parameters":[{"example":"camp_2f9c1d","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Removes one of the caller org's campaigns and answers 204 with no body."},"get":{"parameters":[{"example":"camp_2f9c1d","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one of the caller org's campaigns."},"put":{"parameters":[{"example":"camp_2f9c1d","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ad.updateCampaignIn"}}}},"summary":"Replaces the user-owned fields of one of the caller org's campaigns and answers the stored row."}},"/v1/ad/campaigns/{id}/launch":{"post":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Run one of your stored campaigns on its ad network"}},"/v1/ad/summary":{"get":{"summary":"Rolls the caller org's ad campaigns up into four numbers: how many campaigns exist, how many are active, and the summed budget and spend across all of them."}},"/v1/affiliate":{"get":{"summary":"Answers the caller org's OWN affiliate standing: status, referral code and share link, commission rate, how many orgs it has referred, and its lifetime accrued, still-pending and already-paid commission in integer cents, with its payout history."}},"/v1/affiliate/apply":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/affiliate.applyRequest"}}}},"summary":"Enrolls the caller's OWN org as an affiliate at status `applied`, optionally requesting a vanity code, and answers the record — 201 on the first apply, 200 with `created:false` afterwards."}},"/v1/affiliate/attribute":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/affiliate.attributeRequest"}}}},"summary":"Records the first-touch edge every later commission is computed from: the caller's org was referred by the affiliate that owns this code."}},"/v1/affiliate/click":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/affiliate.clickRequest"}}}},"summary":"Counts a click on a share link."}},"/v1/affiliate/leaderboard":{"get":{"summary":"Answers the top affiliates by lifetime accrued commission, shown by OPT-IN HANDLE with aggregate figures only, plus the caller's own exact rank."}},"/v1/affiliate/me":{"get":{"summary":"Answers the richer self-view: the same lifetime accrued, pending and paid commission and payout history, plus the caller's downline broken out by upline LEVEL — direct, second, third — each with the rate paid at that level and how many orgs sit there."}},"/v1/affiliate/me/earnings":{"get":{"summary":"Answers the caller's own commission ledger: per period, the margin it earned against and the commission taken from that margin; and per referred org, that referral's aggregate contribution."}},"/v1/affiliate/me/handle":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/affiliate.handleRequest"}}}},"summary":"Sets the caller's public leaderboard display name, or clears it."}},"/v1/affiliate/me/links":{"get":{"summary":"Answers the caller's share links, each with its URL and its funnel: clicks tracked, signups — orgs attributed with that code — and conversions, meaning how many of those signups have actually produced commission."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/affiliate.createLinkRequest"}}}},"summary":"Mints a new share link for the caller's own affiliate and answers it with its full URL, 201."}},"/v1/agent":{"get":{"summary":"Returns every agent defined in the caller's org, each with the number of runs recorded against it."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/agent.createAgentIn"}}}},"summary":"Defines an agent in the caller's org: a model, a system prompt (instructions) and a set of tool names."}},"/v1/agent/activity":{"get":{"summary":"Serves the recent-activity feed."}},"/v1/agent/ask":{"post":{"summary":"The MCP server a coding run's harness asks its person through."}},"/v1/agent/builds":{"get":{"parameters":[{"description":"Limit caps the page. Absent, zero or over 500 reads as 100.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns the public index of every published build, most recently updated first, so a gallery can link straight to the story behind each product."}},"/v1/agent/builds/{org}/{project}":{"get":{"parameters":[{"description":"Org is the org that published the build, from the path.","example":"hanzo","in":"path","name":"org","required":true,"schema":{"type":"string"}},{"description":"Project is the product's slug, from the path.","example":"landing","in":"path","name":"project","required":true,"schema":{"type":"string"}}],"summary":"Returns the readable build of one product: the agent session that produced it, turn by turn — the prompts, the reasoning, the commits each turn produced — plus the exact `git log` that re-derives every commit binding from git itself, so nothing here has to be taken on trust."}},"/v1/agent/chat":{"post":{"summary":"Run one tool-calling round against your org's own tools"}},"/v1/agent/chat/conversations":{"get":{"summary":"List your own conversations"},"post":{"summary":"Record turns in a conversation"}},"/v1/agent/chat/conversations/{id}":{"delete":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Delete one of your conversations"},"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Read one agent thread in full"},"patch":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Rename, pin or archive one of your conversations"}},"/v1/agent/chat/conversations/{id}/shares":{"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"List the live links to one of your conversations"},"post":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Share one of your conversations by link"}},"/v1/agent/chat/conversations/{id}/shares/{share}":{"delete":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"path","name":"share","required":true,"schema":{"type":"string"}}],"summary":"Revoke a link to one of your conversations"}},"/v1/agent/chat/conversations/{id}/shares/{share}/viewers/{viewer}":{"delete":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"path","name":"share","required":true,"schema":{"type":"string"}},{"in":"path","name":"viewer","required":true,"schema":{"type":"string"}}],"summary":"Remove one viewer from a link"}},"/v1/agent/chat/presets":{"get":{"summary":"List the agent presets available to a caller"}},"/v1/agent/chat/shared":{"get":{"summary":"List the chats shared with you"}},"/v1/agent/chat/shared/{share}":{"get":{"parameters":[{"in":"path","name":"share","required":true,"schema":{"type":"string"}}],"summary":"Read a chat shared with you"}},"/v1/agent/chat/shares":{"get":{"summary":"List every live link in your organization"}},"/v1/agent/chat/shares/read":{"post":{"summary":"Open a conversation shared by link"}},"/v1/agent/chat/shares/{share}":{"delete":{"parameters":[{"in":"path","name":"share","required":true,"schema":{"type":"string"}}],"summary":"Revoke any link in your organization"}},"/v1/agent/coding":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/agent.CodingStartIn"}}}},"summary":"Start one autonomous coding run against a repo in the caller's org"}},"/v1/agent/coding/{session}/artifacts":{"get":{"parameters":[{"description":"Session is the run's handle — the sessionId POST /v1/agent/coding answered\nwith — from the path.","example":"sess_0123456789abcdef0123456789abcdef","in":"path","name":"session","required":true,"schema":{"type":"string"}}],"summary":"Lists what a coding run left, kept after its sandbox is gone: every file it added or changed and its whole change as `changes.patch`, stored beside the run; the ports it served, each a preview while its sandbox is kept; its pull request and where its work was published."}},"/v1/agent/coding/{session}/blob":{"get":{"parameters":[{"description":"Session is the run's handle, from the path.","example":"sess_0123456789abcdef0123456789abcdef","in":"path","name":"session","required":true,"schema":{"type":"string"}},{"description":"Path is repo-relative, from the query. Empty is the repository's root.","example":"api/server.go","in":"query","name":"path","required":false,"schema":{"type":"string"}}],"summary":"Returns one file of a coding run's repository, read where the tree is read, in the shape GET /v1/git/repos/{name}/blob answers: text verbatim, anything else base64, and a file past the 1 MiB view cap marked truncated with no content."}},"/v1/agent/coding/{session}/changes":{"get":{"parameters":[{"description":"Session is the run's handle — the sessionId POST /v1/agent/coding answered\nwith — from the path.","example":"sess_0123456789abcdef0123456789abcdef","in":"path","name":"session","required":true,"schema":{"type":"string"}}],"summary":"Returns what a coding run changed, read from the forge it pushed its branch to: the commits on its branch that the base does not have, newest first; the net change of the branch against its base, one entry per file with that file's patch; and its pull request with the reviews it has had, or null while it has none."}},"/v1/agent/coding/{session}/merge":{"post":{"parameters":[{"description":"Session is the run's handle — the sessionId POST /v1/agent/coding answered\nwith — from the path.","example":"sess_0123456789abcdef0123456789abcdef","in":"path","name":"session","required":true,"schema":{"type":"string"}}],"summary":"Merges a coding run's pull request into the branch it proposes into, on the forge the run pushed to, and answers the pull request after."}},"/v1/agent/coding/{session}/steer":{"post":{"parameters":[{"description":"Session identifies the running or paused coding session from the path.","in":"path","name":"session","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/agent.codingInstruction"}}}},"summary":"Redirect your running or paused coding session."}},"/v1/agent/coding/{session}/tree":{"get":{"parameters":[{"description":"Session is the run's handle, from the path.","example":"sess_0123456789abcdef0123456789abcdef","in":"path","name":"session","required":true,"schema":{"type":"string"}},{"description":"Path is repo-relative, from the query. Empty is the repository's root.","example":"api","in":"query","name":"path","required":false,"schema":{"type":"string"}}],"summary":"Lists one directory of a coding run's repository, one level down with directories first: at the run's own branch once the forge holds it, and at the branch it started from until then — `ref` says which."}},"/v1/agent/mcp/{server}":{"post":{"parameters":[{"in":"path","name":"server","required":true,"schema":{"type":"string"}}],"summary":"The MCP address a coding run's harness reaches one of its org's MCP servers through."}},"/v1/agent/metrics":{"get":{"parameters":[{"description":"Range is the window to bucket: 24H, 7D or 30D. Anything else reads as 30D.","example":"7D","in":"query","name":"range","required":false,"schema":{"type":"string"}}],"summary":"Serves the invocations-over-time histogram for the Agents dashboard, over the caller's own runs."}},"/v1/agent/runs":{"get":{"parameters":[{"description":"Limit caps how many runs come back, newest first. Absent, zero or out of\nrange (1..200) reads as 50.","example":20,"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Status keeps only runs with this outcome (\"ok\" or \"error\"). Empty keeps\nboth. It is the filter an operator reaches for first — \"show me what broke\"\n— and answering it here rather than by paging the whole history client-side\nis the difference between a usable feed and a download.","example":"error","in":"query","name":"status","required":false,"schema":{"type":"string"}}],"summary":"Returns the caller's own agent runs across EVERY agent of the org, newest first — what ran, on which model, how long it took, and why it failed."}},"/v1/agent/sessions":{"get":{"parameters":[{"description":"Root scopes the page to one subagent tree (its root session id).","in":"query","name":"root","required":false,"schema":{"type":"string"}},{"description":"Parent scopes the page to the direct children of one session. Ignored when\nroot is set; with neither, only ROOT sessions come back.","in":"query","name":"parent","required":false,"schema":{"type":"string"}},{"description":"Status filters to running, paused, done or error.","example":"running","in":"query","name":"status","required":false,"schema":{"type":"string"}},{"description":"Project filters to the sessions tagged with one product slug.","in":"query","name":"project","required":false,"schema":{"type":"string"}},{"description":"Room filters to the sessions started in one collaborative room — the query a\nspace view runs to show what has been run in it.","in":"query","name":"room","required":false,"schema":{"type":"string"}},{"description":"Kind filters to the sessions of one kind of run: \"coding\" lists coding runs,\neach carrying its repo, base, branch, environment and pull request.","in":"query","name":"kind","required":false,"schema":{"type":"string"}},{"description":"Limit caps the page. Absent, zero or over 500 reads as 100.","example":20,"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"After is the `next` of the previous page. Absent starts at the newest.","in":"query","name":"after","required":false,"schema":{"type":"string"}}],"summary":"Returns the caller org's live sessions, newest first — each with its event count, its direct-child count and a one-line preview of its latest event."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/agent.registerReq"}}}},"summary":"Opens a live agent session in the caller's org — the row every surface (the CLI's outer agent, hanzo.bot, the console, chat) hangs its activity off."}},"/v1/agent/sessions/stream":{"get":{"summary":"Live session and event updates for the caller's org, as Server-Sent Events."}},"/v1/agent/sessions/{id}":{"get":{"parameters":[{"description":"ID is the session to act on, from the path.","example":"sess_1","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one session with its direct child sessions and its 50 most recent events, oldest of those first."},"patch":{"parameters":[{"description":"ID is the session to update, from the path.","example":"sess_1","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/agent.patchSessionIn"}}}},"summary":"Updates a session's surface-owned truth: its status, its title, the run-target it is dispatched to, and the product it built plus whether that build's story is public."}},"/v1/agent/sessions/{id}/budget":{"post":{"parameters":[{"description":"ID is the session, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/agent.sessionBudgetIn"}}}},"summary":"Sets, raises, or removes a session's cap."}},"/v1/agent/sessions/{id}/control":{"get":{"parameters":[{"description":"ID is the session whose commands are being drained, from the path.","example":"sess_1","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"After is the last seq this poller applied; only commands newer than it come\nback. Absent or negative reads as 0, which drains from the beginning.","example":12,"in":"query","name":"after","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns the steering commands (pause/resume/stop/message) recorded against the caller's own session that are newer than the cursor, oldest first, with the cursor to poll from next."}},"/v1/agent/sessions/{id}/events":{"post":{"parameters":[{"description":"ID is the session to append to, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/agent.eventIn"}}}},"summary":"Records one turn of a session's transcript and answers 201 with it."}},"/v1/agent/sessions/{id}/message":{"post":{"parameters":[{"description":"ID is the session to steer, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/agent.controlIn"}}}},"summary":"Sends a steering message to a running session — the endpoint a human or another agent interrupts through."}},"/v1/agent/sessions/{id}/pause":{"post":{"parameters":[{"description":"ID is the session to steer, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/agent.controlIn"}}}},"summary":"Asks a running session to pause."}},"/v1/agent/sessions/{id}/progress":{"get":{"parameters":[{"description":"ID is the session to act on, from the path.","example":"sess_1","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns how far along one run is: the share of its goal that is done, whether it is running, blocked or finished, and a line saying what it is doing right now."}},"/v1/agent/sessions/{id}/resume":{"post":{"parameters":[{"description":"ID is the session to steer, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/agent.controlIn"}}}},"summary":"Asks a paused session to continue, on the same terms as a pause."}},"/v1/agent/sessions/{id}/stop":{"post":{"parameters":[{"description":"ID is the session to steer, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/agent.controlIn"}}}},"summary":"Ends a running session."}},"/v1/agent/sessions/{id}/tree":{"get":{"parameters":[{"description":"ID is the session to act on, from the path.","example":"sess_1","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns the subagent-flow graph rooted at this session: the session, its children, their children, each node carrying its own event count."}},"/v1/agent/targets":{"get":{"summary":"Returns every machine registered to the caller's org, newest first, each with its live session load."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/agent.targetReq"}}}},"summary":"Registers a machine as an agent target, or re-links one that is already registered."}},"/v1/agent/targets/{id}":{"delete":{"parameters":[{"description":"ID is the target to act on, from the path.","example":"tgt_1","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Deregisters one machine."},"get":{"parameters":[{"description":"ID is the target to act on, from the path.","example":"tgt_1","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one registered machine, with its live session load."},"patch":{"parameters":[{"description":"ID is the target to update, from the path.","example":"tgt_1","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/agent.patchTargetIn"}}}},"summary":"Updates one machine in place."}},"/v1/agent/targets/{id}/claim":{"post":{"parameters":[{"description":"ID is the target to act on, from the path.","example":"tgt_1","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"ClaimRoutedRun is the machine's long poll for work: it authenticates the daemon, stamps the liveness the dispatch gate reads (the poll IS the proof a runner is listening), and waits up to 25 seconds for the next run addressed to THIS machine."}},"/v1/agent/targets/{id}/key":{"post":{"parameters":[{"description":"ID is the target to act on, from the path.","example":"tgt_1","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Mints (or rotates) the claim key a `hanzo code --serve` daemon presents to claim work for this machine, and returns it ONCE: only its SHA-256 hash is stored."}},"/v1/agent/targets/{id}/runs/{runId}/report":{"post":{"parameters":[{"description":"ID is the machine reporting, from the path.","example":"tgt_1","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"RunID is the routed run being completed, from the path.","example":"run_1","in":"path","name":"runId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/agent.reportRunIn"}}}},"summary":"Completes a claimed run: it delivers the terminal result to the run's durable owner, which is what lets that workflow finish."}},"/v1/agent/{ref}":{"delete":{"parameters":[{"description":"Ref is the agent's public id (the agent_… handle create and list return) or\nits org-unique name, from the path. Either resolves the same agent.","example":"helper","in":"path","name":"ref","required":true,"schema":{"type":"string"}}],"summary":"Removes an agent and every run recorded against it."},"get":{"parameters":[{"description":"Ref is the agent's public id (the agent_… handle create and list return) or\nits org-unique name, from the path. Either resolves the same agent.","example":"helper","in":"path","name":"ref","required":true,"schema":{"type":"string"}}],"summary":"Returns one agent with its system prompt and the caller's own 20 most recent runs of it: a run's input and output are its person's."},"patch":{"parameters":[{"description":"Ref is the agent to update — its public id or org-unique name, from the path.","example":"helper","in":"path","name":"ref","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/agent.updateAgentIn"}}}},"summary":"Changes an agent in place."}},"/v1/agent/{ref}/run":{"post":{"parameters":[{"in":"path","name":"ref","required":true,"schema":{"type":"string"}}],"summary":"Run one of your org's agents and get the recorded run back."}},"/v1/agent/{ref}/runs":{"get":{"parameters":[{"description":"Ref is the agent's public id or its org-unique name, from the path.","example":"helper","in":"path","name":"ref","required":true,"schema":{"type":"string"}},{"description":"Limit caps how many runs come back, newest first. Absent, zero or out of\nrange (1..200) reads as 50.","example":20,"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns the caller's own runs of one agent, newest first — each run's input, its output or its error, and how long it took."}},"/v1/agent/{ref}/spend":{"get":{"parameters":[{"description":"Ref is the agent's public id or its org-unique name.","in":"path","name":"ref","required":true,"schema":{"type":"string"}},{"description":"By groups the answer: \"component\" is the only grouping today.","in":"query","name":"by","required":false,"schema":{"type":"string"}}],"summary":"Answers what one of your org's agents has spent, in integer micro-USD."}},"/v1/ai/account":{"get":{"summary":"Account"}},"/v1/ai/activities":{"get":{"summary":"List activities"}},"/v1/ai/answer":{"get":{"summary":"Answer"}},"/v1/ai/articles":{"get":{"summary":"List articles"},"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Create a article"}},"/v1/ai/articles/global":{"get":{"summary":"List articles across tenants"}},"/v1/ai/articles/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Delete a article"},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Retrieve a article"},"patch":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Update a article"},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Replace a article"}},"/v1/ai/assets":{"get":{"summary":"List assets"},"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Create a asset"}},"/v1/ai/assets/scan":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Scan (asset)"}},"/v1/ai/assets/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Delete a asset"},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Retrieve a asset"},"patch":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Update a asset"},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Replace a asset"}},"/v1/ai/assets/{owner}/{name}/scan":{"post":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Scan (asset)"}},"/v1/ai/chats":{"get":{"summary":"List chats"},"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Create a chat"}},"/v1/ai/chats/global":{"get":{"summary":"List chats across tenants"}},"/v1/ai/chats/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Delete a chat"},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Retrieve a chat"},"patch":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Update a chat"},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Replace a chat"}},"/v1/ai/connections":{"get":{"summary":"Lists the org's connectable AI accounts and whether each is currently connected."},"post":{"summary":"Connects (or reconnects) a third-party AI account for the org by sealing the supplied key into KMS and upserting the org's provider row."}},"/v1/ai/connections/{provider}":{"delete":{"parameters":[{"in":"path","name":"provider","required":true,"schema":{"type":"string"}}],"summary":"Disconnects a third-party AI account: it deactivates the org's row so completion resolution falls back to the global Hanzo account (no BYO), and best-effort tombstones the sealed secret."},"post":{"parameters":[{"in":"path","name":"provider","required":true,"schema":{"type":"string"}}],"summary":"Disconnects a third-party AI account: it deactivates the org's row so completion resolution falls back to the global Hanzo account (no BYO), and best-effort tombstones the sealed secret."}},"/v1/ai/connections/{provider}/authorize":{"get":{"parameters":[{"in":"path","name":"provider","required":true,"schema":{"type":"string"}}],"summary":"Begins an OAuth connection for the caller's org: it binds the org into a signed state and sends the caller to the provider's authorize URL."}},"/v1/ai/connections/{provider}/callback":{"get":{"parameters":[{"in":"path","name":"provider","required":true,"schema":{"type":"string"}}],"summary":"Completes OAuth: the org is recovered from the SIGNED state (not a header), the code is exchanged for a token, the token is SEALED into KMS (never the row/logs) through the same path as a BYOK key, and the org's provider row is upserted to \"connected\"."}},"/v1/ai/connections/{provider}/usage":{"get":{"parameters":[{"in":"path","name":"provider","required":true,"schema":{"type":"string"}}],"summary":"Imports the caller org's usage for a connected third-party account."}},"/v1/ai/dashboards/agents":{"get":{"summary":"Dashboards Agents"}},"/v1/ai/dashboards/vm":{"get":{"summary":"Dashboards Vm"}},"/v1/ai/deployments":{"get":{"summary":"List deployments"},"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Create a application"}},"/v1/ai/deployments/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Delete a application"},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Retrieve a application"},"patch":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Update a application"},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Replace a application"}},"/v1/ai/deployments/{owner}/{name}/deploy":{"post":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Deploy (application)"}},"/v1/ai/deployments/{owner}/{name}/undeploy":{"post":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Undeploy (application)"}},"/v1/ai/feedback":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ai.RoutingRewardRequest"}}}},"summary":"Attaches a per-request outcome reward to the routing decision that served request_id — the enso training loop's quality signal."}},"/v1/ai/files":{"get":{"summary":"List files"},"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Create a file"}},"/v1/ai/files/activate":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Activate (file)"}},"/v1/ai/files/active":{"get":{"summary":"Active (file)"}},"/v1/ai/files/global":{"get":{"summary":"List files across tenants"}},"/v1/ai/files/upload":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Upload (file)"}},"/v1/ai/files/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Delete a file"},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Retrieve a file"},"patch":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Update a file"},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Replace a file"}},"/v1/ai/files/{owner}/{name}/vectors":{"post":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Vectors (file)"}},"/v1/ai/finetune/cancel":{"post":{"summary":"Deletes the TrainJob CR, meters the GPU-hours used so far, and marks the job cancelled."}},"/v1/ai/finetune/deploy":{"post":{"summary":"Serves a completed job's checkpoints and registers the result as a routable model on api.hanzo.ai."}},"/v1/ai/finetune/hf/datasets":{"get":{"summary":"Proxies a HuggingFace dataset search (dataset picker)."}},"/v1/ai/finetune/hf/models":{"get":{"summary":"Proxies a HuggingFace model search (base-model picker)."}},"/v1/ai/finetune/hf/repo":{"get":{"summary":"Returns a repo's detail (files, gated/private state)."}},"/v1/ai/finetune/job":{"get":{"summary":"Returns one job with refreshed live status."}},"/v1/ai/finetune/jobs":{"get":{"summary":"Returns the org's jobs, refreshing live status for active ones."},"post":{"summary":"Validates the request, resolves efficient defaults, persists the job, and submits a real TrainJob CR."}},"/v1/ai/finetune/presets":{"get":{"summary":"Returns the new-job catalog plus, when a selection is passed (?baseModel&method&task&preset[&datasetExamples]), the recommended config so the console can render \"Recommended\" as a one-click, ready-to-run default."}},"/v1/ai/forms":{"get":{"summary":"List forms"},"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Create a form"}},"/v1/ai/forms/data":{"get":{"summary":"Data (form)"}},"/v1/ai/forms/global":{"get":{"summary":"List forms across tenants"}},"/v1/ai/forms/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Delete a form"},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Retrieve a form"},"patch":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Update a form"},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Replace a form"}},"/v1/ai/graphs":{"get":{"summary":"List graphs"},"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Create a graph"}},"/v1/ai/graphs/global":{"get":{"summary":"List graphs across tenants"}},"/v1/ai/graphs/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Delete a graph"},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Retrieve a graph"},"patch":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Update a graph"},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Replace a graph"}},"/v1/ai/k8s-status":{"get":{"summary":"K8s Status"}},"/v1/ai/limits":{"get":{"summary":"Reads the caller's plan usage: for each class of model the plan includes, the share used of the billing period and of its short window, who pays for the next request, and whether the caller is in limited mode and why; the share used of the session and the day; and the ways on."},"put":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/aiLimitsSet"}}}},"summary":"Sets the payer's choice to keep using a model on credits once the plan's included usage of it is spent."}},"/v1/ai/mcp/chat":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/aiChatIn"}}}},"summary":"Asks one model one prompt and answers the reply, which model served it and who paid."}},"/v1/ai/mcp/decisions":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/aiDecideIn"}}}},"summary":"Runs one decision — the caller's own POST /v1/decisions, gated and billed exactly as that route is — and answers the decision, which model served it and who paid."}},"/v1/ai/mcp/models":{"get":{"parameters":[{"description":"Q matches the model's id, name, description or owner, ignoring case.","in":"query","name":"q","required":false,"schema":{"type":"string"}},{"description":"Class keeps one class: premium (third-party frontier models), ours (Hanzo's\npriced models) or free.","in":"query","name":"class","required":false,"schema":{"type":"string"}},{"description":"Family keeps one Hanzo family: enso, zen, kai or zoo.","in":"query","name":"family","required":false,"schema":{"type":"string"}},{"description":"Capability keeps the models that have it: tools, vision or reasoning, or a\nmodality they take or give (text, image, audio, file, video, decision).","in":"query","name":"capability","required":false,"schema":{"type":"string"}},{"description":"Free keeps the models a call to which bills nothing (bounded by the free\nallowances instead of a balance).","in":"query","name":"free","required":false,"schema":{"type":"boolean"}},{"description":"Limit is the most models to answer, 1 to 500; 0 answers 50.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Searches the model catalog — the one GET /v1/models lists, every OpenRouter model among it as last synced — by text, class, family, capability or free, and answers each match with its class, family, whether it is free, its list price (per token and per million; variable for a router billed at the answering model's price; a resold model's every vendor rate and conditional rate as billed), context window, output bound, expiry and capabilities."}},"/v1/ai/mcp/tools":{"get":{"parameters":[{"description":"Names asks for this process's tool NAMES and not only how many there are.\nOff by default: a list of names is a page, and the question this op exists to\nanswer (\"is the MCP server up and does it have anything behind it\") is\nanswered by the count.","in":"query","name":"names","required":false,"schema":{"type":"boolean"}}],"summary":"Reports what THIS PROCESS's MCP server carries: how many tools its own registry projects, optionally their names, and which subsystems this process composed."}},"/v1/ai/memory/delete":{"post":{"summary":"Delete one of the authenticated user's memories"}},"/v1/ai/memory/facts":{"get":{"summary":"List the authenticated user's stored facts"}},"/v1/ai/memory/list":{"get":{"summary":"List the authenticated user's memories, newest first"}},"/v1/ai/memory/recall":{"get":{"summary":"Recall recent/relevant memories for context injection; with q it"}},"/v1/ai/memory/remember":{"post":{"summary":"Store a memory for the authenticated user"}},"/v1/ai/memory/search":{"get":{"summary":"Search the authenticated user's memories (semantic, text fallback)"}},"/v1/ai/memory/update":{"post":{"summary":"Update one of the authenticated user's memories"}},"/v1/ai/messages":{"get":{"summary":"List messages"},"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Create a message"}},"/v1/ai/messages/welcome":{"delete":{"summary":"Welcome (message)"}},"/v1/ai/messages/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Delete a message"},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Retrieve a message"},"patch":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Update a message"},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Replace a message"}},"/v1/ai/messages/{owner}/{name}/answer":{"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Answer (message)"}},"/v1/ai/nodes":{"get":{"summary":"List nodes"},"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Create a node"}},"/v1/ai/nodes/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Delete a node"},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Retrieve a node"},"patch":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Update a node"},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Replace a node"}},"/v1/ai/nodes/{owner}/{name}/tunnel":{"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Tunnel (node)"},"post":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Tunnel (node)"}},"/v1/ai/org/settings":{"delete":{"summary":"The HTTP transport binding for the RESTful router-config nouns (/v1/ai/router/{policy,defaults,ledger,rewards,artifact-meta} and /v1/ai/org/settings[/list])."},"get":{"summary":"The HTTP transport binding for the RESTful router-config nouns (/v1/ai/router/{policy,defaults,ledger,rewards,artifact-meta} and /v1/ai/org/settings[/list])."},"patch":{"summary":"The HTTP transport binding for the RESTful router-config nouns (/v1/ai/router/{policy,defaults,ledger,rewards,artifact-meta} and /v1/ai/org/settings[/list])."},"post":{"summary":"The HTTP transport binding for the RESTful router-config nouns (/v1/ai/router/{policy,defaults,ledger,rewards,artifact-meta} and /v1/ai/org/settings[/list])."},"put":{"summary":"The HTTP transport binding for the RESTful router-config nouns (/v1/ai/router/{policy,defaults,ledger,rewards,artifact-meta} and /v1/ai/org/settings[/list])."}},"/v1/ai/org/settings/list":{"delete":{"summary":"The HTTP transport binding for the RESTful router-config nouns (/v1/ai/router/{policy,defaults,ledger,rewards,artifact-meta} and /v1/ai/org/settings[/list])."},"get":{"summary":"The HTTP transport binding for the RESTful router-config nouns (/v1/ai/router/{policy,defaults,ledger,rewards,artifact-meta} and /v1/ai/org/settings[/list])."},"patch":{"summary":"The HTTP transport binding for the RESTful router-config nouns (/v1/ai/router/{policy,defaults,ledger,rewards,artifact-meta} and /v1/ai/org/settings[/list])."},"post":{"summary":"The HTTP transport binding for the RESTful router-config nouns (/v1/ai/router/{policy,defaults,ledger,rewards,artifact-meta} and /v1/ai/org/settings[/list])."},"put":{"summary":"The HTTP transport binding for the RESTful router-config nouns (/v1/ai/router/{policy,defaults,ledger,rewards,artifact-meta} and /v1/ai/org/settings[/list])."}},"/v1/ai/preferences":{"patch":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Preferences"},"put":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Preferences"}},"/v1/ai/prometheus":{"get":{"summary":"Prometheus"}},"/v1/ai/providers":{"get":{"summary":"List providers"},"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Create a provider"}},"/v1/ai/providers/global":{"get":{"summary":"List providers across tenants"}},"/v1/ai/providers/mcp-tools":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Mcp Tools (provider)"}},"/v1/ai/providers/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Delete a provider"},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Retrieve a provider"},"patch":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Update a provider"},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Replace a provider"}},"/v1/ai/rag/context":{"get":{"summary":"Return every stored chunk of one file_id (full document context)."}},"/v1/ai/rag/delete":{"post":{"summary":"Delete all chunks of one or more uploaded files (by file_id) from the owner's Search+Vector index."}},"/v1/ai/rag/embed":{"post":{"summary":"Parse, chunk, and embed one uploaded file under its file_id into the unified Search+Vector index, scoped to the authenticated owner."}},"/v1/ai/rag/ingest":{"post":{"summary":"Unified RAG ingest: parse + chunk + embed documents and pipe them to BOTH Hanzo Vector (semantic) AND Hanzo Search (keyword) under the tenant index {owner}-{store}-docs — the same index /v1/chat retrieval reads."}},"/v1/ai/rag/query":{"post":{"summary":"Retrieve the top-K chunks relevant to a query, scoped to a single uploaded file (`file_id`)."}},"/v1/ai/rag/query-multiple":{"post":{"summary":"Retrieve the top-K chunks relevant to a query, scoped to a SET of uploaded files (`file_ids`)."}},"/v1/ai/records":{"get":{"summary":"List records"},"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Create a record"}},"/v1/ai/records/batch":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Batch (record)"}},"/v1/ai/records/commit":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Commit (record)"}},"/v1/ai/records/commit-second":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Commit Second (record)"}},"/v1/ai/records/query":{"get":{"summary":"Query (record)"}},"/v1/ai/records/query-second":{"get":{"summary":"Query Second (record)"}},"/v1/ai/records/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Delete a record"},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Retrieve a record"},"patch":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Update a record"},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Replace a record"}},"/v1/ai/remote-connections":{"get":{"summary":"List remote-connections"},"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Create a connection"}},"/v1/ai/remote-connections/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Delete a connection"},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Retrieve a connection"},"patch":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Update a connection"},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Replace a connection"}},"/v1/ai/remote-connections/{owner}/{name}/start":{"post":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Start (connection)"}},"/v1/ai/remote-connections/{owner}/{name}/stop":{"post":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Stop (connection)"}},"/v1/ai/router/artifact-meta":{"delete":{"summary":"The HTTP transport binding for the RESTful router-config nouns (/v1/ai/router/{policy,defaults,ledger,rewards,artifact-meta} and /v1/ai/org/settings[/list])."},"get":{"summary":"The HTTP transport binding for the RESTful router-config nouns (/v1/ai/router/{policy,defaults,ledger,rewards,artifact-meta} and /v1/ai/org/settings[/list])."},"patch":{"summary":"The HTTP transport binding for the RESTful router-config nouns (/v1/ai/router/{policy,defaults,ledger,rewards,artifact-meta} and /v1/ai/org/settings[/list])."},"post":{"summary":"The HTTP transport binding for the RESTful router-config nouns (/v1/ai/router/{policy,defaults,ledger,rewards,artifact-meta} and /v1/ai/org/settings[/list])."},"put":{"summary":"The HTTP transport binding for the RESTful router-config nouns (/v1/ai/router/{policy,defaults,ledger,rewards,artifact-meta} and /v1/ai/org/settings[/list])."}},"/v1/ai/router/catalog":{"get":{"summary":"Lists the Zen and Enso routing catalogs: what each serves, its accounts and model health, and its version history."},"put":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ai.RoutingEdit"}}}},"summary":"Applies an edited catalog to one family, made from its newest version, and records the new version."}},"/v1/ai/router/catalog/propose":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ai.RoutingEdit"}}}},"summary":"Answers the diff an edited catalog would apply to a family, and the version it would be made from."}},"/v1/ai/router/catalog/rollback":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ai.RoutingEdit"}}}},"summary":"Applies an earlier version of a family's catalog again, as a new version."}},"/v1/ai/router/catalog/test":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ai.RoutingEdit"}}}},"summary":"Sends one short turn to a SKU through its family and answers which upstream wrote it and how long it took."}},"/v1/ai/router/data":{"delete":{"summary":"Router Data"},"get":{"summary":"Router Data"}},"/v1/ai/router/defaults":{"delete":{"summary":"The HTTP transport binding for the RESTful router-config nouns (/v1/ai/router/{policy,defaults,ledger,rewards,artifact-meta} and /v1/ai/org/settings[/list])."},"get":{"summary":"The HTTP transport binding for the RESTful router-config nouns (/v1/ai/router/{policy,defaults,ledger,rewards,artifact-meta} and /v1/ai/org/settings[/list])."},"patch":{"summary":"The HTTP transport binding for the RESTful router-config nouns (/v1/ai/router/{policy,defaults,ledger,rewards,artifact-meta} and /v1/ai/org/settings[/list])."},"post":{"summary":"The HTTP transport binding for the RESTful router-config nouns (/v1/ai/router/{policy,defaults,ledger,rewards,artifact-meta} and /v1/ai/org/settings[/list])."},"put":{"summary":"The HTTP transport binding for the RESTful router-config nouns (/v1/ai/router/{policy,defaults,ledger,rewards,artifact-meta} and /v1/ai/org/settings[/list])."}},"/v1/ai/router/history":{"get":{"summary":"Returns the router-improvement time-series."}},"/v1/ai/router/judge-panel":{"get":{"summary":"Returns the LIVE Mean-Field Judge Panel state: the configured panel + dynamic judge posture (enabled/sample) resolved from the \"*\" GlobalDefaultOwner row, the live in-process per-judge calibration (weight/mean/n), and the static published benchmark."}},"/v1/ai/router/ledger":{"delete":{"summary":"The HTTP transport binding for the RESTful router-config nouns (/v1/ai/router/{policy,defaults,ledger,rewards,artifact-meta} and /v1/ai/org/settings[/list])."},"get":{"summary":"The HTTP transport binding for the RESTful router-config nouns (/v1/ai/router/{policy,defaults,ledger,rewards,artifact-meta} and /v1/ai/org/settings[/list])."},"patch":{"summary":"The HTTP transport binding for the RESTful router-config nouns (/v1/ai/router/{policy,defaults,ledger,rewards,artifact-meta} and /v1/ai/org/settings[/list])."},"post":{"summary":"The HTTP transport binding for the RESTful router-config nouns (/v1/ai/router/{policy,defaults,ledger,rewards,artifact-meta} and /v1/ai/org/settings[/list])."},"put":{"summary":"The HTTP transport binding for the RESTful router-config nouns (/v1/ai/router/{policy,defaults,ledger,rewards,artifact-meta} and /v1/ai/org/settings[/list])."}},"/v1/ai/router/policy":{"delete":{"summary":"The HTTP transport binding for the RESTful router-config nouns (/v1/ai/router/{policy,defaults,ledger,rewards,artifact-meta} and /v1/ai/org/settings[/list])."},"get":{"summary":"The HTTP transport binding for the RESTful router-config nouns (/v1/ai/router/{policy,defaults,ledger,rewards,artifact-meta} and /v1/ai/org/settings[/list])."},"patch":{"summary":"The HTTP transport binding for the RESTful router-config nouns (/v1/ai/router/{policy,defaults,ledger,rewards,artifact-meta} and /v1/ai/org/settings[/list])."},"post":{"summary":"The HTTP transport binding for the RESTful router-config nouns (/v1/ai/router/{policy,defaults,ledger,rewards,artifact-meta} and /v1/ai/org/settings[/list])."},"put":{"summary":"The HTTP transport binding for the RESTful router-config nouns (/v1/ai/router/{policy,defaults,ledger,rewards,artifact-meta} and /v1/ai/org/settings[/list])."}},"/v1/ai/router/rewards":{"delete":{"summary":"The HTTP transport binding for the RESTful router-config nouns (/v1/ai/router/{policy,defaults,ledger,rewards,artifact-meta} and /v1/ai/org/settings[/list])."},"get":{"summary":"The HTTP transport binding for the RESTful router-config nouns (/v1/ai/router/{policy,defaults,ledger,rewards,artifact-meta} and /v1/ai/org/settings[/list])."},"patch":{"summary":"The HTTP transport binding for the RESTful router-config nouns (/v1/ai/router/{policy,defaults,ledger,rewards,artifact-meta} and /v1/ai/org/settings[/list])."},"post":{"summary":"The HTTP transport binding for the RESTful router-config nouns (/v1/ai/router/{policy,defaults,ledger,rewards,artifact-meta} and /v1/ai/org/settings[/list])."},"put":{"summary":"The HTTP transport binding for the RESTful router-config nouns (/v1/ai/router/{policy,defaults,ledger,rewards,artifact-meta} and /v1/ai/org/settings[/list])."}},"/v1/ai/router/stats":{"get":{"summary":"Returns the router observability aggregate."}},"/v1/ai/routes":{"get":{"summary":"List routes"},"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Create a model-route"}},"/v1/ai/routes/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Delete a model-route"},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Retrieve a model-route"},"patch":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Update a model-route"},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Replace a model-route"}},"/v1/ai/scales":{"get":{"summary":"List scales"},"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Create a scale"}},"/v1/ai/scales/global":{"get":{"summary":"List scales across tenants"}},"/v1/ai/scales/public":{"get":{"summary":"Public (scale)"}},"/v1/ai/scales/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Delete a scale"},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Retrieve a scale"},"patch":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Update a scale"},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Replace a scale"}},"/v1/ai/scans":{"get":{"summary":"List scans"},"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Create a scan"}},"/v1/ai/scans/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Delete a scan"},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Retrieve a scan"},"patch":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Update a scan"},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Replace a scan"}},"/v1/ai/signin":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Signin"}},"/v1/ai/signin-sessions":{"get":{"summary":"List signin-sessions"},"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Create a session"}},"/v1/ai/signin-sessions/duplicated":{"get":{"summary":"Duplicated (session)"}},"/v1/ai/signin-sessions/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Delete a session"},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Retrieve a session"},"patch":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Update a session"},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Replace a session"}},"/v1/ai/signout":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Signout"}},"/v1/ai/stores":{"get":{"summary":"List stores"},"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Create a store"}},"/v1/ai/stores/global":{"get":{"summary":"List stores across tenants"}},"/v1/ai/stores/names":{"get":{"summary":"Names (store)"}},"/v1/ai/stores/providers":{"get":{"summary":"Providers (store)"}},"/v1/ai/stores/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Delete a store"},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Retrieve a store"},"patch":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Update a store"},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Replace a store"}},"/v1/ai/stores/{owner}/{name}/vectors":{"post":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Vectors (store)"}},"/v1/ai/system":{"get":{"summary":"System"}},"/v1/ai/tasks":{"get":{"summary":"List tasks"},"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Create a task"}},"/v1/ai/tasks/global":{"get":{"summary":"List tasks across tenants"}},"/v1/ai/tasks/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Delete a task"},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Retrieve a task"},"patch":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Update a task"},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Replace a task"}},"/v1/ai/tasks/{owner}/{name}/analyze":{"post":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Analyze (task)"}},"/v1/ai/tasks/{owner}/{name}/document":{"post":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Document (task)"}},"/v1/ai/templates":{"get":{"summary":"List templates"},"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Create a template"}},"/v1/ai/templates/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Delete a template"},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Retrieve a template"},"patch":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Update a template"},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Replace a template"}},"/v1/ai/traffic/globe":{"get":{"summary":"Returns the PUBLIC live request-geo aggregate for the world.hanzo.ai \"Hanzo mode\" globe: WHERE requests to api.hanzo.ai are coming from, as country/region points with per-service-class counts, plus headline throughput rates."}},"/v1/ai/training-contribution":{"get":{"summary":"Training Contribution"},"patch":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Training Contribution"},"put":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Training Contribution"}},"/v1/ai/tree-files":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Create a tree-file"}},"/v1/ai/tree-files/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Delete a tree-file"},"patch":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Update a tree-file"},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Replace a tree-file"}},"/v1/ai/usages":{"get":{"summary":"List usages"}},"/v1/ai/usages/by-user":{"get":{"summary":"By User (usage)"}},"/v1/ai/usages/cloud":{"get":{"summary":"Cloud (usage)"}},"/v1/ai/usages/range":{"get":{"summary":"Range (usage)"}},"/v1/ai/usages/user-names":{"get":{"summary":"User Names (usage)"}},"/v1/ai/vectors":{"get":{"summary":"List vectors"},"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Create a vector"}},"/v1/ai/vectors/all":{"delete":{"summary":"All (vector)"}},"/v1/ai/vectors/global":{"get":{"summary":"List vectors across tenants"}},"/v1/ai/vectors/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Delete a vector"},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Retrieve a vector"},"patch":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Update a vector"},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Replace a vector"}},"/v1/ai/version":{"get":{"summary":"Version"}},"/v1/ai/videos":{"get":{"summary":"List videos"},"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Create a video"}},"/v1/ai/videos/global":{"get":{"summary":"List videos across tenants"}},"/v1/ai/videos/upload":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Upload (video)"}},"/v1/ai/videos/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Delete a video"},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Retrieve a video"},"patch":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Update a video"},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Replace a video"}},"/v1/ai/workflows":{"get":{"summary":"List workflows"},"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Create a workflow"}},"/v1/ai/workflows/global":{"get":{"summary":"List workflows across tenants"}},"/v1/ai/workflows/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Delete a workflow"},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Retrieve a workflow"},"patch":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Update a workflow"},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"summary":"Replace a workflow"}},"/v1/allowance":{"get":{"summary":"Answers what the CALLER has left of their plan's free-call allowance this period, and the instant the count starts again."}},"/v1/ask":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/askRequest"}}}},"summary":"Ask a grounded question about your own org"}},"/v1/ask/web":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ask.webQuestion"}}}},"summary":"Research a question on the live web and answer it with sources cited"}},"/v1/audio/foley":{"post":{"summary":"Serves the generative audio verbs — /v1/audio/voice (TTS), /music, /foley — that the Zen family serves natively."}},"/v1/audio/music":{"post":{"summary":"Serves the generative audio verbs — /v1/audio/voice (TTS), /music, /foley — that the Zen family serves natively."}},"/v1/audio/speech":{"post":{"summary":"The OpenAI-compatible TTS endpoint (POST /v1/audio/speech)."}},"/v1/audio/transcript":{"post":{"summary":"Serves the growing transcript over HTTP: POST opens one, POST to its id pushes raw pcm16 at 16 kHz, and DELETE closes it with the settled text."}},"/v1/audio/transcript/{id}":{"delete":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Serves the growing transcript over HTTP: POST opens one, POST to its id pushes raw pcm16 at 16 kHz, and DELETE closes it with the settled text."},"post":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Serves the growing transcript over HTTP: POST opens one, POST to its id pushes raw pcm16 at 16 kHz, and DELETE closes it with the settled text."}},"/v1/audio/transcriptions":{"post":{"summary":"The OpenAI-compatible STT endpoint (POST /v1/audio/transcriptions, multipart: file + model [+ language + response_format])."}},"/v1/audio/transcriptions/public":{"post":{"summary":"Transcribes up to a minute of audio for a caller with no account, on Hanzo's own transcriber, within a daily allowance per visitor."}},"/v1/audio/voice":{"post":{"summary":"Serves the generative audio verbs — /v1/audio/voice (TTS), /music, /foley — that the Zen family serves natively."}},"/v1/audit":{"get":{"parameters":[{"description":"Sub narrows the trail to one actor — the validated subject that made the\nrequest. Blank means every actor in the org.","in":"query","name":"sub","required":false,"schema":{"type":"string"}},{"description":"Action narrows it to one action name, e.g. \"machine.create\".","example":"machine.create","in":"query","name":"action","required":false,"schema":{"type":"string"}},{"description":"Resource narrows it to one resource TYPE, e.g. \"apikey\".","in":"query","name":"resource","required":false,"schema":{"type":"string"}},{"description":"ResourceID narrows it to one resource instance.","in":"query","name":"resourceId","required":false,"schema":{"type":"string"}},{"description":"Result narrows it to one outcome: \"success\", \"deny\" or \"error\".","example":"success","in":"query","name":"result","required":false,"schema":{"type":"string"}},{"description":"Since is the inclusive lower time bound, RFC3339. An unparseable value is\nignored rather than refused — one malformed filter must not hide the trail.","example":"2026-07-01T00:00:00Z","in":"query","name":"since","required":false,"schema":{"type":"string"}},{"description":"Until is the upper time bound, RFC3339, with the same tolerance.","in":"query","name":"until","required":false,"schema":{"type":"string"}},{"description":"PageSize is rows per page, default 100. A value that is not a positive\ninteger falls back to the default.","example":"50","in":"query","name":"pageSize","required":false,"schema":{"type":"string"}},{"description":"Page is the 1-based page number, driving the offset. Anything below 2 reads\nthe first page.","in":"query","name":"p","required":false,"schema":{"type":"string"}}],"summary":"Reads the caller's OWN org audit trail, newest first, with the total the filter matched so a console can page it."}},"/v1/author":{"get":{"summary":"Returns the caller's author-program dashboard: enrolment status, linked forge login, verified repositories and owner-wide claims, recorded deploys, accrued / pending / paid royalty, and the payout history."}},"/v1/author/basis":{"get":{"parameters":[{"description":"Period is the UTC accrual month, YYYY-MM. Empty means every period; any other\nshape is refused with 400, because the period is echoed back and used as a SQL\nfilter and is only ever accepted in the one form the accrual latch mints.","example":"2026-07","in":"query","name":"period","required":false,"schema":{"type":"string"}}],"summary":"Returns the AUDIT TRAIL behind the caller's own royalty: every ledger row with the spend it was computed from, the share applied at the time, the platform's matching half, whether each row satisfies the formula, and the attribution edges that already existed when the row was written."}},"/v1/author/connect":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/author.connectRequest"}}}},"summary":"Enrols the caller's org in the author program at status \"connected\" and returns its enrolment, including the verify code the file method needs."}},"/v1/author/deploys/record":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/author.deployRequest"}}}},"summary":"Records that the caller's org deployed a project built from a source repository, which is the edge that makes an author's work earn royalty."}},"/v1/author/repos/verify":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/author.verifyRequest"}}}},"summary":"Proves that the caller owns a repository — or a whole OWNER — and records the claim, which is what makes deploys of that code earn royalty."}},"/v1/authz/check":{"post":{"summary":"Ask whether a subject may act on an object"}},"/v1/authz/health":{"get":{"summary":"Liveness of the policy engine"}},"/v1/authz/readyz":{"get":{"summary":"Readiness of the policy engine"}},"/v1/auto/automations":{"get":{"parameters":[{"description":"Q keeps the automations whose name or instructions contain it, ignoring case.","in":"query","name":"q","required":false,"schema":{"type":"string"}},{"description":"Sort is name, next or updated (the default, newest first).","in":"query","name":"sort","required":false,"schema":{"type":"string"}},{"description":"Source keeps the automations made in one product: chat, dev, studio or workflow.","in":"query","name":"source","required":false,"schema":{"type":"string"}}],"summary":"Returns your automations — another member's are never listed."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auto.automationIn"}}}},"summary":"Creates an automation and arms its schedule."}},"/v1/auto/automations/{id}":{"delete":{"parameters":[{"description":"ID is the automation, from the path.","example":"flow_1","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Deletes an automation, its schedule and its run history, and stops a Dev run it has going."},"get":{"parameters":[{"description":"ID is the automation, from the path.","example":"flow_1","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one automation."},"patch":{"parameters":[{"description":"ID is the automation, from the path.","example":"flow_1","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auto.automationPatch"}}}},"summary":"Changes an automation, for the person it runs as: any field it was created with, and `enabled`, which arms or disarms its schedule."}},"/v1/auto/automations/{id}/run":{"post":{"parameters":[{"description":"ID is the automation, from the path.","example":"flow_1","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Starts one run now, whether or not its schedule is armed."}},"/v1/auto/automations/{id}/runs":{"get":{"parameters":[{"description":"ID is the automation, from the path.","example":"flow_1","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Limit bounds the page (default 200, maximum 1000).","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns one automation's runs, newest first, to the person it runs as."}},"/v1/auto/automations/{id}/runs/{run}/review":{"post":{"parameters":[{"description":"ID is the automation, and Run its run in review, from the path.","example":"flow_1","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"example":"run_1","in":"path","name":"run","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auto.reviewIn"}}}},"summary":"Answers a run that holds a post for review, for the person the automation runs as: `post` true posts it to the automation's accounts and answers the run while it posts; false discards it."}},"/v1/auto/cron":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auto.whenIn"}}}},"summary":"Reads a schedule said in words — \"every 5 minutes\", \"weekdays at 8:30\", \"every monday at 9am\", \"tomorrow at 7pm\", \"in 20 minutes\", or a five-field cron expression — in your time zone, and answers the schedule an automation takes, said back in plain words, with when it would first run."}},"/v1/auto/events":{"get":{"summary":"Stream your jobs and automations as they change, as Server-Sent Events"}},"/v1/auto/flows":{"get":{"parameters":[{"description":"Limit bounds the page (default 200, maximum 1000).","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns the caller org's automations, most-recently-updated first."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auto.createFlowReq"}}}},"summary":"Creates an automation and its initial DRAFT version in one call."}},"/v1/auto/flows/{id}":{"delete":{"parameters":[{"description":"ID is the flow to act on, from the path.","example":"flow_1","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Deletes one automation, its versions and its run history."},"get":{"parameters":[{"description":"ID is the flow to act on, from the path.","example":"flow_1","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one automation and its latest version."},"patch":{"parameters":[{"description":"ID is the flow to update, from the path.","example":"flow_1","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auto.patchFlowIn"}}}},"summary":"Updates one automation's metadata in place."}},"/v1/auto/flows/{id}/disable":{"post":{"parameters":[{"description":"ID is the flow to act on, from the path.","example":"flow_1","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Disarms a flow's trigger and marks it DISABLED."}},"/v1/auto/flows/{id}/enable":{"post":{"parameters":[{"description":"ID is the flow to act on, from the path.","example":"flow_1","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Arms a flow's trigger and marks it ENABLED."}},"/v1/auto/flows/{id}/operations":{"post":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Edit a flow — rename it, retarget its trigger, or add, move and delete steps"}},"/v1/auto/flows/{id}/run":{"post":{"parameters":[{"description":"ID is the flow to act on, from the path.","example":"flow_1","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Starts one durable run of a flow now."}},"/v1/auto/flows/{id}/versions":{"get":{"parameters":[{"description":"ID is the flow whose versions to list, from the path.","example":"flow_1","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Limit bounds the page (default 200, maximum 1000).","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns one flow's versions, newest first."},"post":{"parameters":[{"description":"ID is the flow to add a version to, from the path.","example":"flow_1","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auto.createVersionIn"}}}},"summary":"Adds a new DRAFT version to a flow."}},"/v1/auto/hooks/{source}/{event}":{"post":{"parameters":[{"in":"path","name":"source","required":true,"schema":{"type":"string"}},{"in":"path","name":"event","required":true,"schema":{"type":"string"}}],"summary":"Fire an event that starts every enabled flow subscribed to it"}},"/v1/auto/jobs":{"get":{"parameters":[{"description":"Product keeps one product's jobs: chat, dev, studio or workflow.","example":"studio","in":"query","name":"product","required":false,"schema":{"type":"string"}},{"description":"State keeps one state: scheduled, running, succeeded, failed or cancelled.","example":"running","in":"query","name":"state","required":false,"schema":{"type":"string"}},{"description":"Limit bounds the page (default 100, at most 500).","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists everything of yours that runs without you watching, across every product: each run of your automations and workflows, and every Studio render, long video or other background run a product recorded for you."}},"/v1/auto/jobs/{id}":{"get":{"parameters":[{"description":"ID is the job, from the path: a run_ or a job_ id.","example":"run_3f7a…","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Reads one of your jobs."}},"/v1/auto/provider":{"get":{"summary":"Returns the connector catalogue."}},"/v1/auto/provider/{id}/run":{"post":{"parameters":[{"description":"ID is the provider to run, from the path.","example":"notion","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/auto.runIn"}}}},"summary":"Executes one provider action in-process and answers the outcome."}},"/v1/auto/runs":{"get":{"parameters":[{"description":"FlowID narrows the history to one flow. Omit it for the whole org's runs.","in":"query","name":"flowId","required":false,"schema":{"type":"string"}},{"description":"Limit bounds the page (default 200, maximum 1000).","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns your run history, newest first: the runs of the flows you hold."}},"/v1/auto/runs/{id}":{"get":{"parameters":[{"description":"ID is the run to read, from the path.","example":"run_1","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one run."}},"/v1/auto/runs/{id}/resume":{"post":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Release a run waiting at an approval step, with the approval payload"}},"/v1/auto/templates":{"get":{"summary":"Returns the starter automations: a name, what it does, the instructions it runs and the schedule it suggests, in the caller's own zone."}},"/v1/base/bases":{"get":{"summary":"Lists every Base the caller can reach, one per org their token carries."}},"/v1/base/bases/{org}":{"get":{"parameters":[{"description":"Org is the org whose Base to describe, from the path. An org the caller's\ntoken does not carry is not found — the same answer a nonexistent one\ngets, so the listing cannot be used to discover which orgs exist.","in":"path","name":"org","required":true,"schema":{"type":"string"}}],"summary":"Describes ONE org's Base — whether its store exists, and what it occupies."}},"/v1/base/graphql":{"get":{"summary":"Read your org Base's GraphQL schema"},"post":{"summary":"Query or write your org Base with GraphQL"}},"/v1/base/health":{"get":{"summary":"Reports that the base subsystem is serving."}},"/v1/benchmark/catalog":{"get":{"summary":"Is the canonical benchmarks this arena reads — the id, title, axis, item count, upstream source and direction of each, with native marking the ones the standardized harness runs today."}},"/v1/benchmark/claims":{"get":{"parameters":[{"description":"Benchmark filters to one benchmark id. Empty returns every benchmark.","in":"query","name":"Benchmark","required":false,"schema":{"type":"string"}},{"description":"Model filters to one model. Empty returns every model.","in":"query","name":"Model","required":false,"schema":{"type":"string"}},{"description":"Provider filters to one lab or leaderboard — the way to read what a single\nsource claims across every model it covers.","in":"query","name":"Provider","required":false,"schema":{"type":"string"}},{"description":"Source filters to one citation, which is the finest grain there is: a\nsource is what makes two claims about one model independent rather than a\nrestatement of each other.","in":"query","name":"Source","required":false,"schema":{"type":"string"}},{"description":"Protocol filters by HOW a claim was scored, so provider cards can be read\napart from third parties running their own harness.","in":"query","name":"Protocol","required":false,"schema":{"type":"string"}},{"description":"Org filters to the claims one org made; \"admin\" reads the platform's own.\nIt narrows what the caller may already read and never widens it.","in":"query","name":"Org","required":false,"schema":{"type":"string"}}],"summary":"Lists the effective claims the caller may read, each labelled with the org that made it and the user who recorded it."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/benchmark.putClaimsIn"}}}},"summary":"Records claims for the caller's org: one to correct a number, many to import a leaderboard."}},"/v1/benchmark/compare":{"get":{"parameters":[{"description":"Benchmark is the catalog id to compare on, defaulting to gpqa_diamond.","in":"query","name":"benchmark","required":false,"schema":{"type":"string"}},{"description":"A is the first model id. It is required.","in":"query","name":"a","required":true,"schema":{"type":"string"}},{"description":"B is the second model id. It is required.","in":"query","name":"b","required":true,"schema":{"type":"string"}}],"summary":"Is the ONLY valid arm-vs-arm test: it pairs the two models on the items BOTH completed, and answers rescue and damage counts with an exact-McNemar p."}},"/v1/benchmark/history":{"get":{"parameters":[{"description":"Benchmark is the catalog id to read, defaulting to gpqa_diamond.","in":"query","name":"Benchmark","required":false,"schema":{"type":"string"}},{"description":"Model filters to one model. Empty returns every model measured.","in":"query","name":"Model","required":false,"schema":{"type":"string"}}],"summary":"Returns each model's measured score per run over time, oldest first, with the change between runs."}},"/v1/benchmark/leaderboard":{"get":{"parameters":[{"description":"Benchmark is the catalog id to read, defaulting to gpqa_diamond.","in":"query","name":"benchmark","required":false,"schema":{"type":"string"}}],"summary":"Answers one row per model for the benchmark named — what our own harness measured, beside what the vendor claims, and the gap between them."}},"/v1/benchmark/presets":{"get":{"summary":"Are the router blends available to compose from — a named set of model arms, the rank they escalate through and the panel width that bounds fan-out — each named for the model layer as enso-<name>."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/benchmark.Preset"}}}},"summary":"Stores a router blend for the caller's org — its name, its arms, the rank they escalate through and the panel fan-out width — and answers with the stored blend and the enso-<name> it would be resolved under."}},"/v1/benchmark/runs":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/benchmark.suite"}}}},"summary":"Answers what the arena already holds for a model on each benchmark asked about, and spends nothing."}},"/v1/billing/accounts":{"get":{"summary":"Answers the caller's billing accounts: the org itself, its currency, when it was opened, and the caller's own standing in it."}},"/v1/billing/accounts/{id}/members":{"get":{"parameters":[{"description":"ID is the billing account id, which for this store is the org's own id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Answers one billing account's roster."}},"/v1/billing/alerts":{"get":{"summary":"Lists this org's spend caps: the ceiling, its scope, whether it enforces, and how much of it has been spent this period."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/billing.AlertSpec"}}}},"summary":"Opens a spend cap on the caller's own org."}},"/v1/billing/alerts/authorize":{"get":{"parameters":[{"description":"Project narrows the verdict to one project's caps. Empty is the org-wide row.","in":"query","name":"project","required":false,"schema":{"type":"string"}},{"description":"Service narrows it to one service's caps. Empty is every service.","in":"query","name":"service","required":false,"schema":{"type":"string"}},{"description":"Amount is the proposed spend in cents.","in":"query","name":"amount","required":false,"schema":{"type":"string"}},{"description":"PV is \"1\" when the caller ESTABLISHED the project rather than merely\ncarrying a claim of one. An unproven project may not deny traffic.","in":"query","name":"pv","required":false,"schema":{"type":"string"}}],"summary":"Answers whether one proposed spend fits inside this org's caps."}},"/v1/billing/alerts/{id}":{"delete":{"parameters":[{"description":"ID is the cap to remove, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Removes one of the caller's spend caps and answers 204."},"patch":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/billing.AlertPatch"}}}},"summary":"Changes one spend cap: raise or lower the ceiling, flip enforcement, retune the rate limit."}},"/v1/billing/balance":{"get":{"summary":"Prepaid credit the caller's org can still spend"}},"/v1/billing/credit-balance":{"get":{"summary":"Answers what the caller can spend right now, one entry per currency."}},"/v1/billing/credit-balance/breakdown":{"get":{"summary":"Answers that same spendable credit split by grant tag, with the earliest expiry under each and the total across all of them."}},"/v1/billing/credits":{"get":{"summary":"Lists the caller's credit grants — every one of them, spent and lapsed and voided included."}},"/v1/billing/crypto/deposit":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/billing.cryptoAsset"}}}},"summary":"Issues a deposit address the caller can send crypto to, on the asset they ask for."}},"/v1/billing/crypto/deposit/{id}":{"get":{"parameters":[{"description":"ID is the deposit intent id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Reads one of the caller's own deposit intents back — pending, confirming, or succeeded."}},"/v1/billing/crypto/options":{"get":{"summary":"Answers which chains and tokens the crypto rail accepts — what an asset picker renders."}},"/v1/billing/invoices":{"get":{"parameters":[{"in":"query","name":"subject","required":false,"schema":{"type":"string"}},{"in":"query","name":"status","required":false,"schema":{"type":"string"}},{"in":"query","name":"subscriptionId","required":false,"schema":{"type":"string"}},{"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}},{"in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"summary":"Lists the caller's invoices, newest first, with the count beside them."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/billing.RaiseIn"}}}},"summary":"Raise a draft invoice against a customer"}},"/v1/billing/invoices/{id}":{"get":{"parameters":[{"description":"ID is the invoice id.","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Brand is the brand that bills (hanzo, lux, zoo, pars), whose mark and\naddress a rendered invoice carries. The edge sets it from the caller's\nissuer; empty is Hanzo.","in":"query","name":"brand","required":false,"schema":{"type":"string"}}],"summary":"Read one invoice"}},"/v1/billing/invoices/{id}/collect":{"post":{"parameters":[{"description":"ID is the invoice id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/billing.InvoiceRef"}}}},"summary":"Collect an issued invoice from credits, balance, then card"}},"/v1/billing/invoices/{id}/issue":{"post":{"parameters":[{"description":"ID is the invoice id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/billing.InvoiceRef"}}}},"summary":"Issue a draft invoice, making it collectible"}},"/v1/billing/invoices/{id}/pdf":{"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Download one invoice as a PDF"}},"/v1/billing/invoices/{id}/void":{"post":{"parameters":[{"description":"ID is the invoice id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/billing.InvoiceRef"}}}},"summary":"Void a draft or issued invoice"}},"/v1/billing/ledger":{"get":{"parameters":[{"description":"Range is the window: 24h, 7d, 30d or 90d. Anything else — including\nabsent — is 30d, so a typo silently widens the window to a month rather\nthan failing.","example":"30d","in":"query","name":"range","required":false,"schema":{"type":"string"}}],"summary":"Answers the org's own postings inside `range=`, each as a signed entry: a DEPOSIT CREDITS the wallet (positive, account `credits:<org>`), a HOLD sets money aside for a payment agreed and not yet made (negative, account `held:<org>`) and its return gives it back (positive), and every other posting DEBITS it (negative, account `usage:<org>`), described by its notes or its tags."}},"/v1/billing/methods":{"get":{"summary":"Cards and accounts on file for the caller"},"post":{"summary":"Save a card or account for the caller"}},"/v1/billing/methods/{id}":{"delete":{"parameters":[{"description":"ID is the saved method to detach, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Removes one card or account the caller has saved."}},"/v1/billing/mode":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/billing.ModeIn"}}}},"summary":"Moves this org between sandbox money and real money."}},"/v1/billing/payouts":{"get":{"summary":"Answers the org's outbound payouts, newest first — amount, destination, status, and the failure reason where one applies."}},"/v1/billing/plans":{"get":{"summary":"The plan catalog, priced with whatever offer is in force"}},"/v1/billing/portal/methods":{"get":{"summary":"Cards and accounts on file for the caller"},"post":{"summary":"Save a card or account for the caller"}},"/v1/billing/portal/methods/{id}":{"delete":{"parameters":[{"description":"ID is the saved method to detach, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Removes one card or account the caller has saved, at the address a hosted checkout reaches it by."}},"/v1/billing/recharge":{"get":{"summary":"Reads the org's auto-reload rule: top the balance up by `amountCents` whenever it falls below `thresholdCents`, charging the card on file off-session, at most `perDay` times in a UTC day."},"put":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/billing.AutoRechargeEdit"}}}},"summary":"Sets the org's auto-reload rule, and answers with the rule as stored."}},"/v1/billing/recharge/run-all":{"post":{"summary":"Sweeps every org's auto-recharge and answers what it did."}},"/v1/billing/settings":{"get":{"summary":"Answers the PUBLIC half of this org's processor configuration — the ids a browser needs to tokenize a card, and the environment it must tokenize against."}},"/v1/billing/subscribe/card":{"post":{"summary":"Buy a plan with a card"}},"/v1/billing/subscriptions":{"get":{"summary":"Lists the plans the caller may see, with the count beside them."}},"/v1/billing/subscriptions/{id}/cancel":{"post":{"parameters":[{"description":"ID is the subscription, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/billing.subscriptionAct"}}}},"summary":"End a subscription"}},"/v1/billing/subscriptions/{id}/reactivate":{"post":{"parameters":[{"description":"ID is the subscription, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/billing.subscriptionAct"}}}},"summary":"Put a canceled subscription back on its plan"}},"/v1/billing/subscriptions/{id}/resize":{"post":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/billing.resize"}}}},"summary":"Change a team's seats"}},"/v1/billing/subscriptions/{id}/seats":{"put":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/billing.assignment"}}}},"summary":"Assign a team's seats"}},"/v1/billing/tier":{"get":{"summary":"Answers which tier the caller is on, what it allows, and what is left to spend."}},"/v1/billing/topup":{"post":{"parameters":[{"in":"header","name":"X-Idempotency-Key","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/billing.topupIn"}}}},"summary":"Charges a card the caller already saved and credits the balance."}},"/v1/billing/topup/token":{"post":{"parameters":[{"in":"header","name":"X-Idempotency-Key","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/billing.topupIn"}}}},"summary":"Charges a single-use card token and credits the caller's balance."}},"/v1/billing/transactions":{"get":{"parameters":[{"description":"Currency filters to one currency. Empty reads every currency.","in":"query","name":"currency","required":false,"schema":{"type":"string"}},{"description":"Limit is the page size; absent or non-positive takes the default 100.","in":"query","name":"limit","required":false,"schema":{"type":"string"}},{"description":"Offset is how far into the history the page starts.","in":"query","name":"offset","required":false,"schema":{"type":"string"}}],"summary":"Answers one page of the caller's own ledger, newest first: what moved, how much, when, and what it was tagged with."}},"/v1/billing/transactions/{id}":{"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Reads one ledger entry by its id."}},"/v1/billing/usage":{"get":{"summary":"Every billed call the caller's org made, attributed to a product"},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/billing.usageReport"}}}},"summary":"Debits one act an application metered to the org it acts for, and answers the receipt."}},"/v1/billing/usage/accounts":{"get":{"summary":"Answers per-account totals for the linked provider accounts the gateway ROUTED this caller's traffic through — requests, prompt and completion tokens, recorded cost — plus their honest sum."}},"/v1/billing/usage/rollup":{"get":{"summary":"Answers the caller's month: what their plan includes, what has been consumed against it, and the wallet beside it."}},"/v1/billing/wire":{"get":{"summary":"Answers where to send a wire top-up: the receiving bank details, with the caller's own payment reference."}},"/v1/blueprint":{"get":{"summary":"Returns every deployable blueprint with its service count and estimated monthly compute cost."}},"/v1/blueprint/health":{"get":{"summary":"Reports blueprint liveness and echoes the compute rate card in force."}},"/v1/blueprint/sbom":{"get":{"summary":"A blueprint's bill of images and what running it costs"}},"/v1/books/accounts":{"get":{"parameters":[{"description":"Sandbox reads the org's SANDBOX ledger when it is exactly \"true\"; anything else\nreads the live one.","example":"false","in":"query","name":"sandbox","required":false,"schema":{"type":"string"}}],"summary":"Returns the org's chart of accounts — the seeded fixed chart every posting key in the ledger refers to."}},"/v1/books/ask":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/books.AskRequest"}}}},"summary":"Answers a plain-language question about the caller's own books — \"what is my MRR?\", \"how long is my runway?\" — with figures taken from their ledger, never a guessed number."}},"/v1/books/bank/import":{"post":{"summary":"Import a bank statement file into your books"}},"/v1/books/bank/sync":{"post":{"summary":"Pulls every connected bank (Plaid/Teller) for the caller's org, maps each fetched transaction to a posting and books it idempotently, then advances that connector's cursor so the next sync resumes where this one stopped."}},"/v1/books/bank/transactions":{"get":{"parameters":[{"description":"Sandbox reads the org's SANDBOX ledger when it is exactly \"true\".","in":"query","name":"sandbox","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many rows come back; 500 when absent or not positive.","example":100,"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns the org's normalized bank transactions, newest first — every row the import and connector paths have ingested, with its amount in exact cents, its direction, and whether it has been matched to a voucher yet."}},"/v1/books/bank/unreconciled":{"get":{"parameters":[{"description":"Sandbox reads the org's SANDBOX ledger when it is exactly \"true\"; anything else\nreads the live one.","example":"false","in":"query","name":"sandbox","required":false,"schema":{"type":"string"}}],"summary":"Returns the org's unmatched bank inflows and their open clarifying questions — the queue a human answers so an unexplained deposit is never guessed into revenue."}},"/v1/books/export":{"get":{"parameters":[{"description":"Sandbox reads the org's SANDBOX ledger when it is exactly \"true\".","in":"query","name":"sandbox","required":false,"schema":{"type":"string"}},{"description":"From is the RFC3339 start of the window, exclusive. Empty means all time.","example":"2026-01-01T00:00:00Z","in":"query","name":"from","required":false,"schema":{"type":"string"}},{"description":"To is the RFC3339 end of the window, inclusive. Empty means up to now.","example":"2026-12-31T23:59:59Z","in":"query","name":"to","required":false,"schema":{"type":"string"}},{"description":"Format is the export encoding. Only \"json\" is supported; empty means json.","example":"json","in":"query","name":"format","required":false,"schema":{"type":"string"}},{"description":"Limit caps the GL detail rows included as the audit trail; 5000 when absent\nor not positive.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns the complete financial package for the caller's org over (from, to]: the trial balance, the P&L, the balance sheet, and the GL detail behind them — the four statements a tax preparer or an investor asks for, assembled from the one ledger in a single read so they cannot disagree with each other."}},"/v1/books/gl":{"get":{"parameters":[{"description":"Sandbox reads the org's SANDBOX ledger when it is exactly \"true\".","in":"query","name":"sandbox","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many rows come back; 500 when absent or not positive.","example":100,"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns the org's most recent GL Entry rows, newest first."}},"/v1/books/inbox":{"get":{"parameters":[{"description":"Sandbox reads the org's SANDBOX ledger when it is exactly \"true\"; anything else\nreads the live one.","example":"false","in":"query","name":"sandbox","required":false,"schema":{"type":"string"}}],"summary":"Returns the org's open document queue — everything uploaded but not yet booked, newest first, each with its extracted summary and the confidence the scanner resolved its category at."},"post":{"summary":"Queue a document for later scanning"}},"/v1/books/metrics":{"get":{"parameters":[{"description":"Sandbox reads the org's SANDBOX ledger when it is exactly \"true\".","in":"query","name":"sandbox","required":false,"schema":{"type":"string"}},{"description":"From is the RFC3339 start of the window, exclusive. Empty means all time.","example":"2026-01-01T00:00:00Z","in":"query","name":"from","required":false,"schema":{"type":"string"}},{"description":"To is the RFC3339 end of the window, inclusive. Empty means up to now.","example":"2026-06-30T23:59:59Z","in":"query","name":"to","required":false,"schema":{"type":"string"}}],"summary":"Returns the org's deterministic SaaS-metrics snapshot over an optional (from, to] window — MRR, ARR, revenue, COGS, burn, gross margin, net income, cash, deferred revenue, monthly burn and runway — as raw int64-cent figures AND the same figures already formatted."}},"/v1/books/pnl":{"get":{"parameters":[{"description":"Sandbox reads the org's SANDBOX ledger when it is exactly \"true\".","in":"query","name":"sandbox","required":false,"schema":{"type":"string"}},{"description":"From is the RFC3339 start of the window, exclusive. Empty means all time.","example":"2026-01-01T00:00:00Z","in":"query","name":"from","required":false,"schema":{"type":"string"}},{"description":"To is the RFC3339 end of the window, inclusive. Empty means up to now.","example":"2026-03-31T23:59:59Z","in":"query","name":"to","required":false,"schema":{"type":"string"}}],"summary":"Returns the org's accrual-basis Profit & Loss over an optional (from, to] window of RFC3339 posting times: recognized revenue, matched cost, and the net."}},"/v1/books/position":{"get":{"parameters":[{"description":"Sandbox reads the org's SANDBOX ledger when it is exactly \"true\".","in":"query","name":"sandbox","required":false,"schema":{"type":"string"}},{"description":"To is the RFC3339 instant the statement is struck as of. Empty means all time.","example":"2026-03-31T23:59:59Z","in":"query","name":"to","required":false,"schema":{"type":"string"}}],"summary":"Returns the org's Balance Sheet as of `to` (empty = all time), with the Assets == Liabilities + Equity equation proof."}},"/v1/books/questions":{"get":{"parameters":[{"description":"Sandbox reads the org's SANDBOX ledger when it is exactly \"true\"; anything else\nreads the live one.","example":"false","in":"query","name":"sandbox","required":false,"schema":{"type":"string"}}],"summary":"Returns the clarifying questions the caller's own recent GL raises — the unusual postings a founder should look at (outliers, reversals, round-offs, uncosted revenue, an overdrawn wallet), sharpest first."}},"/v1/books/rules":{"get":{"parameters":[{"description":"Sandbox reads the org's SANDBOX ledger when it is exactly \"true\"; anything else\nreads the live one.","example":"false","in":"query","name":"sandbox","required":false,"schema":{"type":"string"}}],"summary":"Returns the org's auto-categorization rules, highest priority first."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/books.Rule"}}}},"summary":"Creates or updates one auto-categorization rule, keyed by its pattern — writing a pattern that already exists REPLACES that row's category and priority."}},"/v1/books/scan":{"post":{"summary":"Scan a receipt or invoice into a proposed voucher"}},"/v1/books/scan/book":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/books.BookRequest"}}}},"summary":"Posts a reviewed scanned bill to the ledger."}},"/v1/books/sync":{"post":{"summary":"Ingests the caller's OWN org from commerce into BOTH ledgers (live and sandbox) and reports how many new vouchers posted to each."}},"/v1/books/transactions":{"get":{"parameters":[{"description":"Sandbox reads the org's SANDBOX ledger when it is exactly \"true\".","in":"query","name":"sandbox","required":false,"schema":{"type":"string"}},{"description":"From is the RFC3339 start of the posting-time window, inclusive.","in":"query","name":"from","required":false,"schema":{"type":"string"}},{"description":"To is the RFC3339 end of the posting-time window, inclusive.","in":"query","name":"to","required":false,"schema":{"type":"string"}},{"description":"Category filters to one COA account, named by number (\"5300\") or by category\nslug (\"software\").","example":"software","in":"query","name":"category","required":false,"schema":{"type":"string"}},{"description":"Vendor filters to rows whose vendor or description contains this text,\ncase-insensitively.","in":"query","name":"vendor","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many rows come back; 200 when absent or not positive.","example":50,"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns the org's booked ledger as a single-line register, newest first: one row per voucher, with its date, description, vendor, category, source and amount in exact cents."}},"/v1/books/trial":{"get":{"parameters":[{"description":"Sandbox reads the org's SANDBOX ledger when it is exactly \"true\".","in":"query","name":"sandbox","required":false,"schema":{"type":"string"}},{"description":"From is the RFC3339 start of the window, exclusive. Empty means all time.","example":"2026-01-01T00:00:00Z","in":"query","name":"from","required":false,"schema":{"type":"string"}},{"description":"To is the RFC3339 end of the window, inclusive. Empty means up to now.","example":"2026-03-31T23:59:59Z","in":"query","name":"to","required":false,"schema":{"type":"string"}}],"summary":"Returns the org's trial balance over an optional [from, to] window of RFC3339 posting times, including the opening/closing columns and the TotalDebit == TotalCredit proof that the books balance."}},"/v1/books/vendors":{"get":{"parameters":[{"description":"Sandbox reads the org's SANDBOX ledger when it is exactly \"true\"; anything else\nreads the live one.","example":"false","in":"query","name":"sandbox","required":false,"schema":{"type":"string"}}],"summary":"Returns the org's vendor book: each canonical vendor, the alias spellings a receipt may print it under, and the expense account new bills from it default to."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/books.VendorRow"}}}},"summary":"Creates or updates one vendor in the org's vendor book, keyed by its canonical name — writing a canonical name that already exists REPLACES that row's aliases and default category."}},"/v1/bot/members":{"get":{"summary":"Returns the caller org's bots as space members — each with the member account uuid and the Person reference the roster addresses it by."}},"/v1/bot/members/sync":{"post":{"summary":"Re-projects the caller org's bots as members into every space of the org and removes the ones whose agent is gone."}},"/v1/bot/runs":{"get":{"summary":"Returns the caller org's live bot runs, read from the bot runtime and projected into the console contract with each run's live session URL derived here."}},"/v1/bot/runs/{runId}/stop":{"post":{"parameters":[{"description":"RunID is the run to stop, as the bot runtime named it. It is read from the\nURL — the `{runId}` segment the router matched on — and a body carrying a\ndifferent id cannot redirect the stop.","in":"path","name":"runId","required":true,"schema":{"type":"string"}}],"summary":"Terminates one of the caller org's own bot runs and reports its terminal state."}},"/v1/build":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/platform.runnerBuildReq"}}}},"summary":"Triggers a native build — an image, or the binaries a repo declares."}},"/v1/build/{id}":{"get":{"parameters":[{"description":"ID is the build's id, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Answers one build: its status, and for a failed build the reason."}},"/v1/campaign":{"get":{"parameters":[{"description":"Status keeps only campaigns in that state: draft, live, paused or failed.\nEmpty means any.","example":"live","in":"query","name":"status","required":false,"schema":{"type":"string"}},{"description":"Limit bounds the page. 0 or less means the default of 200; anything above\n1000 is clamped to 1000.","example":50,"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns the org's campaigns, newest first, optionally narrowed to one status."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/campaign.campaignWrite"}}}},"summary":"Creates a campaign as a DRAFT and returns it."}},"/v1/campaign/summary":{"get":{"summary":"Returns the org's go-to-market roll-up: how many campaigns exist, how many are live, their total budget in cents, and which channel executors this deployment can actually reach."}},"/v1/campaign/{id}":{"delete":{"parameters":[{"description":"ID is the campaign's server-minted handle, \"cmp_\"-prefixed.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Removes one campaign of the caller's org and answers 204 with no body."},"get":{"parameters":[{"description":"ID is the campaign's server-minted handle, \"cmp_\"-prefixed.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one campaign of the caller's org — its name, audience, creatives, channels with their per-channel launch state, schedule, budget and status."},"put":{"parameters":[{"description":"ID is the campaign to update, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/campaign.campaignUpdate"}}}},"summary":"Rewrites a campaign's core fields — name, audience, creatives, schedule and budget — and returns the updated campaign."}},"/v1/campaign/{id}/channels":{"post":{"parameters":[{"description":"ID is the campaign to add the channel to, from the path.","example":"cmp_1f…","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/campaign.channelAdd"}}}},"summary":"Adds a channel to a campaign, or REPLACES the one it already has of that kind, and returns the updated campaign."}},"/v1/campaign/{id}/channels/{kind}":{"delete":{"parameters":[{"description":"ID is the campaign, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Kind is the channel to remove: paid, organic or email.","in":"path","name":"kind","required":true,"schema":{"type":"string"}}],"summary":"Drops one channel from a campaign and returns the updated campaign."}},"/v1/campaign/{id}/launch":{"post":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Launch a campaign across every channel it declares"}},"/v1/campaign/{id}/metrics":{"get":{"parameters":[{"description":"ID is the campaign to report on, from the path.","example":"cmp_1f…","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Range is the lookback window: 24h, 7d, 30d or 90d. Anything else, including\nempty, reads as 30d.","example":"7d","in":"query","name":"range","required":false,"schema":{"type":"string"}},{"description":"Start is an explicit RFC3339 window start. Honored only together with End,\nand only when End is after it.","in":"query","name":"start","required":false,"schema":{"type":"string"}},{"description":"End is an explicit RFC3339 window end.","in":"query","name":"end","required":false,"schema":{"type":"string"}}],"summary":"Returns a campaign's results over a window: the analytics funnel (impressions, clicks, conversions, revenue, visitors), the spend each channel's connector reports, and the derived growth KPIs — CTR, CVR, CAC and ROAS."}},"/v1/campaign/{id}/pause":{"post":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Pause every live channel on a campaign at its provider"}},"/v1/capabilities":{"get":{"summary":"Answers the org's capabilities by name, each with its state, its latest and installed versions, and what the installed one did live."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/train.createIn"}}}},"summary":"Makes a capability in draft from captured corrections of one question: that question (its key, type and labels) is the route it will be installed behind."}},"/v1/capabilities/capture":{"get":{"summary":"Answers whether the org's Kai decisions keep their states for its capabilities to learn from."},"put":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/train.captureIn"}}}},"summary":"Turns capture on or off for the org's Kai decisions from the next one."}},"/v1/capabilities/corrections":{"get":{"parameters":[{"description":"Question keeps one question's corrections.","in":"query","name":"question","required":false,"schema":{"type":"string"}}],"summary":"Answers every correction of the org's decisions, newest first, each captured (it can teach) or missing (its decision was made with capture off), and the questions they ask, each counted: what a capability is made from."}},"/v1/capabilities/{name}":{"delete":{"parameters":[{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Deletes a capability and its versions; their artifacts go with the org's retention."},"get":{"parameters":[{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Answers one capability: its versions with their evaluations, newest first, and what its installed version did live."}},"/v1/capabilities/{name}/disable":{"post":{"parameters":[{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Takes a capability's installed version out of the org's published set: its questions are answered by base Kai, bit for bit, from the next decision."}},"/v1/capabilities/{name}/publish":{"post":{"parameters":[{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/train.publishCapIn"}}}},"summary":"Installs a version in the org's published set, where ai attaches it to the org's decisions: the version's evaluation must have passed, and it must have been taught over the base Kai serves now."}},"/v1/capabilities/{name}/rollback":{"post":{"parameters":[{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Puts the version installed before the installed one back in the org's published set: exactly that version's artifact, nothing retrained."}},"/v1/capabilities/{name}/train":{"post":{"parameters":[{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/train.trainIn"}}}},"summary":"Teaches a capability a new version from its corrections, on the CPU over the states its org's decisions captured: no row is encoded again."}},"/v1/captable/classes":{"get":{"summary":"Returns the caller org's share classes, in creation order."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/captable.captableShareClassIn"}}}},"summary":"Defines a new class of shares."}},"/v1/captable/classes/{id}":{"patch":{"parameters":[{"description":"ID addresses the resource. The URL is the addressing authority — a path\nsegment binds after the body and after the query — so the address decides\nwhich row is written whatever a body claims.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/captable.captableShareClassAmend"}}}},"summary":"Replaces one share class's terms."}},"/v1/captable/company":{"get":{"summary":"Returns the caller org's cap-table company record."},"put":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/captable.captableCompanyUpdate"}}}},"summary":"Sets the caller org's company name and incorporation details."}},"/v1/captable/convertibles":{"get":{"summary":"Returns the caller org's convertible notes, newest first."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/captable.captableConvertibleIn"}}}},"summary":"Records a convertible note."}},"/v1/captable/convertibles/{id}":{"delete":{"parameters":[{"description":"ID is the convertible note to delete.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Removes one of the caller org's convertible notes, taking its principal out of the cap table's unconverted-instrument totals."}},"/v1/captable/investments":{"get":{"summary":"Returns the caller org's investments, newest first."}},"/v1/captable/options":{"get":{"summary":"Returns the caller org's option grants, newest first."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/captable.captableOptionIn"}}}},"summary":"Grants options to a stakeholder from an equity plan."}},"/v1/captable/options/{id}":{"delete":{"parameters":[{"description":"ID is the option grant to delete.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Removes one of the caller org's option grants, taking its shares out of the cap table's granted-options and fully-diluted counts."}},"/v1/captable/plans":{"get":{"summary":"Returns the caller org's equity plans, newest first."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/captable.captableEquityPlanIn"}}}},"summary":"Opens an equity plan that options are granted from."}},"/v1/captable/rounds":{"get":{"summary":"Returns the caller org's fundraising rounds, newest first."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/captable.captableRoundIn"}}}},"summary":"Opens a priced round that investments can be added to."}},"/v1/captable/rounds/{id}":{"get":{"parameters":[{"description":"ID is the round to read. It is the path segment: the URL is the addressing\nauthority, and the org it is resolved in comes from the caller's principal,\nso an id from another tenant is simply not found.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one of the caller org's fundraising rounds together with every investment written into it, oldest first."}},"/v1/captable/rounds/{id}/close":{"post":{"parameters":[{"description":"ID is the round to close. It is the path segment: the URL is the\naddressing authority, and the org it is resolved in comes from the\ncaller's principal, so an id from another tenant is simply not found.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/captable.captableRoundCloseRequest"}}}},"summary":"Closes one of the caller org's fundraising rounds, recording the close date and moving its status to CLOSED."}},"/v1/captable/rounds/{id}/investments":{"post":{"parameters":[{"description":"ID is the round to invest in. The URL is the addressing authority — a path\nsegment binds after the body and after the query — so the address decides\nwhich round is written whatever a body claims.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/captable.captableInvestmentIn"}}}},"summary":"Records one investor's money into an open round."}},"/v1/captable/safes":{"get":{"summary":"Returns the caller org's SAFEs, newest first."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/captable.captableSafeIn"}}}},"summary":"Records a SAFE — a simple agreement for future equity."}},"/v1/captable/safes/{id}":{"delete":{"parameters":[{"description":"ID is the SAFE to delete.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Removes one of the caller org's SAFEs, taking its capital out of the cap table's unconverted-instrument totals."}},"/v1/captable/shares":{"get":{"summary":"Returns the caller org's share certificates, newest first."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/captable.captableShareIn"}}}},"summary":"Issues a share certificate to a stakeholder."}},"/v1/captable/shares/transfer":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/captable.captableShareTransfer"}}}},"summary":"Moves shares from one stakeholder to another."}},"/v1/captable/shares/{id}":{"delete":{"parameters":[{"description":"ID is the share certificate to delete.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Removes one of the caller org's share certificates, taking its shares out of the cap table's outstanding and fully-diluted counts."}},"/v1/captable/stakeholders":{"get":{"summary":"Returns the caller org's stakeholders, newest first."},"post":{"summary":"Add stakeholders to the cap table"}},"/v1/captable/stakeholders/{id}":{"delete":{"parameters":[{"description":"ID is the stakeholder to delete.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Removes one of the caller org's stakeholders."},"patch":{"parameters":[{"description":"ID is the stakeholder to update. It is the path segment: the URL is the\naddressing authority, and the org it is resolved in comes from the\ncaller's principal, so an id from another tenant is simply not found.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/captable.captableStakeholderPatch"}}}},"summary":"Changes one of the caller org's stakeholders."}},"/v1/captable/summary":{"get":{"summary":"Computes the caller org's cap table."}},"/v1/catalog":{"get":{"parameters":[{"description":"Q is the free-text query the lexical index scores relevance on. Empty is a\nbrowse rather than a search — the same request either way.","in":"query","name":"q","required":false,"schema":{"type":"string"}},{"description":"Org narrows to one builder org: hanzo | lux | zoo. Case-insensitive.","in":"query","name":"org","required":false,"schema":{"type":"string"}},{"description":"Kind narrows to repo | site. Case-insensitive.","in":"query","name":"kind","required":false,"schema":{"type":"string"}},{"description":"Origin narrows to what a row IS to you: template | community | third-party |\nproduct. This is the axis the two hanzo.app lanes are cut on.","example":"template","in":"query","name":"origin","required":false,"schema":{"type":"string"}},{"description":"Archetype narrows to one project archetype. Case-insensitive.","in":"query","name":"archetype","required":false,"schema":{"type":"string"}},{"description":"Language narrows to one implementation language. Case-insensitive.","example":"typescript","in":"query","name":"language","required":false,"schema":{"type":"string"}},{"description":"Template narrows a lane to ONE lineage: the id of the parent everything\nreturned was forked from.","in":"query","name":"template","required":false,"schema":{"type":"string"}},{"description":"Forkable is tri-state: \"true\" selects the forkable rows, \"false\" selects the\nrest, and anything else — including absent — applies no filter at all.","example":"true","in":"query","name":"forkable","required":false,"schema":{"type":"string"}},{"description":"Limit caps the page at 200, default 50. A value that is not a non-negative\ninteger falls back to the default.","example":"20","in":"query","name":"limit","required":false,"schema":{"type":"string"}},{"description":"Offset is where the page starts, default 0, with the same tolerance.","in":"query","name":"offset","required":false,"schema":{"type":"string"}}],"summary":"Searches AND browses the cross-org catalog: every project, app and site the fleet has built, whichever org built it."}},"/v1/channel":{"get":{"summary":"Reports every chat channel this org can send through, and whether it can send through it right now."}},"/v1/channel/agent":{"get":{"parameters":[{"description":"Channel is the transport: discord, github, linear, slack, teams, telegram or whatsapp.\nRequired; an unknown value is a 404.","in":"query","name":"channel","required":false,"schema":{"type":"string"}}],"summary":"Returns which agent answers the caller org's channel: the default and every room bound to another agent."},"put":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/channel.channelAgentsPut"}}}},"summary":"Binds agents to the caller org's channel and answers the bindings as GET would."}},"/v1/channel/allowlist":{"get":{"parameters":[{"description":"Channel is the transport to read: discord, github, linear, slack, teams, telegram or whatsapp.\nRequired; an unknown value is a 404.","example":"slack","in":"query","name":"channel","required":false,"schema":{"type":"string"}}],"summary":"Returns the caller org's access policy for one channel: whether DMs are pairing-gated, allowlisted or open, whether group rooms are open, allowlisted or disabled, the config-managed DM and group allow entries, the senders approved through PAIRING (read-only here), and the org's named access groups."},"put":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/channel.allowlistPutIn"}}}},"summary":"Edits the caller org's access policy for one channel and answers the policy as GET would, so both verbs return ONE shape."}},"/v1/channel/inbox":{"get":{"parameters":[{"description":"Since is the exclusive cursor: only messages with a higher row id come\nback. Empty starts at the beginning. Must parse as an integer.","example":"1042","in":"query","name":"since","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many messages come back. Empty or 0 uses the store's\ndefault page size. Must parse as an integer.","example":"100","in":"query","name":"limit","required":false,"schema":{"type":"string"}}],"summary":"Returns the caller's own messages to the org's connected chat bots — those recorded on the caller's linked account — oldest first, in the portable envelope shape every transport normalises into."}},"/v1/channel/pairing":{"get":{"summary":"Returns the pairing requests waiting for the caller org to approve — one per person who messaged a connected bot on a channel whose DM policy is \"pairing\" and who is not allowed yet."}},"/v1/channel/pairing/approve":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/channel.approvePairingIn"}}}},"summary":"Turns one pending pairing code into a standing allow entry, so that person can DM the org's bot on that channel from now on."}},"/v1/channel/{channel}/send":{"post":{"parameters":[{"in":"path","name":"channel","required":true,"schema":{"type":"string"}}],"summary":"Send a message from your org's bot to one chat room"}},"/v1/chat":{"post":{"parameters":[{"description":"The most this request may cost, in USD per 1,000 tokens. Routing picks only models under it; an org's own ceiling fills it when it is absent, and the lower of the two holds.","in":"header","name":"X-Max-Cost","required":false,"schema":{"minimum":0,"type":"number"}},{"description":"The slowest model this request accepts, in milliseconds.","in":"header","name":"X-Max-Latency-Ms","required":false,"schema":{"minimum":0,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/openai.ChatCompletionRequest"}}}},"summary":"Implements the OpenAI-compatible chat completions API"}},"/v1/chat/completions":{"post":{"parameters":[{"description":"The most this request may cost, in USD per 1,000 tokens. Routing picks only models under it; an org's own ceiling fills it when it is absent, and the lower of the two holds.","in":"header","name":"X-Max-Cost","required":false,"schema":{"minimum":0,"type":"number"}},{"description":"The slowest model this request accepts, in milliseconds.","in":"header","name":"X-Max-Latency-Ms","required":false,"schema":{"minimum":0,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/openai.ChatCompletionRequest"}}}},"summary":"Implements the OpenAI-compatible chat completions API"}},"/v1/chat/public":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/openai.ChatCompletionRequest"}}}},"summary":"Serves one completion to a caller with no account."}},"/v1/ci/fleet":{"get":{"summary":"Compares what was written with what is running, one row per service along a single causal line: head, the commit on the branch; built, the image that commit produced; declared, the tag pinned in the universe repository; running, what the cluster serves."}},"/v1/ci/runs":{"get":{"summary":"Lists recent builds: the repo, the branch, the commit and how each run ended, newest first."}},"/v1/cloudflare/d1/databases":{"get":{"parameters":[{"description":"Page is the 1-based page of databases to return.","in":"query","name":"page","required":false,"schema":{"type":"string"}},{"description":"PerPage is how many databases one page holds.","in":"query","name":"per_page","required":false,"schema":{"type":"string"}},{"description":"Name filters to the database with this name.","in":"query","name":"name","required":false,"schema":{"type":"string"}}],"summary":"Lists the D1 databases on the org's Cloudflare account."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/cloudflare.databaseCreateIn"}}}},"summary":"Creates a D1 database on the org's Cloudflare account."}},"/v1/cloudflare/d1/databases/{database}":{"delete":{"parameters":[{"description":"Database is the Cloudflare D1 database id or name.","example":"orders","in":"path","name":"database","required":true,"schema":{"type":"string"}}],"summary":"Deletes a D1 database and everything stored in it."}},"/v1/cloudflare/d1/databases/{database}/query":{"post":{"parameters":[{"in":"path","name":"database","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/cloudflare.D1Query"}}}},"summary":"Runs one SQL statement against a D1 database."}},"/v1/cloudflare/kv/namespaces":{"get":{"parameters":[{"description":"Page is the 1-based page of namespaces to return.","in":"query","name":"page","required":false,"schema":{"type":"string"}},{"description":"PerPage is how many namespaces one page holds.","in":"query","name":"per_page","required":false,"schema":{"type":"string"}},{"description":"Order names the field to sort by, and Direction sorts asc or desc.","in":"query","name":"order","required":false,"schema":{"type":"string"}},{"in":"query","name":"direction","required":false,"schema":{"type":"string"}}],"summary":"Lists the Workers KV namespaces on the org's Cloudflare account."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/cloudflare.namespaceCreateIn"}}}},"summary":"Creates a Workers KV namespace on the org's Cloudflare account."}},"/v1/cloudflare/kv/namespaces/{namespace}":{"delete":{"parameters":[{"description":"Namespace is the Cloudflare KV namespace id.","example":"0123456789abcdef0123456789abcdef","in":"path","name":"namespace","required":true,"schema":{"type":"string"}}],"summary":"Deletes a Workers KV namespace and every key in it."}},"/v1/cloudflare/kv/namespaces/{namespace}/values/{key}":{"delete":{"parameters":[{"description":"Namespace is the Cloudflare KV namespace id.","example":"0123456789abcdef0123456789abcdef","in":"path","name":"namespace","required":true,"schema":{"type":"string"}},{"description":"Key is the key within that namespace. KV keys are broad (up to 512 bytes),\nso this one is escaped rather than charset-restricted.","example":"session/abc","in":"path","name":"key","required":true,"schema":{"type":"string"}}],"summary":"Removes one key from a Workers KV namespace."},"get":{"parameters":[{"in":"path","name":"namespace","required":true,"schema":{"type":"string"}},{"in":"path","name":"key","required":true,"schema":{"type":"string"}}],"summary":"Read a Workers KV value as its stored bytes"},"put":{"parameters":[{"in":"path","name":"namespace","required":true,"schema":{"type":"string"}},{"in":"path","name":"key","required":true,"schema":{"type":"string"}}],"summary":"Write a Workers KV value from the request body"}},"/v1/cloudflare/pages/projects":{"get":{"summary":"Lists the org's Cloudflare Pages projects."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/cloudflare.PagesProjectCreate"}}}},"summary":"Creates a Cloudflare Pages project on the org's account."}},"/v1/cloudflare/pages/projects/{project}":{"delete":{"parameters":[{"description":"Project is the Pages project name.","example":"marketing-site","in":"path","name":"project","required":true,"schema":{"type":"string"}}],"summary":"Deletes a Cloudflare Pages project, and with it every deployment it has ever made."},"get":{"parameters":[{"description":"Project is the Pages project name.","example":"marketing-site","in":"path","name":"project","required":true,"schema":{"type":"string"}}],"summary":"Reads one Cloudflare Pages project — its build config, deployment configs and latest deployment."}},"/v1/cloudflare/pages/projects/{project}/deployments":{"post":{"parameters":[{"in":"path","name":"project","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagesDeploy"}}}},"summary":"Trigger a new Pages deployment for a project"}},"/v1/cloudflare/pages/projects/{project}/domains":{"post":{"parameters":[{"description":"Project is the Pages project name, from the path.","example":"marketing-site","in":"path","name":"project","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/cloudflare.domainAddIn"}}}},"summary":"Attaches a custom domain to a Cloudflare Pages project."}},"/v1/cloudflare/pages/projects/{project}/domains/{domain}":{"delete":{"parameters":[{"description":"Project is the Pages project name.","example":"marketing-site","in":"path","name":"project","required":true,"schema":{"type":"string"}},{"description":"Domain is the attached custom domain to detach.","example":"www.acme.com","in":"path","name":"domain","required":true,"schema":{"type":"string"}}],"summary":"Detaches a custom domain from a Cloudflare Pages project."}},"/v1/cloudflare/r2/buckets":{"get":{"parameters":[{"description":"PerPage is how many buckets one page holds.","in":"query","name":"per_page","required":false,"schema":{"type":"string"}},{"description":"Cursor continues from the position a previous page returned.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}},{"description":"NameContains filters to buckets whose name contains this substring.","in":"query","name":"name_contains","required":false,"schema":{"type":"string"}},{"description":"Order names the field to sort by, and Direction sorts asc or desc.","in":"query","name":"order","required":false,"schema":{"type":"string"}},{"in":"query","name":"direction","required":false,"schema":{"type":"string"}}],"summary":"Lists the R2 buckets on the org's Cloudflare account."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/cloudflare.bucketCreateIn"}}}},"summary":"Creates an R2 bucket on the org's Cloudflare account."}},"/v1/cloudflare/r2/buckets/{bucket}":{"delete":{"parameters":[{"description":"Bucket is the R2 bucket name.","example":"assets","in":"path","name":"bucket","required":true,"schema":{"type":"string"}}],"summary":"Deletes an R2 bucket."}},"/v1/cloudflare/workers/scripts":{"get":{"summary":"Lists the Worker scripts on the org's Cloudflare account."}},"/v1/cloudflare/workers/scripts/{script}":{"delete":{"parameters":[{"description":"Script is the Worker script name.","example":"edge-router","in":"path","name":"script","required":true,"schema":{"type":"string"}}],"summary":"Removes a Worker script from the org's Cloudflare account."},"put":{"parameters":[{"description":"Script means two things on this route, and the document says so in both places\nit appears: the PATH segment names the Worker to publish, and the BODY field\ncarries that Worker's ES-module source — the code itself, never a name or a\nURL. A blank or absent source is refused; there is no empty Worker.","in":"path","name":"script","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/cloudflare.WorkerScriptPut"}}}},"summary":"Uploads or replaces a module Worker script."}},"/v1/cloudflare/workers/scripts/{script}/subdomain":{"post":{"parameters":[{"description":"Script is the Worker script name, from the path.","example":"edge-router","in":"path","name":"script","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/cloudflare.subdomainSetIn"}}}},"summary":"Publishes or withdraws one Worker script on the account's workers.dev subdomain."}},"/v1/cloudflare/workers/subdomain":{"get":{"summary":"Reads the org account's workers.dev subdomain — the name under which every subdomain-enabled script is served."}},"/v1/cloudflare/workers/zones/{zone}/routes":{"get":{"parameters":[{"description":"Zone is the 32-hex Cloudflare zone id.","example":"0123456789abcdef0123456789abcdef","in":"path","name":"zone","required":true,"schema":{"type":"string"}}],"summary":"Lists the Worker routes bound within one zone — the URL patterns that dispatch to a script."},"post":{"parameters":[{"description":"Zone is the 32-hex Cloudflare zone id, from the path.","example":"0123456789abcdef0123456789abcdef","in":"path","name":"zone","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/cloudflare.routeCreateIn"}}}},"summary":"Binds a URL pattern in a zone to a Worker script."}},"/v1/cloudflare/workers/zones/{zone}/routes/{route}":{"delete":{"parameters":[{"description":"Zone is the 32-hex Cloudflare zone id.","example":"0123456789abcdef0123456789abcdef","in":"path","name":"zone","required":true,"schema":{"type":"string"}},{"description":"Route is the 32-hex Cloudflare route id.","example":"fedcba9876543210fedcba9876543210","in":"path","name":"route","required":true,"schema":{"type":"string"}}],"summary":"Unbinds a Worker route, so its pattern stops dispatching to a script."}},"/v1/cloudflare/zones":{"get":{"parameters":[{"description":"Page is the 1-based page of zones to return.","in":"query","name":"page","required":false,"schema":{"type":"string"}},{"description":"PerPage is how many zones one page holds.","in":"query","name":"per_page","required":false,"schema":{"type":"string"}},{"description":"Name filters to the zone with this domain name.","in":"query","name":"name","required":false,"schema":{"type":"string"}},{"description":"Status filters by zone status (active, pending, initializing, …).","in":"query","name":"status","required":false,"schema":{"type":"string"}},{"description":"Order names the field to sort by, and Direction sorts asc or desc.","in":"query","name":"order","required":false,"schema":{"type":"string"}},{"in":"query","name":"direction","required":false,"schema":{"type":"string"}}],"summary":"Lists the Cloudflare zones the org's connected API token can see, paged and filtered by the query parameters Cloudflare itself accepts."}},"/v1/cloudflare/zones/{zone}":{"get":{"parameters":[{"description":"Zone is the 32-hex Cloudflare zone id.","example":"0123456789abcdef0123456789abcdef","in":"path","name":"zone","required":true,"schema":{"type":"string"}}],"summary":"Reads one Cloudflare zone the org's token can see."}},"/v1/cloudflare/zones/{zone}/analytics":{"get":{"parameters":[{"description":"Zone is the 32-hex Cloudflare zone id.","example":"0123456789abcdef0123456789abcdef","in":"path","name":"zone","required":true,"schema":{"type":"string"}},{"description":"Since and Until bound the window, in the form Cloudflare accepts — an RFC 3339\ntime or a negative number of minutes from now (\"-1440\" is the last day).","example":"-1440","in":"query","name":"since","required":false,"schema":{"type":"string"}},{"example":"0","in":"query","name":"until","required":false,"schema":{"type":"string"}},{"description":"Continuous asks Cloudflare for only fully-aggregated buckets.","in":"query","name":"continuous","required":false,"schema":{"type":"string"}}],"summary":"Reads a zone's Cloudflare traffic dashboard — requests, bandwidth, threats and pageviews over the since/until window."}},"/v1/cloudflare/zones/{zone}/purge":{"post":{"parameters":[{"description":"Zone is the 32-hex Cloudflare zone id, from the path.","example":"0123456789abcdef0123456789abcdef","in":"path","name":"zone","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/cloudflare.purgeIn"}}}},"summary":"Drops a zone's Cloudflare edge cache — either the whole zone (purge_everything) or exactly the listed file URLs."}},"/v1/code/ask":{"get":{"parameters":[{"description":"Q is the question to answer. Required, max 4000 bytes.","example":"where is the per-org SQLite file opened","in":"query","name":"q","required":false,"schema":{"type":"string"}},{"description":"Repo narrows retrieval to one repository. Empty searches every repo the org\nhas indexed.","example":"cloud","in":"query","name":"repo","required":false,"schema":{"type":"string"}}],"summary":"Answers a question about the caller org's code with a CITED answer: retrieval packs grounding context, then the synthesizer writes the answer over exactly those spans, which come back alongside it."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/code.askPostIn"}}}},"summary":"Answers a question about the caller org's code with a CITED answer, taking the question from the request BODY, for a question too long or too awkward to put in a URL."}},"/v1/code/context":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/code.contextIn"}}}},"summary":"Packs the most relevant code for a query into a token budget — THE primitive for a coding agent that has to decide what to put in a prompt."}},"/v1/code/file":{"get":{"parameters":[{"description":"Path is the file's repo-relative path. Required.","example":"apps/code/store.go","in":"query","name":"path","required":false,"schema":{"type":"string"}},{"description":"Repo is the repository the file belongs to. REQUIRED.","example":"cloud","in":"query","name":"repo","required":false,"schema":{"type":"string"}}],"summary":"Returns the INDEXED content of one file — read_file over the chunks the search tiers hold, for pulling up code an agent just found."}},"/v1/code/index":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/code.indexIn"}}}},"summary":"(re)indexes a repository for the caller's org, incrementally: files whose content hash is unchanged are skipped, so re-sending a whole tree is cheap."}},"/v1/code/search":{"get":{"parameters":[{"description":"Q is the search query. Required, max 4000 bytes. For type=regex it is a\nregular expression; for type=symbol it is a symbol name.","example":"func openStore","in":"query","name":"q","required":false,"schema":{"type":"string"}},{"description":"Type selects the retrieval tier: \"text\" (FTS5 trigram), \"regex\",\n\"symbol\" (definitions), \"semantic\" (embeddings) or \"hybrid\". Anything\nelse — including empty — reads as hybrid.","example":"hybrid","in":"query","name":"type","required":false,"schema":{"type":"string"}},{"description":"Repo narrows to one repository. Empty searches every repo the org has indexed.","example":"cloud","in":"query","name":"repo","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many spans come back: default 20, maximum 100. A value that\nis not a positive integer reads as the default.","example":20,"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Finds code in the caller org's index across three orthogonal retrieval tiers fused by reciprocal-rank fusion: lexical (FTS5 trigram over code-tokenized text), symbolic (real definition and reference edges), and semantic (embedding cosine over AST-boundary chunks)."}},"/v1/code/tree":{"get":{"parameters":[{"description":"Repo is the repository to walk. REQUIRED — a tree is repo-scoped.","example":"cloud","in":"query","name":"repo","required":false,"schema":{"type":"string"}}],"summary":"Returns one repository's file structure with a per-file symbol count — get_repo_structure over the org's own index, with no git checkout involved."}},"/v1/commerce/cart":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CartOpen"}}}},"summary":"Open a cart for a shopper to fill"}},"/v1/commerce/cart/{id}":{"get":{"parameters":[{"description":"ID is the cart's id, as the open call answered it.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Read one cart with its lines and totals"}},"/v1/commerce/cart/{id}/discard":{"post":{"parameters":[{"description":"ID is the cart's id, as the open call answered it.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Discard a cart the shopper abandoned"}},"/v1/commerce/cart/{id}/item":{"post":{"parameters":[{"description":"ID is the cart to amend, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CartItemSet"}}}},"summary":"Set one item's quantity in a cart; zero removes it"}},"/v1/commerce/catalog":{"get":{"summary":"The public product catalog projection for a brand"}},"/v1/commerce/catalog/models":{"post":{"summary":"Land a syncer's view of the model catalog: upstream costs and machine facts"}},"/v1/commerce/catalog/models/refresh":{"post":{"summary":"Refresh the model catalog by reading the upstream provider"}},"/v1/commerce/collection":{"get":{"summary":"List your org's collections, as a page"},"post":{"summary":"Create a collection"}},"/v1/commerce/collection/{collectionid}":{"delete":{"parameters":[{"in":"path","name":"collectionid","required":true,"schema":{"type":"string"}}],"summary":"Delete a collection, keeping a recoverable copy"},"get":{"parameters":[{"in":"path","name":"collectionid","required":true,"schema":{"type":"string"}}],"summary":"Fetch one collection"},"patch":{"parameters":[{"in":"path","name":"collectionid","required":true,"schema":{"type":"string"}}],"summary":"Change part of a collection"},"post":{"parameters":[{"in":"path","name":"collectionid","required":true,"schema":{"type":"string"}}],"summary":"Method-override tunnel for a collection — for clients that cannot send PUT, PATCH or DELETE"},"put":{"parameters":[{"in":"path","name":"collectionid","required":true,"schema":{"type":"string"}}],"summary":"Replace a collection outright"}},"/v1/commerce/currencies":{"get":{"summary":"The reference currency list the price and settings pickers render"}},"/v1/commerce/disclosure":{"get":{"summary":"List your org's disclosures, as a page"},"post":{"summary":"Create a disclosure"}},"/v1/commerce/disclosure/{disclosureid}":{"delete":{"parameters":[{"in":"path","name":"disclosureid","required":true,"schema":{"type":"string"}}],"summary":"Delete a disclosure, keeping a recoverable copy"},"get":{"parameters":[{"in":"path","name":"disclosureid","required":true,"schema":{"type":"string"}}],"summary":"Fetch one disclosure"},"patch":{"parameters":[{"in":"path","name":"disclosureid","required":true,"schema":{"type":"string"}}],"summary":"Change part of a disclosure"},"post":{"parameters":[{"in":"path","name":"disclosureid","required":true,"schema":{"type":"string"}}],"summary":"Method-override tunnel for a disclosure — for clients that cannot send PUT, PATCH or DELETE"},"put":{"parameters":[{"in":"path","name":"disclosureid","required":true,"schema":{"type":"string"}}],"summary":"Replace a disclosure outright"}},"/v1/commerce/discount":{"get":{"summary":"List your org's discounts, as a page"},"post":{"summary":"Create a discount"}},"/v1/commerce/discount/{discountid}":{"delete":{"parameters":[{"in":"path","name":"discountid","required":true,"schema":{"type":"string"}}],"summary":"Delete a discount, keeping a recoverable copy"},"get":{"parameters":[{"in":"path","name":"discountid","required":true,"schema":{"type":"string"}}],"summary":"Fetch one discount"},"patch":{"parameters":[{"in":"path","name":"discountid","required":true,"schema":{"type":"string"}}],"summary":"Change part of a discount"},"post":{"parameters":[{"in":"path","name":"discountid","required":true,"schema":{"type":"string"}}],"summary":"Method-override tunnel for a discount — for clients that cannot send PUT, PATCH or DELETE"},"put":{"parameters":[{"in":"path","name":"discountid","required":true,"schema":{"type":"string"}}],"summary":"Replace a discount outright"}},"/v1/commerce/health":{"get":{"summary":"Answers ok whenever the commerce subsystem is mounted."}},"/v1/commerce/movie":{"get":{"summary":"List your org's movies, as a page"},"post":{"summary":"Create a movie"}},"/v1/commerce/movie/{movieid}":{"delete":{"parameters":[{"in":"path","name":"movieid","required":true,"schema":{"type":"string"}}],"summary":"Delete a movie, keeping a recoverable copy"},"get":{"parameters":[{"in":"path","name":"movieid","required":true,"schema":{"type":"string"}}],"summary":"Fetch one movie"},"patch":{"parameters":[{"in":"path","name":"movieid","required":true,"schema":{"type":"string"}}],"summary":"Change part of a movie"},"post":{"parameters":[{"in":"path","name":"movieid","required":true,"schema":{"type":"string"}}],"summary":"Method-override tunnel for a movie — for clients that cannot send PUT, PATCH or DELETE"},"put":{"parameters":[{"in":"path","name":"movieid","required":true,"schema":{"type":"string"}}],"summary":"Replace a movie outright"}},"/v1/commerce/note":{"get":{"summary":"List your org's notes, as a page"},"post":{"summary":"Create a note"}},"/v1/commerce/note/{noteid}":{"delete":{"parameters":[{"in":"path","name":"noteid","required":true,"schema":{"type":"string"}}],"summary":"Delete a note, keeping a recoverable copy"},"get":{"parameters":[{"in":"path","name":"noteid","required":true,"schema":{"type":"string"}}],"summary":"Fetch one note"},"patch":{"parameters":[{"in":"path","name":"noteid","required":true,"schema":{"type":"string"}}],"summary":"Change part of a note"},"post":{"parameters":[{"in":"path","name":"noteid","required":true,"schema":{"type":"string"}}],"summary":"Method-override tunnel for a note — for clients that cannot send PUT, PATCH or DELETE"},"put":{"parameters":[{"in":"path","name":"noteid","required":true,"schema":{"type":"string"}}],"summary":"Replace a note outright"}},"/v1/commerce/org":{"get":{"summary":"The public org configuration a checkout page boots from"}},"/v1/commerce/product":{"get":{"summary":"List your org's products, as a page"},"post":{"summary":"Create a product"}},"/v1/commerce/product/{productid}":{"delete":{"parameters":[{"in":"path","name":"productid","required":true,"schema":{"type":"string"}}],"summary":"Delete a product, keeping a recoverable copy"},"get":{"parameters":[{"in":"path","name":"productid","required":true,"schema":{"type":"string"}}],"summary":"Fetch one product"},"patch":{"parameters":[{"in":"path","name":"productid","required":true,"schema":{"type":"string"}}],"summary":"Change part of a product"},"post":{"parameters":[{"in":"path","name":"productid","required":true,"schema":{"type":"string"}}],"summary":"Method-override tunnel for a product — for clients that cannot send PUT, PATCH or DELETE"},"put":{"parameters":[{"in":"path","name":"productid","required":true,"schema":{"type":"string"}}],"summary":"Replace a product outright"}},"/v1/commerce/return":{"get":{"summary":"List your org's returns, as a page"},"post":{"summary":"Create a return"}},"/v1/commerce/return/{returnid}":{"delete":{"parameters":[{"in":"path","name":"returnid","required":true,"schema":{"type":"string"}}],"summary":"Delete a return, keeping a recoverable copy"},"get":{"parameters":[{"in":"path","name":"returnid","required":true,"schema":{"type":"string"}}],"summary":"Fetch one return"},"patch":{"parameters":[{"in":"path","name":"returnid","required":true,"schema":{"type":"string"}}],"summary":"Change part of a return"},"post":{"parameters":[{"in":"path","name":"returnid","required":true,"schema":{"type":"string"}}],"summary":"Method-override tunnel for a return — for clients that cannot send PUT, PATCH or DELETE"},"put":{"parameters":[{"in":"path","name":"returnid","required":true,"schema":{"type":"string"}}],"summary":"Replace a return outright"}},"/v1/commerce/saleschannel":{"get":{"summary":"List your org's sales channels, as a page"},"post":{"summary":"Create a sales channel"}},"/v1/commerce/saleschannel/{saleschannelid}":{"delete":{"parameters":[{"in":"path","name":"saleschannelid","required":true,"schema":{"type":"string"}}],"summary":"Delete a sales channel, keeping a recoverable copy"},"get":{"parameters":[{"in":"path","name":"saleschannelid","required":true,"schema":{"type":"string"}}],"summary":"Fetch one sales channel"},"patch":{"parameters":[{"in":"path","name":"saleschannelid","required":true,"schema":{"type":"string"}}],"summary":"Change part of a sales channel"},"post":{"parameters":[{"in":"path","name":"saleschannelid","required":true,"schema":{"type":"string"}}],"summary":"Method-override tunnel for a sales channel — for clients that cannot send PUT, PATCH or DELETE"},"put":{"parameters":[{"in":"path","name":"saleschannelid","required":true,"schema":{"type":"string"}}],"summary":"Replace a sales channel outright"}},"/v1/commerce/stocklocation":{"get":{"summary":"List your org's stock locations, as a page"},"post":{"summary":"Create a stock location"}},"/v1/commerce/stocklocation/{stocklocationid}":{"delete":{"parameters":[{"in":"path","name":"stocklocationid","required":true,"schema":{"type":"string"}}],"summary":"Delete a stock location, keeping a recoverable copy"},"get":{"parameters":[{"in":"path","name":"stocklocationid","required":true,"schema":{"type":"string"}}],"summary":"Fetch one stock location"},"patch":{"parameters":[{"in":"path","name":"stocklocationid","required":true,"schema":{"type":"string"}}],"summary":"Change part of a stock location"},"post":{"parameters":[{"in":"path","name":"stocklocationid","required":true,"schema":{"type":"string"}}],"summary":"Method-override tunnel for a stock location — for clients that cannot send PUT, PATCH or DELETE"},"put":{"parameters":[{"in":"path","name":"stocklocationid","required":true,"schema":{"type":"string"}}],"summary":"Replace a stock location outright"}},"/v1/commerce/store":{"get":{"summary":"List your org's storefronts as a page"},"post":{"summary":"Create a storefront"}},"/v1/commerce/store/access":{"get":{"summary":"Whether a store is entitled to trade, and why"}},"/v1/commerce/store/current":{"get":{"summary":"Resolve your org's active storefront without naming an id"}},"/v1/commerce/store/token":{"post":{"summary":"Mint your org's least-privilege storefront read key"}},"/v1/commerce/store/{storeid}":{"delete":{"parameters":[{"in":"path","name":"storeid","required":true,"schema":{"type":"string"}}],"summary":"Delete a storefront, keeping a recoverable copy"},"get":{"parameters":[{"in":"path","name":"storeid","required":true,"schema":{"type":"string"}}],"summary":"Fetch one storefront"},"patch":{"parameters":[{"in":"path","name":"storeid","required":true,"schema":{"type":"string"}}],"summary":"Change part of a storefront"},"post":{"parameters":[{"in":"path","name":"storeid","required":true,"schema":{"type":"string"}}],"summary":"Method-override tunnel for clients that cannot send PUT, PATCH or DELETE"},"put":{"parameters":[{"in":"path","name":"storeid","required":true,"schema":{"type":"string"}}],"summary":"Replace a storefront outright"}},"/v1/commerce/store/{storeid}/authorize":{"post":{"parameters":[{"in":"path","name":"storeid","required":true,"schema":{"type":"string"}}],"summary":"Authorize a new order against a storefront, holding the funds without settling them"}},"/v1/commerce/store/{storeid}/authorize/{orderid}":{"post":{"parameters":[{"in":"path","name":"storeid","required":true,"schema":{"type":"string"}},{"in":"path","name":"orderid","required":true,"schema":{"type":"string"}}],"summary":"Authorize an order that already exists, holding the funds without settling them"}},"/v1/commerce/store/{storeid}/bundle/{key}":{"get":{"parameters":[{"in":"path","name":"storeid","required":true,"schema":{"type":"string"}},{"in":"path","name":"key","required":true,"schema":{"type":"string"}}],"summary":"Fetch a bundle as this storefront sells it"}},"/v1/commerce/store/{storeid}/capture/{orderid}":{"post":{"parameters":[{"in":"path","name":"storeid","required":true,"schema":{"type":"string"}},{"in":"path","name":"orderid","required":true,"schema":{"type":"string"}}],"summary":"Capture a previously authorized order and settle the payment"}},"/v1/commerce/store/{storeid}/charge":{"post":{"parameters":[{"in":"path","name":"storeid","required":true,"schema":{"type":"string"}}],"summary":"Authorize and capture a new order in one call"}},"/v1/commerce/store/{storeid}/checkout/authorize":{"post":{"parameters":[{"in":"path","name":"storeid","required":true,"schema":{"type":"string"}}],"summary":"Authorize a new order against a storefront, holding the funds — the checkout spelling"}},"/v1/commerce/store/{storeid}/checkout/authorize/{orderid}":{"post":{"parameters":[{"in":"path","name":"storeid","required":true,"schema":{"type":"string"}},{"in":"path","name":"orderid","required":true,"schema":{"type":"string"}}],"summary":"Authorize an existing order, holding the funds — the checkout spelling"}},"/v1/commerce/store/{storeid}/checkout/capture/{orderid}":{"post":{"parameters":[{"in":"path","name":"storeid","required":true,"schema":{"type":"string"}},{"in":"path","name":"orderid","required":true,"schema":{"type":"string"}}],"summary":"Capture a previously authorized order and settle it — the checkout spelling"}},"/v1/commerce/store/{storeid}/checkout/charge":{"post":{"parameters":[{"in":"path","name":"storeid","required":true,"schema":{"type":"string"}}],"summary":"Authorize and capture a new order in one call — the checkout spelling"}},"/v1/commerce/store/{storeid}/checkout/paypal/cancel/{payKey}":{"post":{"parameters":[{"in":"path","name":"storeid","required":true,"schema":{"type":"string"}},{"in":"path","name":"payKey","required":true,"schema":{"type":"string"}}],"summary":"PayPal cancel by pay key — refuses, exactly as the unprefixed address does"}},"/v1/commerce/store/{storeid}/checkout/paypal/confirm/{payKey}":{"post":{"parameters":[{"in":"path","name":"storeid","required":true,"schema":{"type":"string"}},{"in":"path","name":"payKey","required":true,"schema":{"type":"string"}}],"summary":"PayPal confirm by pay key — refuses, exactly as the unprefixed address does"}},"/v1/commerce/store/{storeid}/checkout/paypal/pay":{"post":{"parameters":[{"in":"path","name":"storeid","required":true,"schema":{"type":"string"}}],"summary":"Start a PayPal authorization for a new order — the checkout spelling"}},"/v1/commerce/store/{storeid}/listing":{"get":{"parameters":[{"in":"path","name":"storeid","required":true,"schema":{"type":"string"}}],"summary":"The storefront's whole listing override map"}},"/v1/commerce/store/{storeid}/listing/{key}":{"delete":{"parameters":[{"in":"path","name":"storeid","required":true,"schema":{"type":"string"}},{"in":"path","name":"key","required":true,"schema":{"type":"string"}}],"summary":"Remove a listing override"},"get":{"parameters":[{"in":"path","name":"storeid","required":true,"schema":{"type":"string"}},{"in":"path","name":"key","required":true,"schema":{"type":"string"}}],"summary":"Fetch one listing override, by item id or by its slug or SKU"},"patch":{"parameters":[{"in":"path","name":"storeid","required":true,"schema":{"type":"string"}},{"in":"path","name":"key","required":true,"schema":{"type":"string"}}],"summary":"Confirm a listing override exists and re-save the store"},"post":{"parameters":[{"in":"path","name":"storeid","required":true,"schema":{"type":"string"}},{"in":"path","name":"key","required":true,"schema":{"type":"string"}}],"summary":"Add a listing override under a new key"},"put":{"parameters":[{"in":"path","name":"storeid","required":true,"schema":{"type":"string"}},{"in":"path","name":"key","required":true,"schema":{"type":"string"}}],"summary":"Upsert a listing override"}},"/v1/commerce/store/{storeid}/paypal/cancel/{payKey}":{"post":{"parameters":[{"in":"path","name":"storeid","required":true,"schema":{"type":"string"}},{"in":"path","name":"payKey","required":true,"schema":{"type":"string"}}],"summary":"PayPal cancel by pay key — refuses, because a pay key alone does not identify the order"}},"/v1/commerce/store/{storeid}/paypal/confirm/{payKey}":{"post":{"parameters":[{"in":"path","name":"storeid","required":true,"schema":{"type":"string"}},{"in":"path","name":"payKey","required":true,"schema":{"type":"string"}}],"summary":"PayPal confirm by pay key — refuses, because a pay key alone does not identify the order"}},"/v1/commerce/store/{storeid}/paypal/pay":{"post":{"parameters":[{"in":"path","name":"storeid","required":true,"schema":{"type":"string"}}],"summary":"Start a PayPal authorization for a new order"}},"/v1/commerce/store/{storeid}/product/{key}":{"get":{"parameters":[{"in":"path","name":"storeid","required":true,"schema":{"type":"string"}},{"in":"path","name":"key","required":true,"schema":{"type":"string"}}],"summary":"Fetch a product as this storefront sells it"}},"/v1/commerce/store/{storeid}/trial":{"post":{"parameters":[{"in":"path","name":"storeid","required":true,"schema":{"type":"string"}}],"summary":"Start this store's no-card trial on the entry plan"}},"/v1/commerce/store/{storeid}/variant/{key}":{"get":{"parameters":[{"in":"path","name":"storeid","required":true,"schema":{"type":"string"}},{"in":"path","name":"key","required":true,"schema":{"type":"string"}}],"summary":"Fetch a variant as this storefront sells it"}},"/v1/commerce/submission":{"get":{"summary":"List your org's submissions, as a page"},"post":{"summary":"Create a submission"}},"/v1/commerce/submission/{submissionid}":{"delete":{"parameters":[{"in":"path","name":"submissionid","required":true,"schema":{"type":"string"}}],"summary":"Delete a submission, keeping a recoverable copy"},"get":{"parameters":[{"in":"path","name":"submissionid","required":true,"schema":{"type":"string"}}],"summary":"Fetch one submission"},"patch":{"parameters":[{"in":"path","name":"submissionid","required":true,"schema":{"type":"string"}}],"summary":"Change part of a submission"},"post":{"parameters":[{"in":"path","name":"submissionid","required":true,"schema":{"type":"string"}}],"summary":"Method-override tunnel for a submission — for clients that cannot send PUT, PATCH or DELETE"},"put":{"parameters":[{"in":"path","name":"submissionid","required":true,"schema":{"type":"string"}}],"summary":"Replace a submission outright"}},"/v1/commerce/subscriber":{"get":{"summary":"List your org's subscribers, as a page"},"post":{"summary":"Create a subscriber"}},"/v1/commerce/subscriber/{subscriberid}":{"delete":{"parameters":[{"in":"path","name":"subscriberid","required":true,"schema":{"type":"string"}}],"summary":"Delete a subscriber, keeping a recoverable copy"},"get":{"parameters":[{"in":"path","name":"subscriberid","required":true,"schema":{"type":"string"}}],"summary":"Fetch one subscriber"},"patch":{"parameters":[{"in":"path","name":"subscriberid","required":true,"schema":{"type":"string"}}],"summary":"Change part of a subscriber"},"post":{"parameters":[{"in":"path","name":"subscriberid","required":true,"schema":{"type":"string"}}],"summary":"Method-override tunnel for a subscriber — for clients that cannot send PUT, PATCH or DELETE"},"put":{"parameters":[{"in":"path","name":"subscriberid","required":true,"schema":{"type":"string"}}],"summary":"Replace a subscriber outright"}},"/v1/commerce/tokentransaction":{"get":{"summary":"List your org's token transactions, as a page"},"post":{"summary":"Create a token transaction"}},"/v1/commerce/tokentransaction/{tokentransactionid}":{"delete":{"parameters":[{"in":"path","name":"tokentransactionid","required":true,"schema":{"type":"string"}}],"summary":"Delete a token transaction, keeping a recoverable copy"},"get":{"parameters":[{"in":"path","name":"tokentransactionid","required":true,"schema":{"type":"string"}}],"summary":"Fetch one token transaction"},"patch":{"parameters":[{"in":"path","name":"tokentransactionid","required":true,"schema":{"type":"string"}}],"summary":"Change part of a token transaction"},"post":{"parameters":[{"in":"path","name":"tokentransactionid","required":true,"schema":{"type":"string"}}],"summary":"Method-override tunnel for a token transaction — for clients that cannot send PUT, PATCH or DELETE"},"put":{"parameters":[{"in":"path","name":"tokentransactionid","required":true,"schema":{"type":"string"}}],"summary":"Replace a token transaction outright"}},"/v1/commerce/transfer":{"get":{"summary":"List your org's transfers, as a page"},"post":{"summary":"Create a transfer"}},"/v1/commerce/transfer/{transferid}":{"delete":{"parameters":[{"in":"path","name":"transferid","required":true,"schema":{"type":"string"}}],"summary":"Delete a transfer, keeping a recoverable copy"},"get":{"parameters":[{"in":"path","name":"transferid","required":true,"schema":{"type":"string"}}],"summary":"Fetch one transfer"},"patch":{"parameters":[{"in":"path","name":"transferid","required":true,"schema":{"type":"string"}}],"summary":"Change part of a transfer"},"post":{"parameters":[{"in":"path","name":"transferid","required":true,"schema":{"type":"string"}}],"summary":"Method-override tunnel for a transfer — for clients that cannot send PUT, PATCH or DELETE"},"put":{"parameters":[{"in":"path","name":"transferid","required":true,"schema":{"type":"string"}}],"summary":"Replace a transfer outright"}},"/v1/commerce/variant":{"get":{"summary":"List your org's variants, as a page"},"post":{"summary":"Create a variant"}},"/v1/commerce/variant/{variantid}":{"delete":{"parameters":[{"in":"path","name":"variantid","required":true,"schema":{"type":"string"}}],"summary":"Delete a variant, keeping a recoverable copy"},"get":{"parameters":[{"in":"path","name":"variantid","required":true,"schema":{"type":"string"}}],"summary":"Fetch one variant"},"patch":{"parameters":[{"in":"path","name":"variantid","required":true,"schema":{"type":"string"}}],"summary":"Change part of a variant"},"post":{"parameters":[{"in":"path","name":"variantid","required":true,"schema":{"type":"string"}}],"summary":"Method-override tunnel for a variant — for clients that cannot send PUT, PATCH or DELETE"},"put":{"parameters":[{"in":"path","name":"variantid","required":true,"schema":{"type":"string"}}],"summary":"Replace a variant outright"}},"/v1/commerce/wallet":{"get":{"summary":"List your org's wallets, as a page"},"post":{"summary":"Create a wallet"}},"/v1/commerce/wallet/{walletid}":{"delete":{"parameters":[{"in":"path","name":"walletid","required":true,"schema":{"type":"string"}}],"summary":"Delete a wallet, keeping a recoverable copy"},"get":{"parameters":[{"in":"path","name":"walletid","required":true,"schema":{"type":"string"}}],"summary":"Fetch one wallet"},"patch":{"parameters":[{"in":"path","name":"walletid","required":true,"schema":{"type":"string"}}],"summary":"Change part of a wallet"},"post":{"parameters":[{"in":"path","name":"walletid","required":true,"schema":{"type":"string"}}],"summary":"Method-override tunnel for a wallet — for clients that cannot send PUT, PATCH or DELETE"},"put":{"parameters":[{"in":"path","name":"walletid","required":true,"schema":{"type":"string"}}],"summary":"Replace a wallet outright"}},"/v1/commerce/watchlist":{"get":{"summary":"List your org's watchlists, as a page"},"post":{"summary":"Create a watchlist"}},"/v1/commerce/watchlist/{watchlistid}":{"delete":{"parameters":[{"in":"path","name":"watchlistid","required":true,"schema":{"type":"string"}}],"summary":"Delete a watchlist, keeping a recoverable copy"},"get":{"parameters":[{"in":"path","name":"watchlistid","required":true,"schema":{"type":"string"}}],"summary":"Fetch one watchlist"},"patch":{"parameters":[{"in":"path","name":"watchlistid","required":true,"schema":{"type":"string"}}],"summary":"Change part of a watchlist"},"post":{"parameters":[{"in":"path","name":"watchlistid","required":true,"schema":{"type":"string"}}],"summary":"Method-override tunnel for a watchlist — for clients that cannot send PUT, PATCH or DELETE"},"put":{"parameters":[{"in":"path","name":"watchlistid","required":true,"schema":{"type":"string"}}],"summary":"Replace a watchlist outright"}},"/v1/commerce/webhooks/{provider}":{"post":{"parameters":[{"in":"path","name":"provider","required":true,"schema":{"type":"string"}}],"summary":"Payment-provider webhook intake for settlement and subscription lifecycle events"}},"/v1/company":{"get":{"summary":"Returns the caller org's formation and the stages reachable from it, or 404 when the org has not begun one."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/company.beginIn"}}}},"summary":"Starts the org's one formation and returns it with the stages reachable from it."}},"/v1/company/advance":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/company.advanceIn"}}}},"summary":"Runs the ONE guarded transition of the formation machine."}},"/v1/company/documents":{"post":{"summary":"Renders the formation documents for the chosen structure and jurisdiction, ingests each into the org's data room, and submits the state filing through the filing client."}},"/v1/company/ein":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/company.einIn"}}}},"summary":"Opens the EIN application and answers what it owes."}},"/v1/company/esign":{"post":{"summary":"Sends the generated formation documents for signature by every founder and records the provider's reference on the formation."}},"/v1/company/esign/complete":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/company.esignCompleteIn"}}}},"summary":"Records whether the formation documents have been signed."}},"/v1/company/founders":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/company.foundersIn"}}}},"summary":"Replaces the formation's founders."}},"/v1/company/fundraise/deck":{"post":{"summary":"Share a pitch deck in the org's data room"}},"/v1/company/fundraise/round":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/company.RoundInput"}}}},"summary":"Records a fundraising round on the org's canonical cap table."}},"/v1/company/fundraise/safe":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/company.safeIn"}}}},"summary":"Raises an e-signature request over documents already in the org's data room — a SAFE, a convertible note, or any other fundraising paper."}},"/v1/company/genesis":{"post":{"summary":"Seeds the canonical cap table with the founding allocation (stakeholders, a common share class, issued shares) and anchors the deterministic equity-genesis root on-chain."}},"/v1/company/import/captable":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/company.importCapTableIn"}}}},"summary":"Reads an existing company's cap table from a Google Sheet and adds its stakeholders to the canonical cap table."}},"/v1/company/import/documents":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/company.importDocumentsIn"}}}},"summary":"Ingests an existing company's corporate documents from a Google Drive folder into the org's data room."}},"/v1/company/kyc":{"post":{"summary":"Opens an identity-verification session for every founder with the wired provider and records each session's reference on the formation."}},"/v1/company/kyc/refresh":{"post":{"summary":"RefreshKYC reconciles each pending founder's KYC with the WIRED provider — the PULL path to a provider-reported terminal status."}},"/v1/company/payment":{"post":{"summary":"Charges the caller's own org the one-time Hanzo Company formation fee."}},"/v1/company/register":{"get":{"parameters":[{"description":"Stage keeps only formations at that stage. Empty means any.","example":"founders","in":"query","name":"stage","required":false,"schema":{"type":"string"}},{"description":"Structure keeps only formations of that entity kind. Empty means any.","in":"query","name":"structure","required":false,"schema":{"type":"string"}},{"description":"Limit bounds the page; 0 or less means the default of 200.","example":50,"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Offset skips that many rows.","in":"query","name":"offset","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns the platform's whole formation register, newest activity first — every org's formation, not the caller's."}},"/v1/company/register/summary":{"get":{"summary":"Counts the platform's formations by stage — the register's shape in one read, so a queue that is growing is visible as a number rather than inferred by paging the list."}},"/v1/company/review":{"get":{"parameters":[{"description":"Limit bounds how many formations are scanned; 0 or less means the default of 200.","example":50,"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Reports the founders whose KYC is not yet settled, oldest formation first, so the queue drains in the order founders have been waiting."}},"/v1/company/skip":{"post":{"summary":"Marks the org as already incorporated and moves it onto the import path, so an existing company brings its documents and cap table in instead of forming a new entity."}},"/v1/company/structure":{"put":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/company.structureIn"}}}},"summary":"Records the entity kind, the state of formation and the proposed name."}},"/v1/company/tariff":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/company.tariffIn"}}}},"summary":"Itemises what a formation costs before anyone commits to it."}},"/v1/completions":{"post":{"parameters":[{"description":"The most this request may cost, in USD per 1,000 tokens. Routing picks only models under it; an org's own ceiling fills it when it is absent, and the lower of the two holds.","in":"header","name":"X-Max-Cost","required":false,"schema":{"minimum":0,"type":"number"}},{"description":"The slowest model this request accepts, in milliseconds.","in":"header","name":"X-Max-Latency-Ms","required":false,"schema":{"minimum":0,"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/openai.ChatCompletionRequest"}}}},"summary":"Implements the OpenAI-compatible chat completions API"}},"/v1/compliance/accreditation":{"get":{"parameters":[{"description":"Limit caps the rows returned; non-positive means the server default.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns the org's tracked accreditation-state records, newest first — evidence entries the org keeps, never a platform certification."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/compliance.accreditationReq"}}}},"summary":"Records an ASSERTED accreditation state for a subject — the subject's own assertion, with no verifier."}},"/v1/compliance/accreditation/{id}":{"get":{"parameters":[{"description":"ID is the accreditation record to read, from the path.","example":"acc_1","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one tracked accreditation record."}},"/v1/compliance/accreditation/{id}/decision":{"post":{"parameters":[{"description":"ID is the accreditation record to decide, from the path.","example":"acc_1","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/compliance.accreditationDecision"}}}},"summary":"Records an org reviewer's decision on an accreditation record — a reviewer confirmation, a provider verification the reviewer has evidence of (a CPA/attorney letter, a verifier report), a rejection, or an expiry."}},"/v1/compliance/audit":{"get":{"parameters":[{"description":"Result filters rows by outcome result: success, deny, or error; empty means all.","in":"query","name":"result","required":false,"schema":{"type":"string"}}],"summary":"AuditRead is the compliance read of the SHARED tamper-evident audit plane — the SOC 2 posture surface (privileged actions: who started/decided what, when)."}},"/v1/compliance/health":{"get":{"summary":"Reports subsystem liveness and the wired verification provider."}},"/v1/compliance/records":{"get":{"parameters":[{"description":"Limit caps the rows returned; non-positive means the server default.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"ListRecords is the unified compliance-record view for the org: its verifications and accreditation records together, each provider-reported or tracked, never platform-asserted."}},"/v1/compliance/status":{"get":{"summary":"Status is the org's honest posture read: the wired provider and the per-status tally of its verifications."}},"/v1/compliance/subjects":{"get":{"parameters":[{"description":"Limit caps the rows returned; non-positive means the server default.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns the org's subjects as PII-MINIMIZED summaries — no name or email, only whether an email is on file."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/compliance.subjectReq"}}}},"summary":"Records a party the org is verifying as part of its own onboarding/compliance — a team member, vendor, customer, or counterparty."}},"/v1/compliance/subjects/{id}":{"get":{"parameters":[{"description":"ID is the subject to read, from the path.","example":"sub_1","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one subject WITH its contact PII — the only surface that returns it, and only to the owning org."}},"/v1/compliance/verifications":{"get":{"parameters":[{"description":"Limit caps the rows returned; non-positive means the server default.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns the org's KYC/KYB verifications, newest first — opaque subject references and provider-reported statuses only, no subject PII."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/compliance.verificationReq"}}}},"summary":"Begins a KYC/KYB verification of a subject through the wired provider — an existing subject by id, or one created inline from the request."}},"/v1/compliance/verifications/webhook":{"post":{"summary":"Provider push that settles a verification, authenticated by HMAC signature"}},"/v1/compliance/verifications/{id}":{"get":{"parameters":[{"description":"ID is the verification to act on, from the path.","example":"chk_1","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one verification — its opaque subject reference and provider-reported status, no subject PII."}},"/v1/compliance/verifications/{id}/decision":{"post":{"parameters":[{"description":"ID is the verification to decide, from the path.","example":"chk_1","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/compliance.verificationDecision"}}}},"summary":"Records a privileged reviewer's MANUAL decision on a verification — the human-in-the-loop path, and the ONLY route to a passing status when no real provider is wired."}},"/v1/compliance/verifications/{id}/refresh":{"post":{"parameters":[{"description":"ID is the verification to act on, from the path.","example":"chk_1","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Polls the wired provider for its current decision and records it, ATTRIBUTED to the provider — the internal PULL reconcile."}},"/v1/compute/clusters":{"get":{"summary":"Returns the caller org's clusters from both sources: the managed clusters projected from Visor's node pools, and the BYO clusters attached to the caller's project."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/compute.clusterAttach"}}}},"summary":"Attaches a BYO cluster to the caller's org — the kubeconfig is validated, KMS-sealed and added to the fleet — and answers 201 with the cluster as it now appears on GET /v1/compute/clusters."}},"/v1/compute/clusters/{clusterId}/pools":{"post":{"parameters":[{"description":"ClusterID is the cluster to add the pool to, from the URL path.","in":"path","name":"clusterId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/compute.poolCreate"}}}},"summary":"Adds a node pool to one of the caller org's clusters and answers 201 with the created pool."}},"/v1/compute/clusters/{clusterId}/pools/{poolId}":{"delete":{"parameters":[{"description":"ClusterID and PoolID address the pool, from the URL path.","in":"path","name":"clusterId","required":true,"schema":{"type":"string"}},{"in":"path","name":"poolId","required":true,"schema":{"type":"string"}},{"description":"Provider is the cloud the cluster lives on, from ?provider=. Required.","in":"query","name":"provider","required":false,"schema":{"type":"string"}}],"summary":"Removes a node pool from one of the caller org's clusters."}},"/v1/compute/clusters/{clusterId}/pools/{poolId}/scale":{"post":{"parameters":[{"description":"ClusterID is the cluster holding the pool, from the URL path.","in":"path","name":"clusterId","required":true,"schema":{"type":"string"}},{"description":"PoolID is the pool to resize, from the URL path — the `poolId` a cluster read\nreports for it. Required.","in":"path","name":"poolId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/compute.poolScale"}}}},"summary":"Resizes a node pool to an absolute node count and returns the pool as Visor reports it after the change."}},"/v1/compute/clusters/{id}":{"delete":{"parameters":[{"description":"ID is the cluster's fleet name (the `name` it was attached under), matched\nlower-cased.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Removes a BYO cluster from the caller org's fleet."}},"/v1/compute/fleet":{"get":{"summary":"Returns every compute unit the caller's org has, from every source, each carrying its latest utilization: agent run-targets, the BYO machines that dialed in, attached BYO clusters and Visor-provisioned machines."}},"/v1/compute/fleet/jobs":{"get":{"parameters":[{"description":"GPU selects one node's lane: jobs TARGETED at it (gpu:<node>) or CLAIMED by\nit. The literal \"shared\" selects the any-GPU lane — no target, no claimant.\nMatched case-insensitively.","in":"query","name":"gpu","required":false,"schema":{"type":"string"}},{"description":"Status selects one lifecycle state: queued, running, stalled, completed,\nfailed or canceled.","in":"query","name":"status","required":false,"schema":{"type":"string"}}],"summary":"Returns the caller org's gpu-jobs render queue, each row tagged with the GPU it targets (empty = the shared any-GPU lane) and the node claiming it, optionally narrowed to one GPU's queue and/or one status."}},"/v1/compute/fleet/jobs/{id}/cancel":{"post":{"parameters":[{"description":"ID is the job (activity) id, from the URL path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/compute.jobCancel"}}}},"summary":"Cancels a queued or running render in the caller's org."}},"/v1/compute/fleet/samples":{"get":{"parameters":[{"description":"Unit selects one compute unit's series by its source-local id.","in":"query","name":"unit","required":false,"schema":{"type":"string"}},{"description":"Source selects one plane: \"agent\", \"byo\" or \"visor\".","in":"query","name":"source","required":false,"schema":{"type":"string"}},{"description":"Range is the lookback window (e.g. \"1h\", \"24h\", \"7d\"); empty takes the\nwarehouse default.","in":"query","name":"range","required":false,"schema":{"type":"string"}}],"summary":"Returns the caller org's utilization series, oldest first."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/compute.sampleIngest"}}}},"summary":"Records a BYO worker's live GPU utilization into the SAME series the fleet board overlays."}},"/v1/compute/fleet/workers":{"get":{"summary":"Returns the caller org's BYO machines — the ones that dialed in via `hanzo link` — with everything each host reported about itself."}},"/v1/compute/gpus":{"get":{"summary":"Returns one row per physical accelerator the caller's org has, derived from its real GPU machines (the size slug says how many cards a node holds) and from the accelerators BYO workers report through nvidia-smi."}},"/v1/compute/gpus/alerts":{"get":{"summary":"Is an HONEST empty surface: Visor exposes no GPU alert inventory, so this returns [] rather than fabricating alerts."}},"/v1/compute/k8s/clusters":{"get":{"summary":"Lists the org's DOKS clusters (Visor, house account) folded with the org's BYO clusters — ONE fleet cluster view under the unified k8s noun."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/compute.createClusterReq"}}}},"summary":"Provisions a DOKS cluster for the caller's org and answers 201."}},"/v1/compute/k8s/clusters/{id}":{"delete":{"parameters":[{"description":"ID is the provider's DOKS cluster id. Visor scopes the lookup to the caller's\norg, so another tenant's id resolves to not-found rather than their cluster.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Destroys a DOKS cluster by id and answers 204."},"get":{"parameters":[{"description":"ID is the provider's DOKS cluster id. Visor scopes the lookup to the caller's\norg, so another tenant's id resolves to not-found rather than their cluster.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one cluster's detail: node pools + worker nodes."}},"/v1/compute/k8s/nodes":{"get":{"summary":"Returns every DOKS worker node in the org's clusters as a machine — the SAME set the fleet folds in (managedMachines), exposed directly under the k8s noun."}},"/v1/compute/machines":{"get":{"parameters":[{"in":"query","name":"kind","required":false,"schema":{"type":"string"}}],"summary":"Returns every machine the caller's org has — Visor's registry, the live DigitalOcean droplets and the DOKS worker nodes (deduped into one union), plus the BYO machines that dialed in via `hanzo link` (provider \"byo\")."},"post":{"summary":"Launch a metered machine for your org, or price one first with dryRun"}},"/v1/compute/machines/agents":{"get":{"summary":"Returns every agent↔machine binding in the caller's org — which machines are running which cloud Agent, with vm's own reconciled status."}},"/v1/compute/machines/{id}":{"delete":{"parameters":[{"description":"ID is the machine's org-scoped NAME — the stable key Visor addresses a\nmachine by (owner/name), not the ephemeral provider id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Terminates one of the caller org's machines."},"get":{"parameters":[{"description":"ID is the machine's org-scoped NAME — the stable key Visor addresses a\nmachine by (owner/name), not the ephemeral provider id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one of the caller org's machines by its org-scoped name."}},"/v1/compute/machines/{id}/agent":{"delete":{"parameters":[{"description":"ID is the machine's org-scoped NAME — the stable key Visor addresses a\nmachine by (owner/name), not the ephemeral provider id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Detaches the agent runtime from one of the caller org's machines."},"get":{"parameters":[{"description":"ID is the machine's org-scoped NAME — the stable key Visor addresses a\nmachine by (owner/name), not the ephemeral provider id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns the agent binding of one of the caller org's machines, or 404 when the machine runs no bot runtime."},"put":{"parameters":[{"description":"ID is the machine to bind, from the URL path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/compute.bindAgentReq"}}}},"summary":"Binds a cloud Agent to one of the caller org's machines: the machine is recorded as running that Agent's @hanzo/bot runtime."}},"/v1/compute/machines/{id}/{action}":{"post":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"path","name":"action","required":true,"schema":{"type":"string"}}],"summary":"Message a bot, or stop it, by naming the action in the path"}},"/v1/compute/regions":{"get":{"summary":"Lists the regions a machine can be launched in."}},"/v1/compute/sizes":{"get":{"summary":"Lists the machine sizes available to launch, with their specifications."}},"/v1/connection":{"get":{"summary":"Lists the caller's OWN connectors across every provider — the set `hanzo connector ls` prints."}},"/v1/connection/providers":{"get":{"summary":"Lists the USER-plane provider cards."}},"/v1/connection/{id}":{"delete":{"parameters":[{"description":"ID is the connector id, provider + \":\" + label (\"openai:default\") — the\nauth-profile-id shape. Another user's id is simply no row, so 404.","example":"openai:work","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Forgets a connector: every custodied secret, then the row."}},"/v1/connection/{id}/refresh":{"post":{"parameters":[{"description":"ID is the connector id, provider + \":\" + label (\"openai:default\") — the\nauth-profile-id shape. Another user's id is simply no row, so 404.","example":"openai:work","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Forces a token rotation for a connected connector, ahead of the automatic rotation a token read would do inside the expiry window."}},"/v1/connection/{id}/token":{"get":{"parameters":[{"description":"ID is the connector id, provider + \":\" + label (\"openai:default\") — the\nauth-profile-id shape. Another user's id is simply no row, so 404.","example":"openai:work","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Hands the custodied access token to its owner — the ONE place custody exits."}},"/v1/connection/{provider}/credential":{"post":{"parameters":[{"description":"Provider is the user-scoped provider's registry id, from the path.","example":"openai","in":"path","name":"provider","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/provider.credentialIn"}}}},"summary":"Is the direct intake path: a customer-held token/setup-token (Verify) or an externally obtained OAuth bundle from the CLI's local PKCE (Adopt)."}},"/v1/connection/{provider}/device":{"post":{"parameters":[{"description":"Provider is the user-scoped provider's registry id, from the path.","example":"openai","in":"path","name":"provider","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/provider.deviceStartIn"}}}},"summary":"Begins a device sign-in and returns the code to show the user plus how to poll for completion."}},"/v1/connection/{provider}/device/{flow}/poll":{"post":{"parameters":[{"description":"Provider is the user-scoped provider's registry id, from the path.","example":"openai","in":"path","name":"provider","required":true,"schema":{"type":"string"}},{"description":"Flow is the id deviceStartOut returned. Expired or another user's flow is\nindistinguishable from an unknown one: 404.","example":"g_7f2c","in":"path","name":"flow","required":true,"schema":{"type":"string"}}],"summary":"Advances a device sign-in."}},"/v1/content/board":{"get":{"parameters":[{"description":"Status keeps only items in one lifecycle state (draft, in_review, approved,\nqueued, published, archived). An undefined state is refused.","example":"queued","in":"query","name":"status","required":false,"schema":{"type":"string"}},{"description":"Project keeps only items in one brand/site sub-scope.","in":"query","name":"project","required":false,"schema":{"type":"string"}},{"description":"DocType keeps only one content type; omitted, the board spans every\npublishable type. An unknown type is refused.","in":"query","name":"doctype","required":false,"schema":{"type":"string"}},{"description":"Limit caps the rows returned, clamped to 1000. Defaults to 200, which is also\nwhat a non-positive or unparseable value takes.","example":50,"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Aggregates the caller org's marketing content across every publishable content type into ONE queue board — the cross-type read the framework's per-DocType list cannot give."}},"/v1/content/channels":{"get":{"summary":"Lists the distribution channels the caller's org has connected — the social integrations a publish can target."}},"/v1/content/generate":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/content.GenerateInput"}}}},"summary":"Draft a provider of marketing content and file it in the CMS as a draft."}},"/v1/content/lifecycle":{"get":{"summary":"Returns the ONE marketing-content state machine: the ordered lifecycle states, which state a fresh document starts in, which one is publicly live, and the legal successors of every state."}},"/v1/content/publish":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/content.PublishInput"}}}},"summary":"Publish distributes one CMS content item to the channels recorded on it and returns the honest per-channel outcome."}},"/v1/content/{doctype}/{name}/transition":{"post":{"parameters":[{"description":"DocType is the content type to act on, from the path.","example":"marketing.SocialPost","in":"path","name":"doctype","required":true,"schema":{"type":"string"}},{"description":"Name is the document to act on, from the path.","example":"spring-teaser","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/content.transitionIn"}}}},"summary":"Moves one content item to a new lifecycle state and, on the move to published, fans it out to the item's channels."}},"/v1/crawl":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/crawl.crawlRequest"}}}},"summary":"Fetch one URL and read it back as markdown"}},"/v1/dataroom/analytics/dataroom/{dataroomId}":{"get":{"parameters":[{"description":"DataroomID is the room to report on. It is the path segment, resolved in\nthe caller's own tenant store.","in":"path","name":"dataroomId","required":true,"schema":{"type":"string"}}],"summary":"Rolls up every share link pointing at one data room: session and page-view totals for the room, plus the per-page breakdown for each link beneath it."}},"/v1/dataroom/analytics/link/{linkId}":{"get":{"parameters":[{"description":"LinkID is the link to report on. It is the path segment, resolved in the\ncaller's own tenant store.","in":"path","name":"linkId","required":true,"schema":{"type":"string"}}],"summary":"Reports how one share link was actually read: total viewing sessions, total page views, and per page the view count, the summed dwell measure and its average."}},"/v1/dataroom/datarooms":{"get":{"summary":"Returns every data room in the caller org's own store, newest first, with its short public id, name, description and timestamps."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dataroom.dataroomCreate"}}}},"summary":"Opens a new data room for the caller org and answers with it, including the short public id it is addressed by."}},"/v1/dataroom/datarooms/{id}":{"get":{"parameters":[{"description":"ID is the room to read. It is the path segment: the URL is the addressing\nauthority, and the org it is resolved in comes from the caller's principal,\nso an id from another tenant is simply not found.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Reads one of the caller org's data rooms together with every document in it, each carrying its membership id and order index."}},"/v1/dataroom/datarooms/{id}/documents":{"post":{"parameters":[{"description":"ID is the room to add to. It is the path segment: the URL is the addressing\nauthority, and the org it is resolved in comes from the caller's principal,\nso an id from another tenant is simply not found.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dataroom.dataroomAddDocument"}}}},"summary":"Puts an already-uploaded document into one of the caller org's data rooms and answers with the new membership id."}},"/v1/dataroom/documents":{"get":{"summary":"Returns every document in the caller org's own store, newest first — name, opaque storage key, content type, page count, size and timestamps."},"post":{"summary":"Upload a document's bytes and record it"}},"/v1/dataroom/documents/{id}":{"get":{"parameters":[{"description":"ID is the document to read. It is the path segment: the URL is the\naddressing authority, and the org it is resolved in comes from the caller's\nprincipal, so an id from another tenant is simply not found.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Reads one of the caller org's documents — its name, opaque storage key, content type, page count, size and timestamps."}},"/v1/dataroom/documents/{id}/file":{"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Download a document's bytes as its owner"}},"/v1/dataroom/health":{"get":{"summary":"Reports that the data room subsystem is up."}},"/v1/dataroom/links":{"get":{"summary":"Returns every live share link in the caller org's own store, newest first, with the controls a visitor will meet: whether an address is required, whether a password is set, the allow and deny lists, whether download is permitted, and when the link expires."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dataroom.dataroomLinkCreate"}}}},"summary":"Grants access: it mints a public share link over one data room (`dataroomId`) or one document (`documentId`) — one of the two is required — and answers with the link, whose `id` is the token a visitor opens it with."}},"/v1/dataroom/trust":{"get":{"summary":"Answers the caller org's OWN trust centre: its settings, every item it holds in both tiers, the requests waiting on it, and the grants it has made."},"put":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dataroom.trustSettings"}}}},"summary":"SetCenter opens, publishes or withdraws the caller org's trust centre and answers with the centre as it now stands."}},"/v1/dataroom/trust/artifacts":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dataroom.trustPublish"}}}},"summary":"Puts an item on the caller org's trust centre and answers with it."}},"/v1/dataroom/trust/artifacts/{id}":{"patch":{"parameters":[{"description":"ID is the item to change, taken from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dataroom.trustEdit"}}}},"summary":"Changes an item on the caller org's trust centre — replace its file with a newer edition, move it between public and gated, rewrite what it says, or retire it — and answers with the item as it now stands."}},"/v1/dataroom/trust/center/{slug}":{"get":{"parameters":[{"description":"Slug is the centre's public address. It resolves only for an org that has\npublished; anything else is not found, so this cannot be used to learn which\norgs exist.","in":"path","name":"slug","required":true,"schema":{"type":"string"}}],"summary":"Answers an org's public trust centre: its name, the text a party must accept to ask for a document, and every item it publishes."}},"/v1/dataroom/trust/center/{slug}/file/{item}":{"get":{"parameters":[{"in":"path","name":"slug","required":true,"schema":{"type":"string"}},{"in":"path","name":"item","required":true,"schema":{"type":"string"}}],"summary":"Read a public trust-centre item's bytes"}},"/v1/dataroom/trust/center/{slug}/requests":{"post":{"parameters":[{"description":"Slug is the centre's public address, taken from the path.","in":"path","name":"slug","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dataroom.trustAsk"}}}},"summary":"Records a request to read what an independent auditor signed, and answers with its id."}},"/v1/dataroom/trust/requests/{id}/grant":{"post":{"parameters":[{"description":"ID is the request to answer, taken from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dataroom.trustDecision"}}}},"summary":"Answers a request by opening access: it mints a share link over what was asked for, addressed to the address that asked and closing at expiry, records the decision, and mails the asker."}},"/v1/dataroom/trust/requests/{id}/refuse":{"post":{"parameters":[{"description":"ID is the request to answer, taken from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dataroom.trustDecision"}}}},"summary":"Answers a request by declining it, recording who declined and why."}},"/v1/dataroom/view/{linkId}":{"get":{"parameters":[{"in":"path","name":"linkId","required":true,"schema":{"type":"string"}}],"summary":"What a share link's visitor sees before authenticating"}},"/v1/dataroom/view/{linkId}/authenticate":{"post":{"parameters":[{"in":"path","name":"linkId","required":true,"schema":{"type":"string"}}],"summary":"Pass a share link's gates and open a viewing session"}},"/v1/dataroom/view/{linkId}/document/{documentId}/file":{"get":{"parameters":[{"in":"path","name":"linkId","required":true,"schema":{"type":"string"}},{"in":"path","name":"documentId","required":true,"schema":{"type":"string"}}],"summary":"Read a document's bytes as an authorised link visitor"}},"/v1/dataroom/view/{linkId}/pageview":{"post":{"parameters":[{"in":"path","name":"linkId","required":true,"schema":{"type":"string"}}],"summary":"Record one page-view against an open viewing session"}},"/v1/dataset":{"get":{"summary":"List this org's datasets"},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dataset.riskDatasetSpec"}}}},"summary":"Declare the next version of a dataset"}},"/v1/dataset/{name}":{"delete":{"parameters":[{"description":"Name is the dataset, from the path.","example":"signups","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Dispose of one dataset and every version of it"},"get":{"parameters":[{"description":"Name is the dataset, from the path.","example":"signups","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Describe every version of one dataset"}},"/v1/dataset/{name}/export":{"get":{"parameters":[{"description":"Name is the dataset, from the path.","example":"signups","in":"path","name":"name","required":true,"schema":{"type":"string"}},{"description":"Version is the version to read. Zero takes the newest published one.","example":1,"in":"query","name":"version","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Split narrows to train, val or test. Empty reads every split.","example":"train","in":"query","name":"split","required":false,"schema":{"type":"string"}},{"description":"Offset is where the page starts, in the version's own row order (by id,\nwhich is derived from the row and therefore stable forever).","in":"query","name":"offset","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Limit is how many rows to return. Zero and anything above the plane's bound\ntake the bound.","example":500,"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Read a version's rows back, one page at a time"}},"/v1/dataset/{name}/lineage":{"get":{"parameters":[{"description":"Name is the dataset, from the path.","example":"signups","in":"path","name":"name","required":true,"schema":{"type":"string"}},{"description":"Version is the version to trace. Zero takes the newest published one.","example":1,"in":"query","name":"version","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Show where a version's rows came from, and whether that can still be demonstrated"}},"/v1/dataset/{name}/materialize":{"post":{"parameters":[{"description":"Name is the dataset, from the path.","example":"signups","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Materialise the declared version into immutable rows"}},"/v1/decisions":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ai.DecisionsRequest"}}}},"summary":"Implements POST /v1/decisions (the Decisions API)."}},"/v1/decisions/{decision}/corrections":{"get":{"parameters":[{"in":"path","name":"decision","required":true,"schema":{"type":"string"}}],"summary":"Answers one of the org's decisions' corrections, each captured (it can teach) or missing (the decision was made with capture off)."},"post":{"parameters":[{"description":"Decision is the decision's id.","in":"path","name":"decision","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CorrectIn"}}}},"summary":"Files a correction of one question of one of the org's Kai decisions: the right answer, which must be one of that question's options and not what Kai answered, and why."}},"/v1/decisions/{decision}/corrections/{id}":{"delete":{"parameters":[{"in":"path","name":"decision","required":true,"schema":{"type":"string"}},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Deletes one correction of one of the org's decisions."}},"/v1/deploy/applications":{"get":{"summary":"Returns the fleet as an argocd ApplicationList: one projected Application per operator App CR, carrying the image tag the CR DECLARES, the tag actually RUNNING in the cluster's Deployment, the reconciled health, and the sync verdict those two produce (declared == running ⇒ Synced, both known and different ⇒ OutOfSync, either unknown ⇒ Unknown)."}},"/v1/deploy/applications/{name}":{"get":{"parameters":[{"description":"Name is the application to read, from the path. It must be a DNS-1123 label\n(lowercase alphanumerics and hyphens, starting and ending alphanumeric) —\nevery operator App CR's metadata.name satisfies that, and anything else is a\n400 rather than a lookup.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns ONE projected argocd Application by name, with status.resources filled in from its reconciled resource tree — which is what makes it the detail view rather than a row of the list."}},"/v1/deploy/applications/{name}/resource-tree":{"get":{"parameters":[{"description":"Name is the application to read, from the path. It must be a DNS-1123 label\n(lowercase alphanumerics and hyphens, starting and ending alphanumeric) —\nevery operator App CR's metadata.name satisfies that, and anything else is a\n400 rather than a lookup.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one application's argocd ApplicationTree: the objects the operator reconciled from its App CR, reached by ownerRef — the Deployment and, under it, the ReplicaSet and Pods, plus the Service, Ingress, HorizontalPodAutoscaler, PodDisruptionBudget and ConfigMaps it owns — each node carrying its parent edges and its health."}},"/v1/deploy/applications/{name}/revisions/{revision}/metadata":{"get":{"parameters":[{"description":"Name is the application to read, from the path. It must be a DNS-1123 label.","in":"path","name":"name","required":true,"schema":{"type":"string"}},{"description":"Revision is the revision to describe, from the path. The empty revision and\n\"HEAD\" both mean \"whatever this application currently declares\".","in":"path","name":"revision","required":true,"schema":{"type":"string"}}],"summary":"Returns the argocd RevisionMetadata for one revision of one application — what the detail view shows beside a revision."}},"/v1/deploy/applications/{name}/rollback":{"post":{"parameters":[{"description":"Name is the application to read, from the path. It must be a DNS-1123 label\n(lowercase alphanumerics and hyphens, starting and ending alphanumeric) —\nevery operator App CR's metadata.name satisfies that, and anything else is a\n400 rather than a lookup.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Serves the console's rollback control, and today it requests a reconcile and nothing more."}},"/v1/deploy/applications/{name}/syncwindows":{"get":{"parameters":[{"description":"Name is the application to read, from the path. It must be a DNS-1123 label\n(lowercase alphanumerics and hyphens, starting and ending alphanumeric) —\nevery operator App CR's metadata.name satisfies that, and anything else is a\n400 rather than a lookup.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one application's argocd ApplicationSyncWindowState — the answer to \"is anything blocking a sync of this application right now?\"."}},"/v1/deploy/clusters":{"get":{"summary":"Returns the argocd ClusterList of the destinations the caller's applications reconcile into: one entry per distinct destination server, carrying the count of applications reconciling into it."}},"/v1/deploy/health":{"get":{"summary":"Reports whether this deployment can observe the delivery plane."}},"/v1/deploy/login":{"get":{"summary":"Start the sign-in round trip for this console"}},"/v1/deploy/logout":{"post":{"summary":"Ends the console session on this host."}},"/v1/deploy/projects":{"get":{"summary":"Returns the argocd AppProjectList this console groups and filters applications by."}},"/v1/deploy/session/userinfo":{"get":{"summary":"Answers \"is this browser signed in, and if not where does it sign in?\" — the dashboard SPA's bootstrap question, and the only route on this plane that answers for an anonymous caller."}},"/v1/deploy/stream/applications":{"get":{"summary":"Live application fleet updates as Server-Sent Events"}},"/v1/deploy/stream/applications/{name}/resource-tree":{"get":{"parameters":[{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Live resource tree for one application, as Server-Sent Events"}},"/v1/destination":{"get":{"summary":"Reports every destination this deployment can forward to, each with the caller org's connection state: whether it is connected, whether it is enabled, whether a credential resolves right now, and the config fields the console renders for it."}},"/v1/destination/{platform}":{"delete":{"parameters":[{"description":"Platform is the destination to act on, from the path: ga4 | meta | tiktok |\nlinkedin | x | reddit | insights.","example":"ga4","in":"path","name":"platform","required":true,"schema":{"type":"string"}}],"summary":"Forgets a destination for the caller's org: every credential held in KMS, then the stored config."},"get":{"parameters":[{"description":"Platform is the destination to act on, from the path: ga4 | meta | tiktok |\nlinkedin | x | reddit | insights.","example":"ga4","in":"path","name":"platform","required":true,"schema":{"type":"string"}}],"summary":"Reports one destination's card for the caller's org — its config fields, its connection state, and whether a credential resolves right now."},"post":{"parameters":[{"in":"path","name":"platform","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":{},"type":"object"}}}},"summary":"Connect one conversion destination for your org, or update the one you have"}},"/v1/destination/{platform}/test":{"post":{"parameters":[{"description":"Platform is the destination to act on, from the path: ga4 | meta | tiktok |\nlinkedin | x | reddit | insights.","example":"ga4","in":"path","name":"platform","required":true,"schema":{"type":"string"}}],"summary":"Sends ONE synthetic conversion through the connected destination end to end and reports what the platform said."}},"/v1/dns/health":{"get":{"summary":"Check the DNS control plane"}},"/v1/dns/sync":{"post":{"summary":"Push a set of zones and records in one call"}},"/v1/dns/zones":{"get":{"summary":"List your org's DNS zones"},"post":{"summary":"Create a DNS zone"}},"/v1/dns/zones/{zone}":{"delete":{"parameters":[{"in":"path","name":"zone","required":true,"schema":{"type":"string"}}],"summary":"Delete a DNS zone"},"get":{"parameters":[{"in":"path","name":"zone","required":true,"schema":{"type":"string"}}],"summary":"Read one DNS zone"}},"/v1/dns/zones/{zone}/records":{"get":{"parameters":[{"in":"path","name":"zone","required":true,"schema":{"type":"string"}}],"summary":"List a zone's DNS records"},"post":{"parameters":[{"in":"path","name":"zone","required":true,"schema":{"type":"string"}}],"summary":"Create a DNS record"}},"/v1/dns/zones/{zone}/records/{record}":{"delete":{"parameters":[{"in":"path","name":"zone","required":true,"schema":{"type":"string"}},{"in":"path","name":"record","required":true,"schema":{"type":"string"}}],"summary":"Delete a DNS record"},"get":{"parameters":[{"in":"path","name":"zone","required":true,"schema":{"type":"string"}},{"in":"path","name":"record","required":true,"schema":{"type":"string"}}],"summary":"Read one DNS record"},"patch":{"parameters":[{"in":"path","name":"zone","required":true,"schema":{"type":"string"}},{"in":"path","name":"record","required":true,"schema":{"type":"string"}}],"summary":"Amend a DNS record"},"put":{"parameters":[{"in":"path","name":"zone","required":true,"schema":{"type":"string"}},{"in":"path","name":"record","required":true,"schema":{"type":"string"}}],"summary":"Amend a DNS record"}},"/v1/domain/availability":{"get":{"parameters":[{"description":"Domain is one name, or several comma-separated, to check in one call. Names\nare lowercased. It is required.","in":"query","name":"domain","required":true,"schema":{"type":"string"}}],"summary":"Checks exact names rather than searching for them, and answers the same quote shape search does — purchasable, premium, first-term and renewal price in cents."}},"/v1/domain/domains":{"get":{"summary":"Is the domains your org has bought here, newest registration first, each carrying the name, when it was registered, when it expires, what the org paid, the registrar order id and the nameservers it points at."}},"/v1/domain/health":{"get":{"summary":"Reports registrar reachability honestly: ok only when the wholesale credentials are present AND name.com accepted them on a live call made while you waited."}},"/v1/domain/register":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.order"}}}},"summary":"Buys a domain for your org and answers the ownership record together with the quote it was bought at."}},"/v1/domain/renew":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.renewReq"}}}},"summary":"Extends a domain your org already owns and answers the updated record with its new expiry alongside what was paid."}},"/v1/domain/search":{"get":{"parameters":[{"description":"Q is the keyword to build names from. It is required.","in":"query","name":"q","required":true,"schema":{"type":"string"}},{"description":"TLD narrows the search to a comma-separated set of top-level domains.","in":"query","name":"tld","required":false,"schema":{"type":"string"}}],"summary":"Finds names built from the keyword q, plus the registrar's alternate-TLD suggestions, and answers a quote for each: the name, whether it is purchasable, whether it is premium, the first-term and renewal price in cents, and the TLD."}},"/v1/domain/transfer":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.transferReq"}}}},"summary":"Moves a domain you own at another registrar onto your org here, using its authCode, and answers the same record-plus-quote a purchase does."}},"/v1/email":{"get":{"parameters":[{"description":"Limit is the maximum number of messages to return (default 50, max 200).","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Status filters messages by delivery status.","in":"query","name":"status","required":false,"schema":{"type":"string"}}],"summary":"Retrieves sent email messages for the authenticated organization."},"post":{"parameters":[{"description":"IdempotencyKey prevents duplicate message dispatches on network retries.","in":"header","name":"Idempotency-Key","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/email.SendMessageInput"}}}},"summary":"Sends commercial email from the org: one message per recipient, each carrying its own signed unsubscribe link in the footer and in List-Unsubscribe and List-Unsubscribe-Post (RFC 8058)."}},"/v1/email/sendgrid/status":{"get":{"parameters":[{"description":"Domain is an optional sending domain to generate SendGrid whitelabel DKIM, Return-Path, and DMARC records for.","in":"query","name":"domain","required":false,"schema":{"type":"string"}}],"summary":"Inspects the authenticated organization's dedicated SendGrid outreach configuration (separate from standard Twilio notify) and whitelabel DNS records."}},"/v1/email/ses/status":{"get":{"parameters":[{"description":"Domain optionally specifies the sending domain to generate Easy DKIM and MAIL FROM records for.","in":"query","name":"domain","required":false,"schema":{"type":"string"}}],"summary":"Inspects the authenticated organization's Amazon SES configuration, sending limits, and Easy DKIM / MAIL FROM DNS records."}},"/v1/email/verify":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/email.VerificationInput"}}}},"summary":"Evaluates an email address using explicitly selected, composable checks."}},"/v1/email/webhooks/sendgrid":{"post":{"summary":"Receives SendGrid's Signed Event Webhook: the delivery is an array of events, signed (ECDSA P-256, SHA-256) over its timestamp header followed by the body, under the public key the organization holds (the webhook-public-key credential)."}},"/v1/email/webhooks/ses":{"post":{"summary":"Receives Amazon SES events as an SNS HTTPS subscription delivers them."}},"/v1/email/{id}":{"get":{"parameters":[{"description":"ID is the unique identifier of the message to retrieve.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Retrieves message delivery status by ID for the authenticated organization."}},"/v1/embeddings":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/openai.EmbeddingRequest"}}}},"summary":"Implements POST /v1/embeddings (OpenAI-compatible)."}},"/v1/engine/model":{"get":{"parameters":[{"description":"Model is the model id to inspect, exactly as the model list reports it.","example":"Qwen/Qwen3-4B","in":"query","name":"model","required":false,"schema":{"type":"string"}}],"summary":"Read one model's load state on the serving runtime"}},"/v1/engine/models":{"get":{"summary":"List the models the serving runtime holds, with each one's load state"}},"/v1/engine/status":{"get":{"summary":"Whether the serving runtime is reachable, and which build it runs"}},"/v1/engine/system":{"get":{"summary":"The serving host's own inventory: devices, memory and build capabilities"}},"/v1/entitlement":{"get":{"summary":"Reports which console apps the CALLER's org may open, and the plan slug that decides it."}},"/v1/entitlement/orgs/{org}":{"get":{"parameters":[{"in":"path","name":"org","required":true,"schema":{"type":"string"}}],"summary":"Lists the products an org has ENABLED — its own intent, which the console's paid-product sidebar reads to decide what to show."},"post":{"parameters":[{"in":"path","name":"org","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/entitlement.mutateReq"}}}},"summary":"Turns products on or off for an org and returns the enabled set afterwards."}},"/v1/environment":{"get":{"summary":"Lists every codebase in your org that has an environment."}},"/v1/environment/{repo}":{"delete":{"parameters":[{"description":"Repo is the repository's name in the caller's org — a name, never owner/name.","in":"path","name":"repo","required":true,"schema":{"type":"string"}}],"summary":"Forgets one codebase's environment, and its secrets with it."},"get":{"parameters":[{"description":"Repo is the repository's name in the caller's org — a name, never owner/name.","in":"path","name":"repo","required":true,"schema":{"type":"string"}}],"summary":"Reads one codebase's environment."},"put":{"parameters":[{"description":"Repo is the repository's name in the caller's org.","in":"path","name":"repo","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/environment.envSave"}}}},"summary":"Saves one codebase's install and start scripts."}},"/v1/environment/{repo}/secrets/{name}":{"delete":{"parameters":[{"description":"Repo is the repository's name in the caller's org.","in":"path","name":"repo","required":true,"schema":{"type":"string"}},{"description":"Name is the secret's environment variable name.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Removes one secret from a codebase."},"put":{"parameters":[{"description":"Repo is the repository's name in the caller's org.","in":"path","name":"repo","required":true,"schema":{"type":"string"}},{"description":"Name is the environment variable the run exports the value under.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/environment.envSecret"}}}},"summary":"Sets one secret on a codebase."}},"/v1/esign/documents":{"get":{"summary":"Returns your org's documents, newest first."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/esign.esignUploadIn"}}}},"summary":"Uploads a PDF and opens a draft ready for recipients and fields."}},"/v1/esign/documents/{id}":{"get":{"parameters":[{"description":"ID is the document to act on. It is the path segment: the URL is the\naddressing authority, and the org it is resolved in comes from the caller's\nprincipal, so an id belonging to another tenant is simply not found.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one document with its recipients and field layout."}},"/v1/esign/documents/{id}/audit":{"get":{"parameters":[{"description":"ID is the document to act on. It is the path segment: the URL is the\naddressing authority, and the org it is resolved in comes from the caller's\nprincipal, so an id belonging to another tenant is simply not found.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns the document's full audit trail, oldest first."}},"/v1/esign/documents/{id}/download":{"get":{"parameters":[{"description":"ID is the document to act on. It is the path segment: the URL is the\naddressing authority, and the org it is resolved in comes from the caller's\nprincipal, so an id belonging to another tenant is simply not found.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns the document — the sealed PDF once it is complete."}},"/v1/esign/documents/{id}/fields":{"post":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/esign.esignFieldIn"}}}},"summary":"Places a field on the page for one recipient to fill."}},"/v1/esign/documents/{id}/recipients":{"post":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/esign.esignRecipientIn"}}}},"summary":"Adds someone to a draft and mints their signing token."}},"/v1/esign/documents/{id}/send":{"post":{"parameters":[{"description":"ID is the document to send. The URL is the addressing authority.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Sends the document out and answers each signer's link."}},"/v1/esign/health":{"get":{"summary":"Reports whether the e-signature surface is mounted."}},"/v1/esign/o/{org}/sign/{token}":{"get":{"parameters":[{"in":"path","name":"org","required":true,"schema":{"type":"string"}},{"in":"path","name":"token","required":true,"schema":{"type":"string"}}],"summary":"Opens a document you were asked to sign, using your signing link."}},"/v1/esign/o/{org}/sign/{token}/complete":{"post":{"parameters":[{"in":"path","name":"org","required":true,"schema":{"type":"string"}},{"in":"path","name":"token","required":true,"schema":{"type":"string"}}],"summary":"Finishes your signing — and seals the document if you were the last."}},"/v1/esign/o/{org}/sign/{token}/fields/{fieldId}":{"post":{"parameters":[{"in":"path","name":"org","required":true,"schema":{"type":"string"}},{"in":"path","name":"token","required":true,"schema":{"type":"string"}},{"in":"path","name":"fieldId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/esign.esignValueIn"}}}},"summary":"Fills in one of your fields."}},"/v1/esign/o/{org}/sign/{token}/reject":{"post":{"parameters":[{"in":"path","name":"org","required":true,"schema":{"type":"string"}},{"in":"path","name":"token","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/esign.esignRejectIn"}}}},"summary":"Declines to sign, with an optional reason."}},"/v1/eval/datasets":{"get":{"parameters":[{"description":"Limit caps the rows returned. It defaults to 100 and is capped at 500; a\nnon-positive or unparseable value falls back to the default rather than\nfailing, because a typo about paging is not a reason to refuse a read.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Is the datasets your org has, each with its name, description, metadata and timestamps."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/eval.datasetReq"}}}},"summary":"Writes a dataset — the named set of graded examples a run scores a model against — under the caller's org and answers 201 with it."}},"/v1/eval/datasets/{name}":{"delete":{"parameters":[{"description":"Name is the dataset the URL names.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Removes the named dataset of the caller's org AND all of its examples, in one transaction."},"get":{"parameters":[{"description":"Name is the dataset the URL names.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one dataset of the caller's org by name, together with its live item count — the one read that answers how big the set actually is."}},"/v1/eval/datasets/{name}/items":{"get":{"parameters":[{"description":"Dataset is the set to read, from the path — this collection only exists\ninside one.","in":"path","name":"name","required":true,"schema":{"type":"string"}},{"description":"Limit caps the rows returned. It defaults to 100 and is capped at 500; a\nnon-positive or unparseable value falls back to the default rather than\nfailing, because a typo about paging is not a reason to refuse a read.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Is the examples in one of your datasets — the set is named in the path, because this collection only exists inside one."},"post":{"parameters":[{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/eval.itemReq"}}}},"summary":"Writes one graded example — its input, its expected output, free-form metadata and a status — into the dataset named in the path, and answers 201 with it."}},"/v1/eval/evaluators":{"get":{"parameters":[{"description":"Limit caps the rows returned. It defaults to 100 and is capped at 500; a\nnon-positive or unparseable value falls back to the default rather than\nfailing, because a typo about paging is not a reason to refuse a read.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Is the judges your org has defined, each with its judge model, criteria and the score name it writes under."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/eval.evaluatorReq"}}}},"summary":"Saves a reusable judge for the caller's org — the judge model and the written criteria it grades against — and answers 201 with it."}},"/v1/eval/metrics":{"get":{"parameters":[{"description":"Range is 24h (the default), 7d or 30d. Anything else normalises to 24h\nrather than failing, so the board always has a valid window.","in":"query","name":"range","required":false,"schema":{"type":"string"}},{"description":"Interval overrides the bucket the series is grouped into: \"hour\" or \"day\".\nAny other value leaves the range's own default in place.","in":"query","name":"interval","required":false,"schema":{"type":"string"}}],"summary":"Is your org's AI overview board over a window: totals (generations, prompt and completion tokens, cost in cents, errors, success rate, distinct models and users), a gap-filled time series, a per-model breakdown with the long tail folded into \"other\", and latency percentiles read from the GenAI spans."}},"/v1/eval/rubrics":{"get":{"parameters":[{"description":"Limit caps the rows returned. It defaults to 100 and is capped at 500; a\nnon-positive or unparseable value falls back to the default rather than\nfailing, because a typo about paging is not a reason to refuse a read.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Is the score shapes your org has declared — each name's data type, its numeric bounds and its allowed categories."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/eval.scoreConfigReq"}}}},"summary":"Defines the shape of one score name for the caller's org and answers 201 with it."}},"/v1/eval/runs":{"get":{"parameters":[{"description":"Dataset narrows to the runs against one dataset.","in":"query","name":"datasetName","required":false,"schema":{"type":"string"}},{"description":"Limit caps the rows returned. It defaults to 100 and is capped at 500; a\nnon-positive or unparseable value falls back to the default rather than\nfailing, because a typo about paging is not a reason to refuse a read.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Is your past runs and how they scored — the dataset and model, the judge model, how many examples were attempted and how many scored, the average score, and when it happened."},"post":{"parameters":[{"in":"header","name":"Authorization","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/eval.runRequest"}}}},"summary":"Runs a real evaluation and answers the summary when it is finished — this is synchronous work, not a job id."}},"/v1/eval/scores":{"get":{"parameters":[{"description":"Name narrows to one score name.","in":"query","name":"name","required":false,"schema":{"type":"string"}},{"description":"RunName narrows to the scores of one run.","in":"query","name":"runName","required":false,"schema":{"type":"string"}},{"description":"TraceID narrows to the scores on one model call.","in":"query","name":"traceId","required":false,"schema":{"type":"string"}},{"description":"Limit caps the rows returned. It defaults to 100 and is capped at 500; a\nnon-positive or unparseable value falls back to the default rather than\nfailing, because a typo about paging is not a reason to refuse a read.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Is the score events your org has recorded, narrowed by any of name, runName and traceId."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/eval.scoreReq"}}}},"summary":"Files one score event for the caller's org and answers 201 with it."}},"/v1/eval/traces":{"get":{"parameters":[{"description":"SessionID narrows to one session, which for an evaluation is one run.","in":"query","name":"sessionId","required":false,"schema":{"type":"string"}},{"description":"RunName narrows to the calls one run made.","in":"query","name":"runName","required":false,"schema":{"type":"string"}},{"description":"Dataset narrows to the calls made against one dataset.","in":"query","name":"datasetName","required":false,"schema":{"type":"string"}},{"description":"Limit caps the rows returned. It defaults to 100 and is capped at 500; a\nnon-positive or unparseable value falls back to the default rather than\nfailing, because a typo about paging is not a reason to refuse a read.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Is the traces behind your evaluations — one per model call an evaluation made, carrying its input, output, model and timing — narrowed by any of sessionId, runName and datasetName."}},"/v1/event":{"post":{"requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/CaptureEvent"},{"items":{"$ref":"#/components/schemas/CaptureEvent"},"type":"array"},{"$ref":"#/components/schemas/CaptureBatch"},{"$ref":"#/components/schemas/insightsBody"}]}}}},"summary":"Capture product events into your org's warehouse"}},"/v1/event/economic":{"get":{"parameters":[{"description":"Year is the calendar year to read, UTC.","example":2026,"in":"query","name":"year","required":true,"schema":{"format":"int64","type":"integer"}},{"description":"Counterparty keeps only payments with this org on the other side.","in":"query","name":"counterparty","required":false,"schema":{"type":"string"}},{"description":"Rail keeps only payments that moved on this rail.","example":"x402","in":"query","name":"rail","required":false,"schema":{"type":"string"}},{"description":"Cursor continues from the next of the page before; empty starts the year.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}},{"description":"Limit is how many events to answer, default 100 and at most 1000.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns, oldest first and paged, the payments the caller's org made or received in a year, with the ones a correction restates named and what either party disputes — for the org's admins."}},"/v1/event/economic/dispute":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/event.disputeIn"}}}},"summary":"Records that the caller's org disputes one payment it is party to — for the org's admins."}},"/v1/event/errors":{"get":{"parameters":[{"description":"Limit is how many rows to return, newest first. Default 50, maximum 200; a\nvalue at or below zero, or one that is not a number, takes the default.","example":100,"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns the caller org's most recently captured errors, newest first."}},"/v1/event/health":{"get":{"summary":"Reports whether the event plane can take a write and the warehouse can answer a read."}},"/v1/event/insights/events":{"get":{"parameters":[{"description":"Limit is how many rows to return, newest first. Default 50, maximum 200; a\nvalue at or below zero, or one that is not a number, takes the default.","example":100,"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Impersonated is which events to return against the mark a platform operator\nleaves acting as someone else: exclude (the default, the tenant's own\ntraffic), include, or only. Anything else is a 400.","in":"query","name":"impersonated","required":false,"schema":{"type":"string"}}],"summary":"Returns the caller org's most recent product events, newest first."}},"/v1/event/insights/health":{"get":{"summary":"Reports that the unified insights surface is serving."}},"/v1/event/overview":{"get":{"parameters":[{"description":"Range is a relative window: a count and a unit — 24h, 7d, 90d, any <N>h or\n<N>d — or day, week, month, all. Default 24h. Ignored when both start and\nend are given. An unknown value, or one past the 730-day horizon, is a 400.","example":"7d","in":"query","name":"range","required":false,"schema":{"type":"string"}},{"description":"Start is the inclusive lower bound of a custom window, RFC3339. Requires end.","in":"query","name":"start","required":false,"schema":{"type":"string"}},{"description":"End is the exclusive upper bound of a custom window, RFC3339. Requires start.","in":"query","name":"end","required":false,"schema":{"type":"string"}},{"description":"Impersonated is which events the product-event lenses count against the mark\na platform operator leaves acting as someone else: exclude (the default, the\ntenant's own traffic), include, or only. Anything else is a 400.","in":"query","name":"impersonated","required":false,"schema":{"type":"string"}}],"summary":"Returns the caller org's analytics KPIs for one time window."}},"/v1/event/pixel/{key}":{"get":{"parameters":[{"in":"path","name":"key","required":true,"schema":{"type":"string"}}],"summary":"A site's default pixel — a page view from an image, for a page that runs no script"}},"/v1/event/replay":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/replayBody"}}}},"summary":"Record a session-replay snapshot batch"}},"/v1/event/tag.js":{"get":{"summary":"The Hanzo event tag — the one-line install for a surface with no bundler"}},"/v1/event/timeseries":{"get":{"parameters":[{"description":"Range is a relative window: a count and a unit — 24h, 7d, 90d, any <N>h or\n<N>d — or day, week, month, all. Default 24h. Ignored when both start and\nend are given. An unknown value, or one past the 730-day horizon, is a 400.","example":"30d","in":"query","name":"range","required":false,"schema":{"type":"string"}},{"description":"Start is the inclusive lower bound of a custom window, RFC3339. Requires end.","in":"query","name":"start","required":false,"schema":{"type":"string"}},{"description":"End is the exclusive upper bound of a custom window, RFC3339. Requires start.","in":"query","name":"end","required":false,"schema":{"type":"string"}}],"summary":"Returns the caller org's LLM usage over time as an evenly-spaced series."}},"/v1/event/top":{"get":{"parameters":[{"description":"Range is a relative window: a count and a unit — 24h, 7d, 90d, any <N>h or\n<N>d — or day, week, month, all. Default 24h. Ignored when both start and\nend are given. An unknown value, or one past the 730-day horizon, is a 400.","example":"7d","in":"query","name":"range","required":false,"schema":{"type":"string"}},{"description":"Start is the inclusive lower bound of a custom window, RFC3339. Requires end.","in":"query","name":"start","required":false,"schema":{"type":"string"}},{"description":"End is the exclusive upper bound of a custom window, RFC3339. Requires start.","in":"query","name":"end","required":false,"schema":{"type":"string"}},{"description":"Limit bounds every ranked lens in the response. Default 10, maximum 100; a\nvalue at or below zero, or one that is not a number, takes the default.","example":25,"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Impersonated is which events the product-event lenses count against the mark\na platform operator leaves acting as someone else: exclude (the default, the\ntenant's own traffic), include, or only. Anything else is a 400.","in":"query","name":"impersonated","required":false,"schema":{"type":"string"}}],"summary":"Returns the caller org's ranked lenses for one window, five of them at once."}},"/v1/exec":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/exec.CodeRun"}}}},"summary":"Run a code snippet in a sandboxed interpreter"}},"/v1/exec/files/{sid}":{"get":{"parameters":[{"description":"SID is the session identifier — the sandbox this listing is of. The URL is\nthe addressing authority: a path segment binds after the body and after the\nquery, so the address decides which session is read whatever else is sent.","in":"path","name":"sid","required":true,"schema":{"type":"string"}}],"summary":"Lists the files in an execution session."}},"/v1/exec/upload":{"post":{"summary":"Upload a file into an execution session"}},"/v1/experiment":{"get":{"summary":"Is every experiment in the caller's org, with its variants, status and decision, ordered by project then id."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/experiment.createBody"}}}},"summary":"Registers a controlled experiment AND puts its assignment flag live, in that order, so the arms start bucketing subjects the moment this returns 201 — the flag is created active at 100% rollout, with each variant weighted as declared."}},"/v1/experiment/health":{"get":{"summary":"Is whether the experiments subsystem is mounted and serving in this process."}},"/v1/experiment/{id}":{"get":{"parameters":[{"description":"ID is the experiment the URL names.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Is one experiment's definition and lifecycle: variants, weights, control arm, status and winner."}},"/v1/experiment/{id}/analyze":{"post":{"parameters":[{"description":"ID is the experiment the URL names.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/experiment.analyzeQuery"}}}},"summary":"Is per-variant conversion, lift and statistical significance against the control arm."}},"/v1/experiment/{id}/assign":{"get":{"parameters":[{"description":"ID is the experiment the URL names.","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Subject is the unit to bucket — a user, org, session or audience key,\nmatching the experiment's subjectKind.","in":"query","name":"subject","required":true,"schema":{"type":"string"}},{"description":"Props is a JSON object of person properties for targeting. A value that is\nnot valid JSON is dropped rather than refused, so a malformed one changes\nthe bucketing without saying so.","in":"query","name":"props","required":false,"schema":{"type":"string"}}],"summary":"Is the variant one subject is bucketed into, and the payload that variant carries."}},"/v1/experiment/{id}/decide":{"post":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/experiment.decideBody"}}}},"summary":"Promotes one variant to the whole rollout and records who decided."}},"/v1/explorer/indexers":{"get":{"summary":"Reports the deployment's chain indexer(s) and how far each has indexed."}},"/v1/explorer/oracles":{"get":{"summary":"Reports the on-chain price/data oracles from the graph's O-Chain PriceFeed registry."}},"/v1/flag":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/flag.evaluateIn"}}}},"summary":"Runs the caller's flag definitions for one identity and returns the flag verdict: which flags are on (or which variant), their payloads, and whether any definition failed to compute."}},"/v1/flag/activity":{"get":{"parameters":[{"description":"Limit caps the rows returned. 1–500; anything else takes the default 100.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns the caller's flag change log newest-first: every create, update and delete, with the actor and the time."}},"/v1/flag/decide":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/flag.evaluateIn"}}}},"summary":"Runs the caller's flag definitions for one identity and returns the flag verdict: which flags are on (or which variant), their payloads, and whether any definition failed to compute."}},"/v1/flag/defs":{"get":{"summary":"Returns every flag definition in the caller's (org, project) store, by key, with its version and who last changed it."}},"/v1/flag/defs/{key}":{"delete":{"parameters":[{"description":"Key is the flag key to act on, from the path.","in":"path","name":"key","required":true,"schema":{"type":"string"}}],"summary":"Removes one flag definition by key and records the deletion in the change log."},"get":{"parameters":[{"description":"Key is the flag key to act on, from the path.","in":"path","name":"key","required":true,"schema":{"type":"string"}}],"summary":"Returns one flag definition by key, or 404 when the caller's store has none under that key."},"put":{"parameters":[{"description":"Key is the flag key to write, from the path.","example":"new-editor","in":"path","name":"key","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{}}}},"summary":"Creates or replaces the flag definition at the path's key and returns the stored row."}},"/v1/flag/health":{"get":{"summary":"Reports that the flag engine is serving."}},"/v1/flag/optin":{"get":{"summary":"Answers the signed-in caller's opt-in to public betas: whether they opted in, whether the org they act in blocked it, and which betas are public."},"put":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/flag.optinIn"}}}},"summary":"Sets the signed-in caller's OWN opt-in to public betas: on, every public beta and each one promoted later is on for them; off, none is."}},"/v1/flag/optin/org":{"put":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/flag.orgOptinIn"}}}},"summary":"Blocks or unblocks the opt-in to public betas for every member of the org the caller acts in."}},"/v1/flag/platform":{"get":{"summary":"Answers the platform switches that are decided per caller — `beta`, whether the caller sees what is not yet generally available — as they apply to the signed-in caller: its validated org and user, never anything the request states."}},"/v1/flow/runs":{"get":{"parameters":[{"description":"Workflow is the UUID of the workflow whose run records to read. It rides\nthe query string.","in":"query","name":"workflow","required":false,"schema":{"type":"string"}}],"summary":"Reads one workflow's recorded runs: every component build with its result, keyed by component."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/flow.flowRun"}}}},"summary":"Executes one of the caller's workflows synchronously: the graph runs in the flow service and the response carries the run's session and outputs."}},"/v1/flow/status":{"get":{"summary":"Reports whether the flow service is reachable and which version it runs."}},"/v1/flow/workflows":{"get":{"parameters":[{"description":"Page is the 1-based page of workflows to return.","in":"query","name":"page","required":false,"schema":{"type":"string"}},{"description":"Size is how many workflows one page holds (the product caps it at 100).","in":"query","name":"size","required":false,"schema":{"type":"string"}}],"summary":"Lists the caller's workflows, paged."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/flow.flowCreate"}}}},"summary":"Creates a workflow in the caller's org."}},"/v1/flow/workflows/{workflow}":{"delete":{"parameters":[{"description":"Workflow is the workflow's UUID, taken from the path.","in":"path","name":"workflow","required":true,"schema":{"type":"string"}}],"summary":"Deletes one of the caller's workflows and its runs."},"get":{"parameters":[{"description":"Workflow is the workflow's UUID, taken from the path.","in":"path","name":"workflow","required":true,"schema":{"type":"string"}}],"summary":"Reads one of the caller's workflows — the full record, graph included."},"patch":{"parameters":[{"description":"Workflow is the workflow's UUID, taken from the path.","in":"path","name":"workflow","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/flow.flowUpdate"}}}},"summary":"Patches one of the caller's workflows: name, description, graph, or the locked flag — only the stated fields move."}},"/v1/framework/doctypes":{"get":{"summary":"Returns every DocType defined in the caller's org."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/framework.DocType"}}}},"summary":"Defines a DocType in the caller's org: the metadata that gives a document surface its fields, its naming rule, whether it has a submit/cancel lifecycle, and which role may do what to it."}},"/v1/framework/doctypes/{name}":{"delete":{"parameters":[{"description":"Name is the DocType's ADDRESS — \"module.name\", e.g. \"kb.page\". A name\ncontaining a space (\"erp.Sales Invoice\") arrives percent-encoded and is\ndecoded before it is matched against the stored one.","example":"Projects.Task","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Removes a DocType and every document stored under it."},"get":{"parameters":[{"description":"Name is the DocType's ADDRESS — \"module.name\", e.g. \"kb.page\". A name\ncontaining a space (\"erp.Sales Invoice\") arrives percent-encoded and is\ndecoded before it is matched against the stored one.","example":"Projects.Task","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one DocType definition — its fields, naming rule, permissions and lifecycle flags."},"put":{"parameters":[{"example":"Projects.Task","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/framework.DocType"}}}},"summary":"Replaces a DocType definition wholesale (PUT semantics): the stored definition becomes the body."}},"/v1/framework/modules":{"get":{"summary":"Returns every app lane compiled into this deployment and the DocTypes each one installs."}},"/v1/framework/modules/{module}":{"get":{"parameters":[{"description":"Module is the lane's registered name (\"cms\", \"erp\"), from the path.","example":"cms","in":"path","name":"module","required":true,"schema":{"type":"string"}}],"summary":"Returns one app lane's install state for the caller's org: the DocTypes the lane declares, and which of them already exist in the org."}},"/v1/framework/modules/{module}/install":{"post":{"parameters":[{"description":"Module is the lane's registered name (\"cms\", \"erp\"), from the path.","example":"cms","in":"path","name":"module","required":true,"schema":{"type":"string"}}],"summary":"Creates an app lane's DocTypes in the caller's org."}},"/v1/framework/summary":{"get":{"summary":"Reports how much of the DocType surface the caller's org uses: how many DocTypes it has defined, and how many documents exist across them."}},"/v1/framework/{doctype}":{"get":{"parameters":[{"description":"DocType is the DocType to list, by ADDRESS — \"module.name\", from the path.","example":"Projects.Task","in":"path","name":"doctype","required":true,"schema":{"type":"string"}},{"description":"Filters is a JSON object of equality matches, e.g. {\"priority\":\"High\"}.\nEvery key must be a field the DocType declares (or the managed name /\ndocstatus); an undeclared one is refused rather than silently ignored.","example":"{\"priority\":\"High\"}","in":"query","name":"filters","required":false,"schema":{"type":"string"}},{"description":"Fields projects the response to a subset — a JSON array [\"a\",\"b\"] or a\ncomma list \"a,b\". The envelope keys are always returned.","in":"query","name":"fields","required":false,"schema":{"type":"string"}},{"description":"OrderBy is \"<field> [asc|desc]\". Empty means most-recently-updated first.","example":"estimate asc","in":"query","name":"order_by","required":false,"schema":{"type":"string"}},{"description":"Limit caps the rows returned. Anything that is not a positive integer\nleaves the engine's default in place.","example":"20","in":"query","name":"limit","required":false,"schema":{"type":"string"}}],"summary":"Returns the caller org's documents of one DocType, filtered, ordered and projected by the query."},"post":{"parameters":[{"in":"path","name":"doctype","required":true,"schema":{"type":"string"}}],"summary":"Create one document of a DocType, from that DocType's own fields."}},"/v1/framework/{doctype}/{name}":{"delete":{"parameters":[{"description":"DocType is the document's DocType, by ADDRESS — \"module.name\", from the path.","example":"Projects.Task","in":"path","name":"doctype","required":true,"schema":{"type":"string"}},{"description":"Name is the document's name — its key within the DocType — from the path.\nA name containing a space arrives percent-encoded and is decoded before it\nis matched against the stored one.","example":"TASK-00001","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Removes one document, after its on_trash hooks agree."},"get":{"parameters":[{"description":"DocType is the document's DocType, by ADDRESS — \"module.name\", from the path.","example":"Projects.Task","in":"path","name":"doctype","required":true,"schema":{"type":"string"}},{"description":"Name is the document's name — its key within the DocType — from the path.\nA name containing a space arrives percent-encoded and is decoded before it\nis matched against the stored one.","example":"TASK-00001","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one document by name, with Password fields redacted."},"put":{"parameters":[{"in":"path","name":"doctype","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Replace a draft document's field data wholesale."}},"/v1/framework/{doctype}/{name}/cancel":{"post":{"parameters":[{"description":"DocType is the document's DocType, by ADDRESS — \"module.name\", from the path.","example":"Projects.Task","in":"path","name":"doctype","required":true,"schema":{"type":"string"}},{"description":"Name is the document's name — its key within the DocType — from the path.\nA name containing a space arrives percent-encoded and is decoded before it\nis matched against the stored one.","example":"TASK-00001","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Moves a submitted document to cancelled (docstatus 1 → 2) after its on_cancel hooks agree."}},"/v1/framework/{doctype}/{name}/submit":{"post":{"parameters":[{"description":"DocType is the document's DocType, by ADDRESS — \"module.name\", from the path.","example":"Projects.Task","in":"path","name":"doctype","required":true,"schema":{"type":"string"}},{"description":"Name is the document's name — its key within the DocType — from the path.\nA name containing a space arrives percent-encoded and is decoded before it\nis matched against the stored one.","example":"TASK-00001","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Moves a draft to submitted (docstatus 0 → 1) after its on_submit hooks agree."}},"/v1/function":{"get":{"summary":"Is every serverless function the caller's org has published, each with its real 7-day rollup."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/function.definition"}}}},"summary":"Publishes a serverless function under the caller's org and answers 201 with it."}},"/v1/function/deployments":{"get":{"summary":"Is what is live right now — each function's current record IS its live deployment, so this is the deployment inventory."}},"/v1/function/metrics":{"get":{"parameters":[{"description":"Range is 1H, 6H, 24H (the default), 7D or 30D. Anything else falls back to\n24H rather than failing.","in":"query","name":"range","required":false,"schema":{"type":"string"}}],"summary":"Is the org's serverless dashboard over a window: a per-function invocation costLine and how those invocations ended."}},"/v1/function/secrets":{"get":{"summary":"Is the NAMES of the secrets the caller org's functions mount."}},"/v1/function/triggers":{"get":{"summary":"Is what calls the caller org's functions — one row per function."}},"/v1/function/{name}":{"delete":{"parameters":[{"description":"Name is the function the URL names.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Removes one of the caller org's functions and answers 204."},"get":{"parameters":[{"description":"Name is the function the URL names.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Is one function with everything a detail page needs in one round-trip: its definition, its 7-day rollup, its trigger, its twenty most recent invocations and the NAMES of the secrets it mounts."}},"/v1/function/{name}/invocations":{"get":{"parameters":[{"description":"Name is the function the URL names.","in":"path","name":"name","required":true,"schema":{"type":"string"}},{"description":"Limit caps the page, defaulting to 100.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Is one function's past runs, newest first — each with its status, HTTP code, method, time and duration."}},"/v1/function/{name}/invoke":{"post":{"parameters":[{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/function.invokeReq"}}}},"summary":"Runs a function and records a REAL invocation."}},"/v1/function/{name}/logs":{"get":{"parameters":[{"description":"Name is the function the URL names.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Is the output of a function's most recent run — its error text when that run failed, else what it printed."}},"/v1/gateway/config":{"get":{"summary":"Returns the EFFECTIVE edge policy the caller is subject to: the platform CORS allowlist and pre-auth per-IP flood cap in force, plus the caller's own authenticated rate ceiling, edge-cache TTLs and accepted-method allowlist."},"put":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/gateway.Policy"}}}},"summary":"Updates one policy scope and returns the policy in force after the write."}},"/v1/gateway/traffic":{"get":{"summary":"Report who is calling this org's API right now"}},"/v1/git":{"get":{"summary":"Browse your org's repositories"}},"/v1/git/explore":{"get":{"summary":"Discover public repositories across every org"}},"/v1/git/link":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/git.linkAll"}}}},"summary":"Links every repository of the caller's org that holds no history here and names no link to github.com/<owner>/<name>, where GitHub lets the caller read it."}},"/v1/git/pools":{"get":{"summary":"Returns the capacity this org has declared and how many daemons have entered each pool."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/git.poolDeclare"}}}},"summary":"Records the capacity an org has, and answers with the secret a runner daemon presents to enter it."}},"/v1/git/repos":{"get":{"summary":"Returns the repos in the caller's scope, most recently updated first."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/git.createReq"}}}},"summary":"Provisions an empty bare repository in the caller's scope and returns it with its clone URLs."}},"/v1/git/repos/{name}":{"delete":{"parameters":[{"description":"Name is the repo's org-unique handle, from the :name path segment. A\ntrailing \".git\" is stripped.","example":"widgets","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Removes a repo's metadata and purges its storage."},"get":{"parameters":[{"description":"Name is the repo's org-unique handle, from the :name path segment. A\ntrailing \".git\" is stripped.","example":"widgets","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one repo with its live ref state: every branch name and the resolved HEAD commit."},"patch":{"parameters":[{"description":"Name is the repo to update, from the :name path segment.","example":"widgets","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/git.patchIn"}}}},"summary":"Flips a repo's public bit, the one mutable repo setting today."}},"/v1/git/repos/{name}/blob":{"get":{"parameters":[{"description":"Name is the repo to read, from the :name path segment.","example":"widgets","in":"path","name":"name","required":true,"schema":{"type":"string"}},{"description":"Ref is a branch, tag or commit; empty means the repo's HEAD.","example":"main","in":"query","name":"ref","required":false,"schema":{"type":"string"}},{"description":"Path is repo-relative; empty is the tree root. Traversal is stripped.","example":"go.mod","in":"query","name":"path","required":false,"schema":{"type":"string"}}],"summary":"Returns one file's bytes at one revision."}},"/v1/git/repos/{name}/commits":{"get":{"parameters":[{"description":"Name is the repo to read, from the :name path segment.","example":"widgets","in":"path","name":"name","required":true,"schema":{"type":"string"}},{"description":"Ref is the branch, tag or commit to walk back from; empty means HEAD.","example":"main","in":"query","name":"ref","required":false,"schema":{"type":"string"}},{"description":"Path narrows the history to commits touching it; empty walks the whole ref.","in":"query","name":"path","required":false,"schema":{"type":"string"}},{"description":"Limit caps the page. Anything not positive means 50; the cap is 100.","example":2,"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Walks a ref's history newest first, or one path's history when a path is given."}},"/v1/git/repos/{name}/files":{"get":{"parameters":[{"description":"Name is the repo to read, from the :name path segment.","example":"universe","in":"path","name":"name","required":true,"schema":{"type":"string"}},{"description":"Ref is a branch, tag or commit; empty means the repo's HEAD.","example":"main","in":"query","name":"ref","required":false,"schema":{"type":"string"}},{"description":"Glob selects files, matched segment by segment so `*` never crosses a `/`.\n`**` matches zero or more whole segments.","example":"charts/app/values/*/*.yaml","in":"query","name":"glob","required":false,"schema":{"type":"string"}}],"summary":"Returns every file a glob selects at one revision, WITH its bytes and the revision they came from."}},"/v1/git/repos/{name}/gc":{"post":{"parameters":[{"description":"Name is the repo's org-unique handle, from the :name path segment. A\ntrailing \".git\" is stripped.","example":"widgets","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Repacks a repo into one bitmapped pack and rewrites its commit-graph, so the next clone reuses the bitmap instead of walking the whole object graph."}},"/v1/git/repos/{name}/home":{"post":{"parameters":[{"description":"Name is the repository, from the :name path segment.","example":"widgets","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Moves a repository whose history is HERE to the forge (git.hanzo.ai), the one home of a repository no other host holds, and links it there: the repository is made in the org's own namespace on the forge, every branch and tag is pushed to it, the forge's refs are read back and must equal these, and only then does the row name the forge as its link, so this copy becomes the cache it can be fetched back into."}},"/v1/git/repos/{name}/link":{"post":{"parameters":[{"description":"Name is the repository, from the :name path segment. It is made when the\norg has none of that name.","example":"widgets","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/git.linkReq"}}}},"summary":"Records that a repository's history lives on another host, making the repository first when the org has none of that name."}},"/v1/git/repos/{name}/pulls":{"get":{"parameters":[{"description":"Name is the repo, from the :name path segment.","example":"widgets","in":"path","name":"name","required":true,"schema":{"type":"string"}},{"description":"State narrows the list to \"open\" or \"merged\". Omit it for every proposal.","example":"open","in":"query","name":"state","required":false,"schema":{"type":"string"}}],"summary":"Returns a repo's pull requests, newest number first — what is waiting to be reviewed, and what has already landed."},"post":{"parameters":[{"description":"Name is the repo the proposal belongs to, from the :name path segment.","example":"widgets","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/git.openReq"}}}},"summary":"Proposes a branch for merging and returns it with its number."}},"/v1/git/repos/{name}/pulls/{number}":{"get":{"parameters":[{"description":"Name is the repo, from the :name path segment.","example":"widgets","in":"path","name":"name","required":true,"schema":{"type":"string"}},{"description":"Number is the proposal's per-repo number, from the :number path segment.","example":4,"in":"path","name":"number","required":true,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns one pull request by its per-repo number."}},"/v1/git/repos/{name}/pulls/{number}/merge":{"post":{"parameters":[{"description":"Name is the repo, from the :name path segment.","example":"widgets","in":"path","name":"name","required":true,"schema":{"type":"string"}},{"description":"Number is the proposal's per-repo number, from the :number path segment.","example":4,"in":"path","name":"number","required":true,"schema":{"format":"int64","type":"integer"}}],"summary":"Merges an open pull request by FAST-FORWARDING base to head, and answers the proposal in its merged state with the revision base now points at."}},"/v1/git/repos/{name}/push":{"post":{"parameters":[{"description":"Name is the repo to push into, from the :name path segment. It is CREATED\non first push if it does not exist.","example":"widgets","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/git.pushReq"}}}},"summary":"Lands a set of files as one commit without a git client — the hanzo.app builder's push."}},"/v1/git/repos/{name}/readme":{"get":{"parameters":[{"description":"Name is the repo to read, from the :name path segment.","example":"widgets","in":"path","name":"name","required":true,"schema":{"type":"string"}},{"description":"Ref is a branch, tag or commit; empty means the repo's HEAD.","example":"main","in":"query","name":"ref","required":false,"schema":{"type":"string"}}],"summary":"Returns the README at the tree root as plain text — unrendered, so the caller decides how to present it."}},"/v1/git/repos/{name}/refs":{"get":{"parameters":[{"description":"Name is the repo's org-unique handle, from the :name path segment. A\ntrailing \".git\" is stripped.","example":"widgets","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Lists a repo's branches, tags and default branch — what a branch picker needs in one call."}},"/v1/git/repos/{name}/subscriptions":{"get":{"parameters":[{"description":"Name is the repo's org-unique handle, from the :name path segment. A\ntrailing \".git\" is stripped.","example":"widgets","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns a repo's Slack subscriptions — which channels the lifecycle notifier posts this repo's push and deploy events to."},"post":{"parameters":[{"description":"Name is the repo to subscribe, from the :name path segment.","example":"widgets","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/git.subscribeReq"}}}},"summary":"Binds a Slack channel to a repo, so the lifecycle notifier posts that repo's push and deploy events there."}},"/v1/git/repos/{name}/subscriptions/{id}":{"delete":{"parameters":[{"description":"Name is the repo, from the :name path segment.","example":"widgets","in":"path","name":"name","required":true,"schema":{"type":"string"}},{"description":"ID is the row to remove, from the :id path segment.","example":"sub_7c2e","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Removes one Slack subscription from a repo; the notifier stops posting that repo's events to that channel."}},"/v1/git/repos/{name}/targets":{"get":{"parameters":[{"description":"Name is the repo's org-unique handle, from the :name path segment. A\ntrailing \".git\" is stripped.","example":"widgets","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns a repo's outbound mirror targets — the downstream remotes the mirror reactor pushes to whenever a push lands here."},"post":{"parameters":[{"description":"Name is the repo whose advanced refs are pushed downstream, from the :name\npath segment.","example":"widgets","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/git.mirrorTargetReq"}}}},"summary":"Registers a downstream remote the repo's advanced refs are pushed to whenever a push lands here."}},"/v1/git/repos/{name}/targets/{id}":{"delete":{"parameters":[{"description":"Name is the repo, from the :name path segment.","example":"widgets","in":"path","name":"name","required":true,"schema":{"type":"string"}},{"description":"ID is the row to remove, from the :id path segment.","example":"mir_2d90","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Removes one outbound mirror target; later pushes stop being forwarded to it."}},"/v1/git/repos/{name}/tree":{"get":{"parameters":[{"description":"Name is the repo to read, from the :name path segment.","example":"widgets","in":"path","name":"name","required":true,"schema":{"type":"string"}},{"description":"Ref is a branch, tag or commit; empty means the repo's HEAD.","example":"main","in":"query","name":"ref","required":false,"schema":{"type":"string"}},{"description":"Path is repo-relative; empty is the tree root. Traversal is stripped.","example":"cmd","in":"query","name":"path","required":false,"schema":{"type":"string"}}],"summary":"Lists the immediate children of one directory at one revision, directories before files."}},"/v1/git/runners":{"get":{"summary":"Returns the daemons registered into this org's pools, newest first, with when each was last heard from."}},"/v1/git/runs":{"get":{"parameters":[{"description":"Repo restricts the listing to one repository. Empty lists the whole org.","in":"query","name":"repo","required":false,"schema":{"type":"string"}},{"description":"Limit caps the answer; 0 means the default of 50, and 200 is the ceiling.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns this org's runs, newest first."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/git.runStart"}}}},"summary":"Runs a repository's workflows at a ref, on demand."}},"/v1/git/runs/{id}":{"get":{"parameters":[{"description":"ID is the run to read, from the :id path segment.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one run."}},"/v1/git/usage":{"get":{"summary":"Returns per-repo and total storage bytes for the caller's org — the queryable, per-tenant number commerce and o11y meter on."}},"/v1/git/webhook":{"post":{"summary":"Retired — push-to-deploy has no inbound webhook"}},"/v1/git/workflows":{"get":{"parameters":[{"description":"Repo is the repository whose workflows to read.","in":"query","name":"repo","required":false,"schema":{"type":"string"}},{"description":"Ref is the branch to read them at; empty means the default.","in":"query","name":"ref","required":false,"schema":{"type":"string"}}],"summary":"Reports the workflows a repository declares at a ref and which declared pool would execute each job — the answer to \"would a push here run, and where\"."}},"/v1/git/workspace":{"post":{"summary":"Sets the org's code workspace up for the caller and answers it: the namespace, made when the org has none, and the caller's forge account and seat there."}},"/v1/git/{org}/{project}/{repo}/git-receive-pack":{"post":{"parameters":[{"in":"path","name":"org","required":true,"schema":{"type":"string"}},{"in":"path","name":"project","required":true,"schema":{"type":"string"}},{"in":"path","name":"repo","required":true,"schema":{"type":"string"}}],"summary":"Accept a push, and turn it into a build"}},"/v1/git/{org}/{project}/{repo}/git-upload-pack":{"post":{"parameters":[{"in":"path","name":"org","required":true,"schema":{"type":"string"}},{"in":"path","name":"project","required":true,"schema":{"type":"string"}},{"in":"path","name":"repo","required":true,"schema":{"type":"string"}}],"summary":"Serve a clone or fetch"}},"/v1/git/{org}/{project}/{repo}/info/refs":{"get":{"parameters":[{"in":"path","name":"org","required":true,"schema":{"type":"string"}},{"in":"path","name":"project","required":true,"schema":{"type":"string"}},{"in":"path","name":"repo","required":true,"schema":{"type":"string"}}],"summary":"Advertise a repository's refs to a git client"}},"/v1/git/{org}/{repo}":{"get":{"parameters":[{"in":"path","name":"org","required":true,"schema":{"type":"string"}},{"in":"path","name":"repo","required":true,"schema":{"type":"string"}}],"summary":"Open a repository's home page"}},"/v1/git/{org}/{repo}/commits":{"get":{"parameters":[{"in":"path","name":"org","required":true,"schema":{"type":"string"}},{"in":"path","name":"repo","required":true,"schema":{"type":"string"}}],"summary":"Read a repository's commit log"}},"/v1/git/{org}/{repo}/git-receive-pack":{"post":{"parameters":[{"in":"path","name":"org","required":true,"schema":{"type":"string"}},{"in":"path","name":"repo","required":true,"schema":{"type":"string"}}],"summary":"Accept a push, and turn it into a build"}},"/v1/git/{org}/{repo}/git-upload-pack":{"post":{"parameters":[{"in":"path","name":"org","required":true,"schema":{"type":"string"}},{"in":"path","name":"repo","required":true,"schema":{"type":"string"}}],"summary":"Serve a clone or fetch"}},"/v1/git/{org}/{repo}/info/refs":{"get":{"parameters":[{"in":"path","name":"org","required":true,"schema":{"type":"string"}},{"in":"path","name":"repo","required":true,"schema":{"type":"string"}}],"summary":"Advertise a repository's refs to a git client"}},"/v1/graph":{"get":{"parameters":[{"description":"Entity narrows to what was asserted ABOUT one entity. Absent matches every\nentity.","example":"acme/svc/api","in":"query","name":"entity","required":false,"schema":{"type":"string"}},{"description":"Relation narrows to one relation. Absent matches every relation.","in":"query","name":"relation","required":false,"schema":{"type":"string"}},{"description":"Value narrows to assertions pointing AT one value, which is how the edges\ninto an entity are read. A property's scalar is matched byte for byte and\nan edge's value by its key, folded as every key is.","in":"query","name":"value","required":false,"schema":{"type":"string"}},{"description":"AsOf bounds the read to statements begun by an instant of the world, RFC\n3339. Absent reads every instant.","in":"query","name":"as_of","required":false,"schema":{"type":"string"}},{"description":"AsKnown bounds the read to what this plane had heard by an instant, RFC\n3339. Absent reads everything it holds.","example":"2026-09-01T00:00:00Z","in":"query","name":"as_known","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many assertions come back. Absent, zero, or anything above\nthe walk ceiling is the ceiling.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the assertions recorded, every version, oldest first."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/graph.graphAssertIn"}}}},"summary":"Records a batch of assertions and counts what became of each."}},"/v1/graph/answer":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/graph.graphAnswerIn"}}}},"summary":"Answers a question from the whole graph and cites the assertions it rests on."}},"/v1/graph/communities":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/graph.graphCommunitiesIn"}}}},"summary":"Partitions the edge graph into sets of entities more densely connected to each other than to the rest."}},"/v1/graph/derive":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/graph.graphDeriveIn"}}}},"summary":"Concludes what the organization's rules derive from the graph, with a proof for every conclusion: the rule, and each support as the assertion in force it rests on or as the derived atom it is."}},"/v1/graph/diff":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/graph.graphDiffIn"}}}},"summary":"Reports what came into force, was superseded and was retracted between two points."}},"/v1/graph/erase":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/graph.graphEraseIn"}}}},"summary":"Removes every assertion that names an entity and returns a receipt."}},"/v1/graph/extract":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/graph.graphSourceIn"}}}},"summary":"Reads the relations a source states and returns them, recording nothing."}},"/v1/graph/graphql":{"get":{"summary":"Read the graph's GraphQL schema."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/graphQLIn"}}}},"summary":"Ask the graph in one request, traversing."}},"/v1/graph/ingest":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/graph.graphSourceIn"}}}},"summary":"Reads a source and records what it states, through the same admission as assert."}},"/v1/graph/neighbors":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/graph.graphNeighborsIn"}}}},"summary":"Walks the in-force edges from a set of seeds and lists every entity reached, bounded."}},"/v1/graph/path":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/graph.graphPathIn"}}}},"summary":"Finds the shortest chain of in-force edges from one entity to another."}},"/v1/graph/resolve":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/graph.graphResolveIn"}}}},"summary":"Answers what holds for one entity and relation at a point, winner first, with every weaker account that disagreed."}},"/v1/graph/search":{"get":{"parameters":[{"description":"Q is what to look for: words, matched as prefixes, all of them required.\nPunctuation is text here rather than syntax, so an entity key searches as\nitself.","example":"billing owner","in":"query","name":"q","required":true,"schema":{"type":"string"}},{"description":"Relation narrows to one relation. Absent matches every relation.","in":"query","name":"relation","required":false,"schema":{"type":"string"}},{"description":"AsOf bounds the search to statements begun by an instant of the world,\nRFC 3339. Absent searches every instant.","in":"query","name":"as_of","required":false,"schema":{"type":"string"}},{"description":"AsKnown bounds the search to what this plane had heard by an instant, RFC\n3339. Absent searches everything it holds.","in":"query","name":"as_known","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many assertions come back. Absent, zero, or anything above\nthe walk ceiling is the ceiling.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Finds assertions by their words, where read finds them by their keys, best match first."}},"/v1/graph/vocabulary":{"get":{"summary":"Lists the relations in use, the schema declared for them and the rule that settles a conflict."}},"/v1/guide":{"get":{"summary":"Returns the caller org's launch journey: the active curriculum's version and title, every step with its state, whether it is available, what blocks it and whether the Business AI can run it, the done/total/percent progress with the next step to take, and the org's analytics funnel folded in."}},"/v1/guide/actions":{"get":{"summary":"Returns the caller org's Business AI action ledger, most recent first: every \"do it for me\" tool call, the arguments it ran with, its result and whether it succeeded."}},"/v1/guide/analytics":{"get":{"summary":"Returns the caller org's funnel from the analytics lens plus the GTM recommendations derived from it."}},"/v1/guide/chat":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/guide.chatRequest"}}}},"summary":"Answers a founder's question about their launch journey as the Business AI coach: it grounds the reply in the org's REAL progress, its ranked available quests and its analytics funnel, and returns those candidate quests alongside so the caller can act on one."}},"/v1/guide/curriculum":{"delete":{"summary":"Clears the caller org's curriculum override and returns the journey it falls back to — the brand blueprint, else the embedded fixture."},"get":{"summary":"Returns the journey the caller's org is actually running, and whether it comes from the org's OWN override (custom) or from the platform default — the brand blueprint, else the embedded fixture."},"put":{"summary":"Replace your org's journey with a curriculum you author"}},"/v1/guide/profile":{"get":{"summary":"Returns the caller org's OBSERVED growth profile — the signal set, the classified growth stage, and the org's own key metrics."}},"/v1/guide/steps/{id}/do":{"post":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Have the Business AI actually do the step for you"}},"/v1/guide/steps/{id}/done":{"post":{"parameters":[{"description":"ID is the step's id, as it appears in the journey (e.g. \"gsuite\").","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Marks one step of the caller org's journey complete and returns the refreshed journey."}},"/v1/guide/steps/{id}/reset":{"post":{"parameters":[{"description":"ID is the step's id, as it appears in the journey (e.g. \"gsuite\").","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one step of the caller org's journey to todo — clearing a manual mark or a skip — and returns the refreshed journey."}},"/v1/guide/steps/{id}/skip":{"post":{"parameters":[{"description":"ID is the step's id, as it appears in the journey (e.g. \"gsuite\").","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Marks one step of the caller org's journey skipped and returns the refreshed journey."}},"/v1/guide/steps/{id}/start":{"post":{"parameters":[{"description":"ID is the step's id, as it appears in the journey (e.g. \"gsuite\").","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Marks one step of the caller org's journey in progress and returns the refreshed journey."}},"/v1/guide/strategies":{"get":{"parameters":[{"description":"Category filters to tactics in exactly this category.","example":"viral-coefficient","in":"query","name":"category","required":false,"schema":{"type":"string"}},{"description":"Stage previews the corpus at a chosen growth stage\n(research|formed|launched|activated|scaling), overriding the org's observed\none. An unknown value is ignored and the observed stage stands.","example":"scaling","in":"query","name":"stage","required":false,"schema":{"type":"string"}},{"description":"Workload filters to tactics with exactly this workload.","in":"query","name":"workload","required":false,"schema":{"type":"string"}}],"summary":"Returns the ENABLED tactics corpus for the caller's org: the tactics library narrowed by the explicit category/workload filters AND by the org's OBSERVED growth stage and capability signals (a tactic's tags are preconditions, so it surfaces only once the org can act on it)."}},"/v1/guide/suggest":{"get":{"summary":"Returns the caller org's next-best quests: the available, non-terminal steps of its journey ranked by how much downstream work each unblocks, each with the grounded reason it is a good next move and whether the Business AI can run it, plus the org's funnel and the GTM recommendations derived from it."}},"/v1/help/articles":{"get":{"parameters":[{"description":"Category narrows the list to one knowledge-base section, matched against\nthe article's category by exact name. Empty lists every section.","in":"query","name":"category","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many articles are returned. Anything that is not a positive\ninteger uses 50, and values above 200 are clamped to 200.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns the public knowledge base: the help center's Published, publicly-visible articles as cards."}},"/v1/help/articles/{slug}":{"get":{"parameters":[{"description":"Slug is the article's public identifier, from the path. It IS the document\nname in the help center's store.","in":"path","name":"slug","required":true,"schema":{"type":"string"}}],"summary":"Returns one public article by slug, with its body."}},"/v1/help/categories":{"get":{"summary":"Returns the knowledge-base sections for the public center's navigation — but ONLY the sections that front at least one Published, public article, so an internal (agent-only) category name or description never leaks."}},"/v1/help/tickets":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/help.helpTicketIntake"}}}},"summary":"Files a customer support ticket into the public help center."}},"/v1/iam/.well-known/jwks":{"get":{"summary":"Publishes the public keys that verify the tokens issued here — the one URL you point a service at so it can check a token itself, offline, without calling back and without holding any secret of ours."}},"/v1/iam/.well-known/oauth-authorization-server":{"get":{"summary":"Returns the OpenID Connect discovery document — the one URL you point a standards-compliant client at so it can find every other endpoint on its own, instead of you configuring them by hand."}},"/v1/iam/.well-known/openid-configuration":{"get":{"summary":"Returns the OpenID Connect discovery document — the one URL you point a standards-compliant client at so it can find every other endpoint on its own, instead of you configuring them by hand."}},"/v1/iam/account":{"get":{"summary":"Returns the signed-in person's own account and the organization they belong to — what a console reads to draw the account menu."},"put":{"parameters":[{"in":"header","name":"Cookie","required":false,"schema":{"type":"string"}},{"in":"header","name":"Authorization","required":false,"schema":{"type":"string"}},{"in":"header","name":"Sec-Fetch-Site","required":false,"schema":{"type":"string"}},{"in":"header","name":"Origin","required":false,"schema":{"type":"string"}},{"in":"header","name":"Host","required":false,"schema":{"type":"string"}},{"in":"header","name":"Content-Type","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.accountBody"}}}},"summary":"Saves the calling person's own profile — the name they are shown by, their picture, a line about themselves and a link."}},"/v1/iam/accounts":{"get":{"summary":"Returns the people signed in on this browser, the most recent sign-in first — what the sign-in page lists when an application asks the person to choose an account."}},"/v1/iam/admin/applications/upsert":{"post":{"parameters":[{"in":"header","name":"Authorization","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.registration"}}}},"summary":"Creates an application or updates it in place, so a deployment can declare the applications it needs and run the same declaration on every environment and on every redeploy."}},"/v1/iam/admin/provision":{"post":{"summary":"Founds an org on someone's behalf — the same onboarding a person gets themselves, driven by one of your own services instead of by them."}},"/v1/iam/admin/users/upsert":{"post":{"parameters":[{"in":"header","name":"Authorization","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.person"}}}},"summary":"Creates a person or updates them in place, so a deployment can declare the accounts it needs and re-run that declaration safely."}},"/v1/iam/applications":{"get":{"parameters":[{"in":"query","name":"owner","required":true,"schema":{"type":"string"}}],"summary":"Returns the applications in one organization, newest first — each product or site your people sign in to, with the sign-in methods and redirect URIs it allows."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.Application"}}}},"summary":"Registers an application in your organization — one product or site your people sign in to, with its own client credentials, sign-in methods and allowed redirect URIs."}},"/v1/iam/applications/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Removes an application."},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one application: its sign-in methods, its allowed redirect URIs and the client credentials your integration authenticates with."},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.Application"}}}},"summary":"Changes an application's display, its sign-in methods and the redirect URIs it may return to — the call that makes login work from a new host."}},"/v1/iam/audit-logs":{"get":{"parameters":[{"in":"query","name":"owner","required":false,"schema":{"type":"string"}}],"summary":"Returns your organization's audit trail, newest first — who did what, when, and from where."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.auditlogs.Input"}}}},"summary":"Records an audit entry, so activity from your own systems lands in the same trail as everything the Hanzo Cloud records for you."}},"/v1/iam/audit-logs/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Removes an audit entry."},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one audit entry in full: the action, the person or key behind it, and the request it came in on."},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.auditlogs.Input"}}}},"summary":"Corrects an audit entry."}},"/v1/iam/auth/application":{"get":{"parameters":[{"description":"ClientId is the application's OAuth client id — the one field that selects\nwhich login screen this is.","in":"query","name":"clientId","required":false,"schema":{"type":"string"}},{"description":"ResponseType is the OAuth response type the screen will ask for. Only \"code\"\nis served; anything else is refused here rather than at the authorize leg,\nwhere the person has already typed a password.","in":"query","name":"responseType","required":false,"schema":{"type":"string"}}],"summary":"Returns everything a login screen needs to draw itself for one application: its branding, and each sign-in method it offers with the provider details that method needs."}},"/v1/iam/auth/identifier":{"post":{"parameters":[{"in":"header","name":"CF-Connecting-IP","required":false,"schema":{"type":"string"}},{"in":"header","name":"X-Forwarded-For","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.identifierBody"}}}},"summary":"Answers whether an account holds an email address at an application, and whether that account signs in with a password."}},"/v1/iam/auth/methods":{"get":{"parameters":[{"description":"ClientId is the application's OAuth client id.","in":"query","name":"clientId","required":false,"schema":{"type":"string"}}],"summary":"Returns the sign-in methods one application actually has switched on, so a login screen can render the right buttons for it without you hard-coding a list that drifts the moment you add a provider."}},"/v1/iam/certs":{"get":{"parameters":[{"in":"query","name":"owner","required":false,"schema":{"type":"string"}}],"summary":"Returns your organization's signing certificates, newest first — the keys the tokens your applications verify are signed with."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.Cert"}}}},"summary":"Adds a signing certificate your applications can verify tokens against — the call you make to stage the next one before a rotation."}},"/v1/iam/certs/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Removes a signing certificate."},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one signing certificate — its algorithm, its validity window and its public half."},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.Cert"}}}},"summary":"Changes a signing certificate's settings."}},"/v1/iam/consent":{"get":{"summary":"Returns the calling person's own privacy and communication choices."},"put":{"summary":"Records the calling person's privacy and communication choices."}},"/v1/iam/delete-membership":{"post":{"summary":"Takes away a person's or an application's right to act in an organization."}},"/v1/iam/invitations":{"get":{"parameters":[{"in":"query","name":"owner","required":false,"schema":{"type":"string"}}],"summary":"Returns your organization's invitations, newest first — who has been asked to join, on what terms, and how many seats each invitation still has left."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.invitations.Input"}}}},"summary":"Issues an invitation to join your organization — the code or link a new member redeems, with the role they arrive holding and the date it stops working."}},"/v1/iam/invitations/accept":{"post":{"parameters":[{"in":"header","name":"Cookie","required":false,"schema":{"type":"string"}},{"in":"header","name":"Authorization","required":false,"schema":{"type":"string"}},{"in":"header","name":"Sec-Fetch-Site","required":false,"schema":{"type":"string"}},{"in":"header","name":"Origin","required":false,"schema":{"type":"string"}},{"in":"header","name":"Host","required":false,"schema":{"type":"string"}},{"in":"header","name":"Content-Type","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.acceptBody"}}}},"summary":"Joins the caller to an organization through an invitation, for a person who already has an account."}},"/v1/iam/invitations/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Withdraws an invitation."},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one invitation: who it is for, what it grants on acceptance, and when it expires."},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.invitations.Input"}}}},"summary":"Changes an invitation's terms — the role it grants, how many may redeem it, or when it expires."}},"/v1/iam/invitations/{owner}/{name}/send":{"post":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}},{"in":"header","name":"Authorization","required":false,"schema":{"type":"string"}}],"summary":"Emails an invitation to the address it is pinned to: who invited them, to which organization, and the link that joins them."}},"/v1/iam/keys":{"get":{"parameters":[{"in":"query","name":"owner","required":false,"schema":{"type":"string"}}],"summary":"Returns the API keys of an organization that you may see, newest first — what each is called, what it may reach, its publishable half, and when it was last used."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.Key"}}}},"summary":"Issues an API key."}},"/v1/iam/keys/org":{"get":{"summary":"Resolve a PUBLISHABLE key to the organization that owns it"}},"/v1/iam/keys/principal":{"get":{"summary":"Resolve a SECRET key to the principal it authenticates"}},"/v1/iam/keys/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Revokes an API key."},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one API key: what it is called, what it may reach, and when it was issued."},"put":{"parameters":[{"description":"Owner is the tenant that holds the key; Name is unique within Owner.","in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.Key"}}}},"summary":"Changes what a key is called, what it may reach, when it expires, or revokes it."}},"/v1/iam/link":{"get":{"summary":"Continues a link in the browser of the person it is for: the browser opens the address POST /v1/iam/link answered, as a top-level navigation, signed in here as that person, and is sent on to the provider."},"post":{"summary":"Starts connecting another sign-in identity to the account you are already signed in as."}},"/v1/iam/linked-accounts":{"get":{"summary":"Returns the sign-in identities linked to the calling person's account — every provider they can currently sign in with."}},"/v1/iam/login":{"post":{"summary":"Signs a person in with the credential they typed, and — when the request is part of an OAuth flow — hands back the one-time code that finishes it."}},"/v1/iam/memberships":{"get":{"parameters":[{"description":"User is \"<homeOrg>/<username>\" — which organizations that identity may act in.","in":"query","name":"user","required":false,"schema":{"type":"string"}},{"description":"Org is an organization — who may act in it.","in":"query","name":"org","required":false,"schema":{"type":"string"}}],"summary":"Answers either question about who belongs where: which organizations one person can act in, or who can act in one organization."},"post":{"summary":"Lets a person or an application act in an organization."}},"/v1/iam/mfa":{"delete":{"summary":"Turns a factor off, so sign-in stops asking for it."}},"/v1/iam/mfa/preferred":{"post":{"summary":"Picks which second factor an account is asked for first when it has more than one."}},"/v1/iam/mfa/setup/enable":{"post":{"summary":"Finishes the enrolment: from here the account's sign-ins ask for this factor."}},"/v1/iam/mfa/setup/initiate":{"post":{"summary":"Starts enrolling a factor and hands over whatever the person needs to prove they hold it: app a fresh secret and the otpauth:// URL to render as a QR code sms a code texted to the number on the account email a code mailed to the address on the account Nothing is switched on yet, so abandoning this step leaves the account exactly as it was."}},"/v1/iam/oauth/authorize":{"get":{"summary":"Starts a sign-in — the address you send a browser to, and the beginning of every OAuth and OpenID Connect flow."},"post":{"summary":"Starts a sign-in — the address you send a browser to, and the beginning of every OAuth and OpenID Connect flow."}},"/v1/iam/oauth/callback":{"get":{"summary":"Completes the round-trip: it resolves and burns the single-use transaction (checking expiry + browser binding), exchanges and verifies the IdP response, links or provisions the local user, and mints the iam authorization code the relying party expects — then redirects to the original redirect_uri with code + state."},"post":{"summary":"Completes the round-trip: it resolves and burns the single-use transaction (checking expiry + browser binding), exchanges and verifies the IdP response, links or provisions the local user, and mints the iam authorization code the relying party expects — then redirects to the original redirect_uri with code + state."}},"/v1/iam/oauth/delegation/keys":{"get":{"summary":"Serves the public half of every delegation key, as a JWKS, to a confidential client allowed to delegate — the one resource server that verifies what it is handed, reading with the credential it delegates with."}},"/v1/iam/oauth/device":{"post":{"summary":"Starts a sign-in on a device with no browser and no keyboard — a TV, a CLI, a headless box."}},"/v1/iam/oauth/device/info":{"post":{"summary":"Answers \"what am I approving?\" for a pending device code."}},"/v1/iam/oauth/federation/mfa":{"post":{"summary":"Completes a sign-in that came in through another identity provider and still owes a second factor."}},"/v1/iam/oauth/introspect":{"post":{"summary":"Answers whether an access token is still good, and what it is good for — the check a resource server of yours makes before honouring a token it did not mint."}},"/v1/iam/oauth/logout":{"get":{"summary":"Ends a sign-in and sends the browser somewhere sensible."},"post":{"summary":"Ends a sign-in and sends the browser somewhere sensible."}},"/v1/iam/oauth/refresh_token":{"post":{"summary":"Exchanges what your application is holding for the tokens it needs — the one-time code from a finished sign-in, a refresh token, or your own client credentials when the caller is a program rather than a person."}},"/v1/iam/oauth/revoke":{"post":{"summary":"Retires a token before it expires — what you call when someone signs out or a credential may have leaked."}},"/v1/iam/oauth/token":{"post":{"summary":"Exchanges what your application is holding for the tokens it needs — the one-time code from a finished sign-in, a refresh token, or your own client credentials when the caller is a program rather than a person."}},"/v1/iam/oauth/userinfo":{"get":{"summary":"Returns the profile claims for whoever the access token belongs to — the standard OpenID Connect way to find out who is calling you without your application storing anything itself."},"post":{"summary":"Returns the profile claims for whoever the access token belongs to — the standard OpenID Connect way to find out who is calling you without your application storing anything itself."}},"/v1/iam/onboard":{"post":{"summary":"Finishes setting up the account of whoever is calling — it creates their organization if they have none and puts them in it, so a person who has just signed up lands somewhere they can work."}},"/v1/iam/organizations":{"get":{"parameters":[{"in":"header","name":"X-Forwarded-For","required":false,"schema":{"type":"string"}},{"in":"query","name":"q","required":false,"schema":{"type":"string"}},{"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}},{"in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"summary":"Returns the organizations you can act in, the ones you belong to first and the rest after, newest first, narrowed by an optional query against the name or the display name."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.CreateOrganizationInput"}}}},"summary":"Makes a new organization — the account your users, applications, roles, projects and workspaces are all named inside."}},"/v1/iam/organizations/avatar":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.SetAvatarInput"}}}},"summary":"Changes how an organization appears across Hanzo: the square mark beside its name, as an uploaded image or as a single emoji."}},"/v1/iam/organizations/profile":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.SetProfileInput"}}}},"summary":"Changes how an organization reads: its display name, its website and its favicon."}},"/v1/iam/organizations/tombstones/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Frees the name of a deleted organization so it can be founded again."},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns what holds a deleted organization's name: when it was deleted and who founded it."}},"/v1/iam/organizations/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Removes an organization and everything named inside it."},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one organization: its display, its defaults and the sign-in rules everyone in it inherits."},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.UpdateOrganizationInput"}}}},"summary":"Changes an organization's display, its defaults and the sign-in rules everyone in it inherits."}},"/v1/iam/password":{"put":{"parameters":[{"in":"header","name":"Cookie","required":false,"schema":{"type":"string"}},{"in":"header","name":"Authorization","required":false,"schema":{"type":"string"}},{"in":"header","name":"Sec-Fetch-Site","required":false,"schema":{"type":"string"}},{"in":"header","name":"Origin","required":false,"schema":{"type":"string"}},{"in":"header","name":"Host","required":false,"schema":{"type":"string"}},{"in":"header","name":"Content-Type","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.passwordBody"}}}},"summary":"Replaces the calling person's password."}},"/v1/iam/permissions":{"get":{"parameters":[{"in":"query","name":"owner","required":false,"schema":{"type":"string"}}],"summary":"Returns the permissions in one organization, newest first — each one a grant saying which people or roles may do what, and to which resources."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.Permission"}}}},"summary":"Grants a permission — the call that gives a person or a role the ability to do something."}},"/v1/iam/permissions/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Revokes a permission."},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one permission: who it grants to, what it allows, and the resources it covers."},"put":{"parameters":[{"description":"Identity — the (owner, name) natural key.","in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.Permission"}}}},"summary":"Changes who a permission grants to, what it allows, or the resources it covers."}},"/v1/iam/preferences":{"post":{"summary":"Saves the calling person's own settings and returns the full set afterwards."}},"/v1/iam/projects":{"get":{"parameters":[{"in":"query","name":"owner","required":false,"schema":{"type":"string"}}],"summary":"Returns your organization's projects, newest first — the scope people pick between when their work is separated by product or client rather than by team."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.projects.Input"}}}},"summary":"Makes a project inside your organization — the scope people pick between when their work is separated by product or client rather than by team."}},"/v1/iam/projects/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Removes a project."},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one project: what it is called and how it is set up."},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.projects.Input"}}}},"summary":"Changes a project's settings."}},"/v1/iam/providers":{"get":{"parameters":[{"in":"query","name":"owner","required":false,"schema":{"type":"string"}}],"summary":"Returns your organization's providers, newest first — the identity providers your people sign in with, and the senders and connectors your applications go through."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.Provider"}}}},"summary":"Adds an identity provider your people can sign in with, or a service your applications send through — a social or enterprise login, an email or SMS sender, a storage or payment connector."}},"/v1/iam/providers/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Removes a provider."},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one provider: what it connects to and how it is configured."},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.Provider"}}}},"summary":"Changes a provider's settings or rotates the credentials it holds."}},"/v1/iam/registry/jwks":{"get":{"summary":"Publishes the public key your registry uses to verify the tokens issued above — the one URL to configure so the registry trusts logins without holding any secret of its own."}},"/v1/iam/registry/token":{"get":{"summary":"Signs a container client in to your registry."},"post":{"summary":"Signs a container client in to your registry."}},"/v1/iam/roles":{"get":{"parameters":[{"in":"query","name":"owner","required":false,"schema":{"type":"string"}}],"summary":"Returns your organization's roles, newest first — each a named group of people that permissions are granted to."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.Input"}}}},"summary":"Makes a role — a named group of people that permissions are granted to."}},"/v1/iam/roles/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Removes a role."},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one role: who is in it, and the roles it includes."},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"description":"Name addresses the team on update and names it on create; every other\nfield is content and binds from the BODY, never the URL.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.Input"}}}},"summary":"Changes who is in a role, or which roles it includes."}},"/v1/iam/scim/v2/ResourceTypes":{"get":{"summary":"Returns the kinds of record this directory provisions and the address of each, so your identity provider discovers them rather than having them configured by hand."}},"/v1/iam/scim/v2/ResourceTypes/{name}":{"get":{"parameters":[{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one provisionable record kind in full."}},"/v1/iam/scim/v2/Schemas":{"get":{"summary":"Returns the attribute definitions this directory understands, so your identity provider knows which fields it may send and what they mean before it sends any."}},"/v1/iam/scim/v2/Schemas/{id}":{"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one attribute definition in full."}},"/v1/iam/scim/v2/ServiceProviderConfig":{"get":{"summary":"Tells your identity provider which parts of SCIM this directory supports, so it configures itself instead of you filling in a form."}},"/v1/iam/scim/v2/Users":{"get":{"summary":"Returns the people in your organization to your identity provider, in the standard SCIM shape, so an IdP can reconcile its directory against ours."},"post":{"summary":"Provisions a person from your identity provider — how a new hire gets an account here automatically when they are added over there."}},"/v1/iam/scim/v2/Users/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Deprovisions a person — how removing someone in your identity provider removes their access here."},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one person in the standard SCIM shape."},"patch":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Applies a partial change from your identity provider — one attribute moved, not the whole record resent."},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Overwrites a person's SCIM attributes with what your identity provider sends — how a change made there lands here."}},"/v1/iam/service-accounts":{"get":{"parameters":[{"description":"Organization is the organization whose service accounts to list. Required.","in":"query","name":"organization","required":false,"schema":{"type":"string"}},{"description":"P is the 1-indexed page to return. Paging takes both p and pageSize —\nleave either out, or send something that is not a number, and the whole\nlist comes back.","in":"query","name":"p","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Size is how many accounts a page holds.","in":"query","name":"pageSize","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns your organization's service accounts — what each is called and when it was created."},"post":{"summary":"Makes a service account — an identity for a program rather than a person, for a script, a bot or a deployment that has to authenticate on its own."}},"/v1/iam/service-accounts/{name}":{"delete":{"parameters":[{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Serves DELETE /v1/iam/service-accounts/:name."}},"/v1/iam/service-accounts/{name}/keys":{"post":{"parameters":[{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Serves POST /v1/iam/service-accounts/:name/keys: mint a fresh key, invalidating the prior one, and return the new raw secret exactly once."}},"/v1/iam/sessions":{"get":{"parameters":[{"in":"query","name":"owner","required":false,"schema":{"type":"string"}},{"in":"query","name":"name","required":false,"schema":{"type":"string"}},{"in":"query","name":"application","required":false,"schema":{"type":"string"}}],"summary":"Returns who is currently signed in to an organization, newest first, and can be narrowed to one person or one application."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.CreateSessionIn"}}}},"summary":"Records a sign-in and answers with the cookie id it minted."}},"/v1/iam/sessions/{owner}/{name}/{application}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}},{"in":"path","name":"application","required":true,"schema":{"type":"string"}}],"summary":"Signs a person out of one application — the session ends and every browser carrying it stops being authenticated."},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}},{"in":"path","name":"application","required":true,"schema":{"type":"string"}}],"summary":"Returns one person's session in one application — when it began and which browsers or devices are still carrying it."},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}},{"in":"path","name":"application","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.UpdateSessionIn"}}}},"summary":"Names the browsers a session keeps — signing out the ones you leave off while the session itself stays live."}},"/v1/iam/signin":{"post":{"summary":"Completes a sign-in: it exchanges the one-time code your application was handed at the end of the login flow for a live session, and returns the signed-in account."}},"/v1/iam/signup":{"post":{"summary":"Creates an account from the sign-up form and applies the application's own sign-up rules — whether self-service registration is open at all, and which fields it requires."}},"/v1/iam/teams":{"get":{"summary":"Returns your organization's teams, newest first — each a named set of people that roles and permissions are granted to."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.teams.Input"}}}},"summary":"Makes a team — a named set of people that roles and permissions grant to."}},"/v1/iam/teams/{name}":{"delete":{"parameters":[{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Removes a team."},"get":{"parameters":[{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one team: who is in it."},"put":{"parameters":[{"description":"Name addresses the team on update and names it on create; every other\nfield is content and binds from the BODY, never the URL.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.teams.Input"}}}},"summary":"Changes who is in a team."}},"/v1/iam/terms":{"put":{"parameters":[{"in":"header","name":"Cookie","required":false,"schema":{"type":"string"}},{"in":"header","name":"Authorization","required":false,"schema":{"type":"string"}},{"in":"header","name":"Sec-Fetch-Site","required":false,"schema":{"type":"string"}},{"in":"header","name":"Origin","required":false,"schema":{"type":"string"}},{"in":"header","name":"Host","required":false,"schema":{"type":"string"}},{"in":"header","name":"Content-Type","required":false,"schema":{"type":"string"}},{"in":"header","name":"X-Forwarded-For","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.termsBody"}}}},"summary":"Records that the signed-in caller accepted the terms and the acceptable use policy, at the versions named."}},"/v1/iam/tokens":{"get":{"parameters":[{"in":"query","name":"owner","required":false,"schema":{"type":"string"}},{"in":"query","name":"organization","required":false,"schema":{"type":"string"}}],"summary":"Returns the access tokens issued in your organization, newest first, and can be narrowed to one organization."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.Token"}}}},"summary":"Records an access token — the credential an application or integration presents on a caller's behalf."}},"/v1/iam/tokens/issue":{"post":{"summary":"Mints an access token for the `?id=<owner>/<name>` target user (optional `?aud=` resource, RFC 8707), issued by the authenticated + allow-listed confidential client."}},"/v1/iam/tokens/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Revokes an access token."},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one access token: who and what it was issued to, and when it expires."},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.Token"}}}},"summary":"Changes an access token's scope or expiry."}},"/v1/iam/unlink":{"post":{"summary":"Disconnects one sign-in identity from an account, so that provider can no longer be used to sign in as that person."}},"/v1/iam/users":{"get":{"parameters":[{"in":"query","name":"owner","required":false,"schema":{"type":"string"}},{"description":"Email narrows the page to the accounts carrying one address. Looking a\nperson up by their address is a QUERY over the collection, not an item\nread: an address is not the natural key, two rows in one org can carry\none, and a caller that gets a page SEES both — where a single-item read\nwould have to choose, and choosing is how somebody joins a team under a\ncolleague's identity.","in":"query","name":"email","required":false,"schema":{"type":"string"}},{"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}},{"in":"query","name":"offset","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns a page of the people in an organization, with the total so you can page through the rest."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.CreateInput"}}}},"summary":"Adds a person to your organization."}},"/v1/iam/users/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Removes a person from your organization."},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}},{"in":"query","name":"email","required":false,"schema":{"type":"string"}}],"summary":"Returns one person in your organization, addressed by their username or by their email address."},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.UpdateInput"}}}},"summary":"Changes a person's profile, their roles, or the credentials they sign in with."}},"/v1/iam/users/{owner}/{name}/keys":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Clears the target user's key of the requested TYPE (immediate revoke)."},"post":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"(re)generates the target user's key of the requested TYPE and returns it once, over the shared authorizeMinter + mintTarget seam."}},"/v1/iam/verification-codes":{"post":{"summary":"Validates the request and asks otp to get a code to the person."}},"/v1/iam/web3/nonce":{"get":{"summary":"Starts a wallet sign-in: it returns a one-time challenge for the wallet to sign."}},"/v1/iam/web3/verify":{"post":{"summary":"Completes a wallet sign-in: it verifies the signed challenge and, if it holds, signs the wallet's owner in."}},"/v1/iam/webauthn-credentials":{"get":{"parameters":[{"in":"query","name":"user","required":false,"schema":{"type":"string"}}],"summary":"Returns the passkeys and security keys registered to one person, newest first — which device each lives on and when it was registered."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.WebauthnCredential"}}}},"summary":"Registers a passkey or security key for a person, so they can sign in with their device instead of a password."}},"/v1/iam/webauthn-credentials/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Removes a passkey or security key — what you call when a device is lost."},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one passkey or security key: whose it is, what device it lives on, and when it was registered."},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.WebauthnCredential"}}}},"summary":"Renames a registered passkey or security key, so a person can tell their devices apart."}},"/v1/iam/webauthn/signin/begin":{"get":{"summary":"Starts a passkey sign-in: it returns the challenge the person's authenticator signs."}},"/v1/iam/webauthn/signin/finish":{"post":{"summary":"Verifies the signed challenge and signs the person in."}},"/v1/iam/webauthn/signup/begin":{"get":{"summary":"Starts enrolling a passkey for the signed-in person: it returns the options their browser hands to the authenticator."}},"/v1/iam/webauthn/signup/finish":{"post":{"summary":"Verifies the newly created passkey and stores it, so the person can sign in with their device from then on."}},"/v1/iam/whoami":{"get":{"summary":"Tells you who the current caller is — the lightweight check a page makes on load to decide whether to render signed-in or signed-out."}},"/v1/iam/workspaces":{"get":{"parameters":[{"in":"query","name":"owner","required":false,"schema":{"type":"string"}}],"summary":"Returns your organization's workspaces, newest first — the scope a team works in, alongside projects rather than instead of them."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.workspaces.Input"}}}},"summary":"Makes a workspace inside your organization — the scope a team works in, alongside projects rather than instead of them."}},"/v1/iam/workspaces/{owner}/{name}":{"delete":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Removes a workspace."},"get":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one workspace: what it is called and how it is set up."},"put":{"parameters":[{"in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/iam.workspaces.Input"}}}},"summary":"Changes a workspace's settings."}},"/v1/images/generations":{"post":{"summary":"Implements POST /v1/images/generations (OpenAI-compatible)."}},"/v1/index/health":{"get":{"summary":"Reports whether the search plane can serve."}},"/v1/index/indexes":{"get":{"summary":"Lists the indexes your org holds."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/index.indexNew"}}}},"summary":"Creates an index."}},"/v1/index/indexes/{uid}":{"delete":{"parameters":[{"in":"path","name":"uid","required":true,"schema":{"type":"string"}}],"summary":"Deletes an index and everything in it."},"get":{"parameters":[{"in":"path","name":"uid","required":true,"schema":{"type":"string"}}],"summary":"Reads one index's definition."}},"/v1/index/indexes/{uid}/documents":{"get":{"parameters":[{"in":"path","name":"uid","required":true,"schema":{"type":"string"}},{"in":"query","name":"limit","required":false,"schema":{"type":"string"}},{"in":"query","name":"offset","required":false,"schema":{"type":"string"}}],"summary":"Pages through the documents in an index."},"post":{"parameters":[{"in":"path","name":"uid","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"items":{},"type":"array"},{}]}}}},"summary":"Add or replace documents in an index"},"put":{"parameters":[{"in":"path","name":"uid","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"items":{},"type":"array"},{}]}}}},"summary":"Add or update documents in an index"}},"/v1/index/indexes/{uid}/documents/delete-batch":{"post":{"parameters":[{"in":"path","name":"uid","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{},"type":"array"}}}},"summary":"Delete many documents by primary key in one call"}},"/v1/index/indexes/{uid}/documents/{id}":{"delete":{"parameters":[{"in":"path","name":"uid","required":true,"schema":{"type":"string"}},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Deletes one document by its primary key."},"get":{"parameters":[{"in":"path","name":"uid","required":true,"schema":{"type":"string"}},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Reads one document by its primary key."}},"/v1/index/indexes/{uid}/search":{"post":{"parameters":[{"in":"path","name":"uid","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/index.indexQuery"}}}},"summary":"Searches an index, forgiving typos."}},"/v1/index/indexes/{uid}/settings":{"get":{"parameters":[{"in":"path","name":"uid","required":true,"schema":{"type":"string"}}],"summary":"Reads an index's filterable attributes."},"patch":{"parameters":[{"in":"path","name":"uid","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/index.indexFilter"}}}},"summary":"Sets which attributes an index can be filtered on."}},"/v1/index/stats":{"get":{"summary":"Counts the documents in each of your indexes."}},"/v1/index/tasks/{uid}":{"get":{"parameters":[{"in":"path","name":"uid","required":true,"schema":{"format":"int64","type":"integer"}}],"summary":"Checks a write task, which has already finished."}},"/v1/index/version":{"get":{"summary":"Identifies the search implementation answering."}},"/v1/ingress/middlewares":{"get":{"summary":"Returns every edge transform the caller's org has configured, ordered by id."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ingress.Middleware"}}}},"summary":"Creates or replaces one edge transform and hot-applies it."}},"/v1/ingress/middlewares/{id}":{"delete":{"parameters":[{"description":"ID is the object to act on, from the path.","example":"strip-api","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Removes one of the caller org's edge transforms and hot-applies the change."},"get":{"parameters":[{"description":"ID is the object to act on, from the path.","example":"strip-api","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one of the caller org's edge transforms by id."},"put":{"parameters":[{"description":"ID identifies the transform within the org: [A-Za-z0-9-_.], at most 128\nchars. A create that omits it gets a generated one. Routes reference it by\nthis id.","example":"strip-api","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ingress.Middleware"}}}},"summary":"Creates or replaces one edge transform and hot-applies it."}},"/v1/ingress/routes":{"get":{"summary":"Returns every routing rule the caller's org has configured, ordered by id."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ingress.Route"}}}},"summary":"Creates or replaces one routing rule and hot-applies the new table — there is no config file and no restart."}},"/v1/ingress/routes/{id}":{"delete":{"parameters":[{"description":"ID is the object to act on, from the path.","example":"web","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Removes one of the caller org's routing rules and hot-applies the shrunken table, freeing its host for another claim."},"get":{"parameters":[{"description":"ID is the object to act on, from the path.","example":"a1b2c3d4e5f60718","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one of the caller org's routing rules by id."},"put":{"parameters":[{"description":"ID identifies the route within the org: [A-Za-z0-9-_.], at most 128 chars.\nA create that omits it gets a generated one.","example":"web","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ingress.Route"}}}},"summary":"Creates or replaces one routing rule and hot-applies the new table — there is no config file and no restart."}},"/v1/ingress/services":{"get":{"summary":"Returns every backend pool the caller's org has configured, ordered by id."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ingress.Upstream"}}}},"summary":"Creates or replaces one backend pool and hot-applies it."}},"/v1/ingress/services/{id}":{"delete":{"parameters":[{"description":"ID is the object to act on, from the path.","example":"app-pool","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Removes one of the caller org's backend pools and hot-applies the change."},"get":{"parameters":[{"description":"ID is the object to act on, from the path.","example":"app-pool","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one of the caller org's backend pools by id."},"put":{"parameters":[{"description":"ID identifies the pool within the org: [A-Za-z0-9-_.], at most 128 chars.\nA create that omits it gets a generated one. Routes reference it by this id.","example":"app-pool","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ingress.Upstream"}}}},"summary":"Creates or replaces one backend pool and hot-applies it."}},"/v1/ingress/status":{"get":{"summary":"Reports the ingress edge's live posture: the role this instance runs in (app or edge), whether its listeners are bound and on which addresses, the ACME posture (staging flag and certificate cache directory), how many hosts the compiled route table currently serves, and how many the ACME HostPolicy will issue a certificate for."}},"/v1/ingress/tls":{"get":{"summary":"Returns the caller org's ACME intent together with the edge-wide TLS facts it lands in: which role this instance runs in, whether its listeners are bound, every host the ACME HostPolicy will issue a certificate for (the union across ALL orgs of TLS-marked routes and configured extraHosts, because one process holds one certificate cache), and the ACME directory and account email the process was started with."},"put":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ingress.TLSConfig"}}}},"summary":"Replaces the caller org's ACME intent and hot-applies what can be hot-applied."}},"/v1/kms/auth/login":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/kms.kmsLogin"}}}},"summary":"Exchanges a machine credential for an IAM bearer token."}},"/v1/kms/config":{"get":{"summary":"Returns the runtime configuration for the KMS console."}},"/v1/kms/health":{"get":{"summary":"Reports whether this broker can actually serve secrets."}},"/v1/kms/secrets":{"get":{"parameters":[{"description":"Env selects the environment, which is part of a secret's storage key.\nOMITTED means EVERY environment — this is the enumeration surface, so it\nmust be able to answer \"what is in here\" without being told where to look.","in":"query","name":"env","required":false,"schema":{"type":"string"}},{"description":"Environment is the KMS operator's spelling of Env, accepted so one caller\nneed not learn the other's vocabulary. Env wins when both are sent.","in":"query","name":"environment","required":false,"schema":{"type":"string"}},{"description":"Path narrows the listing to one subtree beneath the caller's org root, as\na `/`-separated path such as `/ci`. OMITTED means the whole org.","in":"query","name":"path","required":false,"schema":{"type":"string"}},{"description":"SecretPath is the KMS operator's spelling of Path. Path wins when both are\nsent.","in":"query","name":"secretPath","required":false,"schema":{"type":"string"}}],"summary":"Lists the secrets your org holds, without their values."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/kms.kmsPut"}}}},"summary":"Stores or replaces one secret in your org."}},"/v1/knowledge/connectors":{"get":{"summary":"Returns every supported knowledge connector with THIS org's connection state and the REAL number of documents each has ingested into the org's store."}},"/v1/knowledge/connectors/catalog":{"get":{"summary":"Returns the ONE catalog of everything a caller can connect: every first-party connector and every long-tail one, in a single list sorted by provider."}},"/v1/knowledge/connectors/{provider}":{"delete":{"parameters":[{"description":"Provider is the connector to act on: github, slack, google or notion.","in":"path","name":"provider","required":true,"schema":{"type":"string"}}],"summary":"Revokes a connection: it tombstones the stored credential so a later sync cannot reuse it, removes this provider's passages from the org's store, and marks the connector disconnected."}},"/v1/knowledge/connectors/{provider}/callback":{"get":{"parameters":[{"description":"Provider is the connector completing its flow, from the path.","in":"path","name":"provider","required":true,"schema":{"type":"string"}},{"description":"Code is the provider's authorization code, exchanged for a token.","in":"query","name":"code","required":false,"schema":{"type":"string"}},{"description":"State is the org-bound value this server signed at connect time.","in":"query","name":"state","required":false,"schema":{"type":"string"}},{"description":"Error is the provider's denial reason when the user refused consent.","in":"query","name":"error","required":false,"schema":{"type":"string"}}],"summary":"CompleteConnectorOAuth finishes an OAuth connection: it exchanges the provider's code for a token, seals that token in KMS, and records the connection."}},"/v1/knowledge/connectors/{provider}/connect":{"get":{"parameters":[{"description":"Provider is the connector to act on: github, slack, google or notion.","in":"path","name":"provider","required":true,"schema":{"type":"string"}}],"summary":"StartConnectorOAuth returns the provider authorize URL the console opens to connect this org's account."}},"/v1/knowledge/connectors/{provider}/sync":{"post":{"parameters":[{"description":"Provider is the connector to act on: github, slack, google or notion.","in":"path","name":"provider","required":true,"schema":{"type":"string"}}],"summary":"Pulls the provider's documents for the caller's org and files them as knowledge sources, which the store's own hook then indexes — so a synced document is retrievable exactly like a hand-written page."}},"/v1/knowledge/files":{"get":{"parameters":[{"in":"query","name":"bucket","required":false,"schema":{"type":"string"}},{"in":"query","name":"limit","required":false,"schema":{"type":"string"}}],"summary":"Answers the caller's org files, most recently changed first, each with its status and stage — optionally only those in one bucket, which is how Drive shows a folder's files with their index state."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/knowledge.fileIn"}}}},"summary":"Makes an object in one of the caller's org buckets a workspace file."}},"/v1/knowledge/files/retrieve":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/knowledge.retrieveIn"}}}},"summary":"Grounds an answer in the caller's org files, table of contents first: candidate documents are found by searching their passages; a model reads their tables of contents — titles and one-line summaries — and picks the sections the answer is in; hybrid search drills into the passages of those sections; and the graph expands to the sections they link to or name the same entities as, in any file of the workspace."}},"/v1/knowledge/files/search":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/knowledge.fileSearchIn"}}}},"summary":"Answers the passages of the caller's org files that match a query, each citing its file › section › paragraph: the search behind Drive's box, and the first step an agent takes across a workspace."}},"/v1/knowledge/files/{id}":{"delete":{"parameters":[{"description":"ID is the file's id, as POST /v1/knowledge/files answered it.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Removes one of the caller's org files from the index — its table of contents, passages, full-text rows, mentions and links — and its record."},"get":{"parameters":[{"description":"ID is the file's id, as POST /v1/knowledge/files answered it.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Answers one of the caller's org files: what it is, where its bytes are, and how far its ingest has got."}},"/v1/knowledge/files/{id}/graph":{"get":{"parameters":[{"description":"ID is the file's id, as POST /v1/knowledge/files answered it.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Answers one of the caller's org files' place in the org's graph: the files it links to and is linked from (a hyperlink, a citation by name), the files that name the same entities, and the entities it names."}},"/v1/knowledge/files/{id}/sections/{section}":{"get":{"parameters":[{"description":"ID is the file's id.","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Section is the section's number in the file's table of contents.","in":"path","name":"section","required":true,"schema":{"type":"string"}}],"summary":"Answers one section of one of the caller's org files: its own text, its subsections, the sections it links to or shares entities with — in this file or another — and the entities it names."}},"/v1/knowledge/files/{id}/toc":{"get":{"parameters":[{"description":"ID is the file's id, as POST /v1/knowledge/files answered it.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Answers one of the caller's org files' table of contents: every section in document order with its depth, its parent and a one-line summary."}},"/v1/knowledge/graph":{"get":{"parameters":[{"description":"Project narrows the graph to one project scope. Empty reads the whole org.","in":"query","name":"project","required":false,"schema":{"type":"string"}}],"summary":"Returns the caller org's knowledge as a node/edge graph shaped for a force-directed renderer: pages, memories and synced sources as nodes; the page parent tree, the wikilinks between pages, and each source's connector provenance as edges."}},"/v1/knowledge/import":{"post":{"summary":"Import an Obsidian, Notion, Roam or Evernote export into the org's knowledge base"}},"/v1/knowledge/reindex":{"post":{"summary":"Rebuilds the caller org's retrieval from its documents: every passage is removed, and every page, memory and source is cut into passages and embedded again with the configured model; the lexical index is reconciled to the same documents."}},"/v1/knowledge/search":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/knowledge.searchIn"}}}},"summary":"Runs a hybrid search over the caller org's own knowledge — its wiki pages, its agent memories and everything its connectors have synced."}},"/v1/kv/{bucket}":{"delete":{"parameters":[{"description":"Bucket is the bucket's name, from the path.","in":"path","name":"bucket","required":true,"schema":{"type":"string"}}],"summary":"Removes one bucket of the caller's org — every key and every revision with it — and answers 204 with no body."},"post":{"parameters":[{"description":"Bucket is the bucket's name within the org, from the path: 1–64 of\n[A-Za-z0-9_], no dash.","in":"path","name":"bucket","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/kv.bucketWrite"}}}},"summary":"Creates a KV bucket and returns it."}},"/v1/kv/{bucket}/{key}":{"delete":{"parameters":[{"description":"Bucket is the bucket, from the path.","in":"path","name":"bucket","required":true,"schema":{"type":"string"}},{"description":"Key is the key, from the path.","in":"path","name":"key","required":true,"schema":{"type":"string"}}],"summary":"Delete removes one key — a delete marker in the key's history, so watchers see it and Get answers 404 — and answers 204 with no body."},"get":{"parameters":[{"description":"Bucket is the bucket, from the path.","in":"path","name":"bucket","required":true,"schema":{"type":"string"}},{"description":"Key is the key, from the path.","in":"path","name":"key","required":true,"schema":{"type":"string"}}],"summary":"Returns one key's current value and revision."},"put":{"parameters":[{"description":"Bucket is the bucket, from the path.","in":"path","name":"bucket","required":true,"schema":{"type":"string"}},{"description":"Key is the key, from the path.","in":"path","name":"key","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/kv.kvWrite"}}}},"summary":"Sets one key to one value and returns the revision the write created."}},"/v1/kv/{bucket}/{key}/history":{"get":{"parameters":[{"description":"Bucket is the bucket, from the path.","in":"path","name":"bucket","required":true,"schema":{"type":"string"}},{"description":"Key is the key, from the path.","in":"path","name":"key","required":true,"schema":{"type":"string"}}],"summary":"Returns one key's retained revisions, oldest first — every put and every delete marker up to the bucket's History depth."}},"/v1/label":{"get":{"parameters":[{"description":"Kind and Subject narrow to one entity.","in":"query","name":"kind","required":false,"schema":{"type":"string"}},{"in":"query","name":"subject","required":false,"schema":{"type":"string"}},{"description":"Source narrows to one asserter — the read that answers \"what has commerce\ntold us\", separately from \"what has an analyst told us\".","in":"query","name":"source","required":false,"schema":{"type":"string"}},{"description":"From and To bound the EVENT time, half-open, RFC 3339.","in":"query","name":"from","required":false,"schema":{"type":"string"}},{"in":"query","name":"to","required":false,"schema":{"type":"string"}},{"description":"Limit caps the page. Out of range takes the plane's own bound.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Read the assertions this tenant has recorded"},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/label.riskLabelIn"}}}},"summary":"Assert ground truth about events"}},"/v1/label/coverage":{"get":{"parameters":[{"description":"From and To bound the EVENT window, half-open, RFC 3339.\n\nUnstated, the window is the 90 days ENDING where maturity begins — `to` is\nthe horizon ago, not now. A default window running to now under a default\nhorizon could not contain one matured event, so every count below it would\nbe zero however much ground truth the tenant held.","in":"query","name":"from","required":false,"schema":{"type":"string"}},{"in":"query","name":"to","required":false,"schema":{"type":"string"}},{"description":"Horizon is the maturity horizon in days the coverage is measured under.\nUnstated takes 120. It also moves the default window, which ends where\nmaturity begins.","in":"query","name":"horizon","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"How much of the window has matured, and how much of that is judged"}},"/v1/label/dispose":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/label.riskDisposeIn"}}}},"summary":"Dispose of this tenant's expired assertions, whole records only"}},"/v1/label/hold":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/label.riskHoldIn"}}}},"summary":"Place or release a litigation hold on named records"}},"/v1/label/resolve":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/label.riskResolveIn"}}}},"summary":"Resolve the label in force for named events, as of each event's own horizon"}},"/v1/label/vocabulary":{"get":{"summary":"The closed vocabularies and the precedence rule that resolves a conflict"}},"/v1/leaderboard":{"get":{"parameters":[{"description":"Scope picks the board: \"personal\" (default) ranks the caller among their own\norg's users, \"org\" is that same org board named for an admin, \"global\" ranks\norganizations against each other.","example":"personal","in":"query","name":"scope","required":false,"schema":{"type":"string"}},{"description":"Metric is the value ranked: tokens (default), requests, or cost.","example":"tokens","in":"query","name":"metric","required":false,"schema":{"type":"string"}},{"description":"Period is the window ranked: day, week, month (default) or all.","example":"week","in":"query","name":"period","required":false,"schema":{"type":"string"}},{"description":"Limit caps the rows returned, clamped to 100. Defaults to 10, which is also\nwhat a non-positive or unparseable value takes.","example":10,"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Ranks AI usage over a window, either the users of the caller's own org or organizations against each other, and always reports the caller's own standing even when it falls outside the returned page."}},"/v1/leaderboard/activity":{"get":{"parameters":[{"description":"Subject is what the series is about: \"user\" (default), \"org\" or \"project\".","example":"user","in":"query","name":"subject","required":false,"schema":{"type":"string"}},{"description":"ID names the subject within what the caller is entitled to see. Omitted (or\n\"me\") it is the caller themselves, or their own org. Another user requires org\nadmin and must belong to the caller's org; another org requires a SuperAdmin.","in":"query","name":"id","required":false,"schema":{"type":"string"}},{"description":"From is the first day of the range, \"2006-01-02\". Defaults to 90 days back.","example":"2026-01-01","in":"query","name":"from","required":false,"schema":{"type":"string"}},{"description":"To is the last day of the range, \"2006-01-02\". Defaults to today; the span is\nclamped to 366 days.","example":"2026-03-31","in":"query","name":"to","required":false,"schema":{"type":"string"}}],"summary":"Returns the per-day usage series for ONE authorized subject — the points a contribution heatmap and a timeline are drawn from, gap-filled so every day in the range is present."}},"/v1/leaderboard/beta":{"get":{"parameters":[{"description":"Limit caps the rows, clamped to 1..100. Defaults to 25, which is also what a\nnon-positive value takes.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Ranks everyone on the hanzo.ai/beta waitlist by one score: the record's verified-action points, plus 1 per org that signed up with its referral code, plus 20 per such org that has made metered spend, plus 1 per 100,000 tokens the person used, all time."}},"/v1/leaderboard/optin":{"get":{"summary":"Returns the caller's own public-listing preference and their org's, each with whether the caller may change it."},"put":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/leaderboard.userOptinReq"}}}},"summary":"Sets the CALLER's own public-listing preference on the leaderboard."}},"/v1/leaderboard/optin/org":{"put":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/leaderboard.orgOptinReq"}}}},"summary":"Sets the ORG's listing on the cross-org global board."}},"/v1/legal/documents":{"get":{"parameters":[{"description":"Limit bounds the page. Absent or unparseable means the store's own default.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns the org's generated documents, newest first, WITHOUT their rendered content — fetch one document to read its body."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/legal.generateRequest"}}}},"summary":"Renders a document from a template and the caller's own merge data, seals it in the org's store, and returns it with its rendered body."}},"/v1/legal/documents/{id}":{"get":{"parameters":[{"description":"ID is the document's server-minted handle, \"doc_\"-prefixed.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one of the org's documents WITH its rendered body."}},"/v1/legal/documents/{id}/sign":{"post":{"parameters":[{"description":"ID is the document to send for signature, from the path.","example":"doc_1f…","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/legal.signRequest"}}}},"summary":"Opens an e-signature request over one document and moves it to out_for_signature, returning the provider's reference for the request."}},"/v1/legal/documents/{id}/sign/complete":{"post":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Record that a generated document's signature request completed"}},"/v1/legal/filings":{"get":{"parameters":[{"description":"Limit bounds the page. Absent or unparseable means the store's own default.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns the org's filing records, newest first — which documents were filed where, through which provider, and what the filing's honest status is."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/legal.filingRequest"}}}},"summary":"Records a filing of one or more of the org's documents with a state or agency, and returns the tracking record."}},"/v1/legal/health":{"get":{"summary":"Reports that the legal subsystem is serving and how many built-in templates its catalog carries."}},"/v1/legal/templates":{"get":{"summary":"Returns the org's effective template catalog: every built-in template, with any the org has overridden replaced by its own latest version."}},"/v1/legal/templates/{id}":{"get":{"parameters":[{"description":"ID is the template's stable id, e.g. \"nda\" or \"safe\".","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one template resolved for the caller's org — the org's own override if it has saved one, else the built-in — with its full text/template body and its declared merge fields."},"put":{"parameters":[{"description":"ID is the template to override, from the path. Overriding a built-in id\ninherits that built-in's category, title and counsel-review posture.","example":"nda","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/legal.templateOverride"}}}},"summary":"Saves the org's own version of a template — a custom NDA, a house MSA — and returns it with its new version number."}},"/v1/library":{"get":{"parameters":[{"description":"Kind keeps one kind: image, video, audio, document, slides, type, model, code or file.","example":"image","in":"query","name":"kind","required":false,"schema":{"type":"string"}},{"description":"Source keeps what one product made: chat, dev, studio or workflow.","example":"studio","in":"query","name":"source","required":false,"schema":{"type":"string"}},{"description":"Ref keeps what one conversation, run or Studio run made.","in":"query","name":"ref","required":false,"schema":{"type":"string"}},{"description":"Project keeps one project's items.","in":"query","name":"project","required":false,"schema":{"type":"string"}},{"description":"Q keeps the items whose name contains it, ignoring case.","in":"query","name":"q","required":false,"schema":{"type":"string"}},{"description":"Since and Until bound when it was made: RFC 3339, or a date (YYYY-MM-DD).","in":"query","name":"since","required":false,"schema":{"type":"string"}},{"in":"query","name":"until","required":false,"schema":{"type":"string"}},{"description":"Scope is all (yours and what your org shared, the default), mine, or shared.","in":"query","name":"scope","required":false,"schema":{"type":"string"}},{"description":"Limit bounds the page: default 60, at most 200.","example":24,"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Cursor continues a list from the page before's `next`.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"summary":"Lists what you made and what members of your organization shared with you, newest first."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/library.keepIn"}}}},"summary":"Keeps one thing you made in your Library: its bytes go to your own prefix of the Library's store, and it is listed to you alone until you share it."}},"/v1/library/unowned":{"get":{"parameters":[{"description":"Limit bounds the page: default 60, at most 200.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"ListUnowned reads, for a SuperAdmin alone, the organization's items that record no owner."}},"/v1/library/{id}":{"delete":{"parameters":[{"description":"ID is the item, from the path.","example":"lib_0f3c…","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Deletes one of your items and its bytes."},"get":{"parameters":[{"description":"ID is the item, from the path.","example":"lib_0f3c…","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Reads one item with fresh signed URLs."},"patch":{"parameters":[{"description":"ID is the item, from the path.","example":"lib_0f3c…","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/library.itemPatch"}}}},"summary":"Renames one of your items, shares it with your organization or stops sharing it, or moves it to a project."}},"/v1/licensing/download/{release}":{"get":{"parameters":[{"in":"path","name":"release","required":true,"schema":{"type":"string"}},{"in":"header","name":"X-License-Token","required":false,"schema":{"type":"string"}},{"in":"query","name":"token","required":false,"schema":{"type":"string"}}],"summary":"Download resolves a release to its artifact, gated on a valid license."}},"/v1/licensing/fingerprint":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/licensing.FingerprintRequest"}}}},"summary":"Fingerprint turns raw device signals into the opaque value that binds a license to one machine."}},"/v1/licensing/healthz":{"get":{"summary":"Health reports which signer this deployment mints with, and in which env."}},"/v1/licensing/issue":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/licensing.IssueRequest"}}}},"summary":"Issue mints a signed license token for a product the caller's org already pays for."}},"/v1/licensing/jwks":{"get":{"summary":"Pubkey publishes the Ed25519 PUBLIC verification key, at both /pubkey and /jwks."}},"/v1/licensing/pubkey":{"get":{"summary":"Pubkey publishes the Ed25519 PUBLIC verification key, at both /pubkey and /jwks."}},"/v1/licensing/releases":{"get":{"summary":"Lists the signed binary releases this deployment can serve."}},"/v1/licensing/releases/{release}":{"get":{"parameters":[{"in":"path","name":"release","required":true,"schema":{"type":"string"}}],"summary":"Reads one release's metadata: its product, version, platform and the cosign material a client verifies the binary against."}},"/v1/licensing/verify":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/licensing.VerifyRequest"}}}},"summary":"Verify checks a license token online: signature, schema, expiry, app_id and the revocation list."}},"/v1/link":{"get":{"summary":"Lists your linked accounts and the devices they sit on."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/link.enrollReq"}}}},"summary":"Registers a signed-in AI provider account on a machine."}},"/v1/link/devices/{machine}":{"get":{"parameters":[{"description":"Machine is the machine to act on, from the path. It is scoped to the\ncaller, so a machine with none of the caller's accounts is a 404.","in":"path","name":"machine","required":true,"schema":{"type":"string"}}],"summary":"Shows one machine: its accounts, usage and live sessions."}},"/v1/link/devices/{machine}/revoke":{"post":{"parameters":[{"description":"Machine is the machine to act on, from the path. It is scoped to the\ncaller, so a machine with none of the caller's accounts is a 404.","in":"path","name":"machine","required":true,"schema":{"type":"string"}}],"summary":"Logs out every account on one machine and stops its sessions."}},"/v1/link/route":{"get":{"summary":"Gets the failover order across your linked accounts."}},"/v1/link/usage":{"get":{"parameters":[{"description":"Provider is the provider whose meter to read. Required.","in":"query","name":"provider","required":false,"schema":{"type":"string"}},{"description":"Account narrows to one account when a user has several with the provider.","in":"query","name":"account","required":false,"schema":{"type":"string"}},{"description":"Window selects a window class: 6h, day, week or month. Empty reads all.","in":"query","name":"window","required":false,"schema":{"type":"string"}},{"description":"Range is the period, one of 1h, 24h, 7d or 30d; empty means 24h, and an\nunknown label is 400, never a quiet fallback.","in":"query","name":"range","required":false,"schema":{"type":"string"}}],"summary":"Shows one provider account's own usage dashboard."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/link.ingestReq"}}}},"summary":"Reports usage samples from the device collector."}},"/v1/link/usage/accounts":{"get":{"summary":"Breaks down what the gateway routed through each of your accounts."}},"/v1/link/usage/summary":{"get":{"parameters":[{"description":"Range is the period, one of 1h, 24h, 7d or 30d; empty means 24h, and an\nunknown label is 400, never a silent substitution.","in":"query","name":"range","required":false,"schema":{"type":"string"}}],"summary":"Shows plan consumption and Hanzo spend side by side."}},"/v1/link/{id}":{"delete":{"parameters":[{"description":"ID is the link to act on, from the path. It is scoped to the caller, so\nanother user's or org's id is a 404.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Logs out one account and stops the sessions it was running."},"get":{"parameters":[{"description":"ID is the link to act on, from the path. It is scoped to the caller, so\nanother user's or org's id is a 404.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Reads one linked account."}},"/v1/lsp/complete":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/lsp.Query"}}}},"summary":"Offers the candidates a language server has at a position, typed and resolved through the repository's dependencies rather than guessed from text."}},"/v1/lsp/diagnostics":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/lsp.Query"}}}},"summary":"Reports every problem the language server finds in one file — compile errors, type errors and lints, each with its span and its severity (1 error, 2 warning, 3 information, 4 hint)."}},"/v1/lsp/hover":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/lsp.Query"}}}},"summary":"Renders the type and documentation of the symbol at a position, as the language server itself renders it."}},"/v1/lsp/locate":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/lsp.Query"}}}},"summary":"Finds where a symbol lives: its definition, its references, its type or its implementations, chosen by relation (definition, reference, type, implementation — empty means definition)."}},"/v1/lsp/symbols":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/lsp.Query"}}}},"summary":"Outlines one file: every declaration in it, with its kind and its span."}},"/v1/market/chains":{"get":{"summary":"Answers every chain this deployment can read, what is deployed on each, and what its automated market maker amounts to."}},"/v1/market/pools":{"get":{"parameters":[{"description":"Chain is the chain's slug — `cchain`, `zoo` — as `chains` reports it. It is\nthe indexer's word for the chain and NOT the chain id: `96369`, `C` and\n`c-chain` all name nothing.","in":"query","name":"chain","required":false,"schema":{"type":"string"}}],"summary":"Answers the automated market makers on one chain: their two tokens, their fee tier, and what has moved through each."}},"/v1/market/survey":{"get":{"parameters":[{"description":"Chain is the chain's slug — `cchain`, `zoo` — as `chains` reports it. It is\nthe indexer's word for the chain and NOT the chain id: `96369`, `C` and\n`c-chain` all name nothing.","in":"query","name":"chain","required":false,"schema":{"type":"string"}}],"summary":"Answers which of the four settlement precompiles carry code on one chain."}},"/v1/market/token":{"get":{"parameters":[{"in":"query","name":"chain","required":false,"schema":{"type":"string"}},{"description":"At is the token's contract address.","in":"query","name":"at","required":false,"schema":{"type":"string"}}],"summary":"Answers one token's daily history — open, high, low, close, price and volume per UTC day, oldest first."}},"/v1/market/tokens":{"get":{"parameters":[{"description":"Chain is the chain's slug — `cchain`, `zoo` — as `chains` reports it. It is\nthe indexer's word for the chain and NOT the chain id: `96369`, `C` and\n`c-chain` all name nothing.","in":"query","name":"chain","required":false,"schema":{"type":"string"}}],"summary":"Answers the tokens one chain's indexer has seen, with the decimals a caller needs to read any amount of one correctly."}},"/v1/marketing/audiences":{"get":{"parameters":[{"description":"Limit caps the rows returned; 0 means 200 and nothing above 1000 is honoured.","example":50,"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns the org's saved audiences, most recently updated first."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/marketing.Audience"}}}},"summary":"Saves a cohort filter for the caller's org."}},"/v1/marketing/audiences/{id}":{"delete":{"parameters":[{"description":"ID is the audience id from the path, as returned by create.","example":"aud_4c1e9b7a2d6f0538e4a7c9b1d3f5027a","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Removes one of the caller org's audiences and answers 204."},"get":{"parameters":[{"description":"ID is the audience id from the path, as returned by create.","example":"aud_4c1e9b7a2d6f0538e4a7c9b1d3f5027a","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one of the caller org's saved audiences."}},"/v1/marketing/audiences/{id}/preview":{"get":{"parameters":[{"description":"ID is the audience id from the path, as returned by create.","example":"aud_4c1e9b7a2d6f0538e4a7c9b1d3f5027a","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Evaluates the cohort LIVE — the same resolution an enrollment would run — and reports how big it is and how many real mailboxes it reaches."}},"/v1/marketing/beta":{"get":{"summary":"Answers the signed-in caller's waitlist record: the application as it stands, the betas asked for, the points and the actions that earned them, and the place on the waitlist."},"put":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/marketing.BetaIn"}}}},"summary":"Writes the signed-in caller's application: the program, the answers, the betas asked for and the lead it was filed under."}},"/v1/marketing/beta/actions":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/marketing.BetaActIn"}}}},"summary":"Counts one action of the signed-in caller: a star on a Hanzo repository, verified on GitHub for the login named, or a follow of a founder's link, taken on trust."}},"/v1/marketing/beta/invites":{"get":{"summary":"Answers the caller's invites, newest first, with how many were sent, how many joined, and how many more they may send now."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/marketing.BetaInviteIn"}}}},"summary":"Reserves an invite for each address the limits admit and answers the message the member's mailbox sends for each: subject, text and HTML, the unsubscribe headers, with the member's referral link for that invite and a one-click unsubscribe for that address."}},"/v1/marketing/beta/invites/sent":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/marketing.BetaInviteSentIn"}}}},"summary":"Records what the member's browser did with its reservations: the invites sent, and the ones that failed with the mailbox's reason."}},"/v1/marketing/beta/request":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/marketing.BetaRequest"}}}},"summary":"Adds betas to those the signed-in caller asked for, creating the record when there is none."}},"/v1/marketing/calendar":{"get":{"parameters":[{"description":"Status keeps only posts in that state (draft, scheduled, published,\nfailed, canceled). Empty means every post.","example":"scheduled","in":"query","name":"status","required":false,"schema":{"type":"string"}},{"description":"Limit caps the rows returned; 0 means 200 and nothing above 1000 is honoured.","example":50,"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns the org's calendar, latest scheduled first, optionally narrowed to one status."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/marketing.CalendarPost"}}}},"summary":"Adds a post to the content calendar."}},"/v1/marketing/calendar/{id}":{"delete":{"parameters":[{"description":"ID is the post id from the path, as returned by create.","example":"cal_1d7f3b9e5a2c8046f1b3d5a7c9e02468","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Removes one of the caller org's posts and answers 204."},"get":{"parameters":[{"description":"ID is the post id from the path, as returned by create.","example":"cal_1d7f3b9e5a2c8046f1b3d5a7c9e02468","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one of the caller org's posts, including the exact error behind a failed publish."},"put":{"parameters":[{"description":"ID is the server-assigned post id (\"cal_\" + 128 random bits).","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/marketing.CalendarPost"}}}},"summary":"Replaces a post's editable fields."}},"/v1/marketing/campaigns":{"get":{"parameters":[{"description":"Status keeps only campaigns in that lifecycle state (draft, scheduled,\nactive, paused, completed). Empty means every campaign.","example":"active","in":"query","name":"status","required":false,"schema":{"type":"string"}},{"description":"Limit caps the rows returned; 0 means 200 and nothing above 1000 is honoured.","example":25,"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns the org's campaigns, most recently updated first, optionally narrowed to one lifecycle status."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/marketing.Campaign"}}}},"summary":"Registers a campaign in the caller's org."}},"/v1/marketing/campaigns/{id}":{"delete":{"parameters":[{"description":"ID is the campaign id from the path, as returned by create.","example":"camp_9f2a1c7d4e8b0a6f3d2c5b1e7a9f4c60","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Removes one of the caller org's campaigns and answers 204."},"get":{"parameters":[{"description":"ID is the campaign id from the path, as returned by create.","example":"camp_9f2a1c7d4e8b0a6f3d2c5b1e7a9f4c60","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one of the caller org's campaigns."},"put":{"parameters":[{"description":"ID is the server-assigned campaign id (\"camp_\" + 128 random bits).","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/marketing.Campaign"}}}},"summary":"Replaces a campaign's editable fields."}},"/v1/marketing/campaigns/{id}/schedule":{"post":{"parameters":[{"description":"ID is the campaign id from the path.","example":"camp_9f2a1c7d4e8b0a6f3d2c5b1e7a9f4c60","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/marketing.ScheduleInput"}}}},"summary":"Sets a campaign's send time and moves it to \"scheduled\"."}},"/v1/marketing/click":{"get":{"parameters":[{"description":"Agent is the clicker's User-Agent header. Only its family (chrome,\nsafari, automated, …) is kept.","in":"header","name":"User-Agent","required":false,"schema":{"type":"string"}},{"description":"T is the click token the send minted for this link and this recipient:\nbase64url, signed under the deployment's KMS key marketing/click-hmac. It\nis the request's only authority.","example":"AQGAgICAAQVoYW56bw…","in":"query","name":"t","required":false,"schema":{"type":"string"}}],"summary":"Follows a tracked email link."}},"/v1/marketing/leads":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/marketing.LeadIn"}}}},"summary":"Files one public form in the deployment's own CRM."}},"/v1/marketing/leads/esign":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/marketing.EsignEvent"}}}},"summary":"Takes Hanzo eSign's webhook: a SAFE was signed, countersigned, completed, declined or voided, and the investor's form in the brand's CRM moves to that status."}},"/v1/marketing/leads/resume":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/marketing.ResumeIn"}}}},"summary":"Signs a form the careers page posts one resume through, into the brand org's private careers bucket, and answers the key to name on the application (`resume_file`)."}},"/v1/marketing/mail":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/marketing.MailIn"}}}},"summary":"Sends one email from the org to one person, the way a person on the org's team writes back to a lead from its record."}},"/v1/marketing/promos":{"get":{"summary":"Returns every promo the deployment offers with its live counters: how many orgs have redeemed it and how many redemptions remain under the cap."}},"/v1/marketing/promos/{code}/eligibility":{"get":{"parameters":[{"description":"Code is the promo code from the path.","example":"first1000","in":"path","name":"code","required":true,"schema":{"type":"string"}},{"description":"Plan is the plan being priced: pro, max or team. Anything else (including\nthe free Developer plan) has no list price and so nothing to discount.","example":"team","in":"query","name":"plan","required":false,"schema":{"type":"string"}},{"description":"Seats is the Team seat count; 0 means 1, and it is ignored for the\nsingle-seat plans.","example":12,"in":"query","name":"seats","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Prices a promo against a plan and seat count."}},"/v1/marketing/promos/{code}/redeem":{"post":{"parameters":[{"description":"Code is the promo code from the path.","example":"first1000","in":"path","name":"code","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/marketing.RedeemInput"}}}},"summary":"Records the caller org's claim on a promo."}},"/v1/marketing/promos/{code}/redemption":{"get":{"parameters":[{"description":"Code is the promo code from the path, e.g. \"first1000\".","example":"first1000","in":"path","name":"code","required":true,"schema":{"type":"string"}}],"summary":"Returns the caller org's OWN redemption of a promo — an org-scoped read, so it can never surface another tenant's."}},"/v1/marketing/sequences":{"get":{"parameters":[{"description":"Limit caps the rows returned; 0 means 200 and nothing above 1000 is honoured.","example":50,"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns the org's drip sequences, most recently updated first."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/marketing.Sequence"}}}},"summary":"Registers a drip sequence in the caller's org."}},"/v1/marketing/sequences/{id}":{"get":{"parameters":[{"description":"ID is the sequence id from the path, as returned by create.","example":"seq_7b3e5a1c9d024f68b0a3e7c5d9f1a248","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one of the caller org's sequences together with its steps in send order."}},"/v1/marketing/sequences/{id}/enroll":{"post":{"parameters":[{"description":"ID is the sequence id from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/marketing.EnrollInput"}}}},"summary":"Adds one contact or a whole audience to a sequence and schedules the first step for each."}},"/v1/marketing/sequences/{id}/enrollments":{"get":{"parameters":[{"description":"ID is the sequence id from the path.","example":"seq_7b3e5a1c9d024f68b0a3e7c5d9f1a248","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Limit caps the rows returned; 0 means 200 and nothing above 1000 is honoured.","example":100,"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns who is walking one sequence, most recently enrolled first, with each walk's current step and next due time."}},"/v1/marketing/sequences/{id}/enrollments/{eid}/cancel":{"post":{"parameters":[{"description":"ID is the sequence id from the path.","example":"seq_7b3e5a1c9d024f68b0a3e7c5d9f1a248","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"EID is the enrollment id from the path, as returned by a single-address\nenroll.","example":"enr_2a8d6f0b4c1e9375a0d2f6b8c4e19f73","in":"path","name":"eid","required":true,"schema":{"type":"string"}}],"summary":"Stops one walk mid-sequence and answers 204: no further step is sent, and steps already delivered are not recalled."}},"/v1/marketing/sequences/{id}/status":{"post":{"parameters":[{"description":"ID is the sequence id from the path.","example":"seq_7b3e5a1c9d024f68b0a3e7c5d9f1a248","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/marketing.SequenceStatus"}}}},"summary":"Flips draft/active/archived — the activation gate for sending, since only an active sequence accepts enrollments."}},"/v1/marketing/sequences/{id}/steps":{"get":{"parameters":[{"description":"ID is the sequence id from the path, as returned by create.","example":"seq_7b3e5a1c9d024f68b0a3e7c5d9f1a248","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one sequence's steps in send order."},"post":{"parameters":[{"description":"SequenceID is the sequence id from the path (the route's :id).","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/marketing.StepInput"}}}},"summary":"Appends a message to the END of a sequence: the new step's idx is one past the last, so steps arrive in the order they are added."}},"/v1/marketing/summary":{"get":{"summary":"Rolls up the caller org's campaigns: how many there are, how many are active, and the summed budget and spend in cents."}},"/v1/marketing/suppressions":{"delete":{"parameters":[{"description":"Channel is the surface the entry opts out of; empty is email.","example":"email","in":"query","name":"channel","required":false,"schema":{"type":"string"}},{"description":"Address is the entry: an address, or \"@example.com\" for a company.","example":"[email protected]","in":"query","name":"address","required":false,"schema":{"type":"string"}}],"summary":"Re-subscribes an address on one channel and answers 204."},"get":{"parameters":[{"description":"Limit caps the rows returned; 0 means 200 and nothing above 1000 is honoured.","example":100,"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns the org's opt-out list, newest first — everyone the send gate will refuse to deliver to."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/marketing.Suppression"}}}},"summary":"Records an opt-out for the org (admin / self-service management)."}},"/v1/marketing/suppressions/check":{"get":{"parameters":[{"description":"Channel is the surface the entry opts out of; empty is email.","in":"query","name":"channel","required":false,"schema":{"type":"string"}},{"description":"Address is the entry: an address, or \"@example.com\" for a company.","example":"[email protected]","in":"query","name":"address","required":false,"schema":{"type":"string"}}],"summary":"Answers whether the org's send gate refuses an address, and which list holds it, by the same check every commercial send asks."}},"/v1/marketing/unsubscribe":{"get":{"parameters":[{"description":"Org is the org the link was minted for.","example":"acme","in":"query","name":"org","required":false,"schema":{"type":"string"}},{"description":"Channel is the surface to opt out of.","example":"email","in":"query","name":"channel","required":false,"schema":{"type":"string"}},{"description":"Address is the recipient to opt out.","example":"[email protected]","in":"query","name":"address","required":false,"schema":{"type":"string"}},{"description":"Token is the HMAC over (org, channel, address). It is the ONLY authority\nhere — there is no principal — so it binds the request to one tuple and\nnothing else.","example":"9f2a…","in":"query","name":"token","required":false,"schema":{"type":"string"}},{"description":"Company opts out everyone at the address's domain as well, in this org\nalone: a company's unsubscribe. An address at a free mail provider is a\nperson's and is refused 422.","in":"query","name":"company","required":false,"schema":{"type":"boolean"}}],"summary":"Is the PUBLIC one-click endpoint (no principal): a recipient clicks the signed link in an email footer."},"post":{"parameters":[{"description":"Org is the org the link was minted for.","example":"acme","in":"query","name":"org","required":false,"schema":{"type":"string"}},{"description":"Channel is the surface to opt out of.","example":"email","in":"query","name":"channel","required":false,"schema":{"type":"string"}},{"description":"Address is the recipient to opt out.","example":"[email protected]","in":"query","name":"address","required":false,"schema":{"type":"string"}},{"description":"Token is the HMAC over (org, channel, address), the only authority here.","example":"9f2a…","in":"query","name":"token","required":false,"schema":{"type":"string"}}],"summary":"Is the one-click unsubscribe a mail client sends from the List-Unsubscribe header (RFC 8058): the same signed link the footer carries, POSTed with the form body List-Unsubscribe=One-Click."}},"/v1/marketplace":{"get":{"summary":"Lists every tool and agent the caller can reach in their own org and project, enriched with any public listing's title, category and price, and with installed=true on the ones already activated for that scope."}},"/v1/marketplace/install":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/marketplace.installReq"}}}},"summary":"Activates one tool for the caller's own org and project."}},"/v1/marketplace/jobs":{"get":{"parameters":[{"description":"Role is buyer — the jobs the caller's org hired for — or seller, the jobs it\nwas hired for. Buyer when empty.","example":"seller","in":"query","name":"role","required":false,"schema":{"type":"string"}},{"description":"Status keeps one state.","example":"open","in":"query","name":"status","required":false,"schema":{"type":"string"}}],"summary":"Lists the jobs the caller's org is a party to, newest first: as buyer, the work it hired — with the quotes it has not paid and the jobs being funded, each with the attempt that made it, so a hire whose answer was lost is found here — and as seller, the work it was hired for, which never includes another org's quote."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/marketplace.hireIn"}}}},"summary":"Hires another org for a piece of work, through a public listing or by a direct offer, and answers 201 with the job — open, waiting for the seller."}},"/v1/marketplace/jobs/{id}":{"get":{"parameters":[{"description":"ID is the job, from the path.","example":"job_9a1f","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Reads one job the caller's org is a party to."}},"/v1/marketplace/jobs/{id}/accept":{"post":{"parameters":[{"description":"ID is the job, from the path.","example":"job_9a1f","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Accepts a job the caller's org was hired for: the seller takes the work on and the clock toward its deadline is the seller's."}},"/v1/marketplace/jobs/{id}/cancel":{"post":{"parameters":[{"description":"ID is the job, from the path.","example":"job_9a1f","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Takes back a job the caller's org opened, before the seller accepts it."}},"/v1/marketplace/jobs/{id}/decline":{"post":{"parameters":[{"description":"ID is the job, from the path.","example":"job_9a1f","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/marketplace.declineIn"}}}},"summary":"Declines a job the caller's org was hired for, before any work."}},"/v1/marketplace/jobs/{id}/deliver":{"post":{"parameters":[{"description":"ID is the job, from the path.","example":"job_9a1f","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/marketplace.deliverIn"}}}},"summary":"Records delivery of a job the caller's org accepted, before its deadline, and starts the review window: the buyer releases or disputes within it, or it releases itself when it closes."}},"/v1/marketplace/jobs/{id}/dispute":{"post":{"parameters":[{"description":"ID is the job, from the path.","example":"job_9a1f","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/marketplace.disputeIn"}}}},"summary":"Stops a job for a ruling, as either party: before delivery (and before the deadline), or within the review window after it."}},"/v1/marketplace/jobs/{id}/feedback":{"post":{"parameters":[{"description":"ID is the job, from the path.","example":"job_9a1f","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/marketplace.feedbackIn"}}}},"summary":"Rates the other party of a settled job — the seller when the caller's org bought, the buyer when it sold — once per party per job, and never edited."}},"/v1/marketplace/jobs/{id}/refund":{"post":{"parameters":[{"description":"ID is the job, from the path.","example":"job_9a1f","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Refunds a job the caller's org accepted, as the seller, at any point before it is paid: nothing was moved, so the buyer's authorization is given up, never settled, and the amount it set aside returns to the buyer's wallet."}},"/v1/marketplace/jobs/{id}/release":{"post":{"parameters":[{"description":"ID is the job, from the path.","example":"job_9a1f","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Releases a job the caller's org is paying for, paying the seller the whole amount: the buyer's authorization is settled on the rail, once, and the rail states the payment."}},"/v1/marketplace/listings":{"get":{"summary":"Returns the listings the caller's own org has published — what this org is offering, not what it can buy."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/marketplace.publishReq"}}}},"summary":"Offers one thing the caller's org owns on the marketplace — an agent, persona, app, skill or MCP server, or, for the platform, a tool sold per call — optionally monetized."}},"/v1/marketplace/listings/{id}":{"delete":{"parameters":[{"description":"ID is the listing, from the path.","example":"lst_1","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Withdraws one of the caller org's listings from the marketplace and answers 204."},"patch":{"parameters":[{"description":"ID is the listing to edit, from the path.","example":"lst_4f1c","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/marketplace.patchReq"}}}},"summary":"Edits one of the caller org's listings — its copy, price, payout wallet, visibility and documentation — under the same rules publish applies, and answers the listing as it now stands."}},"/v1/marketplace/seller":{"get":{"parameters":[{"description":"Year is the calendar year (UTC); the current one when zero.","example":2026,"in":"query","name":"year","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Answers where the caller's org stands as a seller, in one read: its founders' identity verification (KYC) and legal entity (KYB), its tax form and whether it is certified and valid, its own sanctions screening — only what an org may see about itself — the payout wallet it proved, the TaxPrincipalCredentials signed for its agents, what it earned in the year from the economic events the rails stated, and the 1099s payers furnished it."}},"/v1/marketplace/seller/payout":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/marketplace.payoutIn"}}}},"summary":"Starts binding one of the caller org's wallets as the wallet it is paid into: answers a challenge naming the org, the wallet and its address, to be signed with that wallet within fifteen minutes and sent to POST /v1/marketplace/seller/payout/verify."}},"/v1/marketplace/seller/payout/verify":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/marketplace.verifyIn"}}}},"summary":"Binds the caller org's payout wallet: the signature over its outstanding challenge is recovered, and must recover to the wallet's address, before the challenge expires."}},"/v1/marketplace/shop":{"get":{"parameters":[{"description":"Q keeps listings whose title, description, category, thing or seller\ncontains every word of it, case-insensitively.","example":"research","in":"query","name":"q","required":false,"schema":{"type":"string"}},{"description":"Kind keeps one kind: agent, persona, app, skill, mcp or tool.","example":"agent","in":"query","name":"kind","required":false,"schema":{"type":"string"}},{"description":"Category keeps one category, exactly.","in":"query","name":"category","required":false,"schema":{"type":"string"}},{"description":"Price keeps free listings or priced ones.","in":"query","name":"price","required":false,"schema":{"type":"string"}},{"description":"Rating keeps listings rated at least this many stars, 1 to 5.","in":"query","name":"rating","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Seller keeps one seller org's listings.","in":"query","name":"seller","required":false,"schema":{"type":"string"}},{"description":"Limit is the page size: 48 by default, 200 at most.","example":48,"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Offset is where the page starts.","in":"query","name":"offset","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Searches every public listing of every kind — agents and personas to hire, apps, skills, MCP servers and tools — newest first, with facets by kind, category, price and rating, paged."}},"/v1/marketplace/shop/{id}":{"get":{"parameters":[{"description":"ID is the listing, from the path.","example":"lst_4f1c","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Reads one public listing as the shop shows it — its seller's public face, its reputation and the ways to buy it."}},"/v1/marketplace/uninstall":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/marketplace.installReq"}}}},"summary":"Deactivates one tool for the caller's own org and project, so it stops being dispatchable there."}},"/v1/mcp":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MCPRequest"}}}},"summary":"The agent endpoint: every subsystem's operations as MCP tools"}},"/v1/meet/call":{"get":{"parameters":[{"description":"Space is the space uuid holding the room, as GET /v1/team/rooms\nreports it. It is the segment the caller's membership is checked against.","in":"query","name":"space","required":true,"schema":{"type":"string"}},{"description":"Room is the room's own id within that space, as GET /v1/team/rooms\nreports it. It is opaque here: meet keeps no rooms and cannot say whether\none exists, only whether this caller may be seated in the space holding\nit.","in":"query","name":"room","required":true,"schema":{"type":"string"}}],"summary":"Where a room's call happens"}},"/v1/meet/getToken":{"post":{"summary":"Mint a join token for one video room"}},"/v1/meet/health":{"get":{"summary":"Reports whether the office can mint join tokens."}},"/v1/meet/record":{"delete":{"parameters":[{"description":"Room is the LiveKit room, named the way the office client names one\n(`<space>_<name>_<id>`). Its leading segment is what binds the room to a\ntenant, and it is the segment the caller's membership is checked against.","in":"query","name":"room","required":true,"schema":{"type":"string"}}],"summary":"Stop a room's recording"},"get":{"parameters":[{"description":"Room is the LiveKit room, named the way the office client names one\n(`<space>_<name>_<id>`). Its leading segment is what binds the room to a\ntenant, and it is the segment the caller's membership is checked against.","in":"query","name":"room","required":true,"schema":{"type":"string"}}],"summary":"What is being recorded in a room, and where the file goes"},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/meet.recordIn"}}}},"summary":"Start recording a room, or return the recording already running"}},"/v1/meet/session":{"get":{"summary":"What this caller may open a room in"}},"/v1/messages":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ai.AnthropicRequest"}}}},"summary":"Implements the Anthropic Messages API."}},"/v1/messages/count_tokens":{"post":{"summary":"Implements POST /v1/messages/count_tokens."}},"/v1/metrics/batch":{"post":{"summary":"Ingest a MetricBatch — the same payload the ZAP transport carries"}},"/v1/metrics/health":{"get":{"summary":"How many metric series this deployment holds for your org"}},"/v1/metrics/logs/health":{"get":{"summary":"How many log records this deployment holds for your org"}},"/v1/metrics/logs/query":{"get":{"summary":"Search your org's logs by label, time and substring"}},"/v1/metrics/logs/write":{"post":{"summary":"Append structured log records for your org"}},"/v1/metrics/query":{"get":{"summary":"Read your org's series back over a time range"}},"/v1/metrics/traces/health":{"get":{"summary":"How many spans this deployment holds for your org"}},"/v1/metrics/traces/query":{"get":{"summary":"Recent spans for your org over a time range"}},"/v1/metrics/traces/trace":{"get":{"summary":"Every span of one trace — the waterfall"}},"/v1/metrics/traces/write":{"post":{"summary":"Append spans for your org"}},"/v1/metrics/write":{"post":{"summary":"Append samples to your org's named, labelled series"}},"/v1/ml/health":{"get":{"summary":"Whether model serving can actually work right now"}},"/v1/ml/models":{"get":{"summary":"Lists the inference models deployed in the caller's org."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ml.mlCreate"}}}},"summary":"Deploys one inference model for the caller's org, and answers 201 with the model as Kubernetes admitted it."}},"/v1/ml/models/{name}":{"delete":{"parameters":[{"description":"Name is the resource to act on, taken from the path. Lower-cased and\ntrimmed to the DNS-1123 label a CustomResource's metadata.name must be.","example":"sentiment","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Deletes a deployed inference model."},"get":{"parameters":[{"description":"Name is the resource to act on, taken from the path. Lower-cased and\ntrimmed to the DNS-1123 label a CustomResource's metadata.name must be.","example":"sentiment","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one deployed inference model."},"patch":{"parameters":[{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Change a deployed model in place"}},"/v1/ml/models/{name}/predict":{"post":{"parameters":[{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Run inference against one of your deployed models"}},"/v1/models":{"get":{"summary":"Returns the list of available models from the routing table."}},"/v1/models/providers":{"get":{"summary":"Public, secret-free list of the providers serving the models that GET /v1/models lists — the same source, projected."}},"/v1/models/vendors/{vendor}":{"get":{"parameters":[{"in":"path","name":"vendor","required":true,"schema":{"type":"string"}}],"summary":"Lists every model a vendor lists now, each entry exactly as the vendor listed it (prices, context, output bound, modalities, parameters, created, expiration), and when the list was last synced."}},"/v1/models/vendors/{vendor}/events":{"get":{"parameters":[{"in":"path","name":"vendor","required":true,"schema":{"type":"string"}}],"summary":"Lists the changes syncs read in a vendor's model list, newest first."}},"/v1/models/{model}/access":{"get":{"parameters":[{"in":"path","name":"model","required":true,"schema":{"type":"string"}}],"summary":"Returns the caller's own standing for a gated model: \"granted\", \"requested\", or empty when they have never asked."},"post":{"parameters":[{"in":"path","name":"model","required":true,"schema":{"type":"string"}}],"summary":"Records the caller's waitlist request for a gated model and answers their new standing."}},"/v1/mq/health":{"get":{"summary":"Reports whether the message plane behind this surface answers."}},"/v1/mq/info":{"get":{"summary":"Returns the broker's identity and the org's stream count."}},"/v1/mq/stream":{"get":{"parameters":[{"description":"Limit caps the streams returned (1–1000, default 100).","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Offset skips that many streams, name-ordered.","in":"query","name":"offset","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns the org's streams, name-ordered, with their live state."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/mq.Config"}}}},"summary":"Creates a durable stream in the org's namespace and returns it."}},"/v1/mq/stream/{name}":{"delete":{"parameters":[{"description":"Name is the stream name, from the path.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Removes a stream with all its messages and consumers."},"get":{"parameters":[{"description":"Name is the stream name, from the path.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one stream's configuration and live state."},"put":{"parameters":[{"description":"Name is the stream name, unique within the org (alphanumeric, hyphens, underscores).","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/mq.Config"}}}},"summary":"Reconfigures an existing stream; the path names the stream, and the immutable fields (storage, retention) must restate what they are."}},"/v1/mq/stream/{name}/message":{"get":{"parameters":[{"description":"Name is the stream name, from the path.","in":"path","name":"name","required":true,"schema":{"type":"string"}},{"description":"Seq reads the message at this sequence (with next_by_subject: the walk's start).","in":"query","name":"seq","required":false,"schema":{"format":"uint64","type":"integer"}},{"description":"LastBySubject reads the newest message on this org-relative subject.","in":"query","name":"last_by_subject","required":false,"schema":{"type":"string"}},{"description":"NextBySubject walks forward from seq collecting messages on this org-relative subject (wildcards supported).","in":"query","name":"next_by_subject","required":false,"schema":{"type":"string"}},{"description":"Limit caps a next_by_subject walk (1–1000, default 100).","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Reads stored messages without a consumer: by sequence, by newest on a subject, or walking a subject forward from a sequence."}},"/v1/mq/stream/{name}/message/{seq}":{"delete":{"parameters":[{"description":"Name is the stream name, from the path.","in":"path","name":"name","required":true,"schema":{"type":"string"}},{"description":"Seq is the message's stream sequence, from the path.","in":"path","name":"seq","required":true,"schema":{"format":"uint64","type":"integer"}}],"summary":"Erases one message by sequence; the sequence gap remains."}},"/v1/mq/stream/{name}/purge":{"post":{"parameters":[{"description":"Name is the stream name, from the path.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/mq.Purge"}}}},"summary":"Removes messages from a stream, leaving its consumers in place."}},"/v1/mq/stream/{stream}/consumer":{"get":{"parameters":[{"description":"Stream is the stream name, from the path.","in":"path","name":"stream","required":true,"schema":{"type":"string"}},{"description":"Limit caps the consumers returned (1–1000, default 100).","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Offset skips that many consumers, name-ordered.","in":"query","name":"offset","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns a stream's consumers, name-ordered, with delivery state."},"post":{"parameters":[{"description":"Stream is the stream name, from the path.","in":"path","name":"stream","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/mq.makeIn"}}}},"summary":"Creates a durable pull consumer on a stream and returns it."}},"/v1/mq/stream/{stream}/consumer/{name}":{"delete":{"parameters":[{"description":"Stream is the stream name, from the path.","in":"path","name":"stream","required":true,"schema":{"type":"string"}},{"description":"Name is the consumer name, from the path.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Removes a consumer and its delivery state; unacknowledged messages stay in the stream."},"get":{"parameters":[{"description":"Stream is the stream name, from the path.","in":"path","name":"stream","required":true,"schema":{"type":"string"}},{"description":"Name is the consumer name, from the path.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one consumer's configuration and delivery state."}},"/v1/mq/stream/{stream}/consumer/{name}/next":{"post":{"parameters":[{"description":"Stream is the stream name, from the path.","in":"path","name":"stream","required":true,"schema":{"type":"string"}},{"description":"Name is the consumer name, from the path.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/mq.nextIn"}}}},"summary":"Pulls the consumer's next batch."}},"/v1/network":{"get":{"summary":"Returns the caller's org overlay network on the Zero Trust fabric."}},"/v1/network/identities":{"get":{"summary":"Returns the fabric identities the caller's org owns."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/network.identityIn"}}}},"summary":"Puts the caller on the org's overlay as its own IAM subject."}},"/v1/network/identities/{id}":{"delete":{"parameters":[{"description":"ID is the identity id from the path. The URL is the addressing authority,\nso it binds from there whatever else the request carries.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Takes one of the org's fabric identities out of the org."}},"/v1/network/routers":{"get":{"summary":"Returns the Zero Trust routers the caller's org owns."}},"/v1/network/services":{"get":{"summary":"Returns the Zero Trust edge services the caller's org owns."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/network.serviceIn"}}}},"summary":"Puts a name on the org's overlay: a fabric service forwarding to host:port on whichever of the org's devices carries the \"<name>-host\" role, dialable at \"<name>.<org>.zt\" by any of the org's identities — and by the cloud's own, which is what lets a BYO cluster's apiserver be attached to the fleet with a \".zt\" kubeconfig."}},"/v1/network/services/{id}":{"delete":{"parameters":[{"description":"ID is the service id from the path. The URL is the addressing authority,\nso it binds from there whatever else the request carries.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Takes a name off the org's overlay: the two policies, the service and its two configs that publishing made, in that order, and the \"<name>-host\" role from each of the org's identities — that role exists only for the bind policy to select, and a role naming no service is one the identities endpoint refuses to write."}},"/v1/network/{id}":{"get":{"parameters":[{"description":"ID is the network id from the path. The URL is the addressing authority, so\nit binds from there whatever else the request carries.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one overlay network by id, scoped to the caller's org."}},"/v1/node":{"get":{"summary":"Returns the caller org's currently connected bot nodes: what each one calls itself, the platform it runs on, its agent version, when its socket was established, and the capabilities and commands it reported."}},"/v1/node/connect":{"get":{"summary":"The socket a bot node dials and holds open to become invokable."}},"/v1/node/peer/invoke":{"post":{"summary":"Replica-to-replica forward of one invocation to the pod holding the node's socket."}},"/v1/node/{id}/invoke":{"post":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Ask one of your connected machines to run a command, and get its answer back."}},"/v1/notify/credentials/{provider}/{key}":{"delete":{"parameters":[{"description":"Provider is the delivery provider the credential is for.","in":"path","name":"provider","required":true,"schema":{"type":"string"}},{"description":"Key is the credential's name within that provider.","in":"path","name":"key","required":true,"schema":{"type":"string"}}],"summary":"Removes one of your org's notify provider credentials."},"put":{"parameters":[{"description":"Provider is the delivery provider the credential is for: twilio, plivo,\ntwilio_email or mail.","example":"twilio","in":"path","name":"provider","required":true,"schema":{"type":"string"}},{"description":"Key is one of the credentials that provider reads, such as auth-token or\nsmtp-host. A key the provider does not read is refused.","example":"auth-token","in":"path","name":"key","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/notify.notifyCredential"}}}},"summary":"Sets one of your org's notify provider credentials."}},"/v1/notify/health":{"get":{"summary":"Reports that the notify send surface is mounted."}},"/v1/notify/send":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/notify.notifySend"}}}},"summary":"Delivers one transactional message by email or SMS through the caller org's own provider credential."}},"/v1/notify/send/email":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/notify.notifySend"}}}},"summary":"Delivers one transactional email through the caller org's own provider credential."}},"/v1/notify/send/sms":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/notify.notifySend"}}}},"summary":"Delivers one transactional SMS through the caller org's own provider credential."}},"/v1/o11y/alerts":{"get":{"summary":"Returns the org's current alerts."}},"/v1/o11y/alerts/heartbeat":{"get":{"summary":"Reports whether the alert path's heartbeat is still arriving: the dead-man's switch for paging."}},"/v1/o11y/alerts/last":{"get":{"summary":"Replay the alert records this process took"}},"/v1/o11y/alerts/{receiver}":{"post":{"parameters":[{"in":"path","name":"receiver","required":true,"schema":{"type":"string"}}],"summary":"Take an Alertmanager notification and page a human"}},"/v1/o11y/authz/check":{"post":{"requestBody":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/o11y.O11yTransaction"},"type":"array"}}}},"summary":"Evaluates a batch of transactions — relation plus object — for the authenticated caller and answers each with its authorization verdict, in the order they were asked."}},"/v1/o11y/auto_complete/attribute_values":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.FilterAttributeValueRequest"}}}},"summary":"Reads the attribute-value request from the body rather than off the query string — the spelling the newer builder uses to send its filters alongside the request."}},"/v1/o11y/autocomplete/aggregate_attributes":{"get":{"parameters":[{"description":"DataSource is the telemetry the attributes come from — traces, logs,\nmetrics or meter. The runtime requires it.","in":"query","name":"dataSource","required":false,"schema":{"type":"string"}},{"description":"AggregateOperator is the aggregation the attribute will be used under, e.g.\ncount, avg, sum. The runtime requires it for non-metrics sources.","in":"query","name":"aggregateOperator","required":false,"schema":{"type":"string"}},{"description":"SearchText narrows the attributes to those containing it.","in":"query","name":"searchText","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many attributes come back. Absent means 50.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the attributes usable as an aggregate target for the given telemetry and operator — what a filter builder offers after the aggregation is chosen."}},"/v1/o11y/autocomplete/attribute_keys":{"get":{"parameters":[{"description":"DataSource is the telemetry the keys come from — traces, logs, metrics or\nmeter. The runtime requires it.","in":"query","name":"dataSource","required":false,"schema":{"type":"string"}},{"description":"AggregateOperator is the aggregation the keys will be used under. The\nruntime requires it for non-metrics sources.","in":"query","name":"aggregateOperator","required":false,"schema":{"type":"string"}},{"description":"AggregateAttribute is the metric the keys must appear on.","in":"query","name":"aggregateAttribute","required":false,"schema":{"type":"string"}},{"description":"SearchText narrows the keys to those containing it.","in":"query","name":"searchText","required":false,"schema":{"type":"string"}},{"description":"TagType narrows the keys to one kind — tag or resource. Empty means all;\nan invalid value reads as empty.","in":"query","name":"tagType","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many keys come back. Absent means 50.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the attribute keys available for filtering the given telemetry, each with its data type and whether it is a materialized column."}},"/v1/o11y/autocomplete/attribute_values":{"get":{"parameters":[{"description":"DataSource is the telemetry the values come from — traces, logs or\nmetrics. The runtime requires it.","in":"query","name":"dataSource","required":false,"schema":{"type":"string"}},{"description":"AggregateOperator is the aggregation the values will be used under. The\nruntime requires it for non-metrics sources.","in":"query","name":"aggregateOperator","required":false,"schema":{"type":"string"}},{"description":"AggregateAttribute is the metric the values must appear on.","in":"query","name":"aggregateAttribute","required":false,"schema":{"type":"string"}},{"description":"AttributeKey is the key whose values to list.","in":"query","name":"attributeKey","required":false,"schema":{"type":"string"}},{"description":"FilterAttributeKeyDataType is the key's data type — string, int64, float64\nor bool. Empty means unspecified.","in":"query","name":"filterAttributeKeyDataType","required":false,"schema":{"type":"string"}},{"description":"SearchText narrows the values to those containing it.","in":"query","name":"searchText","required":false,"schema":{"type":"string"}},{"description":"TagType narrows the search to one kind of key — tag or resource.","in":"query","name":"tagType","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many values come back. Absent means 50.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the values one attribute key has taken — string, number and bool values in their own lists — for completing a filter."}},"/v1/o11y/channels":{"get":{"summary":"Lists the org's notification channels."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.PostableChannel"}}}},"summary":"Creates a notification channel, answering with the stored channel."}},"/v1/o11y/channels/test":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.alertmanagertypes.Receiver"}}}},"summary":"Sends a test notification to the posted receiver."}},"/v1/o11y/channels/{id}":{"delete":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Removes a notification channel, by id."},"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one notification channel, by id."},"put":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yChannelUpdateIn"}}}},"summary":"Replaces a notification channel's receiver, by id."}},"/v1/o11y/cloud-integrations/{cloud_provider}/agent-check-in":{"post":{"parameters":[{"in":"path","name":"cloud_provider","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yAgentCheckInIn"}}}},"summary":"Is the deployed agent's check-in on its original hyphenated path, kept for backward compatibility with agents already running."}},"/v1/o11y/cloud_integrations/{cloud_provider}/accounts":{"get":{"parameters":[{"in":"path","name":"cloud_provider","required":true,"schema":{"type":"string"}}],"summary":"Lists the cloud-integration accounts connected for the given provider."},"post":{"parameters":[{"in":"path","name":"cloud_provider","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yCreateAccountIn"}}}},"summary":"Connects a new cloud-integration account for the given provider from its posted config and credentials, answering with the account and the artifact the agent deploys to complete the connection."}},"/v1/o11y/cloud_integrations/{cloud_provider}/accounts/check_in":{"post":{"parameters":[{"in":"path","name":"cloud_provider","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yAgentCheckInIn"}}}},"summary":"Is the deployed agent's check-in — the path consistent with the account surface, reporting the agent's account and telemetry state so the connection can be tracked."}},"/v1/o11y/cloud_integrations/{cloud_provider}/accounts/{id}":{"delete":{"parameters":[{"in":"path","name":"cloud_provider","required":true,"schema":{"type":"string"}},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Tears down a connected account for the given provider, by id."},"get":{"parameters":[{"in":"path","name":"cloud_provider","required":true,"schema":{"type":"string"}},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one connected account for the given provider, by id."},"put":{"parameters":[{"in":"path","name":"cloud_provider","required":true,"schema":{"type":"string"}},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yUpdateAccountIn"}}}},"summary":"Changes a connected account's configuration for the given provider, by id."}},"/v1/o11y/cloud_integrations/{cloud_provider}/accounts/{id}/services":{"get":{"parameters":[{"in":"path","name":"cloud_provider","required":true,"schema":{"type":"string"}},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Lists the services metadata for one connected account of the given provider, by account id."}},"/v1/o11y/cloud_integrations/{cloud_provider}/accounts/{id}/services/{service_id}":{"get":{"parameters":[{"in":"path","name":"cloud_provider","required":true,"schema":{"type":"string"}},{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"path","name":"service_id","required":true,"schema":{"type":"string"}}],"summary":"Returns one service and its configuration for a connected account of the given provider, by account id and service id."},"put":{"parameters":[{"in":"path","name":"cloud_provider","required":true,"schema":{"type":"string"}},{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"path","name":"service_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yUpdateServiceIn"}}}},"summary":"Changes a service's configuration for one connected account of the given provider, by account id and service id."}},"/v1/o11y/cloud_integrations/{cloud_provider}/credentials":{"get":{"parameters":[{"in":"path","name":"cloud_provider","required":true,"schema":{"type":"string"}}],"summary":"Returns the credentials the connecting agent needs to establish the cloud integration, for the given cloud provider."}},"/v1/o11y/cloud_integrations/{cloud_provider}/services":{"get":{"parameters":[{"in":"path","name":"cloud_provider","required":true,"schema":{"type":"string"}},{"description":"CloudIntegrationID, when set, scopes the listing to one cloud integration.","in":"query","name":"cloud_integration_id","required":false,"schema":{"type":"string"}}],"summary":"Lists the services the given provider can collect from, optionally scoped to one cloud integration."}},"/v1/o11y/cloud_integrations/{cloud_provider}/services/{service_id}":{"get":{"parameters":[{"in":"path","name":"cloud_provider","required":true,"schema":{"type":"string"}},{"in":"path","name":"service_id","required":true,"schema":{"type":"string"}},{"description":"CloudIntegrationID, when set, scopes the service to one cloud integration.","in":"query","name":"cloud_integration_id","required":false,"schema":{"type":"string"}}],"summary":"Returns one service the given provider can collect from, by service id, optionally scoped to one cloud integration."}},"/v1/o11y/clusters/attribute_keys":{"get":{"parameters":[{"description":"DataSource is the telemetry the keys come from — metrics for the infra\nfaces. The runtime requires it.","in":"query","name":"dataSource","required":false,"schema":{"type":"string"}},{"description":"AggregateOperator is the aggregation the keys will be used under, e.g.\nnoop, count, avg. The runtime requires it for non-metrics sources.","in":"query","name":"aggregateOperator","required":false,"schema":{"type":"string"}},{"description":"AggregateAttribute is the metric the keys must appear on.","in":"query","name":"aggregateAttribute","required":false,"schema":{"type":"string"}},{"description":"SearchText narrows the keys to those containing it.","in":"query","name":"searchText","required":false,"schema":{"type":"string"}},{"description":"TagType narrows the keys to one kind — tag or resource. Empty means all;\nan invalid value reads as empty.","in":"query","name":"tagType","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many keys come back. Absent means 50.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the metric attribute keys Kubernetes clusters report, for building cluster filters."}},"/v1/o11y/clusters/attribute_values":{"get":{"parameters":[{"description":"DataSource is the telemetry the values come from — metrics for the infra\nfaces. The runtime requires it.","in":"query","name":"dataSource","required":false,"schema":{"type":"string"}},{"description":"AggregateOperator is the aggregation the values will be used under, e.g.\nnoop, count, avg. The runtime requires it for non-metrics sources.","in":"query","name":"aggregateOperator","required":false,"schema":{"type":"string"}},{"description":"AggregateAttribute is the metric the values must appear on.","in":"query","name":"aggregateAttribute","required":false,"schema":{"type":"string"}},{"description":"AttributeKey is the key whose values to list.","in":"query","name":"attributeKey","required":false,"schema":{"type":"string"}},{"description":"FilterAttributeKeyDataType is the key's data type — string, int64,\nfloat64 or bool. Empty means unspecified.","in":"query","name":"filterAttributeKeyDataType","required":false,"schema":{"type":"string"}},{"description":"SearchText narrows the values to those containing it.","in":"query","name":"searchText","required":false,"schema":{"type":"string"}},{"description":"TagType narrows the search to one kind of key — tag or resource.","in":"query","name":"tagType","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many values come back. Absent means 50.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the values one cluster attribute key has taken, for building cluster filters."}},"/v1/o11y/clusters/list":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.ClusterListRequest"}}}},"summary":"Lists Kubernetes clusters over a time range, each with its CPU and memory usage against allocatable capacity and its attributes; filterable, groupable and paginated."}},"/v1/o11y/countErrors":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yErrorsCountIn"}}}},"summary":"Counts the grouped exceptions in the query window for the caller's org."}},"/v1/o11y/daemonsets/attribute_keys":{"get":{"parameters":[{"description":"DataSource is the telemetry the keys come from — metrics for the infra\nfaces. The runtime requires it.","in":"query","name":"dataSource","required":false,"schema":{"type":"string"}},{"description":"AggregateOperator is the aggregation the keys will be used under, e.g.\nnoop, count, avg. The runtime requires it for non-metrics sources.","in":"query","name":"aggregateOperator","required":false,"schema":{"type":"string"}},{"description":"AggregateAttribute is the metric the keys must appear on.","in":"query","name":"aggregateAttribute","required":false,"schema":{"type":"string"}},{"description":"SearchText narrows the keys to those containing it.","in":"query","name":"searchText","required":false,"schema":{"type":"string"}},{"description":"TagType narrows the keys to one kind — tag or resource. Empty means all;\nan invalid value reads as empty.","in":"query","name":"tagType","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many keys come back. Absent means 50.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the metric attribute keys Kubernetes daemonsets report, for building daemonset filters."}},"/v1/o11y/daemonsets/attribute_values":{"get":{"parameters":[{"description":"DataSource is the telemetry the values come from — metrics for the infra\nfaces. The runtime requires it.","in":"query","name":"dataSource","required":false,"schema":{"type":"string"}},{"description":"AggregateOperator is the aggregation the values will be used under, e.g.\nnoop, count, avg. The runtime requires it for non-metrics sources.","in":"query","name":"aggregateOperator","required":false,"schema":{"type":"string"}},{"description":"AggregateAttribute is the metric the values must appear on.","in":"query","name":"aggregateAttribute","required":false,"schema":{"type":"string"}},{"description":"AttributeKey is the key whose values to list.","in":"query","name":"attributeKey","required":false,"schema":{"type":"string"}},{"description":"FilterAttributeKeyDataType is the key's data type — string, int64,\nfloat64 or bool. Empty means unspecified.","in":"query","name":"filterAttributeKeyDataType","required":false,"schema":{"type":"string"}},{"description":"SearchText narrows the values to those containing it.","in":"query","name":"searchText","required":false,"schema":{"type":"string"}},{"description":"TagType narrows the search to one kind of key — tag or resource.","in":"query","name":"tagType","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many values come back. Absent means 50.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the values one daemonset attribute key has taken, for building daemonset filters."}},"/v1/o11y/daemonsets/list":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.DaemonSetListRequest"}}}},"summary":"Lists Kubernetes daemonsets over a time range, each with the CPU and memory its pods used against request and limit, desired and available node counts, restarts and attributes; filterable, groupable and paginated."}},"/v1/o11y/dashboard_views":{"get":{"summary":"Returns every saved view in the calling user's org."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yDashboardViewPostable"}}}},"summary":"Persists the calling user's dashboard-listing state (query, sort, order) as a named, reusable view shared across the org."}},"/v1/o11y/dashboard_views/{id}":{"delete":{"parameters":[{"description":"ID is the resource id from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Removes a saved view."},"put":{"parameters":[{"description":"ID is the saved view id from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yDashboardViewUpdateIn"}}}},"summary":"Replaces a saved view's name and data."}},"/v1/o11y/dashboards":{"get":{"parameters":[{"description":"Query is the filter DSL over dashboard columns and tags, e.g.\n`name:cpu source:user`. Empty lists everything.","in":"query","name":"query","required":false,"schema":{"type":"string"}},{"description":"Sort is the sort field: updated_at, created_at or name. Empty sorts by\nupdated_at.","in":"query","name":"sort","required":false,"schema":{"type":"string"}},{"description":"Order is the sort direction: asc or desc. Empty orders desc.","in":"query","name":"order","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many dashboards come back. Zero means the default of 20;\nthe runtime caps it at 200.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Offset is how many dashboards to skip for pagination.","in":"query","name":"offset","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns a page of v2-shape dashboards for the org."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yDashboardPostable"}}}},"summary":"Creates a dashboard in the v2 format that follows the Perses spec and answers with the stored dashboard."}},"/v1/o11y/dashboards/{id}":{"delete":{"parameters":[{"description":"ID is the resource id from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Deletes a v2-shape dashboard along with its tag relations."},"get":{"parameters":[{"description":"ID is the resource id from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns a v2-shape dashboard."},"patch":{"parameters":[{"description":"ID is the dashboard id from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yDashboardPatchIn"}}}},"summary":"Applies an RFC 6902 JSON Patch to a v2-shape dashboard."},"put":{"parameters":[{"description":"ID is the dashboard id from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yDashboardUpdateIn"}}}},"summary":"Updates a v2-shape dashboard's metadata, spec and tag set."}},"/v1/o11y/dashboards/{id}/clone":{"post":{"parameters":[{"description":"ID is the resource id from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Clones an existing v2-shape dashboard."}},"/v1/o11y/dashboards/{id}/lock":{"delete":{"parameters":[{"description":"ID is the resource id from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Unlocks a v2-shape dashboard."},"put":{"parameters":[{"description":"ID is the resource id from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Locks a v2-shape dashboard."}},"/v1/o11y/dashboards/{id}/public":{"delete":{"parameters":[{"description":"ID is the resource id from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Deletes the public-sharing config and disables public sharing of a dashboard."},"get":{"parameters":[{"description":"ID is the resource id from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns the public-sharing config for a dashboard."},"post":{"parameters":[{"description":"ID is the dashboard id from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yPublicDashboardWriteIn"}}}},"summary":"Creates the public-sharing config for a dashboard and enables public sharing, answering with the new share's id."},"put":{"parameters":[{"description":"ID is the dashboard id from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yPublicDashboardWriteIn"}}}},"summary":"Updates the public-sharing config for a dashboard."}},"/v1/o11y/dependency_graph":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yDependencyGraphIn"}}}},"summary":"Returns the service dependency graph over the requested window: every parent→child edge observed, with call and error rates and latency percentiles per edge."}},"/v1/o11y/deployments/attribute_keys":{"get":{"parameters":[{"description":"DataSource is the telemetry the keys come from — metrics for the infra\nfaces. The runtime requires it.","in":"query","name":"dataSource","required":false,"schema":{"type":"string"}},{"description":"AggregateOperator is the aggregation the keys will be used under, e.g.\nnoop, count, avg. The runtime requires it for non-metrics sources.","in":"query","name":"aggregateOperator","required":false,"schema":{"type":"string"}},{"description":"AggregateAttribute is the metric the keys must appear on.","in":"query","name":"aggregateAttribute","required":false,"schema":{"type":"string"}},{"description":"SearchText narrows the keys to those containing it.","in":"query","name":"searchText","required":false,"schema":{"type":"string"}},{"description":"TagType narrows the keys to one kind — tag or resource. Empty means all;\nan invalid value reads as empty.","in":"query","name":"tagType","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many keys come back. Absent means 50.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the metric attribute keys Kubernetes deployments report, for building deployment filters."}},"/v1/o11y/deployments/attribute_values":{"get":{"parameters":[{"description":"DataSource is the telemetry the values come from — metrics for the infra\nfaces. The runtime requires it.","in":"query","name":"dataSource","required":false,"schema":{"type":"string"}},{"description":"AggregateOperator is the aggregation the values will be used under, e.g.\nnoop, count, avg. The runtime requires it for non-metrics sources.","in":"query","name":"aggregateOperator","required":false,"schema":{"type":"string"}},{"description":"AggregateAttribute is the metric the values must appear on.","in":"query","name":"aggregateAttribute","required":false,"schema":{"type":"string"}},{"description":"AttributeKey is the key whose values to list.","in":"query","name":"attributeKey","required":false,"schema":{"type":"string"}},{"description":"FilterAttributeKeyDataType is the key's data type — string, int64,\nfloat64 or bool. Empty means unspecified.","in":"query","name":"filterAttributeKeyDataType","required":false,"schema":{"type":"string"}},{"description":"SearchText narrows the values to those containing it.","in":"query","name":"searchText","required":false,"schema":{"type":"string"}},{"description":"TagType narrows the search to one kind of key — tag or resource.","in":"query","name":"tagType","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many values come back. Absent means 50.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the values one deployment attribute key has taken, for building deployment filters."}},"/v1/o11y/deployments/list":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.DeploymentListRequest"}}}},"summary":"Lists Kubernetes deployments over a time range, each with the CPU and memory its pods used against request and limit, desired and available replica counts, restarts and attributes; filterable, groupable and paginated."}},"/v1/o11y/disks":{"get":{"summary":"Lists the storage disks the datastore reports, with their names and types."}},"/v1/o11y/downtime_schedules":{"get":{"parameters":[{"description":"Active, when \"true\" or \"false\", keeps only the active or inactive windows.\nAbsent lists all.","in":"query","name":"active","required":false,"schema":{"type":"string"}},{"description":"Recurring, when \"true\" or \"false\", keeps only the recurring or one-off\nwindows. Absent lists all.","in":"query","name":"recurring","required":false,"schema":{"type":"string"}}],"summary":"Lists all planned maintenance windows, optionally narrowed to the active ones or the recurring ones."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.PostablePlannedMaintenance"}}}},"summary":"Creates a planned maintenance window, answering with the stored schedule."}},"/v1/o11y/downtime_schedules/{id}":{"delete":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Removes a planned maintenance window, by id."},"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one planned maintenance window, by id."},"put":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yDowntimeUpdateIn"}}}},"summary":"Replaces a planned maintenance window, by id."}},"/v1/o11y/errorFromErrorID":{"get":{"parameters":[{"description":"Timestamp is the instance's time as a nanosecond epoch spelled as a\nstring. Required.","in":"query","name":"timestamp","required":true,"schema":{"type":"string"}},{"description":"GroupID is the exception group the instance belongs to. Required.","in":"query","name":"groupID","required":true,"schema":{"type":"string"}},{"description":"ErrorID is the exception instance id. Required by errorFromErrorID and\nnextPrevErrorIDs; unused by errorFromGroupID.","in":"query","name":"errorID","required":false,"schema":{"type":"string"}}],"summary":"Returns one exception instance and the span it happened on, by its error id within a group at a timestamp."}},"/v1/o11y/errorFromGroupID":{"get":{"parameters":[{"description":"Timestamp is the instance's time as a nanosecond epoch spelled as a\nstring. Required.","in":"query","name":"timestamp","required":true,"schema":{"type":"string"}},{"description":"GroupID is the exception group the instance belongs to. Required.","in":"query","name":"groupID","required":true,"schema":{"type":"string"}},{"description":"ErrorID is the exception instance id. Required by errorFromErrorID and\nnextPrevErrorIDs; unused by errorFromGroupID.","in":"query","name":"errorID","required":false,"schema":{"type":"string"}}],"summary":"Returns the representative exception instance of a group at a timestamp, and the span it happened on."}},"/v1/o11y/errortracking/issues":{"get":{"parameters":[{"description":"Status narrows to one lifecycle state: unresolved, resolved or ignored.","in":"query","name":"status","required":false,"schema":{"type":"string"}},{"description":"Level narrows to one severity, e.g. error, warning, info.","in":"query","name":"level","required":false,"schema":{"type":"string"}},{"description":"Environment narrows to one deployment environment.","in":"query","name":"environment","required":false,"schema":{"type":"string"}},{"description":"ServiceName narrows to one reporting service.","in":"query","name":"serviceName","required":false,"schema":{"type":"string"}},{"description":"Query narrows to issues whose text contains it.","in":"query","name":"query","required":false,"schema":{"type":"string"}},{"description":"Sort orders the page, e.g. lastSeen, firstSeen, count.","in":"query","name":"sort","required":false,"schema":{"type":"string"}},{"description":"Offset is how many issues to skip. Zero starts at the first.","in":"query","name":"offset","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Limit caps how many issues come back. Zero means the default.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the caller's org's grouped error issues (by fingerprint) with status, level, counts and first/last-seen."}},"/v1/o11y/errortracking/issues/{id}":{"get":{"parameters":[{"description":"ID is the issue id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one grouped issue with its latest occurrence sample."},"post":{"parameters":[{"description":"ID is the issue id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yErrorUpdateIssueIn"}}}},"summary":"Changes an issue's lifecycle — resolve, ignore, reopen or assign — and returns the updated issue."}},"/v1/o11y/event":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yEventIn"}}}},"summary":"Records one product-analytics event for the signed-in user — a track event with a name and free-form attributes."}},"/v1/o11y/explorer/views":{"get":{"parameters":[{"description":"SourcePage narrows the views to one source page, e.g. traces, logs.","in":"query","name":"sourcePage","required":false,"schema":{"type":"string"}},{"description":"Name narrows the views to one name.","in":"query","name":"name","required":false,"schema":{"type":"string"}},{"description":"Category narrows the views to one category.","in":"query","name":"category","required":false,"schema":{"type":"string"}}],"summary":"Lists the caller's org's saved explorer views, optionally narrowed to one source page, name or category."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.SavedView"}}}},"summary":"Saves a new explorer view for the caller's org and returns its id."}},"/v1/o11y/explorer/views/{viewId}":{"delete":{"parameters":[{"description":"ViewID is the view's id.","in":"path","name":"viewId","required":true,"schema":{"type":"string"}}],"summary":"Deletes one saved explorer view by id."},"get":{"parameters":[{"description":"ViewID is the view's id.","in":"path","name":"viewId","required":true,"schema":{"type":"string"}}],"summary":"Returns one saved explorer view by id."},"put":{"parameters":[{"description":"ViewID is the id of the view to replace, taken from the URL.","in":"path","name":"viewId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11ySavedViewUpdateIn"}}}},"summary":"Replaces one saved explorer view by id with the given view and echoes it back."}},"/v1/o11y/export_raw_data":{"post":{"summary":"Export raw telemetry rows as a file"}},"/v1/o11y/features":{"get":{"summary":"Returns the supported feature flags and their resolved values for the caller's org."}},"/v1/o11y/fields/keys":{"get":{"parameters":[{"description":"Signal is the telemetry to read the fields of — traces, logs or metrics.","in":"query","name":"signal","required":false,"schema":{"type":"string"}},{"description":"Source narrows the fields to one source within the signal.","in":"query","name":"source","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many keys come back.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"StartUnixMilli is the window start as a unix millisecond epoch. Zero reads\nas unset.","in":"query","name":"startUnixMilli","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"EndUnixMilli is the window end as a unix millisecond epoch. Zero reads as\nunset.","in":"query","name":"endUnixMilli","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"FieldContext narrows the keys to one context — resource, scope, attribute,\nspan, log or metric.","in":"query","name":"fieldContext","required":false,"schema":{"type":"string"}},{"description":"FieldDataType narrows the keys to one data type.","in":"query","name":"fieldDataType","required":false,"schema":{"type":"string"}},{"description":"MetricName narrows the keys to those on one metric.","in":"query","name":"metricName","required":false,"schema":{"type":"string"}},{"description":"MetricNamespace narrows the keys to one metric namespace.","in":"query","name":"metricNamespace","required":false,"schema":{"type":"string"}},{"description":"SearchText narrows the keys to those containing it.","in":"query","name":"searchText","required":false,"schema":{"type":"string"}}],"summary":"Returns the telemetry field keys matching the selector — the signal's fields grouped by name, and whether the catalog is complete."}},"/v1/o11y/fields/values":{"get":{"parameters":[{"description":"Signal is the telemetry to read the field of — traces, logs or metrics.","in":"query","name":"signal","required":false,"schema":{"type":"string"}},{"description":"Source narrows the field to one source within the signal.","in":"query","name":"source","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many values come back.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"StartUnixMilli is the window start as a unix millisecond epoch. Zero reads\nas unset.","in":"query","name":"startUnixMilli","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"EndUnixMilli is the window end as a unix millisecond epoch. Zero reads as\nunset.","in":"query","name":"endUnixMilli","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"FieldContext narrows the field to one context.","in":"query","name":"fieldContext","required":false,"schema":{"type":"string"}},{"description":"FieldDataType narrows the field to one data type.","in":"query","name":"fieldDataType","required":false,"schema":{"type":"string"}},{"description":"MetricName narrows the field to one metric.","in":"query","name":"metricName","required":false,"schema":{"type":"string"}},{"description":"MetricNamespace narrows the field to one metric namespace.","in":"query","name":"metricNamespace","required":false,"schema":{"type":"string"}},{"description":"SearchText narrows the values to those containing it.","in":"query","name":"searchText","required":false,"schema":{"type":"string"}},{"description":"Name is the field whose values to read.","in":"query","name":"name","required":false,"schema":{"type":"string"}},{"description":"ExistingQuery is the query the field appears in, so related values can be\nsuggested for it.","in":"query","name":"existingQuery","required":false,"schema":{"type":"string"}}],"summary":"Returns the values one telemetry field has taken — string, bool, number and related values — and whether the value list is complete."}},"/v1/o11y/filter_suggestions":{"get":{"parameters":[{"description":"DataSource is the signal suggestions are drawn from; only logs is\nsupported today. Required.","in":"query","name":"dataSource","required":true,"schema":{"type":"string"}},{"description":"SearchText narrows attribute suggestions to keys containing it.","in":"query","name":"searchText","required":false,"schema":{"type":"string"}},{"description":"ExistingFilter is the current filter set, JSON base64url-encoded, so\nexample queries build on it rather than repeat it.","in":"query","name":"existingFilter","required":false,"schema":{"type":"string"}},{"description":"AttributesLimit caps how many attribute keys come back.","in":"query","name":"attributesLimit","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"ExamplesLimit caps how many example queries come back.","in":"query","name":"examplesLimit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Suggests attribute keys and example filter queries for the query builder, seeded by what the org's own telemetry carries."}},"/v1/o11y/gateway/ingestion_keys":{"get":{"parameters":[{"description":"Page is the 1-based page number.","in":"query","name":"page","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"PerPage is the page size.","in":"query","name":"per_page","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the workspace's ingestion keys, paginated."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.PostableIngestionKey"}}}},"summary":"Mints an ingestion key for the workspace, answering with the created key."}},"/v1/o11y/gateway/ingestion_keys/limits/{limitId}":{"delete":{"parameters":[{"in":"path","name":"limitId","required":true,"schema":{"type":"string"}}],"summary":"Removes an ingestion key limit, by limit id."},"patch":{"parameters":[{"in":"path","name":"limitId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yUpdateLimitIn"}}}},"summary":"Changes an ingestion key limit, by limit id."}},"/v1/o11y/gateway/ingestion_keys/search":{"get":{"parameters":[{"description":"Name is the substring to match ingestion-key names against.","in":"query","name":"name","required":false,"schema":{"type":"string"}},{"description":"Page is the 1-based page number.","in":"query","name":"page","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"PerPage is the page size.","in":"query","name":"per_page","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the workspace's ingestion keys whose name matches the search, paginated."}},"/v1/o11y/gateway/ingestion_keys/{keyId}":{"delete":{"parameters":[{"in":"path","name":"keyId","required":true,"schema":{"type":"string"}}],"summary":"Removes an ingestion key, by id."},"patch":{"parameters":[{"in":"path","name":"keyId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yUpdateIngestionKeyIn"}}}},"summary":"Changes an ingestion key, by id."}},"/v1/o11y/gateway/ingestion_keys/{keyId}/limits":{"post":{"parameters":[{"in":"path","name":"keyId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yCreateLimitIn"}}}},"summary":"Sets a signal limit on an ingestion key, by key id, answering with the created limit."}},"/v1/o11y/global/config":{"get":{"summary":"Returns the deployment's global configuration: its public endpoints and which identity providers are enabled."}},"/v1/o11y/health":{"get":{"parameters":[{"description":"Live also checks the datastore connection; an unreachable store refuses\nwith 503.","in":"query","name":"live","required":false,"schema":{"type":"boolean"}}],"summary":"Reports service health."}},"/v1/o11y/healthz":{"get":{"summary":"Health of the observability runtime's services"}},"/v1/o11y/hosts/attribute_keys":{"get":{"parameters":[{"description":"DataSource is the telemetry the keys come from — metrics for the infra\nfaces. The runtime requires it.","in":"query","name":"dataSource","required":false,"schema":{"type":"string"}},{"description":"AggregateOperator is the aggregation the keys will be used under, e.g.\nnoop, count, avg. The runtime requires it for non-metrics sources.","in":"query","name":"aggregateOperator","required":false,"schema":{"type":"string"}},{"description":"AggregateAttribute is the metric the keys must appear on.","in":"query","name":"aggregateAttribute","required":false,"schema":{"type":"string"}},{"description":"SearchText narrows the keys to those containing it.","in":"query","name":"searchText","required":false,"schema":{"type":"string"}},{"description":"TagType narrows the keys to one kind — tag or resource. Empty means all;\nan invalid value reads as empty.","in":"query","name":"tagType","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many keys come back. Absent means 50.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the metric attribute keys hosts report, for building host filters — each with its data type and whether it is a materialized column."}},"/v1/o11y/hosts/attribute_values":{"get":{"parameters":[{"description":"DataSource is the telemetry the values come from — metrics for the infra\nfaces. The runtime requires it.","in":"query","name":"dataSource","required":false,"schema":{"type":"string"}},{"description":"AggregateOperator is the aggregation the values will be used under, e.g.\nnoop, count, avg. The runtime requires it for non-metrics sources.","in":"query","name":"aggregateOperator","required":false,"schema":{"type":"string"}},{"description":"AggregateAttribute is the metric the values must appear on.","in":"query","name":"aggregateAttribute","required":false,"schema":{"type":"string"}},{"description":"AttributeKey is the key whose values to list.","in":"query","name":"attributeKey","required":false,"schema":{"type":"string"}},{"description":"FilterAttributeKeyDataType is the key's data type — string, int64,\nfloat64 or bool. Empty means unspecified.","in":"query","name":"filterAttributeKeyDataType","required":false,"schema":{"type":"string"}},{"description":"SearchText narrows the values to those containing it.","in":"query","name":"searchText","required":false,"schema":{"type":"string"}},{"description":"TagType narrows the search to one kind of key — tag or resource.","in":"query","name":"tagType","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many values come back. Absent means 50.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the values one host attribute key has taken, for building host filters — string, number and bool values in their own lists."}},"/v1/o11y/hosts/list":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.HostListRequest"}}}},"summary":"Lists monitored hosts over a time range, each with its CPU, memory, I/O wait and 15-minute load, whether it is actively reporting, its OS and its attributes; filterable, groupable and paginated."}},"/v1/o11y/infra_monitoring/checks":{"get":{"parameters":[{"description":"Type is the section to check — hosts, processes, pods, nodes,\ndeployments, daemonsets, statefulsets, jobs, namespaces, clusters or\nvolumes. Required.","in":"query","name":"type","required":true,"schema":{"type":"string"}}],"summary":"Reports whether the metrics and attributes an infra-monitoring section needs are being received — for each collector receiver or processor involved, what is present and what is missing, with a user-facing message and a docs link per missing piece."}},"/v1/o11y/infra_monitoring/clusters":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.PostableClusters"}}}},"summary":"Lists Kubernetes clusters with CPU and memory usage against allocatable capacity summed over their nodes, plus per-group node readiness and pod phase counts."}},"/v1/o11y/infra_monitoring/daemonsets":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.PostableDaemonSets"}}}},"summary":"Lists Kubernetes daemonsets with the CPU and memory their pods used against request and limit, the latest desired and current scheduled NODE counts (node counts, not pod counts), and per-group pod phase counts."}},"/v1/o11y/infra_monitoring/deployments":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.PostableDeployments"}}}},"summary":"Lists Kubernetes deployments with the CPU and memory their pods used against request and limit, the latest desired and available replica counts, and per-group pod phase counts."}},"/v1/o11y/infra_monitoring/hosts":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.PostableHosts"}}}},"summary":"Lists hosts with key infrastructure metrics — CPU, memory, I/O wait and disk usage percentages and 15-minute load — plus an active/inactive status from whether the host reported in the last ten minutes."}},"/v1/o11y/infra_monitoring/jobs":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.PostableJobs"}}}},"summary":"Lists Kubernetes jobs with the CPU and memory their pods used against request and limit, the latest desired-successful, active, failed and successful pod counters, and per-group pod phase counts — the phase counts are current state while the counters are cumulative over the job's life."}},"/v1/o11y/infra_monitoring/namespaces":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.PostableNamespaces"}}}},"summary":"Lists Kubernetes namespaces with the CPU and memory their pods used and per-group pod phase counts."}},"/v1/o11y/infra_monitoring/nodes":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.PostableNodes"}}}},"summary":"Lists Kubernetes nodes with CPU and memory usage against allocatable capacity, per-group readiness counts and per-group phase counts for the pods scheduled on them."}},"/v1/o11y/infra_monitoring/pods":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.PostablePods"}}}},"summary":"Lists Kubernetes pods with CPU and memory usage against request and limit, the pod's phase and its age, plus its namespace, node, owning workload and cluster attributes."}},"/v1/o11y/infra_monitoring/pvcs":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.PostableVolumes"}}}},"summary":"Lists Kubernetes persistent volume claims with available, capacity and used bytes and inode counts, plus the claim's pod, namespace, node, statefulset and cluster attributes."}},"/v1/o11y/infra_monitoring/statefulsets":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.PostableStatefulSets"}}}},"summary":"Lists Kubernetes statefulsets with the CPU and memory their pods used against request and limit, the latest desired and current replica counts, and per-group pod phase counts."}},"/v1/o11y/infra_onboarding/k8s/status":{"get":{"summary":"Reports how far Kubernetes infra onboarding has progressed: which metric families have arrived and, per pod, which required metadata labels are present."}},"/v1/o11y/integrations":{"get":{"parameters":[{"description":"IsInstalled, when \"true\" or \"false\", keeps only integrations in that\ninstalled state; empty lists them all.","in":"query","name":"is_installed","required":false,"schema":{"type":"string"}}],"summary":"Lists the available integrations and whether each is installed in the caller's org, optionally narrowed to installed or not-installed."}},"/v1/o11y/integrations/install":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.InstallIntegrationRequest"}}}},"summary":"Installs an integration into the caller's org from its id and configuration, answering with the installed catalog item."}},"/v1/o11y/integrations/uninstall":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.UninstallIntegrationRequest"}}}},"summary":"Removes an integration from the caller's org by id."}},"/v1/o11y/integrations/{integrationId}":{"get":{"parameters":[{"in":"path","name":"integrationId","required":true,"schema":{"type":"string"}}],"summary":"Returns one integration's full detail — its overview, configuration steps, collected data and assets — together with its installation record when the org has installed it."}},"/v1/o11y/integrations/{integrationId}/connection_status":{"get":{"parameters":[{"in":"path","name":"integrationId","required":true,"schema":{"type":"string"}},{"description":"LookbackSeconds is how far back to look for received telemetry, in\nseconds.","in":"query","name":"lookback_seconds","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Reports whether the integration's logs and metrics have been received over the lookback window, so the console can show a live connection state."}},"/v1/o11y/jobs/attribute_keys":{"get":{"parameters":[{"description":"DataSource is the telemetry the keys come from — metrics for the infra\nfaces. The runtime requires it.","in":"query","name":"dataSource","required":false,"schema":{"type":"string"}},{"description":"AggregateOperator is the aggregation the keys will be used under, e.g.\nnoop, count, avg. The runtime requires it for non-metrics sources.","in":"query","name":"aggregateOperator","required":false,"schema":{"type":"string"}},{"description":"AggregateAttribute is the metric the keys must appear on.","in":"query","name":"aggregateAttribute","required":false,"schema":{"type":"string"}},{"description":"SearchText narrows the keys to those containing it.","in":"query","name":"searchText","required":false,"schema":{"type":"string"}},{"description":"TagType narrows the keys to one kind — tag or resource. Empty means all;\nan invalid value reads as empty.","in":"query","name":"tagType","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many keys come back. Absent means 50.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the metric attribute keys Kubernetes jobs report, for building job filters."}},"/v1/o11y/jobs/attribute_values":{"get":{"parameters":[{"description":"DataSource is the telemetry the values come from — metrics for the infra\nfaces. The runtime requires it.","in":"query","name":"dataSource","required":false,"schema":{"type":"string"}},{"description":"AggregateOperator is the aggregation the values will be used under, e.g.\nnoop, count, avg. The runtime requires it for non-metrics sources.","in":"query","name":"aggregateOperator","required":false,"schema":{"type":"string"}},{"description":"AggregateAttribute is the metric the values must appear on.","in":"query","name":"aggregateAttribute","required":false,"schema":{"type":"string"}},{"description":"AttributeKey is the key whose values to list.","in":"query","name":"attributeKey","required":false,"schema":{"type":"string"}},{"description":"FilterAttributeKeyDataType is the key's data type — string, int64,\nfloat64 or bool. Empty means unspecified.","in":"query","name":"filterAttributeKeyDataType","required":false,"schema":{"type":"string"}},{"description":"SearchText narrows the values to those containing it.","in":"query","name":"searchText","required":false,"schema":{"type":"string"}},{"description":"TagType narrows the search to one kind of key — tag or resource.","in":"query","name":"tagType","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many values come back. Absent means 50.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the values one job attribute key has taken, for building job filters."}},"/v1/o11y/jobs/list":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.JobListRequest"}}}},"summary":"Lists Kubernetes jobs over a time range, each with the CPU and memory its pods used against request and limit, desired-successful, active, failed and successful pod counts, restarts and attributes; filterable, groupable and paginated."}},"/v1/o11y/licenses":{"get":{"summary":"Lists the org's licenses."}},"/v1/o11y/licenses/active":{"get":{"summary":"Activates the enterprise license."}},"/v1/o11y/listErrors":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yErrorsListIn"}}}},"summary":"Lists the grouped exceptions in the query window — each an exception type with its message, count, service and first/last-seen — for the caller's org."}},"/v1/o11y/livez":{"get":{"summary":"Liveness of the observability process"}},"/v1/o11y/llm/annotation":{"get":{"parameters":[{"description":"TraceID narrows to annotations on one trace.","in":"query","name":"traceId","required":false,"schema":{"type":"string"}},{"description":"Queue narrows to one review queue.","in":"query","name":"queue","required":false,"schema":{"type":"string"}},{"description":"Status narrows to one review status, e.g. PENDING.","in":"query","name":"status","required":false,"schema":{"type":"string"}},{"description":"Offset is how many rows to skip, for paging.","in":"query","name":"offset","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Limit caps how many rows come back.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists human annotations on traces and observations, optionally scoped to one review queue."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yLLMIngestAnnotation"}}}},"summary":"Adds a human annotation to a trace or observation, optionally in a review queue."}},"/v1/o11y/llm/observations":{"get":{"parameters":[{"description":"Start is the start of the window as a unix-millisecond epoch. Zero means\n24h before the end.","in":"query","name":"start","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"End is the end of the window as a unix-millisecond epoch. Zero means now.","in":"query","name":"end","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"TraceID narrows the view to one trace.","in":"query","name":"traceId","required":false,"schema":{"type":"string"}},{"description":"SessionID narrows the view to one conversation.","in":"query","name":"sessionId","required":false,"schema":{"type":"string"}},{"description":"UserID narrows the view to one end user.","in":"query","name":"userId","required":false,"schema":{"type":"string"}},{"description":"Name narrows the view to observations of one name.","in":"query","name":"name","required":false,"schema":{"type":"string"}},{"description":"Model narrows the view to one model.","in":"query","name":"model","required":false,"schema":{"type":"string"}},{"description":"Offset is how many rows to skip, for paging.","in":"query","name":"offset","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Limit caps how many rows come back.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists gen_ai spans as LLM observations — each an LLM call with its model, token counts, cost and latency projected from gen_ai.* attributes, newest first, over the query window."}},"/v1/o11y/llm/score/{id}":{"delete":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Hard-deletes a score by id."},"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns a single score by id."}},"/v1/o11y/llm/scores":{"get":{"parameters":[{"description":"TraceID narrows to scores on one trace.","in":"query","name":"traceId","required":false,"schema":{"type":"string"}},{"description":"ObservationID narrows to scores on one observation.","in":"query","name":"observationId","required":false,"schema":{"type":"string"}},{"description":"Name narrows to scores of one name.","in":"query","name":"name","required":false,"schema":{"type":"string"}},{"description":"Source narrows to scores from one source, e.g. API, EVAL.","in":"query","name":"source","required":false,"schema":{"type":"string"}},{"description":"Offset is how many rows to skip, for paging.","in":"query","name":"offset","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Limit caps how many rows come back.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists eval scores and human-feedback signals attached to traces and observations, newest first."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yLLMIngestScore"}}}},"summary":"Attaches an eval score or human-feedback signal to a trace or a single observation."}},"/v1/o11y/llm/sessions":{"get":{"parameters":[{"description":"Start is the start of the window as a unix-millisecond epoch. Zero means\n24h before the end.","in":"query","name":"start","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"End is the end of the window as a unix-millisecond epoch. Zero means now.","in":"query","name":"end","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"TraceID narrows the view to one trace.","in":"query","name":"traceId","required":false,"schema":{"type":"string"}},{"description":"SessionID narrows the view to one conversation.","in":"query","name":"sessionId","required":false,"schema":{"type":"string"}},{"description":"UserID narrows the view to one end user.","in":"query","name":"userId","required":false,"schema":{"type":"string"}},{"description":"Name narrows the view to observations of one name.","in":"query","name":"name","required":false,"schema":{"type":"string"}},{"description":"Model narrows the view to one model.","in":"query","name":"model","required":false,"schema":{"type":"string"}},{"description":"Offset is how many rows to skip, for paging.","in":"query","name":"offset","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Limit caps how many rows come back.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists conversations — gen_ai spans grouped by session.id, with their trace and observation counts, tokens and cost."}},"/v1/o11y/llm/traces":{"get":{"parameters":[{"description":"Start is the start of the window as a unix-millisecond epoch. Zero means\n24h before the end.","in":"query","name":"start","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"End is the end of the window as a unix-millisecond epoch. Zero means now.","in":"query","name":"end","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"TraceID narrows the view to one trace.","in":"query","name":"traceId","required":false,"schema":{"type":"string"}},{"description":"SessionID narrows the view to one conversation.","in":"query","name":"sessionId","required":false,"schema":{"type":"string"}},{"description":"UserID narrows the view to one end user.","in":"query","name":"userId","required":false,"schema":{"type":"string"}},{"description":"Name narrows the view to observations of one name.","in":"query","name":"name","required":false,"schema":{"type":"string"}},{"description":"Model narrows the view to one model.","in":"query","name":"model","required":false,"schema":{"type":"string"}},{"description":"Offset is how many rows to skip, for paging.","in":"query","name":"offset","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Limit caps how many rows come back.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists LLM traces — gen_ai spans grouped by trace_id, with cost, tokens and latency rolled up across each trace."}},"/v1/o11y/llm/users":{"get":{"parameters":[{"description":"Start is the start of the window as a unix-millisecond epoch. Zero means\n24h before the end.","in":"query","name":"start","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"End is the end of the window as a unix-millisecond epoch. Zero means now.","in":"query","name":"end","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"TraceID narrows the view to one trace.","in":"query","name":"traceId","required":false,"schema":{"type":"string"}},{"description":"SessionID narrows the view to one conversation.","in":"query","name":"sessionId","required":false,"schema":{"type":"string"}},{"description":"UserID narrows the view to one end user.","in":"query","name":"userId","required":false,"schema":{"type":"string"}},{"description":"Name narrows the view to observations of one name.","in":"query","name":"name","required":false,"schema":{"type":"string"}},{"description":"Model narrows the view to one model.","in":"query","name":"model","required":false,"schema":{"type":"string"}},{"description":"Offset is how many rows to skip, for paging.","in":"query","name":"offset","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Limit caps how many rows come back.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists end users — gen_ai spans grouped by user.id, with their session, trace and observation counts, tokens and cost."}},"/v1/o11y/llm_pricing_rules":{"get":{"parameters":[{"description":"Search matches rules by model or provider.","in":"query","name":"q","required":false,"schema":{"type":"string"}},{"description":"IsOverride, when \"true\" or \"false\", narrows to user-pinned rules or to\nsynced ones; empty returns both. It is a string because a query param is a\nstring on the wire, and the runtime reads absent as \"no filter\".","in":"query","name":"isOverride","required":false,"schema":{"type":"string"}},{"description":"Offset is how many rows to skip, for paging.","in":"query","name":"offset","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Limit caps how many rows come back.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns the LLM pricing rules for the caller's org, with pagination and an optional search and override filter."},"put":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yLLMUpdatablePricingRules"}}}},"summary":"Writes the pricing-rule batch — the single write endpoint used by both the user and the Zeus sync job."}},"/v1/o11y/llm_pricing_rules/{id}":{"delete":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Hard-deletes a pricing rule by id."},"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns a single LLM pricing rule by id."}},"/v1/o11y/login":{"get":{"summary":"Report why an observability sign-in did not complete"}},"/v1/o11y/logs":{"get":{"parameters":[{"description":"Limit caps how many records come back. Zero means the default of 100.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"TimestampStart is the start of the window as a nanosecond epoch. Zero\nmeans fifteen minutes before the end.","in":"query","name":"timestampStart","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"TimestampEnd is the end of the window as a nanosecond epoch. Zero means\nnow.","in":"query","name":"timestampEnd","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns the most recent log records in the query window, newest first — each record an open object carrying its nanosecond timestamp and whatever fields the record was ingested with."}},"/v1/o11y/logs/aggregate":{"get":{"summary":"Returns the logs aggregate buckets for the query window."}},"/v1/o11y/logs/fields":{"get":{"summary":"Returns the log field catalog: the fields already selected as indexed columns, and the interesting ones seen in the data that could be."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yFieldSetting"}}}},"summary":"Changes how one log field is stored — selects or deselects it as a materialized column and tunes its index — and echoes the setting back."}},"/v1/o11y/logs/livetail":{"get":{"summary":"Follow log records as they arrive"}},"/v1/o11y/logs/pipelines":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yLogPipelineCreateIn"}}}},"summary":"Saves the given log parsing pipelines as the new config version for the caller's org and starts deploying it."}},"/v1/o11y/logs/pipelines/preview":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yLogPipelinePreviewIn"}}}},"summary":"Runs the given log parsing pipelines over the given sample records without saving anything, and returns the transformed records plus whatever the collector logged while simulating them."}},"/v1/o11y/logs/pipelines/{version}":{"get":{"parameters":[{"description":"Version is the config version to read — a positive number, or \"latest\".","in":"path","name":"version","required":true,"schema":{"type":"string"}}],"summary":"Returns the caller's org's log parsing pipelines at one config version — \"latest\" for the newest — along with that version's deployment record and the recent version history."}},"/v1/o11y/logs/promote_paths":{"get":{"summary":"Lists the log body paths already promoted or indexed, with the indexes each carries."},"post":{"requestBody":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/o11y.O11yLogPromotePath"},"type":"array"}}}},"summary":"Promotes and indexes log body paths: each named path is lifted out of the JSON body into its own column, with the indexes the caller asked for."}},"/v1/o11y/messaging-queues/kafka/consumer-lag/consumer-details":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yQueueIn"}}}},"summary":"Returns the consumer side of a consumer-lag view: the consumer groups reading the topic/partition named in variables, with their throughput and latency over the window."}},"/v1/o11y/messaging-queues/kafka/consumer-lag/network-latency":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yQueueIn"}}}},"summary":"Returns consumer network latency correlated per client: a throughput pass over the window finds the consumer clients, then their fetch latency joins in as a latency column per client/instance/service."}},"/v1/o11y/messaging-queues/kafka/consumer-lag/producer-details":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yQueueIn"}}}},"summary":"Returns the producer side of a consumer-lag view: the producers writing to the topic/partition named in variables, with their throughput and latency over the window."}},"/v1/o11y/messaging-queues/kafka/onboarding/consumers":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yQueueIn"}}}},"summary":"Checks whether the spans the Kafka consumer views need are arriving, row for row like producersOnboarding."}},"/v1/o11y/messaging-queues/kafka/onboarding/kafka":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yQueueIn"}}}},"summary":"Checks whether Kafka's own metrics — consumer lag and partition telemetry — are arriving, so the lag views can be lit up."}},"/v1/o11y/messaging-queues/kafka/onboarding/producers":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yQueueIn"}}}},"summary":"Checks whether the spans the Kafka producer views need are arriving — one row per required span attribute, with a pass/fail status and, on failure, what is missing from the instrumentation."}},"/v1/o11y/messaging-queues/kafka/partition-latency/consumer":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yQueueIn"}}}},"summary":"Returns the consumer-group latency detail for the topic and partition named in the request's variables."}},"/v1/o11y/messaging-queues/kafka/partition-latency/overview":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yQueueIn"}}}},"summary":"Returns the per-partition latency overview for the window — each topic/partition with its throughput and latency profile."}},"/v1/o11y/messaging-queues/kafka/span/evaluation":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yQueueIn"}}}},"summary":"Correlates producer and consumer spans over the evaluation window (eval_time bounds the scan) and returns the pairings with their end-to-end delay — the check that messages produced are being consumed."}},"/v1/o11y/messaging-queues/kafka/topic-throughput/consumer":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yQueueIn"}}}},"summary":"Returns the consumer topic-throughput overview for the window — what each consumer group read, per topic."}},"/v1/o11y/messaging-queues/kafka/topic-throughput/consumer-details":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yQueueIn"}}}},"summary":"Breaks one consumer topic's throughput down using the topic and service named in variables."}},"/v1/o11y/messaging-queues/kafka/topic-throughput/producer":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yQueueIn"}}}},"summary":"Returns the producer topic-throughput overview for the window — what each producer service wrote, per topic."}},"/v1/o11y/messaging-queues/kafka/topic-throughput/producer-details":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yQueueIn"}}}},"summary":"Breaks one producer topic's throughput down using the topic and service named in variables."}},"/v1/o11y/messaging-queues/queue-overview":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yQueueListIn"}}}},"summary":"Lists the messaging destinations observed in the window — one row per queue/destination/service combination with its throughput and latency columns."}},"/v1/o11y/metric/metric_metadata":{"get":{"parameters":[{"description":"MetricName is the metric to read.","in":"query","name":"metricName","required":false,"schema":{"type":"string"}},{"description":"ServiceName scopes the metadata to the metric as one service reports it.","in":"query","name":"serviceName","required":false,"schema":{"type":"string"}}],"summary":"Serves the OLDER /metric/metric_metadata route."}},"/v1/o11y/metric_reduction_rules":{"get":{"parameters":[{"description":"OrderBy sorts the page: metric, ingested_volume, reduced_volume or\nlast_updated. Unset means ingested_volume.","in":"query","name":"orderBy","required":false,"schema":{"type":"string"}},{"description":"Order is asc or desc. Unset means desc.","in":"query","name":"order","required":false,"schema":{"type":"string"}},{"description":"Search narrows the page to rules whose metric name contains it.","in":"query","name":"search","required":false,"schema":{"type":"string"}},{"description":"MetricName narrows the page to one metric's rule.","in":"query","name":"metricName","required":false,"schema":{"type":"string"}},{"description":"Offset is how many rules to skip, for paging.","in":"query","name":"offset","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Limit caps how many rules come back, at most 1000. Unset means 10.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the org's metric volume-control (label reduction) rules, pageable and sortable by name, volume or recency."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yReductionRuleCreateIn"}}}},"summary":"Creates a volume-control rule for a metric and returns it with its id; a metric that already has a rule is refused."}},"/v1/o11y/metric_reduction_rules/preview":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yReductionRulePreviewIn"}}}},"summary":"Estimates the series reduction and the dashboards and alerts a candidate volume-control rule would touch, without persisting it."}},"/v1/o11y/metric_reduction_rules/stats":{"get":{"summary":"Returns total ingested vs retained series and samples and the estimated monthly savings across all volume-control rules."}},"/v1/o11y/metric_reduction_rules/timeseries":{"get":{"summary":"Returns ingested vs retained series over time across all volume-control rules, in hourly buckets, in the query-range time-series response shape."}},"/v1/o11y/metric_reduction_rules/{id}":{"delete":{"parameters":[{"description":"ID is the rule's id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Deletes a volume-control rule by its id."},"get":{"parameters":[{"description":"ID is the rule's id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one volume-control rule by its id."},"put":{"parameters":[{"description":"ID is the rule's id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yReductionRuleSaveIn"}}}},"summary":"Updates the match type and labels of a volume-control rule by its id; the metric name is immutable."}},"/v1/o11y/metrics":{"get":{"parameters":[{"description":"Start is the start of the window as a Unix timestamp in milliseconds.","in":"query","name":"start","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"End is the end of the window as a Unix timestamp in milliseconds.","in":"query","name":"end","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Limit caps how many metrics come back; unset means 100, at most 5000.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"SearchText narrows the page to metric names containing it.","in":"query","name":"searchText","required":false,"schema":{"type":"string"}},{"description":"Source narrows the page by ingestion source.","in":"query","name":"source","required":false,"schema":{"type":"string"}}],"summary":"Lists the distinct metric names seen in a time range, each with its description, type, unit, temporality and monotonicity."}},"/v1/o11y/metrics/alerts":{"get":{"parameters":[{"description":"MetricName is the metric's name; it may contain slashes, e.g.\nrun.googleapis.com/request_latencies. Required.","in":"query","name":"metricName","required":true,"schema":{"type":"string"}}],"summary":"Lists the alert rules that reference a metric."}},"/v1/o11y/metrics/attributes":{"get":{"parameters":[{"description":"MetricName is the metric's name; it may contain slashes. Required.","in":"query","name":"metricName","required":true,"schema":{"type":"string"}},{"description":"Start is the start of the window as a Unix timestamp in milliseconds.","in":"query","name":"start","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"End is the end of the window as a Unix timestamp in milliseconds.","in":"query","name":"end","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns one metric's attribute keys, each with its unique values and their count."}},"/v1/o11y/metrics/dashboards":{"get":{"parameters":[{"description":"MetricName is the metric's name; it may contain slashes, e.g.\nrun.googleapis.com/request_latencies. Required.","in":"query","name":"metricName","required":true,"schema":{"type":"string"}}],"summary":"Lists the dashboard panels that reference a metric."}},"/v1/o11y/metrics/highlights":{"get":{"parameters":[{"description":"MetricName is the metric's name; it may contain slashes, e.g.\nrun.googleapis.com/request_latencies. Required.","in":"query","name":"metricName","required":true,"schema":{"type":"string"}}],"summary":"Returns one metric's headline numbers: data points, total and active time series, and when it was last received."}},"/v1/o11y/metrics/inspect":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yMetricInspectIn"}}}},"summary":"Returns one metric's raw time series over a window of at most thirty minutes — each series with its labels and timestamp/value pairs."}},"/v1/o11y/metrics/metadata":{"get":{"parameters":[{"description":"MetricName is the metric's name; it may contain slashes, e.g.\nrun.googleapis.com/request_latencies. Required.","in":"query","name":"metricName","required":true,"schema":{"type":"string"}}],"summary":"Returns one metric's metadata: description, type, unit, temporality and monotonicity."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yMetricMetadataSaveIn"}}}},"summary":"Updates one metric's metadata — description, type, unit, temporality, monotonicity — and answers with the bare success envelope."}},"/v1/o11y/metrics/onboarding":{"get":{"summary":"Reports whether any non-O11y metrics have been ingested — the lightweight check onboarding polls."}},"/v1/o11y/metrics/stats":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yMetricStatsIn"}}}},"summary":"Lists metrics with their sample and time-series counts for a time range — the volume view of the metrics explorer, pageable and sortable."}},"/v1/o11y/metrics/treemap":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yMetricTreemapIn"}}}},"summary":"Returns the proportional distribution of metrics by sample count or time-series count, as the entries of a treemap."}},"/v1/o11y/namespaces/attribute_keys":{"get":{"parameters":[{"description":"DataSource is the telemetry the keys come from — metrics for the infra\nfaces. The runtime requires it.","in":"query","name":"dataSource","required":false,"schema":{"type":"string"}},{"description":"AggregateOperator is the aggregation the keys will be used under, e.g.\nnoop, count, avg. The runtime requires it for non-metrics sources.","in":"query","name":"aggregateOperator","required":false,"schema":{"type":"string"}},{"description":"AggregateAttribute is the metric the keys must appear on.","in":"query","name":"aggregateAttribute","required":false,"schema":{"type":"string"}},{"description":"SearchText narrows the keys to those containing it.","in":"query","name":"searchText","required":false,"schema":{"type":"string"}},{"description":"TagType narrows the keys to one kind — tag or resource. Empty means all;\nan invalid value reads as empty.","in":"query","name":"tagType","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many keys come back. Absent means 50.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the metric attribute keys Kubernetes namespaces report, for building namespace filters."}},"/v1/o11y/namespaces/attribute_values":{"get":{"parameters":[{"description":"DataSource is the telemetry the values come from — metrics for the infra\nfaces. The runtime requires it.","in":"query","name":"dataSource","required":false,"schema":{"type":"string"}},{"description":"AggregateOperator is the aggregation the values will be used under, e.g.\nnoop, count, avg. The runtime requires it for non-metrics sources.","in":"query","name":"aggregateOperator","required":false,"schema":{"type":"string"}},{"description":"AggregateAttribute is the metric the values must appear on.","in":"query","name":"aggregateAttribute","required":false,"schema":{"type":"string"}},{"description":"AttributeKey is the key whose values to list.","in":"query","name":"attributeKey","required":false,"schema":{"type":"string"}},{"description":"FilterAttributeKeyDataType is the key's data type — string, int64,\nfloat64 or bool. Empty means unspecified.","in":"query","name":"filterAttributeKeyDataType","required":false,"schema":{"type":"string"}},{"description":"SearchText narrows the values to those containing it.","in":"query","name":"searchText","required":false,"schema":{"type":"string"}},{"description":"TagType narrows the search to one kind of key — tag or resource.","in":"query","name":"tagType","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many values come back. Absent means 50.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the values one namespace attribute key has taken, for building namespace filters."}},"/v1/o11y/namespaces/list":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.NamespaceListRequest"}}}},"summary":"Lists Kubernetes namespaces over a time range, each with the CPU and memory its pods used, their phase counts and its attributes; filterable, groupable and paginated."}},"/v1/o11y/nextPrevErrorIDs":{"get":{"parameters":[{"description":"Timestamp is the instance's time as a nanosecond epoch spelled as a\nstring. Required.","in":"query","name":"timestamp","required":true,"schema":{"type":"string"}},{"description":"GroupID is the exception group the instance belongs to. Required.","in":"query","name":"groupID","required":true,"schema":{"type":"string"}},{"description":"ErrorID is the exception instance id. Required by errorFromErrorID and\nnextPrevErrorIDs; unused by errorFromGroupID.","in":"query","name":"errorID","required":false,"schema":{"type":"string"}}],"summary":"Returns the ids of the exception instances immediately after and before a given one within its group — the paging cursor the error detail view walks."}},"/v1/o11y/nodes/attribute_keys":{"get":{"parameters":[{"description":"DataSource is the telemetry the keys come from — metrics for the infra\nfaces. The runtime requires it.","in":"query","name":"dataSource","required":false,"schema":{"type":"string"}},{"description":"AggregateOperator is the aggregation the keys will be used under, e.g.\nnoop, count, avg. The runtime requires it for non-metrics sources.","in":"query","name":"aggregateOperator","required":false,"schema":{"type":"string"}},{"description":"AggregateAttribute is the metric the keys must appear on.","in":"query","name":"aggregateAttribute","required":false,"schema":{"type":"string"}},{"description":"SearchText narrows the keys to those containing it.","in":"query","name":"searchText","required":false,"schema":{"type":"string"}},{"description":"TagType narrows the keys to one kind — tag or resource. Empty means all;\nan invalid value reads as empty.","in":"query","name":"tagType","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many keys come back. Absent means 50.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the metric attribute keys Kubernetes nodes report, for building node filters."}},"/v1/o11y/nodes/attribute_values":{"get":{"parameters":[{"description":"DataSource is the telemetry the values come from — metrics for the infra\nfaces. The runtime requires it.","in":"query","name":"dataSource","required":false,"schema":{"type":"string"}},{"description":"AggregateOperator is the aggregation the values will be used under, e.g.\nnoop, count, avg. The runtime requires it for non-metrics sources.","in":"query","name":"aggregateOperator","required":false,"schema":{"type":"string"}},{"description":"AggregateAttribute is the metric the values must appear on.","in":"query","name":"aggregateAttribute","required":false,"schema":{"type":"string"}},{"description":"AttributeKey is the key whose values to list.","in":"query","name":"attributeKey","required":false,"schema":{"type":"string"}},{"description":"FilterAttributeKeyDataType is the key's data type — string, int64,\nfloat64 or bool. Empty means unspecified.","in":"query","name":"filterAttributeKeyDataType","required":false,"schema":{"type":"string"}},{"description":"SearchText narrows the values to those containing it.","in":"query","name":"searchText","required":false,"schema":{"type":"string"}},{"description":"TagType narrows the search to one kind of key — tag or resource.","in":"query","name":"tagType","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many values come back. Absent means 50.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the values one node attribute key has taken, for building node filters."}},"/v1/o11y/nodes/list":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.NodeListRequest"}}}},"summary":"Lists Kubernetes nodes over a time range, each with its CPU and memory usage against allocatable capacity, readiness condition counts and attributes; filterable, groupable and paginated."}},"/v1/o11y/org/preferences":{"get":{"summary":"Lists every org-scoped preference, each with its current and default value."}},"/v1/o11y/org/preferences/{name}":{"get":{"parameters":[{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one org-scoped preference, by name."},"put":{"parameters":[{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yUpdatablePreference"}}}},"summary":"Sets one org-scoped preference, by name."}},"/v1/o11y/orgs/me":{"get":{"summary":"Returns the caller's own organization."},"put":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yOrganization"}}}},"summary":"Rewrites the caller's own organization record — display name, name, alias — always addressed as \"me\", never by id."}},"/v1/o11y/orgs/me/filters":{"get":{"summary":"Returns the org's quick filters for every signal — the attribute shortlists its explorers offer as one-click filters."},"put":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yUpdatableQuickFilters"}}}},"summary":"Replaces the org's quick filters for one signal with the attribute list given."}},"/v1/o11y/orgs/me/filters/{signal}":{"get":{"parameters":[{"in":"path","name":"signal","required":true,"schema":{"type":"string"}}],"summary":"Returns the org's quick filters for one signal — traces, logs, metrics, exceptions or api_monitoring."}},"/v1/o11y/pods/attribute_keys":{"get":{"parameters":[{"description":"DataSource is the telemetry the keys come from — metrics for the infra\nfaces. The runtime requires it.","in":"query","name":"dataSource","required":false,"schema":{"type":"string"}},{"description":"AggregateOperator is the aggregation the keys will be used under, e.g.\nnoop, count, avg. The runtime requires it for non-metrics sources.","in":"query","name":"aggregateOperator","required":false,"schema":{"type":"string"}},{"description":"AggregateAttribute is the metric the keys must appear on.","in":"query","name":"aggregateAttribute","required":false,"schema":{"type":"string"}},{"description":"SearchText narrows the keys to those containing it.","in":"query","name":"searchText","required":false,"schema":{"type":"string"}},{"description":"TagType narrows the keys to one kind — tag or resource. Empty means all;\nan invalid value reads as empty.","in":"query","name":"tagType","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many keys come back. Absent means 50.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the metric attribute keys Kubernetes pods report, for building pod filters."}},"/v1/o11y/pods/attribute_values":{"get":{"parameters":[{"description":"DataSource is the telemetry the values come from — metrics for the infra\nfaces. The runtime requires it.","in":"query","name":"dataSource","required":false,"schema":{"type":"string"}},{"description":"AggregateOperator is the aggregation the values will be used under, e.g.\nnoop, count, avg. The runtime requires it for non-metrics sources.","in":"query","name":"aggregateOperator","required":false,"schema":{"type":"string"}},{"description":"AggregateAttribute is the metric the values must appear on.","in":"query","name":"aggregateAttribute","required":false,"schema":{"type":"string"}},{"description":"AttributeKey is the key whose values to list.","in":"query","name":"attributeKey","required":false,"schema":{"type":"string"}},{"description":"FilterAttributeKeyDataType is the key's data type — string, int64,\nfloat64 or bool. Empty means unspecified.","in":"query","name":"filterAttributeKeyDataType","required":false,"schema":{"type":"string"}},{"description":"SearchText narrows the values to those containing it.","in":"query","name":"searchText","required":false,"schema":{"type":"string"}},{"description":"TagType narrows the search to one kind of key — tag or resource.","in":"query","name":"tagType","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many values come back. Absent means 50.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the values one pod attribute key has taken, for building pod filters."}},"/v1/o11y/pods/list":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.PodListRequest"}}}},"summary":"Lists Kubernetes pods over a time range, each with its CPU and memory usage against request and limit, restart count, phase counts and attributes; filterable, groupable and paginated."}},"/v1/o11y/processes/attribute_keys":{"get":{"parameters":[{"description":"DataSource is the telemetry the keys come from — metrics for the infra\nfaces. The runtime requires it.","in":"query","name":"dataSource","required":false,"schema":{"type":"string"}},{"description":"AggregateOperator is the aggregation the keys will be used under, e.g.\nnoop, count, avg. The runtime requires it for non-metrics sources.","in":"query","name":"aggregateOperator","required":false,"schema":{"type":"string"}},{"description":"AggregateAttribute is the metric the keys must appear on.","in":"query","name":"aggregateAttribute","required":false,"schema":{"type":"string"}},{"description":"SearchText narrows the keys to those containing it.","in":"query","name":"searchText","required":false,"schema":{"type":"string"}},{"description":"TagType narrows the keys to one kind — tag or resource. Empty means all;\nan invalid value reads as empty.","in":"query","name":"tagType","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many keys come back. Absent means 50.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the metric attribute keys processes report, for building process filters."}},"/v1/o11y/processes/attribute_values":{"get":{"parameters":[{"description":"DataSource is the telemetry the values come from — metrics for the infra\nfaces. The runtime requires it.","in":"query","name":"dataSource","required":false,"schema":{"type":"string"}},{"description":"AggregateOperator is the aggregation the values will be used under, e.g.\nnoop, count, avg. The runtime requires it for non-metrics sources.","in":"query","name":"aggregateOperator","required":false,"schema":{"type":"string"}},{"description":"AggregateAttribute is the metric the values must appear on.","in":"query","name":"aggregateAttribute","required":false,"schema":{"type":"string"}},{"description":"AttributeKey is the key whose values to list.","in":"query","name":"attributeKey","required":false,"schema":{"type":"string"}},{"description":"FilterAttributeKeyDataType is the key's data type — string, int64,\nfloat64 or bool. Empty means unspecified.","in":"query","name":"filterAttributeKeyDataType","required":false,"schema":{"type":"string"}},{"description":"SearchText narrows the values to those containing it.","in":"query","name":"searchText","required":false,"schema":{"type":"string"}},{"description":"TagType narrows the search to one kind of key — tag or resource.","in":"query","name":"tagType","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many values come back. Absent means 50.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the values one process attribute key has taken, for building process filters."}},"/v1/o11y/processes/list":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.ProcessListRequest"}}}},"summary":"Lists monitored processes over a time range, each with its name, PID, command line and CPU and memory usage; filterable, groupable and paginated."}},"/v1/o11y/product/metrics":{"get":{"parameters":[{"description":"Product is the console product slug to read, e.g. \"kms\". Required.","example":"kms","in":"query","name":"product","required":false,"schema":{"type":"string"}},{"description":"Range is the window in seconds. Default 3600, capped at 604800 (7d).","example":3600,"in":"query","name":"range","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"StepSec is the bucket width in seconds, clamped to [30, 3600]. Absent\npicks ~60 buckets across the range.","in":"query","name":"stepSec","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns one product's RED series — request rate, errors, p50 and p95 latency — for the caller's org, plus that org's LLM usage rollup over the same window."}},"/v1/o11y/public/dashboards/{id}":{"get":{"parameters":[{"description":"ID is the resource id from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns the sanitized dashboard data for public access — the read a shared dashboard's public page makes."}},"/v1/o11y/public/dashboards/{id}/widgets/{idx}/query_range":{"get":{"parameters":[{"description":"ID is the public dashboard id from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Idx is the widget's index from the path.","in":"path","name":"idx","required":true,"schema":{"type":"string"}},{"description":"StartTime is the window start as a millisecond epoch. Used only when the\nshare enables a caller-chosen time range.","in":"query","name":"startTime","required":false,"schema":{"type":"string"}},{"description":"EndTime is the window end as a millisecond epoch. Used only when the share\nenables a caller-chosen time range.","in":"query","name":"endTime","required":false,"schema":{"type":"string"}}],"summary":"Returns the query-range result for one widget of a public dashboard."}},"/v1/o11y/pvcs/attribute_keys":{"get":{"parameters":[{"description":"DataSource is the telemetry the keys come from — metrics for the infra\nfaces. The runtime requires it.","in":"query","name":"dataSource","required":false,"schema":{"type":"string"}},{"description":"AggregateOperator is the aggregation the keys will be used under, e.g.\nnoop, count, avg. The runtime requires it for non-metrics sources.","in":"query","name":"aggregateOperator","required":false,"schema":{"type":"string"}},{"description":"AggregateAttribute is the metric the keys must appear on.","in":"query","name":"aggregateAttribute","required":false,"schema":{"type":"string"}},{"description":"SearchText narrows the keys to those containing it.","in":"query","name":"searchText","required":false,"schema":{"type":"string"}},{"description":"TagType narrows the keys to one kind — tag or resource. Empty means all;\nan invalid value reads as empty.","in":"query","name":"tagType","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many keys come back. Absent means 50.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the metric attribute keys persistent volume claims report, for building volume filters."}},"/v1/o11y/pvcs/attribute_values":{"get":{"parameters":[{"description":"DataSource is the telemetry the values come from — metrics for the infra\nfaces. The runtime requires it.","in":"query","name":"dataSource","required":false,"schema":{"type":"string"}},{"description":"AggregateOperator is the aggregation the values will be used under, e.g.\nnoop, count, avg. The runtime requires it for non-metrics sources.","in":"query","name":"aggregateOperator","required":false,"schema":{"type":"string"}},{"description":"AggregateAttribute is the metric the values must appear on.","in":"query","name":"aggregateAttribute","required":false,"schema":{"type":"string"}},{"description":"AttributeKey is the key whose values to list.","in":"query","name":"attributeKey","required":false,"schema":{"type":"string"}},{"description":"FilterAttributeKeyDataType is the key's data type — string, int64,\nfloat64 or bool. Empty means unspecified.","in":"query","name":"filterAttributeKeyDataType","required":false,"schema":{"type":"string"}},{"description":"SearchText narrows the values to those containing it.","in":"query","name":"searchText","required":false,"schema":{"type":"string"}},{"description":"TagType narrows the search to one kind of key — tag or resource.","in":"query","name":"tagType","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many values come back. Absent means 50.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the values one persistent-volume-claim attribute key has taken, for building volume filters."}},"/v1/o11y/pvcs/list":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.VolumeListRequest"}}}},"summary":"Lists Kubernetes persistent volume claims over a time range, each with its available, capacity and used bytes, inode counts and attributes; filterable, groupable and paginated."}},"/v1/o11y/query":{"get":{"parameters":[{"description":"Query is the PromQL expression to evaluate. Required.","in":"query","name":"query","required":true,"schema":{"type":"string"}},{"description":"Time is the evaluation timestamp — epoch seconds or RFC3339. Empty\nevaluates at now.","in":"query","name":"time","required":false,"schema":{"type":"string"}},{"description":"Stats set to any non-empty value includes query statistics in the answer.","in":"query","name":"stats","required":false,"schema":{"type":"string"}},{"description":"Timeout caps evaluation time, as a duration in seconds.","in":"query","name":"timeout","required":false,"schema":{"type":"string"}}],"summary":"Evaluates one instant PromQL query against the org's metrics and returns the result at a single point in time."}},"/v1/o11y/query_filter/analyze":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yAnalyzeIn"}}}},"summary":"Analyzes a query and extracts the metric names it reads and the columns it groups by."}},"/v1/o11y/query_progress":{"get":{"summary":"Watch one running query's progress"}},"/v1/o11y/query_range":{"get":{"parameters":[{"description":"Start is the window start — a unix timestamp (seconds, with optional\nfraction) or an RFC 3339 time. Required.","in":"query","name":"start","required":true,"schema":{"type":"string"}},{"description":"End is the window end, in the same form as Start, and not before it.\nRequired.","in":"query","name":"end","required":true,"schema":{"type":"string"}},{"description":"Step is the query resolution, e.g. 60s, 1m, 1h — a positive duration.\nRequired.","in":"query","name":"step","required":true,"schema":{"type":"string"}},{"description":"Query is the PromQL expression to evaluate. Required.","in":"query","name":"query","required":true,"schema":{"type":"string"}},{"description":"Stats, when \"all\", asks for query statistics alongside the result.","in":"query","name":"stats","required":false,"schema":{"type":"string"}},{"description":"Timeout caps how long the query may run, e.g. 30s, 1m — a positive\nduration. Absent means the server default.","in":"query","name":"timeout","required":false,"schema":{"type":"string"}}],"summary":"Runs a Prometheus-style range query over metrics — the legacy read that predates the v5 querier — and returns the matrix, vector or scalar the query resolved to."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.QueryRangeRequest"}}}},"summary":"Executes a composite query over a time range: builder queries over traces, logs and metrics, formulas, trace operators, PromQL and Datastore SQL, answering time series, scalars or raw records as the request type asks."}},"/v1/o11y/query_range/format":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.QueryRangeParamsV3"}}}},"summary":"Parses a builder query and echoes it back normalized to the v3 shape — the endpoint the UI uses to canonicalize a query without running it."}},"/v1/o11y/query_range/preview":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yQueryRangePreviewIn"}}}},"summary":"Validates a composite query and renders the Datastore statements it would run WITHOUT executing it — a dry run for agentic and tooling use."}},"/v1/o11y/readyz":{"get":{"summary":"Readiness of the observability runtime to serve"}},"/v1/o11y/reviews":{"get":{"parameters":[{"description":"Page is the 1-based page to read. Default 1.","example":1,"in":"query","name":"page","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Limit is how many rows to return. Default 20, capped at 100.","example":20,"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns a page of the caller org's human-review queues, newest first, narrowed to the caller's project."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.createQueueReq"}}}},"summary":"Creates a human-review queue in the caller's org and project."}},"/v1/o11y/reviews/{id}":{"delete":{"parameters":[{"description":"ID is the annotation queue to act on, from the path.","example":"annq_1","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Removes one review queue and every item in it."},"get":{"parameters":[{"description":"ID is the annotation queue to act on, from the path.","example":"annq_1","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one review queue with its pending and completed counts and its first page of items."},"patch":{"parameters":[{"description":"ID is the annotation queue to update, from the path.","example":"annq_1","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.updateQueueIn"}}}},"summary":"Changes a review queue's name, description or score-config set."}},"/v1/o11y/reviews/{id}/items":{"get":{"parameters":[{"description":"ID is the annotation queue whose items to list, from the path.","example":"annq_1","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Status filters to PENDING or COMPLETED items. Absent returns both.","example":"PENDING","in":"query","name":"status","required":false,"schema":{"type":"string"}},{"description":"Page is the 1-based page to read. Default 1.","in":"query","name":"page","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Limit is how many rows to return. Default 20, capped at 100.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns a page of one review queue's items, newest first, optionally filtered to PENDING or COMPLETED."},"post":{"parameters":[{"description":"ID is the annotation queue to add to, from the path.","example":"annq_1","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.addItemsIn"}}}},"summary":"Enqueues traces, observations or sessions on a review queue."}},"/v1/o11y/reviews/{id}/items/{itemId}":{"patch":{"parameters":[{"description":"ID is the annotation queue the item belongs to, from the path.","example":"annq_1","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"ItemID is the item to update, from the path.","example":"annqi_1","in":"path","name":"itemId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.updateItemIn"}}}},"summary":"Moves one queue item between PENDING and COMPLETED and sets its assignee."}},"/v1/o11y/roles":{"get":{"summary":"Lists every role in the caller's org — the managed ones the platform seeds and the custom ones its admins created."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yRoleCreateIn"}}}},"summary":"Creates a custom role in the caller's org from a name, an optional description and the transaction groups it grants, answering the new role's id."}},"/v1/o11y/roles/{id}":{"delete":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Deletes a custom role."},"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one role with the transaction groups it grants."},"put":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yRoleUpdateIn"}}}},"summary":"Replaces a custom role's description and transaction groups."}},"/v1/o11y/route_policies":{"get":{"summary":"Lists the org's route policies."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.PostableRoutePolicy"}}}},"summary":"Creates a route policy, answering with the stored policy."}},"/v1/o11y/route_policies/{id}":{"delete":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Removes a route policy, by id."},"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one route policy, by id."},"put":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yRoutePolicyUpdateIn"}}}},"summary":"Replaces a route policy, by id, answering with the stored policy."}},"/v1/o11y/rules":{"get":{"summary":"Lists all alert rules with their current evaluation state."},"post":{"requestBody":{"content":{"application/json":{"schema":{}}}},"summary":"Creates a new alert rule and answers with the stored rule."}},"/v1/o11y/rules/test":{"post":{"requestBody":{"content":{"application/json":{"schema":{}}}},"summary":"Fires a test notification for a rule definition without saving it, answering with how many series would alert."}},"/v1/o11y/rules/{id}":{"delete":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Removes an alert rule, by id."},"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one alert rule with its evaluation state, by id."},"patch":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{}}}},"summary":"Applies a partial update to an alert rule, by id, answering with the stored rule — the common toggle for enabling or muting a rule."},"put":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{}}}},"summary":"Replaces an alert rule's definition, by id."}},"/v1/o11y/rules/{id}/history/filter_keys":{"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"StartUnixMilli is the window start, unix milliseconds.","in":"query","name":"startUnixMilli","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"EndUnixMilli is the window end, unix milliseconds.","in":"query","name":"endUnixMilli","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"SearchText narrows the keys to those containing it.","in":"query","name":"searchText","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many keys come back. Absent means 50, capped at 200.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns the distinct label keys present in a rule's history entries over the selected range, for building history filters."}},"/v1/o11y/rules/{id}/history/filter_values":{"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"StartUnixMilli is the window start, unix milliseconds.","in":"query","name":"startUnixMilli","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"EndUnixMilli is the window end, unix milliseconds.","in":"query","name":"endUnixMilli","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"SearchText narrows the keys to those containing it.","in":"query","name":"searchText","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many keys come back. Absent means 50, capped at 200.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Name is the label key whose values to list. Required.","in":"query","name":"name","required":true,"schema":{"type":"string"}},{"description":"ExistingQuery is a filter expression scoping which values appear.","in":"query","name":"existingQuery","required":false,"schema":{"type":"string"}}],"summary":"Returns the distinct values a given label key has taken across a rule's history entries."}},"/v1/o11y/rules/{id}/history/overall_status":{"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Start is the window start, unix milliseconds. Required by the runtime.","in":"query","name":"start","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"End is the window end, unix milliseconds. Required by the runtime.","in":"query","name":"end","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns the overall firing/inactive intervals for a rule over the selected range."},"post":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yRuleHistoryQueryIn"}}}},"summary":"Returns the overall firing/inactive windows for a rule, for the posted query range."}},"/v1/o11y/rules/{id}/history/stats":{"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Start is the window start, unix milliseconds. Required by the runtime.","in":"query","name":"start","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"End is the window end, unix milliseconds. Required by the runtime.","in":"query","name":"end","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns trigger and resolution statistics for a rule over the selected time range, current window against the prior one."},"post":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yRuleHistoryQueryIn"}}}},"summary":"Returns trigger and resolution statistics for a rule, current window against the prior one, for the posted query range."}},"/v1/o11y/rules/{id}/history/timeline":{"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Start is the window start, unix milliseconds. Required by the runtime.","in":"query","name":"start","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"End is the window end, unix milliseconds. Required by the runtime.","in":"query","name":"end","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"State keeps only entries in one alert state, e.g. firing or normal.","in":"query","name":"state","required":false,"schema":{"type":"string"}},{"description":"FilterExpression narrows entries to those whose labels match it.","in":"query","name":"filterExpression","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many entries come back. Absent means 50.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Order sorts by time, asc or desc.","in":"query","name":"order","required":false,"schema":{"type":"string"}},{"description":"Cursor resumes a previous page; opaque, returned as nextCursor.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"summary":"Returns paginated timeline entries for a rule's state transitions, filterable by state and a label expression, cursor-paginated."},"post":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yRuleHistoryQueryIn"}}}},"summary":"Returns a rule's state-transition timeline for the posted query range, each entry carrying its related-logs or related-traces link."}},"/v1/o11y/rules/{id}/history/top_contributors":{"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Start is the window start, unix milliseconds. Required by the runtime.","in":"query","name":"start","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"End is the window end, unix milliseconds. Required by the runtime.","in":"query","name":"end","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns the label combinations that contributed most to a rule firing over the selected range."},"post":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yRuleHistoryQueryIn"}}}},"summary":"Returns the label combinations that contributed most to a rule firing, for the posted query range."}},"/v1/o11y/sentinel/discover":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yDiscoverIn"}}}},"summary":"Aggregates a project's captured errors into a table — the caller names the filters, the groupings and the aggregations, and gets back the columns and rows they asked for."}},"/v1/o11y/sentinel/events/{id}":{"get":{"parameters":[{"description":"ID is the event id.","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Project is the project the event belongs to, by its id. Required.","in":"query","name":"project","required":true,"schema":{"type":"string"}}],"summary":"Returns one captured error event of a project, by its id."}},"/v1/o11y/sentinel/issues":{"get":{"parameters":[{"description":"Status narrows to one lifecycle state: unresolved, resolved or ignored.","in":"query","name":"status","required":false,"schema":{"type":"string"}},{"description":"Level narrows to one severity, e.g. error, warning, info.","in":"query","name":"level","required":false,"schema":{"type":"string"}},{"description":"Environment narrows to one deployment environment.","in":"query","name":"environment","required":false,"schema":{"type":"string"}},{"description":"ServiceName narrows to one reporting service.","in":"query","name":"serviceName","required":false,"schema":{"type":"string"}},{"description":"Query narrows to issues whose text contains it.","in":"query","name":"query","required":false,"schema":{"type":"string"}},{"description":"Sort orders the page, e.g. lastSeen, firstSeen, count.","in":"query","name":"sort","required":false,"schema":{"type":"string"}},{"description":"Offset is how many issues to skip. Zero starts at the first.","in":"query","name":"offset","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Limit caps how many issues come back. Zero means the default.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Project narrows the org's issues to one project, by its id.","in":"query","name":"project","required":false,"schema":{"type":"string"}},{"description":"Period is the window to read, relative to now — 1h, 24h, 7d, 14d, 30d.","in":"query","name":"period","required":false,"schema":{"type":"string"}}],"summary":"Lists the caller's org's grouped error issues, optionally narrowed to one project and one time window, and filtered by status, level, environment, service, a free-text query and a sort."}},"/v1/o11y/sentinel/issues/{id}":{"get":{"parameters":[{"description":"ID is the issue id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one grouped issue of the caller's org with its latest occurrence sample."},"put":{"parameters":[{"description":"ID is the issue id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11ySentryUpdateIssueIn"}}}},"summary":"Changes an issue's lifecycle — resolve, ignore, reopen or assign — and returns the updated issue."}},"/v1/o11y/sentinel/issues/{id}/events":{"get":{"parameters":[{"description":"ID is the issue id.","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Project is the project whose occurrences to read, by its id. Required.","in":"query","name":"project","required":true,"schema":{"type":"string"}},{"description":"Limit caps how many occurrences come back. Zero means the default.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists one issue's captured occurrences, scoped to a project — a project is an isolation unit, so the caller declares which project's occurrences to read."}},"/v1/o11y/sentinel/logs":{"get":{"parameters":[{"description":"Project is the project to read, as its id. Required.","in":"query","name":"project","required":true,"schema":{"type":"string"}},{"description":"Query narrows the page to events whose text contains it.","in":"query","name":"query","required":false,"schema":{"type":"string"}},{"description":"Period is the window to read, relative to now — 1h, 24h, 7d, 14d, 30d.","in":"query","name":"period","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many events come back.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists a project's captured error events, newest first, optionally narrowed to those whose message or exception text contains a search string."}},"/v1/o11y/sentinel/projects":{"get":{"summary":"Lists the caller's org's Sentry projects — one per product that has reported an error, plus any created by hand."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11ySentryPostableProject"}}}},"summary":"Creates a Sentry project under the caller's org and returns it."}},"/v1/o11y/sentinel/projects/{id}":{"delete":{"parameters":[{"description":"ID is the project id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Deletes one Sentry project of the caller's org; retained events are not touched."},"get":{"parameters":[{"description":"ID is the project id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one Sentry project of the caller's org."}},"/v1/o11y/sentinel/stats":{"get":{"parameters":[{"description":"Project is the project to read, as its id. Required.","in":"query","name":"project","required":true,"schema":{"type":"string"}},{"description":"Field is the dimension to count over. Empty counts all events.","in":"query","name":"field","required":false,"schema":{"type":"string"}},{"description":"Period is the window to read, relative to now — 1h, 24h, 7d, 14d, 30d.","in":"query","name":"period","required":false,"schema":{"type":"string"}}],"summary":"Returns a project's event-rate timeseries: one bucket per interval over the requested period, counting the events in it."}},"/v1/o11y/sentinel/traces":{"get":{"parameters":[{"description":"Project is the project to read, as its id. Required.","in":"query","name":"project","required":true,"schema":{"type":"string"}},{"description":"Period is the window to read, relative to now — 1h, 24h, 7d, 14d, 30d.","in":"query","name":"period","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many traces come back.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the traces a project's captured errors reference, each with how many errors landed on it, when they started and stopped, and the latest message seen — the entry point for \"which requests are failing\"."}},"/v1/o11y/sentinel/traces/{id}":{"get":{"parameters":[{"description":"ID is the trace id.","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Project is the project the trace's errors belong to. Required.","in":"query","name":"project","required":true,"schema":{"type":"string"}}],"summary":"Returns one trace's captured errors for a project — every error event that carried the trace id, in the order the events plane holds them."}},"/v1/o11y/service/entry_point_operations":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yOperationsIn"}}}},"summary":"Returns one service's entry-point operations with the same latency and error profile topOperations reports."}},"/v1/o11y/service/top_level_operations":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yTopLevelOpsIn"}}}},"summary":"Maps each service to its entry-point span names — for the one service named in the request, or for every service when none is."}},"/v1/o11y/service/top_operations":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yOperationsIn"}}}},"summary":"Returns one service's heaviest operations in the window, each with p50/p95/p99 latency, how often it ran and how often it errored."}},"/v1/o11y/service_accounts":{"get":{"summary":"Lists the caller's org's service accounts."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yServiceAccountCreateIn"}}}},"summary":"Creates a service account in the caller's org, answering its id."}},"/v1/o11y/service_accounts/me":{"get":{"summary":"Returns the calling service account itself, with the roles it holds — the self-inspection read for a key-authenticated caller."},"put":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yMyServiceAccountUpdateIn"}}}},"summary":"Renames the calling service account."}},"/v1/o11y/service_accounts/{id}":{"delete":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Deletes a service account and revokes every key it holds."},"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one service account with the roles it holds."},"put":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yServiceAccountUpdateIn"}}}},"summary":"Renames a service account."}},"/v1/o11y/service_accounts/{id}/keys":{"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Lists a service account's API keys — metadata only, never the secrets."},"post":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yAPIKeyCreateIn"}}}},"summary":"Mints an API key for a service account and answers the key's id and its secret — the one time the secret is ever shown."}},"/v1/o11y/service_accounts/{id}/keys/{fid}":{"delete":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"path","name":"fid","required":true,"schema":{"type":"string"}}],"summary":"Revokes an API key."},"put":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"path","name":"fid","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yAPIKeyUpdateIn"}}}},"summary":"Renames an API key or moves its expiry."}},"/v1/o11y/service_accounts/{id}/roles":{"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Lists the roles a service account holds."},"post":{"parameters":[{"description":"RoleID is the id of the role to assign. Required.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yServiceAccountRoleGrantIn"}}}},"summary":"Assigns a role, named by its id, to a service account."}},"/v1/o11y/service_accounts/{id}/roles/{rid}":{"delete":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"path","name":"rid","required":true,"schema":{"type":"string"}}],"summary":"Removes a role from a service account."}},"/v1/o11y/services":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yServicesIn"}}}},"summary":"Lists the instrumented services seen in the window, each with the request profile of its entry-point spans: p99 and average latency, call and error rates, and the entry-point operations the numbers were computed over."}},"/v1/o11y/services/list":{"get":{"summary":"Lists the name of every service the trace store holds, with no window applied — the complete catalog, for pickers and autocomplete."}},"/v1/o11y/sessions":{"get":{"summary":"List the caller org's LLM sessions"}},"/v1/o11y/settings/apdex":{"get":{"parameters":[{"description":"Services are the service names, comma separated.","in":"query","name":"services","required":false,"schema":{"type":"string"}}],"summary":"Returns apdex settings for the named services."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yApdexSetIn"}}}},"summary":"Sets one service's apdex threshold and the status codes excluded from its score."}},"/v1/o11y/settings/ttl":{"get":{"summary":"Returns the org's current retention policy: default TTL, custom per-label rules, and cold-storage settings where configured."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yRetentionSetIn"}}}},"summary":"Sets the org's retention policy for one signal: the default TTL in days, ordered per-label retention rules, and optional cold-storage settings."}},"/v1/o11y/span_mapper_groups":{"get":{"parameters":[{"in":"query","name":"enabled","required":false,"schema":{"type":"boolean"}}],"summary":"Lists the caller's org's mapping groups, optionally only the enabled ones."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.PostableSpanMapperGroup"}}}},"summary":"Creates a mapping group: the name it is known by, the span and resource attributes whose presence selects a span into it, and whether it is on."}},"/v1/o11y/span_mapper_groups/{groupId}":{"delete":{"parameters":[{"in":"path","name":"groupId","required":true,"schema":{"type":"string"}}],"summary":"Deletes a mapping group and every mapper under it."},"patch":{"parameters":[{"in":"path","name":"groupId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11ySpanMapperGroupUpdateIn"}}}},"summary":"Changes a group's name, condition or enabled state."}},"/v1/o11y/span_mapper_groups/{groupId}/span_mappers":{"get":{"parameters":[{"in":"path","name":"groupId","required":true,"schema":{"type":"string"}}],"summary":"Lists the mappers belonging to one group, in the order they are applied."},"post":{"parameters":[{"in":"path","name":"groupId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11ySpanMapperCreateIn"}}}},"summary":"Adds a mapper to a group: which field context it reads, the move or copy it performs, and whether it is on."}},"/v1/o11y/span_mapper_groups/{groupId}/span_mappers/{mapperId}":{"delete":{"parameters":[{"in":"path","name":"groupId","required":true,"schema":{"type":"string"}},{"in":"path","name":"mapperId","required":true,"schema":{"type":"string"}}],"summary":"Deletes one mapper from a group."},"patch":{"parameters":[{"in":"path","name":"groupId","required":true,"schema":{"type":"string"}},{"in":"path","name":"mapperId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11ySpanMapperUpdateIn"}}}},"summary":"Changes a mapper's field context, config or enabled state."}},"/v1/o11y/span_percentile":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11ySpanPercentileIn"}}}},"summary":"Places one span's duration among its peers: the p50/p90/p99 durations of like spans, and the percentile the given duration lands at."}},"/v1/o11y/statefulsets/attribute_keys":{"get":{"parameters":[{"description":"DataSource is the telemetry the keys come from — metrics for the infra\nfaces. The runtime requires it.","in":"query","name":"dataSource","required":false,"schema":{"type":"string"}},{"description":"AggregateOperator is the aggregation the keys will be used under, e.g.\nnoop, count, avg. The runtime requires it for non-metrics sources.","in":"query","name":"aggregateOperator","required":false,"schema":{"type":"string"}},{"description":"AggregateAttribute is the metric the keys must appear on.","in":"query","name":"aggregateAttribute","required":false,"schema":{"type":"string"}},{"description":"SearchText narrows the keys to those containing it.","in":"query","name":"searchText","required":false,"schema":{"type":"string"}},{"description":"TagType narrows the keys to one kind — tag or resource. Empty means all;\nan invalid value reads as empty.","in":"query","name":"tagType","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many keys come back. Absent means 50.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the metric attribute keys Kubernetes statefulsets report, for building statefulset filters."}},"/v1/o11y/statefulsets/attribute_values":{"get":{"parameters":[{"description":"DataSource is the telemetry the values come from — metrics for the infra\nfaces. The runtime requires it.","in":"query","name":"dataSource","required":false,"schema":{"type":"string"}},{"description":"AggregateOperator is the aggregation the values will be used under, e.g.\nnoop, count, avg. The runtime requires it for non-metrics sources.","in":"query","name":"aggregateOperator","required":false,"schema":{"type":"string"}},{"description":"AggregateAttribute is the metric the values must appear on.","in":"query","name":"aggregateAttribute","required":false,"schema":{"type":"string"}},{"description":"AttributeKey is the key whose values to list.","in":"query","name":"attributeKey","required":false,"schema":{"type":"string"}},{"description":"FilterAttributeKeyDataType is the key's data type — string, int64,\nfloat64 or bool. Empty means unspecified.","in":"query","name":"filterAttributeKeyDataType","required":false,"schema":{"type":"string"}},{"description":"SearchText narrows the values to those containing it.","in":"query","name":"searchText","required":false,"schema":{"type":"string"}},{"description":"TagType narrows the search to one kind of key — tag or resource.","in":"query","name":"tagType","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many values come back. Absent means 50.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the values one statefulset attribute key has taken, for building statefulset filters."}},"/v1/o11y/statefulsets/list":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.StatefulSetListRequest"}}}},"summary":"Lists Kubernetes statefulsets over a time range, each with the CPU and memory its pods used against request and limit, desired and available replica counts, restarts and attributes; filterable, groupable and paginated."}},"/v1/o11y/stats":{"get":{"summary":"Returns the collected usage statistics for the caller's org, as the stats reporter aggregates them — a map whose keys are the reporter's own counter names."}},"/v1/o11y/status":{"get":{"parameters":[{"description":"Product is the console product slug to probe, e.g. \"kms\". Required.","example":"kms","in":"query","name":"product","required":false,"schema":{"type":"string"}}],"summary":"Reports whether a product's service is live: an in-cluster health probe with its measured latency, fused with the per-replica up inventory."}},"/v1/o11y/substitute_vars":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.QueryRangeRequest"}}}},"summary":"Substitutes a query's variables and returns the resolved request, without running it — what a dashboard does before it queries."}},"/v1/o11y/summary":{"get":{"summary":"Reports whether the platform is up."}},"/v1/o11y/testChannel":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.alertmanagertypes.Receiver"}}}},"summary":"Sends a test notification to the posted receiver."}},"/v1/o11y/testRule":{"post":{"requestBody":{"content":{"application/json":{"schema":{}}}},"summary":"Fires a test notification for the posted rule definition and answers with how many series alerted and a status message."}},"/v1/o11y/third-party-apis/overview/domain":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yDomainsIn"}}}},"summary":"Returns one external domain's endpoint-level breakdown — each endpoint with its rate, error and latency columns over the window."}},"/v1/o11y/third-party-apis/overview/list":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yDomainsIn"}}}},"summary":"Lists the external domains the instrumented services call, with request rate, error percentage and latency per domain."}},"/v1/o11y/trace-funnels/analytics/error-traces":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yDraftFunnelIn"}}}},"summary":"Returns the errored traces through a step transition of a funnel described inline."}},"/v1/o11y/trace-funnels/analytics/overview":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yDraftFunnelIn"}}}},"summary":"Returns the conversion overview of a funnel described inline."}},"/v1/o11y/trace-funnels/analytics/slow-traces":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yDraftFunnelIn"}}}},"summary":"Returns the slowest traces through a step transition of a funnel described inline."}},"/v1/o11y/trace-funnels/analytics/steps":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yDraftFunnelIn"}}}},"summary":"Returns the per-step metrics of a funnel described inline."}},"/v1/o11y/trace-funnels/analytics/steps/overview":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yDraftFunnelIn"}}}},"summary":"Returns the conversion between two steps of a funnel described inline."}},"/v1/o11y/trace-funnels/analytics/validate":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yDraftFunnelIn"}}}},"summary":"Lists the traces that match a funnel described inline — the builder's \"try this\" before anything is saved."}},"/v1/o11y/trace-funnels/list":{"get":{"summary":"Lists the caller's org's funnels, each with its steps and who last touched it."}},"/v1/o11y/trace-funnels/new":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yFunnelCreateIn"}}}},"summary":"Creates an empty funnel with a name, answering the funnel it created."}},"/v1/o11y/trace-funnels/steps/update":{"put":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yFunnelStepsUpdateIn"}}}},"summary":"Replaces a funnel's steps — the funnel is named in the body rather than the path — and answers the funnel as it now stands."}},"/v1/o11y/trace-funnels/{funnel_id}":{"delete":{"parameters":[{"in":"path","name":"funnel_id","required":true,"schema":{"type":"string"}}],"summary":"Deletes a funnel."},"get":{"parameters":[{"in":"path","name":"funnel_id","required":true,"schema":{"type":"string"}}],"summary":"Returns one funnel with its steps."},"put":{"parameters":[{"in":"path","name":"funnel_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yFunnelUpdateIn"}}}},"summary":"Renames a funnel or rewrites its description, answering the funnel as it now stands."}},"/v1/o11y/trace-funnels/{funnel_id}/analytics/error-traces":{"post":{"parameters":[{"in":"path","name":"funnel_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yFunnelStepWindowIn"}}}},"summary":"Returns the errored traces through a step transition of a saved funnel — the entry point for \"why is this step failing\"."}},"/v1/o11y/trace-funnels/{funnel_id}/analytics/overview":{"post":{"parameters":[{"in":"path","name":"funnel_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yFunnelStepWindowIn"}}}},"summary":"Returns a saved funnel's conversion overview over a window: how many entered, how many converted, the rate and the latency."}},"/v1/o11y/trace-funnels/{funnel_id}/analytics/slow-traces":{"post":{"parameters":[{"in":"path","name":"funnel_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yFunnelStepWindowIn"}}}},"summary":"Returns the slowest traces through a step transition of a saved funnel — the entry point for \"why is this step slow\"."}},"/v1/o11y/trace-funnels/{funnel_id}/analytics/steps":{"post":{"parameters":[{"in":"path","name":"funnel_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yFunnelWindowIn"}}}},"summary":"Returns a saved funnel's per-step metrics over a window — the counts and latencies at each step, in step order."}},"/v1/o11y/trace-funnels/{funnel_id}/analytics/steps/overview":{"post":{"parameters":[{"in":"path","name":"funnel_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yFunnelStepWindowIn"}}}},"summary":"Returns the conversion between two named steps of a saved funnel — the step-to-step drill-down behind the overview."}},"/v1/o11y/trace-funnels/{funnel_id}/analytics/validate":{"post":{"parameters":[{"in":"path","name":"funnel_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yFunnelWindowIn"}}}},"summary":"Lists the traces that match a saved funnel over a window — the read that answers \"is this funnel finding anything at all\"."}},"/v1/o11y/traces":{"get":{"parameters":[{"description":"Range is the window in seconds, counted back from now over each trace's\nlast activity. Default 3600, capped at 604800 (7d).","example":3600,"in":"query","name":"range","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Limit is how many traces to return. Default 50, capped at 500.","example":50,"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"MinDurationMs keeps only traces that lasted at least this many\nmilliseconds. Zero or absent keeps every trace in the window.","in":"query","name":"minDurationMs","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the caller org's recent traces — one row per trace with its span count and wall-clock duration, most recently active first."}},"/v1/o11y/traces/fields":{"get":{"summary":"Returns the trace field catalog: the span fields already selected as indexed columns, and the interesting ones seen in the data that could be."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yFieldSetting"}}}},"summary":"Changes how one span field is stored — selects or deselects it as a materialized column and tunes its index — and echoes the setting back."}},"/v1/o11y/traces/{traceId}":{"get":{"parameters":[{"in":"path","name":"traceId","required":true,"schema":{"type":"string"}},{"in":"query","name":"spanId","required":false,"schema":{"type":"string"}},{"in":"query","name":"levelUp","required":false,"schema":{"format":"int64","type":"integer"}},{"in":"query","name":"levelDown","required":false,"schema":{"format":"int64","type":"integer"}},{"in":"query","name":"spanRenderLimit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns one trace's spans as a column/row table, optionally centred on a span and walked a fixed number of levels up and down from it — the read the trace explorer opens a trace with."}},"/v1/o11y/traces/{traceId}/aggregations":{"post":{"parameters":[{"in":"path","name":"traceId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yTraceAggregationsIn"}}}},"summary":"Computes span aggregations over one trace — span count, duration or share of execution time — grouped by the resource field each aggregation names."}},"/v1/o11y/traces/{traceId}/flamegraph":{"post":{"parameters":[{"in":"path","name":"traceId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yTraceFlamegraphIn"}}}},"summary":"Returns a trace's flamegraph: spans bucketed by depth level, each level ordered as it is drawn, around the selected span."}},"/v1/o11y/traces/{traceId}/waterfall":{"post":{"parameters":[{"in":"path","name":"traceId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yTraceWaterfallIn"}}}},"summary":"Returns a trace's waterfall: every span when the trace is small enough, a capped window around the selected span when it is not, with the uncollapsed subtrees the caller asked to keep open."}},"/v1/o11y/usage":{"get":{"parameters":[{"description":"Start is the window start, as epoch nanoseconds. Required.","in":"query","name":"start","required":true,"schema":{"type":"string"}},{"description":"End is the window end, as epoch nanoseconds. Required.","in":"query","name":"end","required":true,"schema":{"type":"string"}},{"description":"Step is the bucket width in seconds. The runtime requires it.","in":"query","name":"step","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Service narrows usage to one service. Empty covers all.","in":"query","name":"service","required":false,"schema":{"type":"string"}}],"summary":"Returns ingestion usage counts bucketed over the requested window, optionally narrowed to one service."}},"/v1/o11y/user/preferences":{"get":{"summary":"Lists every preference of the calling user, each with its current and default value."}},"/v1/o11y/user/preferences/{name}":{"get":{"parameters":[{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one preference of the calling user, by name."},"put":{"parameters":[{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yUpdatablePreference"}}}},"summary":"Sets one preference of the calling user, by name."}},"/v1/o11y/users/me":{"get":{"summary":"Returns the calling user together with every role they hold."}},"/v1/o11y/users/me/dashboards":{"get":{"parameters":[{"description":"Query is the filter DSL over dashboard columns and tags, e.g.\n`name:cpu source:user`. Empty lists everything.","in":"query","name":"query","required":false,"schema":{"type":"string"}},{"description":"Sort is the sort field: updated_at, created_at or name. Empty sorts by\nupdated_at.","in":"query","name":"sort","required":false,"schema":{"type":"string"}},{"description":"Order is the sort direction: asc or desc. Empty orders desc.","in":"query","name":"order","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many dashboards come back. Zero means the default of 20;\nthe runtime caps it at 200.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Offset is how many dashboards to skip for pagination.","in":"query","name":"offset","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Is dashboardListV2 personalized for the calling user: each dashboard carries the caller's pinned state, and pinned dashboards float to the top of the requested ordering."}},"/v1/o11y/users/me/dashboards/{id}/pins":{"delete":{"parameters":[{"description":"ID is the resource id from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Removes the caller's pin for a dashboard."},"put":{"parameters":[{"description":"ID is the resource id from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Pins a dashboard for the calling user."}},"/v1/o11y/variables/query":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.O11yDashboardVarsIn"}}}},"summary":"Evaluates a dashboard variable query and returns the values the variable may take."}},"/v1/o11y/version":{"get":{"summary":"Reports the running build: its version, whether an enterprise edition is present (\"N\" in this build), and whether first-user setup has completed."}},"/v1/o11y/zeus/hosts":{"get":{"summary":"Returns the deployment's host info from Zeus."},"put":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.PostableHost"}}}},"summary":"Records the deployment's host in Zeus, overwriting any prior one."}},"/v1/o11y/zeus/profiles":{"put":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/o11y.PostableProfile"}}}},"summary":"Records the deployment's profile in Zeus — how the team uses observability today and what they plan — overwriting any prior one."}},"/v1/openapi.json":{"get":{"summary":"The API description this SDK was generated from"}},"/v1/openapi/commands":{"get":{"summary":"Every operation this API answers, as a command"}},"/v1/patent/approvals":{"get":{"parameters":[{"description":"Disclosure narrows to the decisions on one document.","in":"query","name":"disclosure","required":false,"schema":{"type":"string"}},{"description":"Project narrows to one project.","in":"query","name":"project","required":false,"schema":{"type":"string"}}],"summary":"Returns the decision trail — each person's current word on each disclosure."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/approvalBatch"}}}},"summary":"Appends one person's decision about one disclosure."}},"/v1/patent/disclosures":{"get":{"parameters":[{"description":"ID reads one disclosure.","in":"query","name":"id","required":false,"schema":{"type":"string"}},{"description":"Status narrows to one status.","in":"query","name":"status","required":false,"schema":{"type":"string"}},{"description":"Project narrows to one project.","in":"query","name":"project","required":false,"schema":{"type":"string"}}],"summary":"Returns the canonical disclosures, each carrying its current approvals."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/disclosureBatch"}}}},"summary":"Appends the assembled document and the record ids it rests on."}},"/v1/patent/grants":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/grantIn"}}}},"summary":"Makes the decision a recording never implied: whether an idea, implementation or disclosure stays private to its author's project, opens to the org, or goes public."}},"/v1/patent/health":{"get":{"summary":"Reports what this deployment actually guarantees about the records it keeps, in honest states."}},"/v1/patent/ideas":{"get":{"parameters":[{"description":"ID reads one entry, which is how a single idea is addressed — there is no\nsecond route for it.","in":"query","name":"id","required":false,"schema":{"type":"string"}},{"description":"Kind narrows to one kind of conception entry.","in":"query","name":"kind","required":false,"schema":{"type":"string"}},{"description":"Project narrows to one project; empty reads the org's whole set.","in":"query","name":"project","required":false,"schema":{"type":"string"}}],"summary":"Returns the caller org's canonical conception entries, oldest appended first, which is the order the log says they were thought."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ideaBatch"}}}},"summary":"Appends conception entries."}},"/v1/patent/implementations":{"get":{"parameters":[{"description":"ID reads one implementation.","in":"query","name":"id","required":false,"schema":{"type":"string"}},{"description":"Idea narrows to implementations citing one conception entry — which is\nhow a correction finds every artifact built on the idea it invalidates.","in":"query","name":"idea","required":false,"schema":{"type":"string"}},{"description":"Project narrows to one project.","in":"query","name":"project","required":false,"schema":{"type":"string"}}],"summary":"Returns the canonical implementation records with their citations."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/implBatch"}}}},"summary":"Appends the machine's half of the record, and the idea citation is the load-bearing field: it is what lets a reader see that the conception came first."}},"/v1/patent/proof":{"get":{"parameters":[{"description":"Disclosure folds the record set one document rests on, and reports on\nthat set alone — which is what an attorney asks for.","in":"query","name":"disclosure","required":false,"schema":{"type":"string"}},{"description":"Idea narrows to the one entry and the artifacts citing it.","in":"query","name":"idea","required":false,"schema":{"type":"string"}},{"description":"Project narrows inside the org; empty reads the caller's scope.","in":"query","name":"project","required":false,"schema":{"type":"string"}}],"summary":"Folds the caller's record set and answers the ordering question over it."}},"/v1/patent/timeline":{"get":{"parameters":[{"description":"ID is the entry's stable id. Required.","in":"query","name":"id","required":false,"schema":{"type":"string"}},{"description":"Kind is idea, implementation or disclosure — which log to read.","in":"query","name":"kind","required":false,"schema":{"type":"string"}},{"description":"Project narrows inside the org; empty is the caller's own scope.","in":"query","name":"project","required":false,"schema":{"type":"string"}}],"summary":"Returns every retained version of one entry, in append order."}},"/v1/patrol/alarm":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/patrol.patrolAlarmIn"}}}},"summary":"Takes one activation."}},"/v1/patrol/camera":{"get":{"parameters":[{"description":"Site narrows the list to one site by document name. Empty lists every\ncamera.","in":"query","name":"site","required":false,"schema":{"type":"string"}}],"summary":"Lists the cameras a caller may OPEN."}},"/v1/patrol/camera/{name}/stream":{"get":{"parameters":[{"description":"Name is the camera's document name, from the path.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Mints a short-lived way in to one camera."}},"/v1/patrol/camera/{name}/stream/{ticket}":{"get":{"parameters":[{"description":"Name is the camera's document name, from the path.","in":"path","name":"name","required":true,"schema":{"type":"string"}},{"description":"Ticket is the tag the minted address carries, from the path.","in":"path","name":"ticket","required":true,"schema":{"type":"string"}},{"description":"Expires is the moment the tag covers, as the seconds the minted address\ncarries in its `expires` parameter.","in":"query","name":"expires","required":false,"schema":{"type":"string"}}],"summary":"Redeems a minted ticket for what opens the camera."}},"/v1/patrol/event":{"get":{"parameters":[{"description":"Level narrows the list to red, amber, green or cyan. Empty lists every\nlevel.","in":"query","name":"level","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many rows are returned. Anything that is not a positive\ninteger uses 80, and higher values are clamped to 80.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the feed, newest first."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/patrol.patrolEventIn"}}}},"summary":"Writes one feed row by hand and pushes it to every screen watching."}},"/v1/patrol/feed":{"get":{"summary":"Watch the live feed"}},"/v1/patrol/incident":{"get":{"parameters":[{"description":"Open lists only the incidents that are not closed when it is 1.","in":"query","name":"open","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Limit caps how many are returned. Anything that is not a positive integer\nuses 50, and higher values are clamped to 50.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists responses."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/patrol.patrolIncidentIn"}}}},"summary":"Records a response by hand, in state received and carrying the site's tier and SLA."}},"/v1/patrol/incident/{name}":{"get":{"parameters":[{"description":"Name is the incident's document name, from the path.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one response whole: the incident, every act performed on it, and the SLA clocks those acts settled."}},"/v1/patrol/incident/{name}/step":{"post":{"parameters":[{"description":"Name is the incident's document name, from the path.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/patrol.patrolIncidentAct"}}}},"summary":"Performs one act on an incident: it stamps the act's time, moves the state, appends the act to the trail, and runs what the act sets in motion — a unit assigned, a site secured, a report filed, a controller told."}},"/v1/patrol/key":{"get":{"summary":"Lists the key register."}},"/v1/patrol/key/{name}":{"get":{"parameters":[{"description":"Name is the key set's reference, from the path.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one key set from the register."}},"/v1/patrol/key/{name}/move":{"post":{"parameters":[{"description":"Name is the key set's reference, from the path.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/patrol.patrolMoveIn"}}}},"summary":"Records a key set leaving, returning, or being counted, and moves the register row to match."}},"/v1/patrol/note":{"get":{"parameters":[{"description":"Subject narrows the list to one subject by exact match. Empty lists every\nnote.","in":"query","name":"subject","required":false,"schema":{"type":"string"}}],"summary":"Lists internal remarks."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/patrol.patrolNoteIn"}}}},"summary":"Records an internal remark, stamped with who wrote it."}},"/v1/patrol/point/{name}/confirm":{"post":{"parameters":[{"description":"Name is the checkpoint's document name, from the path.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/patrol.patrolConfirmIn"}}}},"summary":"Records presence at a checkpoint: who confirmed it, the method, where they stood, and the photo key if one was taken."}},"/v1/patrol/report":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/patrol.patrolReportIn"}}}},"summary":"Composes and files a report from one estate read, so the same figures read the same a month later."}},"/v1/patrol/report/{name}":{"get":{"parameters":[{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Download a filed report"}},"/v1/patrol/site":{"get":{"parameters":[{"description":"Limit caps how many sites are returned. Anything that is not a positive\ninteger uses 500, and higher values are clamped to 500.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Status narrows the list to ok, fault, alarm or offline. Empty lists every\nstatus.","in":"query","name":"status","required":false,"schema":{"type":"string"}}],"summary":"Lists the estate."}},"/v1/patrol/site/{name}":{"get":{"parameters":[{"description":"Name is the site's document name, from the path.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one site whole: the register row plus the panel's zones and the standing hazards, which ride inside the document."},"put":{"parameters":[{"description":"Name is the site's document name, from the path.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/patrol.patrolSiteEdit"}}}},"summary":"Changes a site's contract and brief fields."}},"/v1/patrol/snapshot":{"get":{"parameters":[{"description":"Events caps how many feed rows ride along. Anything that is not a positive\ninteger uses 80, and higher values are clamped to 80.","in":"query","name":"events","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns the whole picture in one read: sites, units with their position trails, today's tours and checkpoints, the key register, the recent feed and the open incident."}},"/v1/patrol/tenant/{org}":{"get":{"parameters":[{"description":"Org is the IAM org the tenant belongs to, from the path.","in":"path","name":"org","required":true,"schema":{"type":"string"}}],"summary":"Returns one org's public face — brand, company, operations, features and terminology."}},"/v1/patrol/tour":{"get":{"parameters":[{"description":"Date narrows the list to one day, as YYYY-MM-DD. \"today\" means today.\nEmpty lists every round held.","in":"query","name":"date","required":false,"schema":{"type":"string"}}],"summary":"Lists patrol rounds with their checkpoints — the proof-of-presence record."}},"/v1/patrol/unit":{"get":{"summary":"Lists the fleet with each unit's position trail, which is what the map draws."}},"/v1/patrol/unit/near":{"get":{"parameters":[{"description":"Site is the site to measure from, by document name.","in":"query","name":"site","required":false,"schema":{"type":"string"}},{"description":"Limit caps how many units come back. Anything that is not a positive\ninteger uses 3, and higher values are clamped to 10.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Answers which units can reach a site soonest."}},"/v1/patrol/unit/{name}/fix":{"post":{"parameters":[{"description":"Name is the unit's call sign, from the path.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/patrol.patrolFixIn"}}}},"summary":"Records where a unit is."}},"/v1/patrol/unit/{name}/state":{"post":{"parameters":[{"description":"Name is the unit's call sign, from the path.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/patrol.patrolUnitStateIn"}}}},"summary":"Moves a unit between states — on shift, on a break, off, or in trouble."}},"/v1/plan":{"get":{"summary":"Returns the Hanzo cloud plan catalog: every cloud tier with its price, included capacity, limits and feature list, scoped to the caller's catalog."}},"/v1/plan/blockchain":{"get":{"summary":"Returns the blockchain RPC plan catalog: the tiers metered in monthly compute units, with their prices, limits and overage terms."}},"/v1/plan/dns":{"get":{"summary":"ListDNSPlans returns the DNS plan catalog: the tiers priced on zones, records per zone and queries per day."}},"/v1/plan/entitlements/{id}":{"get":{"parameters":[{"description":"ID is the plan's catalog id or slug — \"dev\", \"max\", \"team\", \"rpc-growth\".\nBoth are matched, so a slug resolves the plan it names. A withdrawn id still\nresolves for a renewal, which is why this takes an id rather than a ladder\nposition.","example":"team","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns what one plan GRANTS and not what it costs: the canonical namespaced entitlement block and the flat license-feature list derived from it."}},"/v1/plan/gpu":{"get":{"summary":"ListGPUTiers returns the rentable GPU configurations, each with its accelerator count and model, VRAM, vCPUs, host memory and hourly price."}},"/v1/plan/health":{"get":{"summary":"Reports that the plans subsystem is mounted and serving."}},"/v1/plan/policy":{"get":{"summary":"Returns the published pricing policy: whether pricing is transparent, the revenue-sharing terms (idle compute resale and the open-source share) and the principles the catalog is priced by."}},"/v1/plan/regions":{"get":{"summary":"Returns the regions cloud capacity is offered in, each with its display name and physical location."}},"/v1/plan/resolve/{id}":{"get":{"parameters":[{"description":"ID is the plan's catalog id or slug — \"dev\", \"max\", \"team\", \"rpc-growth\".\nBoth are matched, so a slug resolves the plan it names. A withdrawn id still\nresolves for a renewal, which is why this takes an id rather than a ladder\nposition.","example":"dev","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Resolves one plan to everything a consumer of the catalog needs at once: its canonical entitlement block, the flat license-feature list a signed license carries, its billing reference, and the catalog it came from."}},"/v1/plan/schema":{"get":{"summary":"Returns the two JSON Schema documents this surface speaks: entitlements.schema.json, which declares every entitlement key with its type, unit and enum, and plan.schema.json, which a catalog plan record conforms to."}},"/v1/plan/storage":{"get":{"summary":"Returns the block-storage price block: the price per GB per month and the volume size bounds a cloud plan may attach."}},"/v1/plan/subscriptions":{"get":{"summary":"Returns the subscription ladder — the personal and team tiers a customer buys to use the cloud, each with its monthly and annual price, seat rules, limits and billing reference."}},"/v1/plan/tools":{"get":{"summary":"Returns the per-use price of every metered tool — web search, code interpreter, image generation, speech — each with the unit it is billed in."}},"/v1/plan/vocab":{"get":{"summary":"Returns the entitlement key vocabulary: every key with its namespace, JSON type, nullability, unit, enum and title, the list of namespaces, and the engine features a license can grant."}},"/v1/platform/apps":{"get":{"parameters":[{"description":"Org names the organisation whose declarations to read, defaulting to the\ncaller's own. Only a SuperAdmin may name one that is not theirs; anyone\nelse naming a foreign org is refused, so this widens nothing by itself.","in":"query","name":"org","required":false,"schema":{"type":"string"}}],"summary":"Answers what this organisation has declared, joined with what the delivery plane has done about it."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/declareReq"}}}},"summary":"Deploy an app through cd.hanzo.ai"}},"/v1/platform/apps/{app}":{"get":{"parameters":[{"description":"App is the DNS-1123 label of the declaration. The URL is the addressing\nauthority — a path segment binds after the body and after the query — so\nthe address decides which app is read whatever else is sent.","in":"path","name":"app","required":true,"schema":{"type":"string"}},{"description":"Org names the organisation the declaration lives in, defaulting to the\ncaller's own and subject to the same SuperAdmin rule as the listing.","in":"query","name":"org","required":false,"schema":{"type":"string"}}],"summary":"Answers ONE declaration — what git says this app is, before the delivery plane has had any say in it."}},"/v1/platform/apps/{app}/cd":{"get":{"parameters":[{"description":"App is the DNS-1123 label of the declaration. The URL is the addressing\nauthority — a path segment binds after the body and after the query — so\nthe address decides which app is read whatever else is sent.","in":"path","name":"app","required":true,"schema":{"type":"string"}},{"description":"Org names the organisation the declaration lives in, defaulting to the\ncaller's own and subject to the same SuperAdmin rule as the listing.","in":"query","name":"org","required":false,"schema":{"type":"string"}}],"summary":"Answers ONE app's reconciliation alone — the poll a deploy console makes while it waits, without re-reading the whole inventory each time."}},"/v1/platform/apps/{app}/project":{"put":{"parameters":[{"description":"App is the declaration's name, from the path.","in":"path","name":"app","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/platform.appMove"}}}},"summary":"Moves an app to a project."}},"/v1/platform/builds":{"get":{"summary":"Returns real build records for your org."}},"/v1/platform/cd":{"get":{"summary":"Answers every Application the delivery plane holds."}},"/v1/platform/environments":{"get":{"summary":"Returns your deploy targets, and what is running on each."}},"/v1/platform/fleet":{"get":{"parameters":[{"description":"Env narrows to one lifecycle env: main, test or dev.","in":"query","name":"env","required":false,"schema":{"type":"string"}},{"description":"Health narrows to one health colour: green, yellow or red.","in":"query","name":"health","required":false,"schema":{"type":"string"}},{"description":"Org narrows to one image namespace.","in":"query","name":"org","required":false,"schema":{"type":"string"}},{"description":"Drift is `1` or `true` to show only rows that have actually drifted. It is\na STRING and not a bool because those two spellings are exactly what the\nboard has always accepted, and a bool would silently widen that to `?drift`\nalone and to `TRUE` — a behaviour change wearing a type change's clothes.","in":"query","name":"drift","required":false,"schema":{"type":"string"}}],"summary":"Returns the platform's own service tier, and where it has drifted."}},"/v1/platform/fleet/{app}":{"get":{"parameters":[{"description":"App is the service's CR name, from the path. It must be a DNS-1123 label.","in":"path","name":"app","required":true,"schema":{"type":"string"}},{"description":"Env narrows the scan to one lifecycle env: main, test or dev. Omitted, the\nnamespaces are scanned in lifecycle order and the first match wins, so a\nbare name resolves to PRODUCTION.","in":"query","name":"env","required":false,"schema":{"type":"string"}}],"summary":"Returns one platform service, resolved to production by default."}},"/v1/platform/health":{"get":{"summary":"Reports whether this control plane can actually deploy anything."}},"/v1/platform/pipelines":{"get":{"summary":"Returns one build-and-deploy pipeline per app, with its latest run."}},"/v1/platform/projects":{"get":{"parameters":[{"description":"Org names whose projects to read. Omitted, a SuperAdmin reads every owner's\nand anyone else reads their own; naming another org is an act-as only a\nSuperAdmin has, and naming a platform directory reads the platform's own.","in":"query","name":"org","required":false,"schema":{"type":"string"}}],"summary":"Answers every project the caller may see, with how its apps stand."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/platform.projectCreate"}}}},"summary":"Creates a project from the apps it starts with."}},"/v1/platform/projects/{project}":{"delete":{"parameters":[{"description":"Project is the project to delete, from the path.","in":"path","name":"project","required":true,"schema":{"type":"string"}},{"description":"Into is the existing project its apps move into. Required: an app always\nbelongs to exactly one project.","in":"query","name":"into","required":false,"schema":{"type":"string"}},{"description":"Org names the projects' owner, defaulting to the caller's own scope.","in":"query","name":"org","required":false,"schema":{"type":"string"}},{"description":"Mode is `branch` (the default) or `commit`.","in":"query","name":"mode","required":false,"schema":{"type":"string"}}],"summary":"Folds a project into another."},"get":{"parameters":[{"description":"Project is the project's name, from the path.","in":"path","name":"project","required":true,"schema":{"type":"string"}},{"description":"Org names the project's owner, defaulting to the caller's own scope — which\nfor a SuperAdmin whose home is a brand org is the platform's.","in":"query","name":"org","required":false,"schema":{"type":"string"}}],"summary":"Answers one project and every app in it."},"put":{"parameters":[{"description":"Project is the project to rename, from the path.","in":"path","name":"project","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/platform.projectRename"}}}},"summary":"Renames a project."}},"/v1/platform/projects/{project}/apps":{"get":{"parameters":[{"description":"Project is the project's name, from the path.","in":"path","name":"project","required":true,"schema":{"type":"string"}}],"summary":"Returns the applications in one project, with what the cluster says about them."},"post":{"parameters":[{"description":"Project is the project to create the application under, from the path.","in":"path","name":"project","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/platform.createAppReq"}}}},"summary":"Creates an application from a git repo or a container image."}},"/v1/platform/projects/{project}/apps/{app}":{"delete":{"parameters":[{"description":"Project is the project the application lives under, from the path.","in":"path","name":"project","required":true,"schema":{"type":"string"}},{"description":"App is the application's slug, from the path.","in":"path","name":"app","required":true,"schema":{"type":"string"}}],"summary":"Deletes an application and tears down what it runs."},"get":{"parameters":[{"description":"Project is the project the application lives under, from the path.","in":"path","name":"project","required":true,"schema":{"type":"string"}},{"description":"App is the application's slug, from the path.","in":"path","name":"app","required":true,"schema":{"type":"string"}}],"summary":"Returns one application, with its live phase, health and secret sync."}},"/v1/platform/projects/{project}/apps/{app}/deploy":{"post":{"parameters":[{"description":"Project is the project the application lives under, from the path.","in":"path","name":"project","required":true,"schema":{"type":"string"}},{"description":"App is the application's slug, from the path.","in":"path","name":"app","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/platform.deployReq"}}}},"summary":"Deploys the app — building it first if it comes from git."}},"/v1/platform/projects/{project}/apps/{app}/deployments":{"get":{"parameters":[{"description":"Project is the project the application lives under, from the path.","in":"path","name":"project","required":true,"schema":{"type":"string"}},{"description":"App is the application's slug, from the path.","in":"path","name":"app","required":true,"schema":{"type":"string"}}],"summary":"Returns an app's deployment history."}},"/v1/platform/projects/{project}/apps/{app}/deployments/{id}":{"get":{"parameters":[{"description":"Project is the project the application lives under, from the path.","in":"path","name":"project","required":true,"schema":{"type":"string"}},{"description":"App is the application's slug, from the path.","in":"path","name":"app","required":true,"schema":{"type":"string"}},{"description":"ID is the deployment's id, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one deployment of one app."}},"/v1/platform/projects/{project}/apps/{app}/deployments/{id}/logs":{"get":{"parameters":[{"description":"Project is the project the application lives under, from the path.","in":"path","name":"project","required":true,"schema":{"type":"string"}},{"description":"App is the application's slug, from the path.","in":"path","name":"app","required":true,"schema":{"type":"string"}},{"description":"ID is the deployment's id, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns real logs for a deployment — the build's, then the app's."}},"/v1/platform/projects/{project}/apps/{app}/domains":{"get":{"parameters":[{"description":"Project is the project the application lives under, from the path.","in":"path","name":"project","required":true,"schema":{"type":"string"}},{"description":"App is the application's slug, from the path.","in":"path","name":"app","required":true,"schema":{"type":"string"}}],"summary":"Returns every hostname this app answers on."},"post":{"parameters":[{"description":"Project is the project the application lives under, from the path.","in":"path","name":"project","required":true,"schema":{"type":"string"}},{"description":"App is the application's slug, from the path.","in":"path","name":"app","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/platform.addDomainReq"}}}},"summary":"Attaches a hostname — instantly if you already own it, otherwise with a DNS challenge."}},"/v1/platform/projects/{project}/apps/{app}/domains/{host}":{"delete":{"parameters":[{"description":"Project is the project the application lives under, from the path.","in":"path","name":"project","required":true,"schema":{"type":"string"}},{"description":"App is the application's slug, from the path.","in":"path","name":"app","required":true,"schema":{"type":"string"}},{"description":"Host is the hostname, from the path.","in":"path","name":"host","required":true,"schema":{"type":"string"}}],"summary":"Detaches a hostname and releases the claim."}},"/v1/platform/projects/{project}/apps/{app}/domains/{host}/verify":{"post":{"parameters":[{"description":"Project is the project the application lives under, from the path.","in":"path","name":"project","required":true,"schema":{"type":"string"}},{"description":"App is the application's slug, from the path.","in":"path","name":"app","required":true,"schema":{"type":"string"}},{"description":"Host is the hostname, from the path.","in":"path","name":"host","required":true,"schema":{"type":"string"}}],"summary":"Checks a custom domain's DNS and turns it on if it passes."}},"/v1/platform/projects/{project}/apps/{app}/env":{"put":{"parameters":[{"description":"Project is the project the application lives under, from the path.","in":"path","name":"project","required":true,"schema":{"type":"string"}},{"description":"App is the application's slug, from the path.","in":"path","name":"app","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/platform.setEnvReq"}}}},"summary":"Replaces an app's environment variables."}},"/v1/platform/projects/{project}/apps/{app}/preview":{"post":{"parameters":[{"description":"Project is the project the parent application lives under, from the path.","in":"path","name":"project","required":true,"schema":{"type":"string"}},{"description":"App is the parent application's slug, from the path.","in":"path","name":"app","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/platform.previewReq"}}}},"summary":"Puts a branch on its own URL."}},"/v1/platform/projects/{project}/apps/{app}/promote":{"post":{"parameters":[{"description":"Project is the project the application lives under, from the path.","in":"path","name":"project","required":true,"schema":{"type":"string"}},{"description":"App is the application's slug, from the path.","in":"path","name":"app","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/platform.promoteReq"}}}},"summary":"Promotes an already-built release to the app."}},"/v1/platform/projects/{project}/apps/{app}/rollback":{"post":{"parameters":[{"description":"Project is the project the application lives under, from the path.","in":"path","name":"project","required":true,"schema":{"type":"string"}},{"description":"App is the application's slug, from the path.","in":"path","name":"app","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/platform.rollbackReq"}}}},"summary":"Goes back to the previous release."}},"/v1/platform/projects/{project}/apps/{app}/start":{"post":{"parameters":[{"description":"Project is the project the application lives under, from the path.","in":"path","name":"project","required":true,"schema":{"type":"string"}},{"description":"App is the application's slug, from the path.","in":"path","name":"app","required":true,"schema":{"type":"string"}}],"summary":"Starts a stopped app back up."}},"/v1/platform/projects/{project}/apps/{app}/stop":{"post":{"parameters":[{"description":"Project is the project the application lives under, from the path.","in":"path","name":"project","required":true,"schema":{"type":"string"}},{"description":"App is the application's slug, from the path.","in":"path","name":"app","required":true,"schema":{"type":"string"}}],"summary":"Stops an app without deleting it."}},"/v1/platform/releases":{"get":{"summary":"Returns the versions that actually reached the cluster."}},"/v1/platform/run":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/platform.runReq"}}}},"summary":"Runs a container image and gives back a URL."}},"/v1/pref":{"get":{"summary":"Returns the signed-in caller's OWN preference document — the theme, density and pinned nav that follow them across every Hanzo surface."},"patch":{"summary":"Save the preference keys your surface owns, leaving every other key alone"}},"/v1/pricing":{"get":{"summary":"Returns the whole pricing catalog in one document: Zen and third-party models, providers, model families, the free-model list, plan and infrastructure pricing."}},"/v1/pricing/base":{"get":{"summary":"Returns the Hanzo Base plans — the managed-instance tiers, each with its monthly and annual price, storage and request allowances and feature list."}},"/v1/pricing/blockchain":{"get":{"summary":"Returns the blockchain access plans — the RPC and node tiers, each with its monthly price, compute-unit allowance and feature list."}},"/v1/pricing/cloud":{"get":{"summary":"Returns the public cloud section of the catalog in one document: its instance plans, its regions and its block-storage prices."}},"/v1/pricing/cloud/plans":{"get":{"summary":"Returns just the cloud instance plans — each with its vCPU, memory, disk, CPU type, VM allowance, feature list and monthly and hourly price."}},"/v1/pricing/cloud/regions":{"get":{"summary":"Returns the regions a cloud instance can be placed in, each with its id, display name and physical location."}},"/v1/pricing/cloud/storage":{"get":{"summary":"Returns the block-storage prices of the cloud section: the per-GB monthly rate and the volume size bounds a caller may ask for."}},"/v1/pricing/compute":{"get":{"summary":"Returns the compute section of the catalog: the cloud provider and region the prices are quoted for, the monthly markup applied to them, the full instance-size tier list and the named presets."}},"/v1/pricing/compute/presets":{"get":{"summary":"Returns just the named compute sizes — the short, human-labelled list (\"Starter\", \"Pro\") a size picker renders, each carrying its provider slug, vCPU, memory, disk and price."}},"/v1/pricing/datastore":{"get":{"summary":"Returns the Hanzo Datastore rate card: the tier list, the per-GB storage and egress usage rates, the annual discount and the trial."}},"/v1/pricing/enablement":{"get":{"summary":"Returns what the caller can actually use: every managed item with its global state and whether it is effective for this caller — a beta item is, while the platform's `beta` switch is on for it."}},"/v1/pricing/featured":{"get":{"summary":"Returns the models the catalog highlights, filtered to what the caller's org may see."}},"/v1/pricing/free":{"get":{"summary":"Returns the models that cost nothing to call, filtered to what the caller's org may see."}},"/v1/pricing/gpu":{"get":{"summary":"ListGPUTiers returns the rentable GPU configurations, each with its accelerator count and model, VRAM, vCPU, host memory and hourly price."}},"/v1/pricing/health":{"get":{"summary":"Reports that the pricing subsystem is mounted and serving."}},"/v1/pricing/iam":{"get":{"summary":"ListIAMPlans returns the identity plans — the Hanzo IAM tiers, each with its monthly and annual price, monthly-active-user allowance and feature list."}},"/v1/pricing/model/{name}":{"get":{"parameters":[{"description":"Name is the model's name or its slugged id (\"zen4\",\n\"acme/some-model-1\"), matched case-insensitively. It comes from\nthe path: the URL is the addressing authority.","example":"zen4","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one model's catalog entry — its pricing, context window and capabilities as the pricing source records them."}},"/v1/pricing/models":{"get":{"summary":"Returns the whole model catalog — every model the gateway serves, Zen and third-party alike — filtered to what the caller may see."}},"/v1/pricing/paas":{"get":{"summary":"ListPaaSPlans returns the application-hosting plans — the deploy-and-host tiers, each with its monthly and annual price, app and memory allowances and feature list."}},"/v1/pricing/policy":{"get":{"summary":"Returns the pricing policy document: the revenue-sharing terms (the idle-resale share and the open-source share, each with its percentage and who is eligible) and the commitments Hanzo makes about how it bills — no hidden fees, no egress charges, no surprise bills."}},"/v1/pricing/providers":{"get":{"summary":"Returns the model providers the catalog knows, each with its info object, filtered to what the caller's org may see."}},"/v1/pricing/services":{"get":{"summary":"Returns the managed-service rate cards — Search, Crawl, Vector, Console and Managed Services — each with its own tiers, and some with usage rates or a comparison table."}},"/v1/pricing/subscriptions":{"get":{"summary":"Returns the API subscription plans — the account-level tiers a customer subscribes to, each with its monthly and annual price, included credit, rate limits and feature list."}},"/v1/pricing/summary":{"get":{"summary":"Returns the catalog's headline statistics — model counts by family and the provider directory."}},"/v1/pricing/tariff":{"get":{"summary":"Returns the platform's rate card: what a bill is made of, what each part costs, and the completion windows a request may ask for."}},"/v1/pricing/tools":{"get":{"summary":"Returns the per-use tool prices — web search, web fetch, code interpreter, file storage, image generation, speech-to-text and text-to-speech — each with the unit it is billed by and its price in that unit."}},"/v1/principal":{"get":{"summary":"Returns the caller's org as an economic principal, composed from the apps that own each fact: its legal entity and founders' identity verification (company), the W-9 or W-8 it certified (tax), its wallets (wallet), the agents that answer to it — spawned ones with the agent that spawned them — (agents), its screening against the OFAC, UN, EU and UK sanctions lists and the embargoed jurisdictions, run now, and what it still lacks to pay and be paid."}},"/v1/principal/agents/{ref}":{"get":{"parameters":[{"description":"Ref is the agent's id or its name in the caller's org.","in":"path","name":"ref","required":true,"schema":{"type":"string"}}],"summary":"Attests which principal one of the caller's agents answers to: the org, the chain of agents that spawned it, and the same signed with the platform's key as a JWS (EdDSA) a verifier checks offline against GET /v1/principal/keys."}},"/v1/principal/clearance":{"get":{"parameters":[{"description":"Payee narrows to one payee.","in":"query","name":"payee","required":false,"schema":{"type":"string"}}],"summary":"Lists the caller org's clearances, newest first, 200 at most; a payee narrows them."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/principal.clearIn"}}}},"summary":"Decides whether the caller's org may pay another org, BEFORE the payment: what must happen first, what must be withheld and why, what must be reported, by whom and when, and how the payment may settle net of withholding."}},"/v1/principal/clearance/{id}":{"get":{"parameters":[{"description":"ID is the clearance, \"clr_\"-prefixed.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Reads one of the caller org's clearances, as it was decided."}},"/v1/principal/keys":{"get":{"summary":"Publishes the keys attestations are signed with, as a JSON Web Key Set (RFC 7517; Ed25519 keys as RFC 8037 writes them)."}},"/v1/principal/statements/{id}":{"get":{"parameters":[{"description":"ID is the statement's jti, as its JWS carries it.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Reads whether one statement the platform signed about an agent still stands: live, expired, or revoked and when."}},"/v1/project":{"get":{"summary":"Returns every project your org owns."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/project.projectsCreate"}}}},"summary":"Creates a project — the handle a site is deployed and served under — and answers 201 with it in `draft`."}},"/v1/project/edge":{"get":{"summary":"health reports whether a publish reaches readers, rather than whether it was accepted."}},"/v1/project/fork":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/project.projectsFork"}}}},"summary":"Creates a project seeded from a PUBLISHED EXAMPLE — either a starter-kit template from the ONE embedded gallery catalog, or any live project on the platform (an example a seeded creator published, or another org's app serving at <slug>.hanzo.app)."}},"/v1/project/sites":{"get":{"summary":"Returns the org's deployed sites at the pretty URLs they serve at."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/project.projectsBuildSite"}}}},"summary":"Generates a self-contained, mobile-responsive static site from a natural-language brief and deploys it live in one call."}},"/v1/project/sites/deploy":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/project.projectsDeploySite"}}}},"summary":"Deploys a caller-supplied file manifest — the deploy_site capability an agent calls — and answers with where it went live."}},"/v1/project/sites/{slug}":{"get":{"parameters":[{"description":"Slug is the project to act on, from the path. It is unique within the\ncaller's org and nowhere else, so another tenant's slug is a 404.","in":"path","name":"slug","required":true,"schema":{"type":"string"}}],"summary":"Returns one site — the same row ListSites carries, for one slug."}},"/v1/project/tags":{"get":{"summary":"The site's browser tag set for the hosted tag — which pixels to inject, by publishable key"}},"/v1/project/{slug}":{"delete":{"parameters":[{"description":"Slug is the project to act on, from the path. It is unique within the\ncaller's org and nowhere else, so another tenant's slug is a 404.","in":"path","name":"slug","required":true,"schema":{"type":"string"}}],"summary":"Deletes a project and takes its site off the internet."},"get":{"parameters":[{"description":"Slug is the project to act on, from the path. It is unique within the\ncaller's org and nowhere else, so another tenant's slug is a 404.","in":"path","name":"slug","required":true,"schema":{"type":"string"}}],"summary":"Returns one project of yours by slug — its settings, its live URL and the deployment currently serving it."},"patch":{"parameters":[{"description":"Slug is the project to update, from the path. The URL is the addressing\nauthority — a `slug` in the body cannot move the write to another project.","in":"path","name":"slug","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/project.projectsUpdate"}}}},"summary":"Changes a project's settings, and only the settings you send."}},"/v1/project/{slug}/deploy":{"post":{"parameters":[{"in":"path","name":"slug","required":true,"schema":{"type":"string"}}],"summary":"Upload a built site as one archive and serve it"}},"/v1/project/{slug}/deployments":{"get":{"parameters":[{"description":"Slug is the project to act on, from the path. It is unique within the\ncaller's org and nowhere else, so another tenant's slug is a 404.","in":"path","name":"slug","required":true,"schema":{"type":"string"}}],"summary":"Returns a project's deploy history, newest version first."},"post":{"parameters":[{"description":"Slug is the site to deploy, from the path.","in":"path","name":"slug","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/project.projectsDeployStart"}}}},"summary":"Opens a deployment and hands back a short-lived, prefix-scoped grant to write its bytes straight to object storage."}},"/v1/project/{slug}/deployments/{id}":{"get":{"parameters":[{"description":"Slug is the project the deployment belongs to, from the path.","in":"path","name":"slug","required":true,"schema":{"type":"string"}},{"description":"ID is the deployment id, from the path. A deployment of another project —\nor of another tenant's project — is not found.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one deployment of a project by id."}},"/v1/project/{slug}/deployments/{id}/complete":{"post":{"parameters":[{"description":"Slug is the project the deployment belongs to, from the path.","in":"path","name":"slug","required":true,"schema":{"type":"string"}},{"description":"ID is the queued deployment to complete, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/project.projectsComplete"}}}},"summary":"CompleteDeployment is the CI completion hook that flips a queued git deployment to live (or error) once CI has synced the built site to S3."}},"/v1/project/{slug}/domains":{"get":{"parameters":[{"description":"Slug is the project to act on, from the path. It is unique within the\ncaller's org and nowhere else, so another tenant's slug is a 404.","in":"path","name":"slug","required":true,"schema":{"type":"string"}}],"summary":"Returns every custom hostname this site holds: the live ones, plus any pending claim with the DNS records it still owes."},"post":{"parameters":[{"description":"Slug is the site the hosts attach to, from the path.","in":"path","name":"slug","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/project.projectsDomainsBind"}}}},"summary":"Attaches one or more CUSTOM public hostnames to this org's site."}},"/v1/project/{slug}/domains/{host}":{"delete":{"parameters":[{"description":"Slug is the project the host is attached to, from the path.","in":"path","name":"slug","required":true,"schema":{"type":"string"}},{"description":"Host is the custom hostname, from the path. It is cleaned to its canonical\nform (lowercased, trailing dot dropped) before anything is looked up.","in":"path","name":"host","required":true,"schema":{"type":"string"}}],"summary":"Gives a custom hostname back, so the name is free to reuse."}},"/v1/project/{slug}/domains/{host}/verify":{"post":{"parameters":[{"description":"Slug is the project the host is attached to, from the path.","in":"path","name":"slug","required":true,"schema":{"type":"string"}},{"description":"Host is the custom hostname, from the path. It is cleaned to its canonical\nform (lowercased, trailing dot dropped) before anything is looked up.","in":"path","name":"host","required":true,"schema":{"type":"string"}}],"summary":"Checks the DNS challenge for a pending custom hostname and, when it passes, promotes the host so it begins routing at the edge."}},"/v1/project/{slug}/publish":{"post":{"parameters":[{"description":"Slug is the site to publish, from the path.","in":"path","name":"slug","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/project.projectsPublish"}}}},"summary":"Promotes a build output into a new release AND goes live with it — create+activate in one call, which is the 99% path."}},"/v1/project/{slug}/purge":{"post":{"parameters":[{"description":"Slug is the project to act on, from the path. It is unique within the\ncaller's org and nowhere else, so another tenant's slug is a 404.","in":"path","name":"slug","required":true,"schema":{"type":"string"}}],"summary":"Flushes the site's edge cache without redeploying anything."}},"/v1/project/{slug}/releases":{"get":{"parameters":[{"description":"Slug is the project to act on, from the path. It is unique within the\ncaller's org and nowhere else, so another tenant's slug is a 404.","in":"path","name":"slug","required":true,"schema":{"type":"string"}}],"summary":"Returns a site's releases newest-first, marking the active one — the rollback menu."},"post":{"parameters":[{"description":"Slug is the site to publish, from the path.","in":"path","name":"slug","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/project.projectsPublish"}}}},"summary":"Promotes a build output into a new immutable release WITHOUT serving it — the staged half of publishing, for when you want to check a release before it goes live."}},"/v1/project/{slug}/releases/{release}/activate":{"post":{"parameters":[{"description":"Slug is the site the release belongs to, from the path.","in":"path","name":"slug","required":true,"schema":{"type":"string"}},{"description":"Release is the content-addressed release id (\"rel_\" + 32 hex chars), from\nthe path. Anything that is not that shape is not found, rather than being\ninterpolated into a storage prefix.","in":"path","name":"release","required":true,"schema":{"type":"string"}}],"summary":"Points the site at an existing release — the go-live, and equally the ROLLBACK."}},"/v1/project/{slug}/shot":{"get":{"parameters":[{"in":"path","name":"slug","required":true,"schema":{"type":"string"}}],"summary":"Get a PNG of the project's live site"}},"/v1/project/{slug}/star":{"delete":{"parameters":[{"description":"Slug is the project to act on, from the path. It is unique within the\ncaller's org and nowhere else, so another tenant's slug is a 404.","in":"path","name":"slug","required":true,"schema":{"type":"string"}}],"summary":"Removes the caller's own bookmark from a project, and answers whether it is starred afterwards."},"put":{"parameters":[{"description":"Slug is the project to act on, from the path. It is unique within the\ncaller's org and nowhere else, so another tenant's slug is a 404.","in":"path","name":"slug","required":true,"schema":{"type":"string"}}],"summary":"Bookmarks a project for the person calling, and answers whether it is starred afterwards."}},"/v1/prompt":{"get":{"summary":"Returns the caller org's prompt library as one row per prompt: its name, type, every version number it has, its taxonomy and when it last changed."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/prompt.promptReq"}}}},"summary":"Records a prompt for the caller's org and answers 201 with it."}},"/v1/prompt/catalog":{"get":{"summary":"Returns the read-only starter prompt library shipped with the binary — reference content every tenant sees the same, NOT the caller's own prompts and never mixed into them."}},"/v1/prompt/metrics":{"get":{"summary":"Returns real per-prompt statistics for the caller's org: how many versions each prompt has, which one is current, and when it was created and last changed."}},"/v1/prompt/{name}":{"delete":{"parameters":[{"description":"Name is the prompt to act on, from the path.","example":"greeting","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Delete removes one of the caller org's prompts and every version of it, answering 204."},"get":{"parameters":[{"description":"Name is the prompt to act on, from the path.","example":"greeting","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one of the caller org's prompts: its CURRENT template text plus the metadata of every version it has had."}},"/v1/provider":{"get":{"summary":"Returns every registered integration provider together with THIS org's connection status for it — the catalog the console's Integrations page renders."}},"/v1/provider/discord/interactions":{"post":{"summary":"Discord interactions endpoint"}},"/v1/provider/discord/link":{"get":{"summary":"Begin linking a Hanzo account from Discord"}},"/v1/provider/discord/link/callback":{"get":{"summary":"Complete the Discord account link"}},"/v1/provider/discord/link/discord":{"get":{"summary":"Discord sign-in return leg"}},"/v1/provider/forge/webhook":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/forgeJob"}}}},"summary":"Forge workflow_job webhook"}},"/v1/provider/github/fork":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/provider.githubForkReq"}}}},"summary":"Forks a granted repository."}},"/v1/provider/github/installations":{"get":{"summary":"Lists the GitHub accounts the caller may see the App installed on, each confirmed against the App's own list, plus where to add another."}},"/v1/provider/github/issues/backfill":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/provider.githubBackfillIn"}}}},"summary":"Seeds the native todo with the EXISTING issues across the org's granted repos (default state=open); the webhook keeps them live thereafter."}},"/v1/provider/github/repos":{"get":{"parameters":[{"description":"Q keeps repositories whose owner/name contains it, case-insensitively.","example":"cloud","in":"query","name":"q","required":false,"schema":{"type":"string"}},{"description":"Owner keeps one GitHub account's repositories — an org or a user login.","in":"query","name":"owner","required":false,"schema":{"type":"string"}},{"description":"Limit is the page size: 1 to 100, and 50 when absent or unreadable.","example":50,"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"After is the `next` of the previous page. Absent starts at the most\nrecently pushed.","in":"query","name":"after","required":false,"schema":{"type":"string"}}],"summary":"Lists the GitHub repositories the caller may work on, most recently pushed first, searched and paged on the server."}},"/v1/provider/github/repos/import":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/provider.githubImportIn"}}}},"summary":"Imports the selected (or all) granted repos into git.hanzo.ai."}},"/v1/provider/github/repos/{owner}/{repo}/branches":{"get":{"parameters":[{"description":"Owner is the GitHub account that holds the repository.","example":"hanzoai","in":"path","name":"owner","required":true,"schema":{"type":"string"}},{"description":"Repo is the repository's name within that account.","example":"cloud","in":"path","name":"repo","required":true,"schema":{"type":"string"}},{"description":"Q keeps branches whose name starts with it, matched by GitHub.","example":"feat/","in":"query","name":"q","required":false,"schema":{"type":"string"}},{"description":"Limit is the page size: 1 to 100, and 50 when absent or unreadable.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"After is the `next` of the previous page.","in":"query","name":"after","required":false,"schema":{"type":"string"}}],"summary":"Lists a repository's branches, the default first, with prefix search."}},"/v1/provider/github/repos/{repo}/pages":{"delete":{"parameters":[{"description":"Repo is the repository's short name within the org's installation, with no\nowner prefix (the owner is server-derived from the grant). A trailing \".git\"\nis stripped.","example":"widgets","in":"path","name":"repo","required":true,"schema":{"type":"string"}}],"summary":"Deletes the repo's Pages site."},"get":{"parameters":[{"description":"Repo is the repository's short name within the org's installation, with no\nowner prefix (the owner is server-derived from the grant). A trailing \".git\"\nis stripped.","example":"widgets","in":"path","name":"repo","required":true,"schema":{"type":"string"}}],"summary":"Returns the repo's Pages status, live URL, custom domain and build source."},"post":{"parameters":[{"description":"Repo is the repository, from the :repo path segment.","example":"widgets","in":"path","name":"repo","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/provider.githubPagesEnableReq"}}}},"summary":"Creates the repo's Pages site and answers 201 Created with it."},"put":{"parameters":[{"description":"Repo is the repository, from the :repo path segment.","example":"widgets","in":"path","name":"repo","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/provider.githubPagesUpdateReq"}}}},"summary":"Sets or clears the custom domain (cname) and updates HTTPS enforcement, build type, or source."}},"/v1/provider/github/repos/{repo}/pages/builds":{"post":{"parameters":[{"description":"Repo is the repository's short name within the org's installation, with no\nowner prefix (the owner is server-derived from the grant). A trailing \".git\"\nis stripped.","example":"widgets","in":"path","name":"repo","required":true,"schema":{"type":"string"}}],"summary":"Requests a Pages rebuild and returns the queued build's status."}},"/v1/provider/github/search":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/provider.githubSearchReq"}}}},"summary":"Finds repositories on GitHub."}},"/v1/provider/github/user":{"get":{"summary":"Reports whether the caller has connected their own GitHub account in the org they act in, and as whom."}},"/v1/provider/github/user/callback":{"get":{"summary":"Is where GitHub returns the person."}},"/v1/provider/github/user/complete":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/provider.githubUserCompleteIn"}}}},"summary":"Finishes connecting the caller's GitHub account: it takes the authorization the callback parked, trades it for the person's token, and seals it."}},"/v1/provider/github/user/connect":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/provider.githubUserConnectIn"}}}},"summary":"Begins connecting the caller's own GitHub account: it answers the App's authorization page, carrying a state signed for this org and this person."}},"/v1/provider/github/user/disconnect":{"post":{"summary":"Forgets the caller's GitHub connection in this org: the token is revoked at GitHub, and the sealed secrets and the row go."}},"/v1/provider/github/webhook":{"post":{"summary":"GitHub App webhook"}},"/v1/provider/gitlab/projects":{"get":{"summary":"Lists the projects the org's GitLab connection can reach — membership projects, most recently active first."}},"/v1/provider/google/user":{"get":{"summary":"Reports whether the caller has connected their own Google account in the org they act in, and as whom."}},"/v1/provider/google/user/callback":{"get":{"summary":"Is where Google returns the person."}},"/v1/provider/google/user/complete":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/provider.googleUserCompleteIn"}}}},"summary":"Finishes connecting the caller's Google account: it takes the authorization the callback parked, trades it for the person's tokens, and seals them."}},"/v1/provider/google/user/connect":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/provider.googleUserConnectIn"}}}},"summary":"Begins connecting the caller's own Google account: it answers Google's consent page, asking offline access to send mail as them, carrying a state signed for this org and this person."}},"/v1/provider/google/user/disconnect":{"post":{"summary":"Forgets the caller's Google connection in this org: the grant is revoked at Google, and the sealed secrets and the row go."}},"/v1/provider/linear/claim":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/provider.linearClaimIn"}}}},"summary":"Binds the caller's Linear organization to the org and seals the webhook secret."}},"/v1/provider/linear/comments":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/provider.linearCommentIn"}}}},"summary":"Posts a comment on a Linear issue with the caller's own key, so it carries their name."}},"/v1/provider/linear/issues/backfill":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/provider.linearBackfillIn"}}}},"summary":"Seeds the native todo with the EXISTING Linear issues the caller's key can see (default state=open); the webhook keeps them live thereafter."}},"/v1/provider/linear/webhook":{"post":{"summary":"Linear webhook"}},"/v1/provider/openrouter/webhook":{"post":{"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":{},"type":"object"}}}},"summary":"Receive OpenRouter Broadcast traces as usage rows"}},"/v1/provider/slack/channels":{"get":{"parameters":[{"description":"Types selects public_channel, private_channel, im or mpim, comma-separated.\nDefaults to public_channel; each selected type requires its own read scope.","in":"query","name":"types","required":false,"schema":{"type":"string"}},{"description":"Cursor continues the previous page's next_cursor.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"summary":"Lists Slack conversations for the caller's connected workspace."}},"/v1/provider/slack/commands":{"post":{"summary":"Slack slash command webhook"}},"/v1/provider/slack/events":{"post":{"summary":"Slack Events API webhook"}},"/v1/provider/slack/file":{"get":{"summary":"Read one Slack file's bytes."}},"/v1/provider/slack/install":{"get":{"summary":"Install the Hanzo app into a Slack workspace"}},"/v1/provider/slack/join":{"post":{"summary":"Joins every public channel in the caller org's workspace."}},"/v1/provider/slack/link":{"get":{"summary":"Begin linking a Hanzo account from Slack"}},"/v1/provider/slack/link/callback":{"get":{"summary":"Complete the Slack account link"}},"/v1/provider/slack/link/slack":{"get":{"summary":"Slack sign-in return leg"}},"/v1/provider/slack/messages":{"delete":{"parameters":[{"in":"query","name":"channel","required":false,"schema":{"type":"string"}},{"in":"query","name":"ts","required":false,"schema":{"type":"string"}}],"summary":"Takes back one of this app's messages: DELETE /v1/provider/slack/messages."},"get":{"parameters":[{"description":"Channel is a Slack channel ID, name (#hanzo-gtm), or Slack channel mention.","in":"query","name":"channel","required":false,"schema":{"type":"string"}},{"description":"Limit bounds the page to 1-100 messages; zero defaults to 15.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Cursor continues the previous page's next_cursor.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}},{"description":"ThreadTS reads a thread via conversations.replies. Empty reads recent\nchannel messages via conversations.history, which excludes thread replies.","in":"query","name":"thread_ts","required":false,"schema":{"type":"string"}},{"description":"Oldest filters to messages after this Slack timestamp (exclusive).","in":"query","name":"oldest","required":false,"schema":{"type":"string"}},{"description":"Latest filters to messages before this Slack timestamp (exclusive).","in":"query","name":"latest","required":false,"schema":{"type":"string"}}],"summary":"Reads recent messages from a named Slack channel such as #hanzo-gtm."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/provider.slackSendMessageIn"}}}},"summary":"Posts as Hanzo to the caller's connected Slack workspace."},"put":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/provider.slackUpdateMessageIn"}}}},"summary":"Rewrites one of this app's messages: PUT /v1/provider/slack/messages."}},"/v1/provider/slack/reactions":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/provider.slackReactIn"}}}},"summary":"Adds an emoji reaction: POST /v1/provider/slack/reactions."}},"/v1/provider/slack/search":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/provider.slackSearchIn"}}}},"summary":"Answers a workspace question: POST /v1/provider/slack/search."}},"/v1/provider/teams/events":{"post":{"summary":"Microsoft Teams Bot Framework webhook"}},"/v1/provider/teams/link":{"get":{"summary":"Begin linking a Hanzo account from Teams"}},"/v1/provider/teams/link/aad":{"get":{"summary":"Microsoft sign-in return leg"}},"/v1/provider/teams/link/callback":{"get":{"summary":"Complete the Teams account link"}},"/v1/provider/telegram/connect":{"post":{"summary":"Mints a short, single-use deep-link code bound to the caller's org and returns the t.me link the console navigates to."}},"/v1/provider/telegram/link":{"get":{"summary":"Begin linking a Hanzo account from Telegram"}},"/v1/provider/telegram/link/auth":{"get":{"summary":"Telegram Login Widget return leg"}},"/v1/provider/telegram/link/callback":{"get":{"summary":"Complete the Telegram account link"}},"/v1/provider/telegram/webhook":{"post":{"summary":"Telegram Bot API webhook"}},"/v1/provider/whatsapp/webhook":{"get":{"summary":"WhatsApp Cloud API subscription challenge"},"post":{"summary":"WhatsApp Cloud API webhook"}},"/v1/provider/{provider}":{"get":{"parameters":[{"description":"Provider is the registry id of the connector — \"slack\", \"github\",\n\"cloudflare\". Unknown ids are 404, as are the user-plane (/v1/connection)\nproviders, which this surface never resolves.","example":"slack","in":"path","name":"provider","required":true,"schema":{"type":"string"}}],"summary":"Returns ONE provider with this org's connection status — the same view list carries, for a single id."}},"/v1/provider/{provider}/callback":{"get":{"parameters":[{"in":"path","name":"provider","required":true,"schema":{"type":"string"}}],"summary":"OAuth return for any connector"}},"/v1/provider/{provider}/connect":{"post":{"parameters":[{"description":"Provider is the connector's registry id, from the :provider path segment.","example":"cloudflare","in":"path","name":"provider","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/provider.connectIn"}}}},"summary":"Acquires the org's credential for one provider."}},"/v1/provider/{provider}/disconnect":{"post":{"parameters":[{"description":"Provider is the registry id of the connector — \"slack\", \"github\",\n\"cloudflare\". Unknown ids are 404, as are the user-plane (/v1/connection)\nproviders, which this surface never resolves.","example":"slack","in":"path","name":"provider","required":true,"schema":{"type":"string"}}],"summary":"Revokes (best-effort) and forgets an org's connection: it deletes every custodied KMS secret and the connection row."}},"/v1/provider/{provider}/logo":{"get":{"parameters":[{"in":"path","name":"provider","required":true,"schema":{"type":"string"}}],"summary":"Serves a connector's logo from the catalog."}},"/v1/provider/{provider}/run":{"post":{"parameters":[{"description":"Provider is the connector, from the path.","example":"bitly","in":"path","name":"provider","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/provider.runIn"}}}},"summary":"Runs one action of a connector as the caller's org, with the credential the org connected, and answers what the action returned."}},"/v1/provider/{provider}/verify":{"post":{"parameters":[{"description":"Provider is the registry id of the connector — \"slack\", \"github\",\n\"cloudflare\". Unknown ids are 404, as are the user-plane (/v1/connection)\nproviders, which this surface never resolves.","example":"cloudflare","in":"path","name":"provider","required":true,"schema":{"type":"string"}}],"summary":"Re-checks a CONNECTED apikey connector's stored credential against the provider, live (`hanzo connector verify`)."}},"/v1/provisioning/datastore":{"get":{"summary":"Lists the caller org's Hanzo Datastore warehouses."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/provisioning.provisionRequest"}}}},"summary":"Launches your org's OWN Hanzo Datastore instance and answers with its `datastore://` connection string."}},"/v1/provisioning/datastore/{name}":{"delete":{"parameters":[{"description":"Name is the resource's org-unique slug, from the path. Lower-cased and\ntrimmed before lookup, exactly as it was at create.","example":"warehouse","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Deprovisions one Hanzo Datastore warehouse."},"get":{"parameters":[{"description":"Name is the resource's org-unique slug, from the path. Lower-cased and\ntrimmed before lookup, exactly as it was at create.","example":"warehouse","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one Hanzo Datastore warehouse's metadata."}},"/v1/provisioning/docdb":{"get":{"summary":"Lists the caller org's Hanzo DocDB document databases."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/provisioning.provisionRequest"}}}},"summary":"Launches your org's OWN document-database instance and answers with its `mongodb://` connection string."}},"/v1/provisioning/docdb/{name}":{"delete":{"parameters":[{"description":"Name is the resource's org-unique slug, from the path. Lower-cased and\ntrimmed before lookup, exactly as it was at create.","example":"sessions","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Deprovisions one Hanzo DocDB database."},"get":{"parameters":[{"description":"Name is the resource's org-unique slug, from the path. Lower-cased and\ntrimmed before lookup, exactly as it was at create.","example":"sessions","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one Hanzo DocDB database's metadata."}},"/v1/provisioning/kv":{"get":{"summary":"Lists the caller org's Hanzo KV stores."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/provisioning.provisionRequest"}}}},"summary":"Launches your org's OWN key-value instance and answers with its `kv://` connection string."}},"/v1/provisioning/kv/{name}":{"delete":{"parameters":[{"description":"Name is the resource's org-unique slug, from the path. Lower-cased and\ntrimmed before lookup, exactly as it was at create.","example":"sessions","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Deprovisions one Hanzo KV store."},"get":{"parameters":[{"description":"Name is the resource's org-unique slug, from the path. Lower-cased and\ntrimmed before lookup, exactly as it was at create.","example":"sessions","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one Hanzo KV store's metadata."}},"/v1/provisioning/s3":{"get":{"summary":"Lists the caller org's object-storage buckets."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/provisioning.provisionRequest"}}}},"summary":"Creates an S3-compatible bucket inside the already-running shared object store and answers with the endpoint that reaches it."}},"/v1/provisioning/s3/{name}":{"delete":{"parameters":[{"description":"Name is the resource's org-unique slug, from the path. Lower-cased and\ntrimmed before lookup, exactly as it was at create.","example":"uploads","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Deletes one bucket from the shared object store and removes its metadata row."},"get":{"parameters":[{"description":"Name is the resource's org-unique slug, from the path. Lower-cased and\ntrimmed before lookup, exactly as it was at create.","example":"uploads","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one bucket's metadata."}},"/v1/provisioning/search":{"get":{"summary":"Lists the caller org's search indexes."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/provisioning.provisionRequest"}}}},"summary":"Creates a search index inside the already-running shared search backend and answers with the endpoint that reaches it."}},"/v1/provisioning/search/{name}":{"delete":{"parameters":[{"description":"Name is the resource's org-unique slug, from the path. Lower-cased and\ntrimmed before lookup, exactly as it was at create.","example":"products","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Deletes one search index from the shared backend and removes its metadata row."},"get":{"parameters":[{"description":"Name is the resource's org-unique slug, from the path. Lower-cased and\ntrimmed before lookup, exactly as it was at create.","example":"products","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one search index's metadata."}},"/v1/provisioning/sql":{"get":{"summary":"Lists the caller org's Hanzo SQL databases."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/provisioning.provisionRequest"}}}},"summary":"Launches your org's OWN PostgreSQL instance and answers with its `postgres://` connection string."}},"/v1/provisioning/sql/{name}":{"delete":{"parameters":[{"description":"Name is the resource's org-unique slug, from the path. Lower-cased and\ntrimmed before lookup, exactly as it was at create.","example":"orders","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Deprovisions one Hanzo SQL database."},"get":{"parameters":[{"description":"Name is the resource's org-unique slug, from the path. Lower-cased and\ntrimmed before lookup, exactly as it was at create.","example":"orders","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one Hanzo SQL database's metadata."}},"/v1/provisioning/vector":{"get":{"summary":"Lists the caller org's vector collections."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/provisioning.provisionRequest"}}}},"summary":"Creates a vector collection inside the already-running shared vector backend and answers with the endpoint that reaches it."}},"/v1/provisioning/vector/{name}":{"delete":{"parameters":[{"description":"Name is the resource's org-unique slug, from the path. Lower-cased and\ntrimmed before lookup, exactly as it was at create.","example":"embeddings","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Deletes one vector collection from the shared backend and removes its metadata row."},"get":{"parameters":[{"description":"Name is the resource's org-unique slug, from the path. Lower-cased and\ntrimmed before lookup, exactly as it was at create.","example":"embeddings","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Returns one vector collection's metadata."}},"/v1/pubsub/publish":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pubsub.busPublish"}}}},"summary":"Puts one message on the org's bus."}},"/v1/pubsub/request":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pubsub.busRequest"}}}},"summary":"Sends one request on the org's bus and waits for one reply — the synchronous half of pub/sub, for callers speaking to a responder subscribed on the NATS port."}},"/v1/reference":{"get":{"summary":"Lists every set this plane publishes, with its version and how fresh it is."}},"/v1/reference/resolve":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/reference.ResolveReferenceIn"}}}},"summary":"Looks keys up against the reference plane."}},"/v1/reference/{set}":{"delete":{"parameters":[{"example":"domain","in":"path","name":"set","required":true,"schema":{"type":"string"}},{"example":"partner.example","in":"query","name":"key","required":false,"schema":{"type":"string"}}],"summary":"Removes one of your organisation's overrides."},"get":{"parameters":[{"example":"domain","in":"path","name":"set","required":true,"schema":{"type":"string"}},{"description":"After pages the override listing: the last key of the previous page.","in":"query","name":"after","required":false,"schema":{"type":"string"}},{"description":"Limit caps the override listing: default 200, maximum 1000.","example":50,"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Reference describes one set and lists your org's overrides in it."},"put":{"parameters":[{"example":"domain","in":"path","name":"set","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/reference.SetReferenceIn"}}}},"summary":"Writes your organisation's own allow and deny entries over a set."}},"/v1/referral":{"get":{"summary":"Returns the caller's referral code, share link and the referrals they have made."},"put":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/referral.setCodeRequest"}}}},"summary":"Updates the caller's referral code and returns the updated referral summary."}},"/v1/referral/claim":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/referral.claimRequest"}}}},"summary":"Records that the caller's org signed up through a referral code."}},"/v1/registry/images":{"get":{"summary":"Lists the org's container repositories, read live from the OCI catalog and filtered server-side to the org's namespace — the page can only ever hold the caller's own images."}},"/v1/registry/packages":{"get":{"parameters":[{"description":"Query narrows the listing within the org's scope when present; the org\nboundary itself is never widened by it. It rides the query string.","in":"query","name":"query","required":false,"schema":{"type":"string"}}],"summary":"Lists the org's npm packages — `<org>` and `@<org>/…` — from the npm registry's search index, optionally narrowed by a query within that scope."}},"/v1/registry/projects":{"get":{"summary":"Lists the namespaces the caller can see with what each holds: the org's slug, its repository count on the OCI catalog, and its package count on the npm registry."}},"/v1/registry/status":{"get":{"summary":"Reports whether the OCI and npm registries are reachable and, when the OCI half is auth-gated, which token realm its challenge advertises — an honest lens for \"is the registry plane up\", never a fabricated ok."}},"/v1/registry/tags":{"get":{"parameters":[{"description":"Image is the repository name inside the org's namespace, as returned by\nthe images op. It rides the query string.","in":"query","name":"image","required":false,"schema":{"type":"string"}}],"summary":"Lists one org-owned repository's tags, read live from the OCI registry."}},"/v1/registry/token":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/registry.registryMint"}}}},"summary":"Mints a short-lived, pull-only registry token for exactly one of the org's images, through the same IAM realm the docker CLI authenticates against."}},"/v1/rerank":{"post":{"summary":"Implements POST /v1/rerank (Cohere/Jina-compatible)."}},"/v1/responses":{"post":{"parameters":[{"description":"The most this request may cost, in USD per 1,000 tokens. Routing picks only models under it; an org's own ceiling fills it when it is absent, and the lower of the two holds.","in":"header","name":"X-Max-Cost","required":false,"schema":{"minimum":0,"type":"number"}},{"description":"The slowest model this request accepts, in milliseconds.","in":"header","name":"X-Max-Latency-Ms","required":false,"schema":{"minimum":0,"type":"integer"}}],"summary":"Implements POST /v1/responses."}},"/v1/risk/features":{"get":{"parameters":[{"description":"Days is how far back to measure the organisation's own coverage, 1 to 400.\nZero takes thirty.","example":30,"in":"query","name":"days","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"The feature catalogue: what the model reads, and what your surface carries"}},"/v1/risk/health":{"get":{"summary":"Whether the risk model plane can actually work right now"}},"/v1/risk/learn":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/risk.riskLearnIn"}}}},"summary":"Teach your organisation's own model from its own events"}},"/v1/risk/policy":{"get":{"summary":"Your organisation's decision-regime history, and which version is in force"},"put":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/risk.riskAppetiteIn"}}}},"summary":"State the decision regime: the appetite, the sample, and whether the model is live"}},"/v1/risk/score":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/risk.riskScoreIn"}}}},"summary":"Score one event against your organisation's own model"}},"/v1/risk/search":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/risk.riskSearchIn"}}}},"summary":"Search exhaustively for the model shape that fits your own history"}},"/v1/risk/search/{id}":{"get":{"parameters":[{"description":"ID is the run, taken from the path. A run another organisation started is\nsimply not there — the same answer an unknown id gives.","example":"srch_2f6a1c","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Read back one exhaustive search"}},"/v1/risk/state":{"get":{"summary":"Report your organisation's model: what it learned, and what it realised"}},"/v1/risk/state/model":{"post":{"summary":"Publish your organisation's model as a named, immutable value"},"put":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/risk.riskAdoptIn"}}}},"summary":"Put one of your organisation's own published model values in force"}},"/v1/runner/declare":{"post":{"parameters":[{"in":"header","name":"x-runner-uuid","required":false,"schema":{"type":"string"}},{"in":"header","name":"x-runner-token","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/runner.DeclareIn"}}}},"summary":"Republishes what a registered runner can do, and answers with what this side understands, so the two learn about each other from one exchange."}},"/v1/runner/log":{"post":{"parameters":[{"in":"header","name":"x-runner-uuid","required":false,"schema":{"type":"string"}},{"in":"header","name":"x-runner-token","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/runner.LogIn"}}}},"summary":"Adds console output to a task's log and answers with how far that log is durable, so the runner knows where to resend from."}},"/v1/runner/register":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/runner.RegisterIn"}}}},"summary":"Trades a pool's join secret for a runner identity and the token that authenticates every later call."}},"/v1/runner/state":{"post":{"parameters":[{"in":"header","name":"x-runner-uuid","required":false,"schema":{"type":"string"}},{"in":"header","name":"x-runner-token","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/runner.StateIn"}}}},"summary":"Records a task's progress and that of its steps, and answers with the result this side now holds — which is how a runner learns its task was stopped from somewhere else."}},"/v1/runner/task":{"post":{"parameters":[{"in":"header","name":"x-runner-uuid","required":false,"schema":{"type":"string"}},{"in":"header","name":"x-runner-token","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/runner.TaskIn"}}}},"summary":"Hands the runner a job to execute, if its pool has one, and answers immediately either way."}},"/v1/s3/buckets":{"get":{"summary":"Lists the caller org's own buckets."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/s3.bucketIn"}}}},"summary":"Makes a new bucket for the caller's org and answers 201 with it."}},"/v1/s3/buckets/{bucket}":{"delete":{"parameters":[{"description":"Bucket is the bucket's friendly name, from the path.","in":"path","name":"bucket","required":true,"schema":{"type":"string"}}],"summary":"Removes an EMPTY bucket and answers 204."}},"/v1/s3/buckets/{bucket}/objects":{"get":{"parameters":[{"description":"Bucket is the bucket to list, from the path.","in":"path","name":"bucket","required":true,"schema":{"type":"string"}},{"in":"query","name":"prefix","required":false,"schema":{"type":"string"}},{"in":"query","name":"recursive","required":false,"schema":{"type":"string"}}],"summary":"Lists one folder level of a bucket."},"post":{"parameters":[{"description":"Bucket is the bucket to upload into, from the path.","in":"path","name":"bucket","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/s3.uploadIn"}}}},"summary":"Mints a presigned PUT URL the caller uploads to DIRECTLY."}},"/v1/s3/buckets/{bucket}/uploads":{"post":{"parameters":[{"description":"Bucket is the bucket to upload into, from the path.","in":"path","name":"bucket","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/s3.uploadStart"}}}},"summary":"Begins a multipart upload of a large file into one of the caller's org buckets."}},"/v1/s3/buckets/{bucket}/uploads/{upload}":{"delete":{"parameters":[{"description":"Bucket is the bucket, from the path.","in":"path","name":"bucket","required":true,"schema":{"type":"string"}},{"description":"Upload is the upload's id, from the path.","in":"path","name":"upload","required":true,"schema":{"type":"string"}},{"description":"Key is the object key the upload was started on. In the query for a read\nor an abandon, in the body to complete.","in":"query","name":"key","required":false,"schema":{"type":"string"}}],"summary":"Aborts a multipart upload and deletes the parts it stored."},"get":{"parameters":[{"description":"Bucket is the bucket, from the path.","in":"path","name":"bucket","required":true,"schema":{"type":"string"}},{"description":"Upload is the upload's id, from the path.","in":"path","name":"upload","required":true,"schema":{"type":"string"}},{"description":"Key is the object key the upload was started on. In the query for a read\nor an abandon, in the body to complete.","in":"query","name":"key","required":false,"schema":{"type":"string"}}],"summary":"Answers the parts a multipart upload already holds, in order: what a client resuming after a dropped connection reads to send only the rest."}},"/v1/s3/buckets/{bucket}/uploads/{upload}/complete":{"post":{"parameters":[{"description":"Bucket is the bucket, from the path.","in":"path","name":"bucket","required":true,"schema":{"type":"string"}},{"description":"Upload is the upload's id, from the path.","in":"path","name":"upload","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/s3.uploadRef"}}}},"summary":"Assembles a multipart upload into its object from every part the store holds, in order."}},"/v1/s3/buckets/{bucket}/uploads/{upload}/parts":{"post":{"parameters":[{"description":"Bucket is the bucket, from the path.","in":"path","name":"bucket","required":true,"schema":{"type":"string"}},{"description":"Upload is the upload's id, from the path.","in":"path","name":"upload","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/s3.uploadParts"}}}},"summary":"Answers presigned PUT URLs for some parts of a multipart upload, at most 64 a call, each valid for minutes: mint them as the upload reaches them."}},"/v1/s3/health":{"get":{"summary":"Reports whether this deployment can serve object storage."}},"/v1/sandbox":{"get":{"parameters":[{"in":"query","name":"project","required":false,"schema":{"type":"string"}},{"in":"query","name":"status","required":false,"schema":{"type":"string"}}],"summary":"Lists the sandboxes the caller holds, newest first."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/sandbox.sandboxIn"}}}},"summary":"Leases a sandbox — a real computer — for the caller's org."}},"/v1/sandbox/end":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/sandbox.EndIn"}}}},"summary":"End a sandbox and release it"}},"/v1/sandbox/lease":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/sandbox.LeaseIn"}}}},"summary":"Lease a sandbox — a real computer — or resume one you hold"}},"/v1/sandbox/read":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/sandbox.PathIn"}}}},"summary":"Read a file from a sandbox you hold"}},"/v1/sandbox/run":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/sandbox.RunIn"}}}},"summary":"Run a command in a sandbox you hold and read its output"}},"/v1/sandbox/stop":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/sandbox.StopIn"}}}},"summary":"Stop what a sandbox is running, and keep the sandbox"}},"/v1/sandbox/write":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/sandbox.WriteIn"}}}},"summary":"Write a file into a sandbox you hold"}},"/v1/sandbox/{id}":{"delete":{"parameters":[{"description":"ID is the sandbox to end, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"query","name":"purge","required":false,"schema":{"type":"string"}}],"summary":"Ends a sandbox and releases the compute behind it."},"get":{"parameters":[{"description":"ID is the sandbox to address, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one sandbox: its class, project, image, the runtime it was given, its status and when its lease ends."}},"/v1/sandbox/{id}/exec":{"post":{"parameters":[{"description":"ID is the sandbox to run in, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/sandbox.execRequest"}}}},"summary":"Runs one command in a sandbox the caller holds and answers with its exit code, stdout and stderr."}},"/v1/sandbox/{id}/fs":{"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Read a file, or list a directory"},"post":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Write a file"}},"/v1/sandbox/{id}/pause":{"post":{"parameters":[{"description":"ID is the sandbox to address, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Stops the pod, keeps the row and the volume, and settles the tail: POST /v1/sandbox/:id/pause."}},"/v1/sandbox/{id}/ports":{"get":{"parameters":[{"description":"ID is the sandbox, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Lists the TCP ports something listens on in a sandbox the caller holds, each with the preview host that serves it — what the sandbox's Browser can open."}},"/v1/sandbox/{id}/preview":{"post":{"parameters":[{"description":"ID is the sandbox, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/sandbox.previewIn"}}}},"summary":"Opens a port of a sandbox the caller holds in a browser."}},"/v1/sandbox/{id}/resume":{"post":{"parameters":[{"description":"ID is the sandbox to address, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Gives a parked sandbox a pod again: POST /v1/sandbox/:id/resume."}},"/v1/sandbox/{id}/screen":{"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"The screen, as a page"}},"/v1/sandbox/{id}/screen/ticket":{"post":{"parameters":[{"description":"ID is the sandbox to address, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Mints a short-lived grant to open the screen of a desktop sandbox."}},"/v1/sandbox/{id}/screen/ws":{"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"The screen, as a socket"}},"/v1/sandbox/{id}/terminal":{"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"The terminal, as a page"}},"/v1/sandbox/{id}/terminal/ticket":{"post":{"parameters":[{"description":"ID is the sandbox to address, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Mints a short-lived grant to open a terminal on a sandbox."}},"/v1/sandbox/{id}/terminal/ws":{"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"The terminal, as a socket"}},"/v1/sbom/health":{"get":{"summary":"Health is a pure liveness probe: the service is up; datastore reflects whether the datastore store is connected."}},"/v1/search":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/search.Request"}}}},"summary":"Hybrid search over the org's own corpora"}},"/v1/security/findings":{"get":{"parameters":[{"description":"ScanID narrows to a single scan.","in":"query","name":"scanId","required":false,"schema":{"type":"string"}},{"description":"MinSeverity drops everything below that rank: critical, high, medium or low.\nA value outside that set is refused rather than quietly ignored, so a filter\ntypo cannot read as \"no findings\".","in":"query","name":"minSeverity","required":false,"schema":{"type":"string"}},{"description":"Limit caps the page.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Is the org's findings — rule, severity, path, line, masked preview and fingerprint — newest first, across scans or within one."}},"/v1/security/findings/{id}":{"get":{"parameters":[{"description":"ID is the finding the URL names.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns a single finding: which rule fired, where (path and line), the masked preview and the SHA-256 fingerprint of the secret — the raw secret is not stored and cannot be read back."}},"/v1/security/health":{"get":{"summary":"Reports that the scanning subsystem is serving and how many secret-detection rules the engine holds."}},"/v1/security/rules":{"get":{"summary":"Is the secret-detection catalog the engine scans with."}},"/v1/security/scans":{"get":{"parameters":[{"description":"Limit caps the page.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Is the org's scan history, newest first, each as the same summary the submission answered — files read, findings fired, tally by severity."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/security.submitReq"}}}},"summary":"Runs the detection engine over a batch of files and answers 201 with the scan summary: how many files were read, how many findings fired, and the tally by severity."}},"/v1/security/scans/{id}":{"get":{"parameters":[{"description":"ID is the scan the URL names.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one scan together with every finding on it, so the detail view is one round-trip rather than a list call per scan."}},"/v1/seo/audit":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/seo.seoAuditIn"}}}},"summary":"Fetch one page and report what it gets wrong"}},"/v1/seo/backlinks":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/seo.seoBacklinkIn"}}}},"summary":"Who links to a target, and how much of it is broken or spam"}},"/v1/seo/competitors":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/seo.seoCompetitorIn"}}}},"summary":"The domains that place for the same phrases"}},"/v1/seo/ideas":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/seo.seoIdeaIn"}}}},"summary":"Grow a seed phrase into the phrases nobody named yet"}},"/v1/seo/keywords":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/seo.seoKeywordIn"}}}},"summary":"How often named phrases are searched, and what a click costs"}},"/v1/seo/rankings":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/seo.seoRankIn"}}}},"summary":"Every phrase a domain already places for, with its position"}},"/v1/seo/rates":{"get":{"summary":"What each call on this surface costs, from the vendor's own list"}},"/v1/settings/{product}":{"get":{"parameters":[{"description":"Product is the catalog slug, from the path. Must match ^[a-z0-9][a-z0-9._-]{0,62}$.","in":"path","name":"product","required":true,"schema":{"type":"string"}}],"summary":"Reads the caller org's configuration for one product, with every secret field MASKED — only the names of the set secrets come back, never their values, which live in KMS."},"put":{"parameters":[{"description":"Product is the catalog slug, from the PATH. zip binds the path last, so the\nURL names the product being written whatever a body field claims.","in":"path","name":"product","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/settings.settingsReq"}}}},"summary":"Writes the caller org's configuration for one product and answers the stored result, secrets masked."}},"/v1/share":{"get":{"summary":"Returns the tunnel shares the caller's account currently has open — their org's, or in a held org their own — across every environment it has enabled."}},"/v1/share/enable":{"post":{"summary":"Provisions the caller's tunnel account — their org's, or in a held org, where every self-serve signup lands, their own — and returns the credential the `hanzo share` CLI needs to run a tunnel."}},"/v1/share/rotate":{"post":{"summary":"Replaces the credential of a tunnel account and ends every environment enabled with it, shares and all, so a credential handed out before — to a member who has left, or to anyone who read it — opens nothing from now on."}},"/v1/social/accounts":{"get":{"parameters":[{"description":"Provider keeps only accounts on one network — x, facebook, instagram,\nlinkedin, tiktok, youtube or threads. Omit it for every network. It is\nlower-cased and trimmed before it is matched, and a value that names no\nnetwork simply matches nothing rather than being refused.","in":"query","name":"provider","required":false,"schema":{"type":"string"}},{"description":"Limit bounds the page, defaulting to 200 and capped at 1000. It is a string\nrather than an integer on purpose: the route parses it with a leading trim\nand falls back to the default on anything it cannot read, so `?limit=%2050`\nis a page of fifty today. An integer field would refuse the space and read\nan unparseable value as zero, which is a different page.","in":"query","name":"limit","required":false,"schema":{"type":"string"}}],"summary":"Returns the org's connected accounts — each one's id, network, handle, status and timestamps, most-recently-updated first."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/social.socialAccountBody"}}}},"summary":"Records a social account for the org and answers 201 with the stored row, including the generated id later calls address it by."}},"/v1/social/accounts/{id}":{"delete":{"parameters":[{"description":"ID is the account or post to act on, taken from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Removes one connected account from the org and answers 204 with no body; an id that is not there is 404."},"get":{"parameters":[{"description":"ID is the account or post to act on, taken from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one of the org's connected accounts by id — its network, handle, status and timestamps — or 404."},"put":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/social.socialAccountWrite"}}}},"summary":"Replaces the account's network, handle and status with what the body carries, and answers with the stored row."}},"/v1/social/posts":{"get":{"parameters":[{"description":"Status keeps only posts in one state — draft, scheduled, published or\nfailed. Omit it for every state. The transient publishing claim is not a\nuser-visible state and matching it is not useful.","in":"query","name":"status","required":false,"schema":{"type":"string"}},{"description":"Limit bounds the page, defaulting to 200 and capped at 1000. A string for\nthe same reason accountFilter.Limit is.","in":"query","name":"limit","required":false,"schema":{"type":"string"}}],"summary":"Returns the org's posts — content, channel, status, scheduled time, media and timestamps — most-recently-updated first."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/social.socialPostBody"}}}},"summary":"Stores a post for the org and answers 201 with the stored row."}},"/v1/social/posts/{id}":{"delete":{"parameters":[{"description":"ID is the account or post to act on, taken from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Removes one post from the org and answers 204 with no body; an id that is not there is 404."},"get":{"parameters":[{"description":"ID is the account or post to act on, taken from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one of the org's posts by id, with its current status, scheduled time, media and — once it has published — the account and external id it published under."},"put":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/social.socialPostWrite"}}}},"summary":"Replaces the post's content, channel, status, scheduled time and media with what the body carries, and answers with the stored row."}},"/v1/social/posts/{id}/publish":{"post":{"parameters":[{"description":"ID is the account or post to act on, taken from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Publishes the post immediately to the connected accounts on its channel and answers with the updated row, carrying the account and external id it published under."}},"/v1/social/providers":{"get":{"summary":"Reports each supported network's publish-readiness: whether this deployment holds the OAuth application credentials for it and, when it does not, exactly which environment variables are missing."}},"/v1/social/summary":{"get":{"summary":"Returns four counts for the caller's org: total posts, how many are scheduled, how many have published, and how many accounts are connected."}},"/v1/space/health":{"get":{"summary":"Reports whether this deployment can serve spaces, drives and files."}},"/v1/space/spaces":{"get":{"summary":"Lists the caller org's own spaces."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.spaceIn"}}}},"summary":"Makes a new space for the caller's org and answers 201 with it."}},"/v1/space/{space}/drives":{"get":{"parameters":[{"description":"Space is the space's name, from the path.","in":"path","name":"space","required":true,"schema":{"type":"string"}}],"summary":"Lists a space's drives."},"post":{"parameters":[{"description":"Space is the space to create the drive in, from the path. It carries NO\n`url:\"-\"`, unlike the field below it, and the difference is the whole reason\nboth tags are written out: zip's binder skips a field tagged \"-\" for EVERY\nURL source, path params included, so a path-borne value that carried it\nwould arrive empty and the create would refuse a perfectly good address.","in":"path","name":"space","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/space.driveIn"}}}},"summary":"Makes a new drive in a space and answers 201 with it."}},"/v1/space/{space}/drives/{drive}":{"delete":{"parameters":[{"description":"Space is the space's name, from the path.","in":"path","name":"space","required":true,"schema":{"type":"string"}},{"description":"Drive is the drive's name, from the path.","in":"path","name":"drive","required":true,"schema":{"type":"string"}}],"summary":"Removes an EMPTY drive and answers 204."}},"/v1/space/{space}/drives/{drive}/files":{"get":{"parameters":[{"description":"Space is the space to list in, from the path.","in":"path","name":"space","required":true,"schema":{"type":"string"}},{"description":"Drive is the drive to list, from the path.","in":"path","name":"drive","required":true,"schema":{"type":"string"}},{"in":"query","name":"folder","required":false,"schema":{"type":"string"}},{"in":"query","name":"recursive","required":false,"schema":{"type":"string"}}],"summary":"Lists one folder level of a drive."}},"/v1/standing/upkeep":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/standing.upkeepIn"}}}},"summary":"Reports what keeping this entity costs every year, itemised."}},"/v1/studio/brands":{"get":{"parameters":[{"description":"Limit is how many rows one page holds, 1 to 100 (default 50).","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Cursor is the previous page's next.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"summary":"Lists the brands you may read — palettes and type systems as design tokens."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/studio.BrandWrite"}}}},"summary":"Saves a brand: its tokens in the W3C design-token format (color, font, type, space, radius groups) and up to 16 logo items."}},"/v1/studio/brands/{id}":{"delete":{"parameters":[{"description":"ID is the resource's id, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Deletes one of your brands."},"get":{"parameters":[{"description":"ID is the resource's id, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Reads one brand you may read."},"patch":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/studio.BrandPatch"}}}},"summary":"Changes one of your brands; absent fields stay as they are."}},"/v1/studio/chat":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatTurn"}}}},"summary":"One chat turn that plans and launches runs, streamed"}},"/v1/studio/documents":{"get":{"parameters":[{"description":"Kind is doc or deck.","in":"query","name":"kind","required":false,"schema":{"type":"string"}},{"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}},{"in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"summary":"Lists the documents and decks you may read, most recently changed first."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/studio.DocumentWrite"}}}},"summary":"Writes a document (kind doc, its IR blocks) or a deck (kind deck, its slides)."}},"/v1/studio/documents/{id}":{"delete":{"parameters":[{"description":"ID is the resource's id, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Deletes one of your documents."},"get":{"parameters":[{"description":"ID is the resource's id, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Reads one document you may read."},"patch":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/studio.DocumentPatch"}}}},"summary":"Changes one of your documents; absent fields stay as they are."}},"/v1/studio/estimate":{"post":{"parameters":[{"in":"header","name":"Idempotency-Key","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/studio.RunCreate"}}}},"summary":"Prices a run without starting it: the estimate POST /v1/studio/runs would reserve, step by step."}},"/v1/studio/flows":{"get":{"parameters":[{"description":"Limit is how many rows one page holds, 1 to 100 (default 50).","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Cursor is the previous page's next.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"summary":"Lists the flows you may read, most recently changed first."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/studio.FlowWrite"}}}},"summary":"Saves a graph as a flow of yours."}},"/v1/studio/flows/{id}":{"delete":{"parameters":[{"description":"ID is the resource's id, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Deletes one of your flows."},"get":{"parameters":[{"description":"ID is the resource's id, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Reads one flow you may read."},"patch":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/studio.FlowPatch"}}}},"summary":"Changes one of your flows; absent fields stay as they are."}},"/v1/studio/gpus":{"get":{"parameters":[{"description":"Limit is how many rows one page holds, 1 to 100 (default 50).","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Cursor is the previous page's next.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"summary":"Lists the GPUs your org has linked with `hanzo link` that can take a studio.render step, each with whether it is free now."}},"/v1/studio/runs":{"get":{"parameters":[{"in":"query","name":"kind","required":false,"schema":{"type":"string"}},{"description":"Status keeps only runs at this status.","in":"query","name":"status","required":false,"schema":{"type":"string"}},{"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}},{"in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"summary":"Lists the runs you may read — your own and those your org shares — newest first."},"post":{"parameters":[{"in":"header","name":"Idempotency-Key","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/studio.RunCreate"}}}},"summary":"Starts a run: name exactly one of template, flow or graph, with the input its inputs schema asks for."}},"/v1/studio/runs/{id}":{"get":{"parameters":[{"description":"ID is the resource's id, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Reads one run: its graph, its input, every step's state, the assets it made and what it cost."},"patch":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/studio.RunPatch"}}}},"summary":"Renames or shares one of your runs."}},"/v1/studio/runs/{id}/cancel":{"post":{"parameters":[{"description":"ID is the resource's id, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Cancels one of your runs: a step in flight is told to stop, nothing new starts, and the reservation settles to what finished steps cost."}},"/v1/studio/runs/{id}/events":{"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Stream a run's progress as Server-Sent Events"}},"/v1/studio/runs/{id}/retry":{"post":{"parameters":[{"description":"ID is the resource's id, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Resumes one of your runs that failed or was cancelled: the steps that did not succeed run again in the same run, and the steps that did keep their outputs and are neither run nor charged again."}},"/v1/studio/runs/{id}/versions":{"get":{"parameters":[{"description":"ID is the resource's id, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Lists every version of a creation you may read — the runs in this run's lineage — oldest (version 1) first."}},"/v1/studio/templates":{"get":{"parameters":[{"description":"Kind keeps only templates that make this: image, poster, document, slides,\ntype, model, ad, video, film, voice, music or other.","in":"query","name":"kind","required":false,"schema":{"type":"string"}},{"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}},{"in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"summary":"Lists templates: the public catalog (org empty) first, then your org's own that you may read."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/studio.TemplateWrite"}}}},"summary":"Saves a template to your org: a graph and the inputs schema its runs are started with."}},"/v1/studio/templates/{id}":{"delete":{"parameters":[{"description":"ID is the resource's id, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Deletes one of your templates."},"get":{"parameters":[{"description":"ID is the resource's id, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Reads one template: a catalog slug or one of your org's templates you may read."},"patch":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/studio.TemplatePatch"}}}},"summary":"Changes one of your templates; absent fields stay as they are."}},"/v1/studio/threads":{"get":{"parameters":[{"description":"Limit is how many rows one page holds, 1 to 100 (default 50).","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Cursor is the previous page's next.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"summary":"Lists your chat threads, most recent first."}},"/v1/studio/threads/{id}":{"delete":{"parameters":[{"description":"ID is the resource's id, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Deletes one of your threads."},"get":{"parameters":[{"description":"ID is the resource's id, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Reads one of your threads and its messages, oldest first."}},"/v1/sync":{"get":{"summary":"Returns every sync link the caller's org has, each with its two endpoints, its direction and trigger policy, the time it last reconciled, and for a repo link its native copy on the forge — the address to clone it from, its default branch and whether it is in step."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/sync.syncReq"}}}},"summary":"Declares a sync between two endpoints and returns it."}},"/v1/sync/{id}":{"delete":{"parameters":[{"description":"ID is the sync to act on, from the path.","example":"sync_1","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Removes one sync and tears down the outbound mirror it derived, answering 204."},"get":{"parameters":[{"description":"ID is the sync to act on, from the path.","example":"sync_1","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one sync by id."},"patch":{"parameters":[{"description":"ID is the sync to update, from the path.","example":"sync_1","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/sync.patchSyncIn"}}}},"summary":"Updates one sync's mutable policy — direction, trigger and actor — in place."}},"/v1/sync/{id}/run":{"post":{"parameters":[{"description":"ID is the sync to act on, from the path.","example":"sync_1","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Reconciles one sync now — the manual re-sync, and the initial import for a link created without run=true."}},"/v1/task/board":{"get":{"parameters":[{"description":"Key is the project whose issues to list, from the path. EMPTY means every\nproject in the org — the global board. It is a filter like the rest of\nthis struct rather than an address, which is what lets one op answer both\n\"this board\" and \"all the work\" without a second surface disagreeing with\nthe first about what a column is.","in":"query","name":"key","required":false,"schema":{"type":"string"}},{"description":"Status keeps only issues in that board column: backlog, todo, in_progress,\ndone or canceled. An unknown value is refused with 400.","in":"query","name":"status","required":false,"schema":{"type":"string"}},{"description":"Kind keeps only work items of that shape: issue, pr or epic. An unknown\nvalue is refused with 400.","in":"query","name":"kind","required":false,"schema":{"type":"string"}},{"description":"Repo keeps only issues bound to that git repository.","in":"query","name":"repo","required":false,"schema":{"type":"string"}},{"description":"Label keeps only issues carrying that label, compared case-insensitively.\n\nThis is how a board narrows to something SMALLER than a repository — the\none mechanism for it. An estate whose apps are directories inside one\nrepository (hanzoai/cloud carries ~140 of them) has no repository per app\nto address, so the app is a label: `label=app/meet` is the meet board.\nNothing is provisioned to make one exist; a board is the query.","in":"query","name":"label","required":false,"schema":{"type":"string"}},{"description":"Source keeps only issues opened from that surface: team, git, crm,\nhelpdesk, cms or agent. An unknown value is refused with 400.","in":"query","name":"source","required":false,"schema":{"type":"string"}},{"description":"Scheduled keeps only issues that carry a date — a start, a due date or\nboth. This is the timeline's slice of the board: pass scheduled=true to\nget exactly the rows a gantt has somewhere to draw, instead of fetching\nevery issue and discarding the undated ones client-side.","in":"query","name":"scheduled","required":false,"schema":{"type":"boolean"}}],"summary":"Returns a board's issues — work items with their column, priority, assignee, labels and schedule."}},"/v1/task/issues":{"get":{"parameters":[{"description":"Q matches an issue's title or description. A word from the issue, which is\nwhat someone remembers — not its number, which is what they are looking up.","in":"query","name":"q","required":false,"schema":{"type":"string"}},{"description":"Project narrows to one team key; \"\" searches every project in the org,\nwhich is the point of this op.","in":"query","name":"project","required":false,"schema":{"type":"string"}},{"description":"Status keeps one board column: backlog, todo, in_progress, done, canceled.","in":"query","name":"status","required":false,"schema":{"type":"string"}},{"description":"Kind keeps one shape: issue, pr, epic.","in":"query","name":"kind","required":false,"schema":{"type":"string"}},{"description":"Repo keeps issues bound to one git repository.","in":"query","name":"repo","required":false,"schema":{"type":"string"}},{"description":"Room keeps issues bound to one collaboration room, spelled\n\"<space>_<room>\" — the exact value GET /v1/meet/call answers with, so a\nchannel's call and its task list name the room the same way. This is the\nread a channel view runs to draw its own list; it spans every board of the\norg, because the work a channel is about is not confined to one board.","in":"query","name":"room","required":false,"schema":{"type":"string"}},{"description":"Source keeps one origin: team, git, crm, helpdesk, cms, agent. \"git\" is\nhow you ask for the mirrored GitHub issues specifically.","in":"query","name":"source","required":false,"schema":{"type":"string"}},{"description":"Assignee keeps issues held by one person. Pass \"me\" for yourself.","in":"query","name":"assignee","required":false,"schema":{"type":"string"}},{"description":"Limit caps the answer; 0 means the default, and anything above the ceiling\nis clamped rather than refused — a search that errors on being too broad\nteaches people to guess.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Answers across every project in the org."}},"/v1/task/projects":{"get":{"summary":"Returns the boards of your org — the places your work actually is."},"post":{"summary":"Refused — a board is a repository on the forge"}},"/v1/task/projects/{key}":{"delete":{"parameters":[{"in":"path","name":"key","required":true,"schema":{"type":"string"}}],"summary":"Refused — a board is a repository on the forge"},"get":{"parameters":[{"description":"Key is the project's org-unique handle: 2-8 uppercase alphanumerics starting\nwith a letter (\"ENG\", \"OPS2\"). Matched case-insensitively.","in":"path","name":"key","required":true,"schema":{"type":"string"}}],"summary":"Returns one board of your org by its key — the repository name."},"patch":{"parameters":[{"in":"path","name":"key","required":true,"schema":{"type":"string"}}],"summary":"Refused — a board is a repository on the forge"}},"/v1/task/projects/{key}/issues":{"get":{"parameters":[{"description":"Key is the project whose issues to list, from the path. EMPTY means every\nproject in the org — the global board. It is a filter like the rest of\nthis struct rather than an address, which is what lets one op answer both\n\"this board\" and \"all the work\" without a second surface disagreeing with\nthe first about what a column is.","in":"path","name":"key","required":true,"schema":{"type":"string"}},{"description":"Status keeps only issues in that board column: backlog, todo, in_progress,\ndone or canceled. An unknown value is refused with 400.","in":"query","name":"status","required":false,"schema":{"type":"string"}},{"description":"Kind keeps only work items of that shape: issue, pr or epic. An unknown\nvalue is refused with 400.","in":"query","name":"kind","required":false,"schema":{"type":"string"}},{"description":"Repo keeps only issues bound to that git repository.","in":"query","name":"repo","required":false,"schema":{"type":"string"}},{"description":"Label keeps only issues carrying that label, compared case-insensitively.\n\nThis is how a board narrows to something SMALLER than a repository — the\none mechanism for it. An estate whose apps are directories inside one\nrepository (hanzoai/cloud carries ~140 of them) has no repository per app\nto address, so the app is a label: `label=app/meet` is the meet board.\nNothing is provisioned to make one exist; a board is the query.","in":"query","name":"label","required":false,"schema":{"type":"string"}},{"description":"Source keeps only issues opened from that surface: team, git, crm,\nhelpdesk, cms or agent. An unknown value is refused with 400.","in":"query","name":"source","required":false,"schema":{"type":"string"}},{"description":"Scheduled keeps only issues that carry a date — a start, a due date or\nboth. This is the timeline's slice of the board: pass scheduled=true to\nget exactly the rows a gantt has somewhere to draw, instead of fetching\nevery issue and discarding the undated ones client-side.","in":"query","name":"scheduled","required":false,"schema":{"type":"boolean"}}],"summary":"Returns a board's issues — work items with their column, priority, assignee, labels and schedule."},"post":{"parameters":[{"description":"Key is the board — the repository name, from the path. `owner/name`, or\n`github.com/owner/name`, names a repository on GitHub that no board on the\nforge stands for.","in":"path","name":"key","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/task.newIssue"}}}},"summary":"Opens a work item on the board, filed as YOU, where the repository lives: an issue on the deployment's forge, or on GitHub for a repository the forge mirrors from there or does not hold at all."}},"/v1/task/projects/{key}/issues/{num}":{"get":{"parameters":[{"description":"Key is the board — the repository name, or an index board's key.","in":"path","name":"key","required":true,"schema":{"type":"string"}},{"description":"Num is the issue's number on that board.","in":"path","name":"num","required":true,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns ONE work item in full — its description included."},"patch":{"parameters":[{"description":"Key is the board — the repository name, from the path.","in":"path","name":"key","required":true,"schema":{"type":"string"}},{"description":"Num is the issue number on that repository, from the path.","in":"path","name":"num","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/task.issueEdit"}}}},"summary":"Edits a work item — rename it, rewrite it, move it to another column, re-prioritise it, hand it to somebody, or comment on it."}},"/v1/task/projects/{key}/issues/{num}/claim":{"post":{"parameters":[{"in":"path","name":"key","required":true,"schema":{"type":"string"}},{"in":"path","name":"num","required":true,"schema":{"format":"int64","type":"integer"}}],"summary":"Takes an issue: it becomes yours and it moves to in_progress."}},"/v1/task/projects/{key}/issues/{num}/comments":{"get":{"parameters":[{"description":"Key is the board — the repository name, or an index board's key.","example":"site","in":"path","name":"key","required":true,"schema":{"type":"string"}},{"description":"Num is the issue's number on that board.","example":1,"in":"path","name":"num","required":true,"schema":{"format":"int64","type":"integer"}}],"summary":"Is one issue's conversation, oldest first, read as the caller."}},"/v1/task/rooms/{room}":{"get":{"parameters":[{"description":"Room is the room, spelled \"<space>_<room>\" — the same value\nGET /v1/meet/call answers with, so a channel's call and its work name the\nroom identically. From the path.","in":"path","name":"room","required":true,"schema":{"type":"string"}}],"summary":"Summarises one room's work."}},"/v1/tax/filings":{"get":{"summary":"Lists the caller org's IRS return exports and where each stands, without their files."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tax.exportIn"}}}},"summary":"Exports the caller org's return for a tax year and form, as the files the IRIS Taxpayer Portal takes, and records the export."}},"/v1/tax/filings/{id}":{"get":{"parameters":[{"description":"ID is the filing id, \"iris_\"-prefixed.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Reads one IRS return export WITH its files, rebuilt from the sealed forms and proven identical to what was exported."}},"/v1/tax/filings/{id}/receipt":{"post":{"parameters":[{"description":"ID is the filing, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tax.receiptIn"}}}},"summary":"Records what IRIS answered for an exported return — the Receipt ID on submission, then the acknowledgment."}},"/v1/tax/forms":{"get":{"parameters":[{"description":"Year narrows the list to one tax year; absent lists every year.","in":"query","name":"year","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the 1099s the caller org prepared as payer, oldest first, voided and superseded ones included — a return that was furnished stays on the record."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tax.prepareIn"}}}},"summary":"Prepares the caller org's 1099 drafts for a tax year, as the PAYER: one 1099-NEC and/or 1099-MISC per payee whose reportable payments on Hanzo's rails reach the year's threshold, from the same derivation GET /v1/tax/payments answers."}},"/v1/tax/forms/{id}":{"get":{"parameters":[{"description":"ID is the form id, \"f1099_\"-prefixed.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Reads one 1099 the caller org prepared as payer, every box and both parties, TINs masked."}},"/v1/tax/forms/{id}/correct":{"post":{"parameters":[{"description":"ID is the furnished form to correct, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tax.correctIn"}}}},"summary":"Corrects a furnished (or owed) 1099 with a NEW form that supersedes it."}},"/v1/tax/forms/{id}/furnish":{"post":{"parameters":[{"description":"ID is the form id, \"f1099_\"-prefixed.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Furnishes Copy B of a reviewed 1099 to its payee."}},"/v1/tax/forms/{id}/mailed":{"post":{"parameters":[{"description":"ID is the form id, \"f1099_\"-prefixed.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Records that the payer mailed a paper Copy B it owed."}},"/v1/tax/forms/{id}/pdf":{"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Download a 1099 the org prepared, as a PDF"}},"/v1/tax/forms/{id}/review":{"post":{"parameters":[{"description":"ID is the form id, \"f1099_\"-prefixed.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Marks a draft 1099 reviewed — a person has checked it."}},"/v1/tax/forms/{id}/void":{"post":{"parameters":[{"description":"ID is the form id, \"f1099_\"-prefixed.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Voids a draft or reviewed 1099, which is then never furnished or filed."}},"/v1/tax/inbox":{"get":{"parameters":[{"description":"Year narrows the list to one tax year; absent lists every year.","in":"query","name":"year","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the Copy B statements furnished to the caller org — every 1099 a payer on Hanzo delivered to it electronically, corrected ones beside the ones they supersede."}},"/v1/tax/inbox/{id}":{"get":{"parameters":[{"description":"ID is the form id, \"f1099_\"-prefixed.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Reads one Copy B furnished to the caller org."}},"/v1/tax/inbox/{id}/pdf":{"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Download a Copy B furnished to the org, as a PDF"}},"/v1/tax/payments":{"get":{"parameters":[{"description":"Year is the calendar year the payments were made in, e.g. 2026.","in":"query","name":"year","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns the caller org's tax year as a PAYER: every payment it made to another org in that calendar year, on any rail, as the event plane records it, each classified — reportable or not, in which 1099 box, and the rule that decided it, with its source — and each payee's totals tested against the year's threshold."}},"/v1/tax/profile":{"get":{"summary":"Returns the caller org's own tax profile — every line of its Form W-9, W-8BEN or W-8BEN-E, every number masked to its last four characters, where the certification stands, whether a W-8 is valid and when it expires, and whether the org consents to receive its 1099s electronically."},"put":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tax.profileIn"}}}},"summary":"Writes the caller org's tax profile — its Form W-9, or its Form W-8BEN or W-8BEN-E when it is a foreign person — and answers it, every number masked."}},"/v1/tax/profile/certify":{"post":{"summary":"Signs the caller org's certification — Form W-9 Part II, Form W-8BEN Part III or Form W-8BEN-E Part XXX — through /v1/legal's e-signature."}},"/v1/tax/w9":{"get":{"summary":"Lists the caller org's W-9 relationships on both sides: the W-9s it asked its payees for, with where each stands, and the requests other orgs made for its own W-9."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tax.w9Request"}}}},"summary":"Asks another org for its W-9, as the org that pays it."}},"/v1/tax/w9/{id}":{"get":{"parameters":[{"description":"ID is the relationship's id, \"w9_\"-prefixed.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Reads one W-9 relationship from the caller's side."}},"/v1/tax/w9/{id}/decline":{"post":{"parameters":[{"description":"ID is the relationship's id, \"w9_\"-prefixed.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Declines a request for this org's W-9."}},"/v1/tax/w9/{id}/grant":{"post":{"parameters":[{"description":"ID is the relationship's id, \"w9_\"-prefixed.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Grants the payer that asked a live read of this org's W-9 — every line, the TIN masked, and the full TIN to that payer's org admins alone, each read audited."}},"/v1/tax/w9/{id}/match":{"post":{"parameters":[{"description":"ID is the relationship, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tax.matchIn"}}}},"summary":"Records the result of IRS TIN Matching for a payee, as the payer."}},"/v1/tax/w9/{id}/revoke":{"post":{"parameters":[{"description":"ID is the relationship's id, \"w9_\"-prefixed.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Revokes a W-9 this org granted."}},"/v1/tax/w9/{id}/tin":{"get":{"parameters":[{"description":"ID is the relationship's id, \"w9_\"-prefixed.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Reads a payee's TIN in full — and, for a payee on a W-8, its foreign TIN, which the payer's Form 1042-S carries."}},"/v1/taxonomy":{"get":{"parameters":[{"description":"Brand returns only what that brand's console shows — the categories it\nadmits, and within them the taxa scoped to it. Empty returns everything.","in":"query","name":"brand","required":false,"schema":{"type":"string"}}],"summary":"Returns the product catalogue as this caller sees it: the PLATFORM catalogue — Hanzo's own products, the part that is true for everyone — plus the caller's own org's rows, every category in display order and each carrying the products filed under it in theirs."}},"/v1/taxonomy/categories/{id}":{"delete":{"parameters":[{"description":"ID is the slug to act on, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Removes one empty category."},"put":{"parameters":[{"description":"ID is the category slug to write, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/taxonomy.categoryIn"}}}},"summary":"Creates or replaces one category and returns it as stored."}},"/v1/taxonomy/taxa/{id}":{"delete":{"parameters":[{"description":"ID is the slug to act on, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Removes one product from the catalogue."},"put":{"parameters":[{"description":"ID is the taxon slug to write, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/taxonomy.taxonIn"}}}},"summary":"Creates or replaces one product and returns it as stored."}},"/v1/team/account":{"post":{"summary":"Read the caller's account and switch space"}},"/v1/team/account/auth/{provider}":{"get":{"parameters":[{"in":"path","name":"provider","required":true,"schema":{"type":"string"}}],"summary":"Start a sign-in at hanzo.id"}},"/v1/team/account/auth/{provider}/callback":{"get":{"parameters":[{"in":"path","name":"provider","required":true,"schema":{"type":"string"}}],"summary":"Complete a sign-in and hand the browser its session"}},"/v1/team/account/cookie":{"delete":{"summary":"Signs this browser out of team by expiring the HttpOnly account-token cookie the OAuth callback set."},"put":{"summary":"Store the session token as this browser's cookie"}},"/v1/team/account/providers":{"get":{"summary":"Returns the identity providers this deployment starts a login with."}},"/v1/team/billing/plan":{"get":{"summary":"Returns the plan and seat counts for the caller's OWN org, resolved from the VERIFIED team session token — never a client header."}},"/v1/team/billing/ui":{"get":{"summary":"Open the wallet page"}},"/v1/team/collaborator":{"get":{"summary":"Open the live collaborative-editing socket"}},"/v1/team/collaborator/rpc/{documentId}":{"post":{"parameters":[{"description":"DocumentID addresses the document field, as\n\"<spaceUuid>|<objectClass>|<objectId>|<objectAttr>\" — the\ncollaborator-client encodeDocumentId shape, from the path.","example":"6579…|tracker:class:Issue|issue-1|description","in":"path","name":"documentId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/team.collabRequest"}}}},"summary":"CollabRPC is the collaborative-markup snapshot plane the Team front's editor speaks: createContent stores a document field's markup at a fresh, immutable blob ref and returns it, updateContent stores a new snapshot and answers nothing, and getContent reads back the exact snapshot a ref names."}},"/v1/team/dms":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/team.teamDirectOpen"}}}},"summary":"Opens the direct message between the caller and the people named, or answers the one that already exists — there is one conversation per set of people, however many times it is asked for."}},"/v1/team/docs":{"get":{"parameters":[{"description":"Space is the space uuid. Optional for a caller in exactly one space.","in":"query","name":"space","required":false,"schema":{"type":"string"}},{"description":"Teamspace narrows the answer to one teamspace.","in":"query","name":"teamspace","required":false,"schema":{"type":"string"}},{"description":"Parent narrows the answer to one document's children.","in":"query","name":"parent","required":false,"schema":{"type":"string"}}],"summary":"Returns the documents of a space the caller may see, with the teamspaces they are grouped in."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/team.teamDocNew"}}}},"summary":"Creates a document, as the caller, after its siblings."}},"/v1/team/docs/{id}":{"delete":{"parameters":[{"description":"ID is the document, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Space is the space uuid holding it.","example":"0e3c…","in":"query","name":"space","required":false,"schema":{"type":"string"}}],"summary":"Removes a document with everything nested under it and every comment on any of them — the Team client's own delete, which takes the subtree with it."},"get":{"parameters":[{"description":"ID is the document, from the path.","example":"d41c","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Space is the space uuid holding it.","example":"0e3c…","in":"query","name":"space","required":false,"schema":{"type":"string"}}],"summary":"Returns one document the caller may see."},"patch":{"parameters":[{"description":"ID is the document, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/team.teamDocEdit"}}}},"summary":"Renames a document or moves it — under another document, to the top of its teamspace, or to another teamspace with everything nested under it."}},"/v1/team/docs/{id}/comments":{"get":{"parameters":[{"description":"ID is the document, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Space is the space uuid holding it.","in":"query","name":"space","required":false,"schema":{"type":"string"}}],"summary":"Returns the comments on a document, oldest first — the same message shape a room's conversation answers."},"post":{"parameters":[{"description":"ID is the document, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/team.teamCommentWrite"}}}},"summary":"Comments on a document, as the caller."}},"/v1/team/events":{"get":{"summary":"Stream live changes to what the caller may see, as Server-Sent Events"}},"/v1/team/files/{space}":{"post":{"parameters":[{"in":"path","name":"space","required":true,"schema":{"type":"string"}}],"summary":"Upload a file into a space"}},"/v1/team/files/{space}/{filename}":{"delete":{"parameters":[{"description":"Space is the space uuid the blob belongs to, from the path.","example":"6579…","in":"path","name":"space","required":true,"schema":{"type":"string"}},{"description":"Filename is the last path segment, which the front sets to the blob id\nwhen it sends no explicit `file`.","in":"path","name":"filename","required":true,"schema":{"type":"string"}},{"description":"File is the blob id, and wins over the path segment when both are present.","example":"0d4f…","in":"query","name":"file","required":false,"schema":{"type":"string"}}],"summary":"Removes one blob from a space's file store."},"get":{"parameters":[{"in":"path","name":"space","required":true,"schema":{"type":"string"}},{"in":"path","name":"filename","required":true,"schema":{"type":"string"}}],"summary":"Download a space file"}},"/v1/team/inbox":{"get":{"parameters":[{"description":"Space is the space uuid. Optional for a caller in exactly one space.","in":"query","name":"space","required":false,"schema":{"type":"string"}},{"description":"Archived lists the archived notifications instead of the live ones.","in":"query","name":"archived","required":false,"schema":{"type":"boolean"}}],"summary":"Returns the caller's notifications, newest first, each with the room or document it is about and the message that caused it."}},"/v1/team/inbox/read":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/team.teamInboxAll"}}}},"summary":"Marks every live notification of the caller's read, and says how many it changed."}},"/v1/team/inbox/{id}/archive":{"post":{"parameters":[{"description":"ID is the notification, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/team.teamInboxAt"}}}},"summary":"Archives one of the caller's notifications — read, and out of the live inbox — and answers it."}},"/v1/team/inbox/{id}/read":{"post":{"parameters":[{"description":"ID is the notification, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/team.teamInboxAt"}}}},"summary":"Marks one of the caller's notifications read and answers it."}},"/v1/team/members":{"get":{"parameters":[{"description":"Space is the space uuid. Optional for a caller in exactly one space.","in":"query","name":"space","required":false,"schema":{"type":"string"}}],"summary":"Returns the people and agents in a space, with the name, avatar, role and presence a client draws them with."}},"/v1/team/messages/{id}":{"delete":{"parameters":[{"description":"ID is the message, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Space names the space holding it. A message id is unique within a space,\nnot across the org.","example":"0e3c…","in":"query","name":"space","required":false,"schema":{"type":"string"}}],"summary":"Removes a message, with its replies, reactions, files and the inbox notifications that point at it."},"patch":{"parameters":[{"description":"ID is the message, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/team.teamMessageEdit"}}}},"summary":"Rewrites what a message says."}},"/v1/team/messages/{id}/reactions/{emoji}":{"delete":{"parameters":[{"description":"ID is the message, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Emoji is the reaction, from the path (percent-encoded on the wire).","in":"path","name":"emoji","required":true,"schema":{"type":"string"}},{"description":"Space names the space holding the message.","example":"0e3c…","in":"query","name":"space","required":false,"schema":{"type":"string"}}],"summary":"Takes back the caller's reaction to a message and answers the message with its reactions as they now stand."},"put":{"parameters":[{"description":"ID is the message, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Emoji is the reaction, from the path (percent-encoded on the wire).","in":"path","name":"emoji","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/team.teamReactionWrite"}}}},"summary":"Adds the caller's reaction to a message and answers the message with its reactions as they now stand."}},"/v1/team/messages/{id}/replies":{"get":{"parameters":[{"description":"ID is the message, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Space names the space holding it. A message id is unique within a space,\nnot across the org.","in":"query","name":"space","required":false,"schema":{"type":"string"}}],"summary":"Returns a message's thread, oldest first, each reply with its reactions and files."},"post":{"parameters":[{"description":"ID is the message being answered, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/team.teamReplyWrite"}}}},"summary":"Answers a message in its thread, as the caller."}},"/v1/team/public":{"get":{"parameters":[{"description":"Q matches a room's name or its topic.","in":"query","name":"q","required":false,"schema":{"type":"string"}},{"description":"Org narrows to one org's published rooms.","in":"query","name":"org","required":false,"schema":{"type":"string"}},{"description":"Limit caps the page, 50 when unstated and 200 at most. An unparseable\nvalue reads as unstated rather than as zero — zero pages is not an answer\nanybody asked for.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the rooms orgs have published, across every org."}},"/v1/team/rooms":{"get":{"summary":"Returns the rooms the caller may see, with the kind and work facet each carries."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/team.teamRoomNew"}}}},"summary":"Opens a named room and answers it as the store now holds it."}},"/v1/team/rooms/{id}":{"patch":{"parameters":[{"description":"ID is the room, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/team.teamRoomEdit"}}}},"summary":"Renames a channel, sets its topic, or archives or reopens it, and answers the room as it now stands."},"put":{"parameters":[{"description":"ID is the room to bind, from the path. The URL is the authority; a body\ncarrying another id cannot redirect the write.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/team.teamRoomBind"}}}},"summary":"States what a room is for: its lifecycle intent, and what it is about."}},"/v1/team/rooms/{id}/members":{"get":{"parameters":[{"description":"ID is the room, from the path. The URL is the authority.","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Space names the space holding the room, and is required for the reason the\nbind op requires it: a room id is unique within a space and not across the\norg, so searching every space for a match would make the answer depend on\niteration order.","in":"query","name":"space","required":false,"schema":{"type":"string"}}],"summary":"Returns the people and agents in one room, as the roster describes them."},"post":{"parameters":[{"description":"ID is the room, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/team.teamRoomJoin"}}}},"summary":"Adds people to a room and answers the room as it now stands."}},"/v1/team/rooms/{id}/members/{account}":{"delete":{"parameters":[{"description":"ID is the room, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Account is the account uuid to remove, from the path. Your own is leaving.","in":"path","name":"account","required":true,"schema":{"type":"string"}},{"description":"Space is the space uuid holding the room.","example":"0e3c…","in":"query","name":"space","required":false,"schema":{"type":"string"}}],"summary":"Takes one person out of a room — the caller leaving, when the account is their own."}},"/v1/team/rooms/{id}/messages":{"get":{"parameters":[{"description":"ID is the room, from the path. The URL is the authority.","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Space names the space holding the room, and is required for the reason the\nbind op requires it: a room id is unique within a space and not across the\norg, so searching every space for a match would make the answer depend on\niteration order.","in":"query","name":"space","required":false,"schema":{"type":"string"}}],"summary":"Returns the tail of one room's conversation, oldest first, each message with its reactions, files and thread count."},"post":{"parameters":[{"description":"ID is the room to say it in, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/team.teamMessageWrite"}}}},"summary":"Says one thing in a room, as the caller."}},"/v1/team/transactor/statistics":{"get":{"parameters":[{"description":"Token is the space token minted by selectWorkspace.","example":"eyJhbGciOiJIUzI1NiJ9…","in":"query","name":"token","required":false,"schema":{"type":"string"}}],"summary":"Returns the transactor's live sessions for the space the caller's credential names — the endpoint the front's space switcher and server panel poll on the transactor base."}},"/v1/team/transactor/{token}":{"get":{"parameters":[{"in":"path","name":"token","required":true,"schema":{"type":"string"}}],"summary":"Open the space data-plane socket"}},"/v1/tel/calls":{"get":{"summary":"Lists the calls this org has placed or received, newest first."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tel.callInput"}}}},"summary":"Dials."}},"/v1/tel/calls/{id}":{"delete":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Ends a call this org placed."}},"/v1/tel/messages":{"get":{"summary":"Lists the messages this org has sent or received, newest first."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tel.messageInput"}}}},"summary":"Sends a message from one of this org's own numbers."}},"/v1/tel/numbers":{"get":{"summary":"Lists the phone numbers this org HOLDS — the ones it has bought and not released."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tel.buyInput"}}}},"summary":"Provisions with the carrier FIRST and records second."}},"/v1/tel/numbers/available":{"get":{"parameters":[{"in":"query","name":"Country","required":false,"schema":{"type":"string"}},{"in":"query","name":"Area","required":false,"schema":{"type":"string"}},{"in":"query","name":"Type","required":false,"schema":{"type":"string"}},{"in":"query","name":"Limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Asks the carrier what is available to buy."}},"/v1/tel/numbers/{id}":{"delete":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Checks the holding is THIS org's before it reaches the carrier."}},"/v1/tel/summary":{"get":{"summary":"Counts what this org holds on the telephony plane: its numbers, its calls and its messages."}},"/v1/template":{"get":{"summary":"Lists the public starter-kit catalog plus, for a validated caller, that org's own private kits."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/template.publishKitIn"}}}},"summary":"Creates a starter kit PRIVATE to the caller's org and answers 201 with the stored kit."}},"/v1/template/{slug}":{"delete":{"parameters":[{"description":"Slug is the starter kit to act on, from the path.","example":"acme-portal","in":"path","name":"slug","required":true,"schema":{"type":"string"}}],"summary":"Deletes the caller org's OWN starter kit."},"get":{"parameters":[{"description":"Slug is the starter kit to act on, from the path.","example":"folio","in":"path","name":"slug","required":true,"schema":{"type":"string"}}],"summary":"Returns one starter kit: the caller org's own by that slug, else the public catalog's."},"put":{"parameters":[{"description":"Slug is the kit to replace, from the path.","example":"acme-portal","in":"path","name":"slug","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/template.replaceKitIn"}}}},"summary":"Overwrites the caller org's OWN starter kit at the path slug, answering the stored kit."}},"/v1/tool":{"get":{"parameters":[{"description":"Source keeps only tools from one source — connector, function, zap-service,\nagent, skill or mcp. Empty keeps every source.","in":"query","name":"source","required":false,"schema":{"type":"string"}},{"description":"Activated keeps only the tools activated for the caller's org and project,\nand only when it is exactly the string \"true\".","in":"query","name":"activated","required":false,"schema":{"type":"string"}}],"summary":"Lists every tool the caller's org and project can reach, from every source, each flagged with whether it is activated."}},"/v1/tool/activation":{"get":{"summary":"Reports which tools are switched on for the caller's org and project."},"put":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tool.activationReq"}}}},"summary":"Switches tools on and off for the caller's org and project, and answers with the resulting activated set."}},"/v1/tool/call":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tool.toolCall"}}}},"summary":"Runs one of the caller's activated tools and answers with its output."}},"/v1/tool/catalog":{"get":{"parameters":[{"description":"Q matches the name, title or description, case-insensitively.","in":"query","name":"q","required":false,"schema":{"type":"string"}},{"description":"Featured keeps only the listings we put on the front of the shelf, and only\nwhen it is exactly the string \"true\".","in":"query","name":"featured","required":false,"schema":{"type":"string"}},{"description":"Official keeps only the vendors' OWN servers — not third-party copies of\nthem — and only when it is exactly the string \"true\".","in":"query","name":"official","required":false,"schema":{"type":"string"}},{"description":"Limit bounds the page: default 50, maximum 200. A value that is not a\npositive integer reads as the default.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Offset skips that many listings.","in":"query","name":"offset","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the MCP servers the public registries publish, as we hold them: our canonical copy of registry.modelcontextprotocol.io, plus what we decided about each entry."}},"/v1/tool/catalog/{id}":{"get":{"parameters":[{"description":"ID is the listing, from the path. It is the publisher's reverse-DNS name\nwith its one slash written as an underscore — \"com.stripe_mcp\".","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one catalog entry in full: the publisher's description, its repository and site, every package form with the runtime that launches it, and every hosted endpoint."}},"/v1/tool/kit":{"get":{"summary":"Answers the caller's kit: what their coding runs carry of the org's tool plane."},"put":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tool.muteReq"}}}},"summary":"Mutes and unmutes names of the org's kit for the caller's own runs, and answers the caller's kit after."}},"/v1/tool/mcp/servers":{"get":{"summary":"Lists the external MCP servers the caller's org has registered."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tool.createServerReq"}}}},"summary":"Gives the caller's org one more external MCP server, so its tools join the org's tool plane and the fleet's MCP server."}},"/v1/tool/mcp/servers/{id}":{"delete":{"parameters":[{"description":"ID is the server to deregister, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Deregisters one of the caller org's external MCP servers, so its tools leave the registry."}},"/v1/tool/plugins":{"get":{"parameters":[{"description":"All includes the configured-but-disabled subsystems too, but only when it is\nexactly the string \"true\". Otherwise only the running ones are reported.","in":"query","name":"all","required":false,"schema":{"type":"string"}}],"summary":"Reports what this deployment actually mounted: every subsystem the composition root declared and whether it is switched on."}},"/v1/tool/plugins/authored":{"get":{"summary":"Lists the plugins the caller's org BUILT, newest first, each with the TypeScript as authored."}},"/v1/tool/plugins/authored/{id}":{"delete":{"parameters":[{"description":"ID is the plugin to remove, from the path.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Removes one of the caller org's built plugins, so the runtime can no longer load it."}},"/v1/tool/plugins/build":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tool.buildRequest"}}}},"summary":"Builds and stores one plugin for the caller's org."}},"/v1/tool/skills":{"get":{"parameters":[{"description":"Activated keeps only the tools activated for the caller's org and project,\nand only when it is exactly the string \"true\".","in":"query","name":"activated","required":false,"schema":{"type":"string"}}],"summary":"Lists the skills the caller's org can reach — the brand's embedded catalogue plus the org's own authored ones — with each one's activation flag."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tool.skillIn"}}}},"summary":"Adds or revises one of the caller org's own skills, and answers 201 with the stored record."}},"/v1/tool/skills/authored":{"get":{"summary":"Lists the caller org's OWN skills with their SKILL.md bodies."}},"/v1/tool/skills/{id}":{"delete":{"parameters":[{"description":"ID is the skill to remove, from the path. It is the skill's name.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Removes one of the caller org's authored skills."}},"/v1/train/artifacts":{"get":{"summary":"Answers the org's objects — its uploads and its jobs' outputs, one per sha256 — with what produced each, whether it is published and when retention deletes it."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/train.uploadIn"}}}},"summary":"Records rows the org is about to upload, named by the SHA-256 of their bytes, and answers the same grant an executor's artifact gets: a presigned PUT S3 accepts only with that checksum and length, encrypted under the org's key — a PUT per 64 MiB part over 64 MiB — or stored: true when the org already holds those bytes."}},"/v1/train/artifacts/{sha256}":{"delete":{"parameters":[{"description":"SHA256 names the object, from the path.","in":"path","name":"sha256","required":true,"schema":{"type":"string"}}],"summary":"Deletes one of the org's objects — an upload or a job's output — from the store: every artifact naming it then reads deleted, and its storage is no longer billed."},"get":{"parameters":[{"description":"SHA256 names the object, from the path.","in":"path","name":"sha256","required":true,"schema":{"type":"string"}}],"summary":"Answers one of the org's objects, as the list does, with an address that fetches its bytes for ten minutes once it is stored: how an executor reads an `artifact:<sha256>` dataset its job names, and how the org downloads what it uploaded."}},"/v1/train/clients":{"get":{"summary":"Answers the org's live clients as the engine reports them."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/train.createClientIn"}}}},"summary":"Loads base_model on the engine with a LoRA adapter and answers the client, loading; poll it until ready."}},"/v1/train/clients/{id}":{"delete":{"parameters":[{"description":"ID names the client.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Drops one of the org's clients and frees its memory on the engine."},"get":{"parameters":[{"description":"ID names the client.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Answers one of the org's clients with its loss history."}},"/v1/train/clients/{id}/forward_backward":{"post":{"parameters":[{"description":"ID names the client.","example":"tc-…","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/train.forwardIn"}}}},"summary":"Accumulates the gradients of a batch on the client."}},"/v1/train/clients/{id}/optim_step":{"post":{"parameters":[{"description":"ID names the client.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/train.optimIn"}}}},"summary":"Applies the optimizer to the accumulated gradients."}},"/v1/train/clients/{id}/sample":{"post":{"parameters":[{"description":"ID names the client.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/train.sampleIn"}}}},"summary":"Decodes from the client's current weights."}},"/v1/train/clients/{id}/save_weights":{"post":{"parameters":[{"description":"ID names the client.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/train.saveIn"}}}},"summary":"Writes the client's adapter on the engine."}},"/v1/train/jobs":{"get":{"parameters":[{"description":"Status narrows to one status.","in":"query","name":"status","required":false,"schema":{"type":"string"}},{"description":"Limit bounds the answer; default 50, at most 500.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Answers the org's jobs, newest first, narrowed by ?status=."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/train.Spec"}}}},"summary":"Creates a job that teaches base_model one capability: the data, the objective, how the trained parameters are represented (adaptation), what they must not damage and by how much (protect), where it runs and how far (resources), the suites it is judged on (evaluation) and what it produces (output)."}},"/v1/train/jobs/claim":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/train.claimIn"}}}},"summary":"ClaimTrainTask is an executor's long poll for work: it names the machine it runs on, its devices and what its build runs, and is answered, within 25 seconds, one task it can run — a job's lead first; a join once its lead has said where it coordinates — or 204."}},"/v1/train/jobs/{id}":{"get":{"parameters":[{"description":"ID names the job.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Answers one job: what it asked for, its status and tasks, its artifacts, its result and verdict, and whether it was published."}},"/v1/train/jobs/{id}/artifacts":{"get":{"parameters":[{"description":"ID names the job.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Answers a job's artifacts — checkpoint, capability, lora, basis or merged, each named by the SHA-256 of its bytes — with a download address that lives ten minutes for each one stored."},"post":{"parameters":[{"description":"ID names the job, from the path.","example":"job_0123456789abcdef","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/train.registerIn"}}}},"summary":"Records an output its executor is about to store, named by the SHA-256 of its bytes, and answers a presigned PUT for exactly that object under the org's prefix — S3 accepts it only with the checksum and encrypts it under the org's key — or, over 64 MiB, a presigned PUT per 64 MiB part, or stored: true when the org already holds those bytes."}},"/v1/train/jobs/{id}/cancel":{"post":{"parameters":[{"description":"ID names the job.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Stops a job that has not ended."}},"/v1/train/jobs/{id}/events":{"get":{"parameters":[{"description":"ID names the job.","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"After is the last seq the caller holds; 0 reads from the start.","in":"query","name":"after","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Wait is how many seconds to hold the request for a first new event, at most 25.","in":"query","name":"wait","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Answers a job's events after a cursor — status changes, the coordinator's address, metrics, log lines, artifacts and the result — waiting up to `wait` seconds for the first new one, so a caller following a run holds one request at a time."},"post":{"parameters":[{"description":"ID names the job, from the path.","example":"job_0123456789abcdef","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/train.reportIn"}}}},"summary":"ReportTrainTask is an executor's report for the task it holds: status changes, the lead's coordinator address, metrics, log lines, stored artifacts and, last, the lead's result."}},"/v1/train/jobs/{id}/metrics":{"get":{"parameters":[{"description":"ID names the job.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Answers a job's metric series — loss, throughput and each validation suite's numbers as the executor reported them — one per name, each point [step, value, unix seconds]."}},"/v1/train/jobs/{id}/publish":{"post":{"parameters":[{"description":"ID names the job.","example":"job_0123456789abcdef","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/train.publishIn"}}}},"summary":"Publishes a job's output under a name."}},"/v1/train/models":{"get":{"summary":"Answers each base the caller can train today, in one shape: the base, the methods it trains by (adaptations), where it runs (runs: Hanzo's devices or the org's machines) with what one device-second costs there in nano-USD, then the resources that run it (nouns), its executor and devices, and the protections, objective terms, outputs and dataset schemes it takes."}},"/v1/translate":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brief"}}}},"summary":"Translate a string or a batch into one target language"}},"/v1/translate/memory":{"get":{"parameters":[{"description":"Target narrows to one target language tag (BCP-47, e.g. \"es\" or \"pt-BR\").","in":"query","name":"target","required":false,"schema":{"type":"string"}},{"description":"State narrows to one position on the review ladder: machine, suggested,\napproved or published.","in":"query","name":"state","required":false,"schema":{"type":"string"}},{"description":"Limit caps the rows returned. Non-positive or unparseable means the server\ndefault (200); the ceiling is 1000.","in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Returns the org's own translation-memory entries, newest first, optionally narrowed to one target language and/or one position on the review ladder."},"put":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/translate.ReviewRequest"}}}},"summary":"Records a human decision on one translation-memory entry, and returns the entry as stored."}},"/v1/treasury":{"get":{"summary":"Returns the reserve fund's health and the current revenue-share policy for any validated caller."}},"/v1/treasury/accounts":{"get":{"parameters":[{"description":"Scope is \"house\" to read the reserve/revenue/payout house accounts. SuperAdmin only.","in":"query","name":"scope","required":false,"schema":{"type":"string"}},{"description":"Org names another tenant to read. SuperAdmin only; ignored when scope=house.","in":"query","name":"org","required":false,"schema":{"type":"string"}}],"summary":"Returns the ledger accounts the caller may see, with their balances."}},"/v1/trust":{"get":{"summary":"Reads YOUR organization's whole trust centre, including the addresses of your own gated documents."}},"/v1/trust/controls":{"get":{"summary":"Lists every control your organization publishes, with the counts."}},"/v1/trust/controls/{id}":{"get":{"parameters":[{"description":"ID is the control's id, dotted lowercase — \"iam.pkce.s256\".","example":"iam.pkce.s256","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Reads one control by id."}},"/v1/trust/coverage":{"get":{"summary":"Reads coverage: per framework, how many clauses have an automated control behind them, how many are partial, and how many have none — each carrying the unit it is counted in, because \"12 of 20\" is not a fact until you know what the 20 are."}},"/v1/trust/coverage/{framework}":{"get":{"parameters":[{"description":"Framework is the framework id — \"soc2\", \"iso27001\", \"nist80053\".","example":"soc2","in":"path","name":"framework","required":true,"schema":{"type":"string"}}],"summary":"Reads one framework clause by clause: every clause the standard publishes, what covers it, and which controls stand behind it — so a coverage number can be checked line by line rather than taken on trust."}},"/v1/trust/documents":{"get":{"summary":"Lists your organization's documents."}},"/v1/trust/evidence":{"get":{"parameters":[{"description":"Control is the control id whose trail to read. Required.","example":"iam.refresh.rotation","in":"query","name":"control","required":false,"schema":{"type":"string"}},{"description":"From is the inclusive lower bound, an RFC 3339 date or instant\n(\"2026-01-01\" or \"2026-01-01T00:00:00Z\"). Empty leaves it unbounded. A\nmalformed bound is refused rather than silently widening the window.","example":"2026-01-01","in":"query","name":"from","required":false,"schema":{"type":"string"}},{"description":"To is the upper bound, same form and same tolerance.","in":"query","name":"to","required":false,"schema":{"type":"string"}},{"description":"Limit caps the rows returned, 1..1000, default 100. It is a string because\nan unparseable value is refused rather than read as zero.","example":"50","in":"query","name":"limit","required":false,"schema":{"type":"string"}}],"summary":"Reads the audit rows that stand behind one control, over a window."}},"/v1/trust/faq":{"get":{"summary":"Lists your knowledge base — the questions a reviewer asks, answered once."}},"/v1/trust/frameworks":{"get":{"summary":"Lists the frameworks coverage is computed against, and how many clauses each publishes."}},"/v1/trust/policies":{"get":{"summary":"Lists your organization's published policies."}},"/v1/trust/profile":{"get":{"summary":"Reads your organization's trust-centre profile — the name, tagline and summary a visitor sees, whether the centre is published, and where to send somebody who wants a gated document."}},"/v1/trust/published/{org}":{"get":{"parameters":[{"description":"Org is the organization's slug — the name in its address.","example":"hanzo","in":"path","name":"org","required":true,"schema":{"type":"string"}}],"summary":"Reads a published trust centre — the whole thing in one answer: the organization's profile, its control inventory, coverage computed against each framework's whole published clause list, its documents, subprocessors, policies, knowledge base, updates and risk profile."}},"/v1/trust/risk":{"get":{"summary":"Reads your risk profile — the label and value pairs describing what your organization handles and how."}},"/v1/trust/subprocessors":{"get":{"summary":"Lists the third parties your organization sends data to, each naming what it is for."}},"/v1/trust/updates":{"get":{"summary":"Lists your trust-centre updates, newest as you ordered them."}},"/v1/trust/{kind}/{id}":{"delete":{"parameters":[{"description":"Kind is the section — profile, control, document, subprocessor, policy,\nfaq, update or risk. Anything else is not found. The URL is the authority:\na value here is bound from the path, which zip binds last.","example":"faq","in":"path","name":"kind","required":true,"schema":{"type":"string"}},{"description":"ID is the record's id within that section. The single-valued sections\n(profile, risk) hold one record whatever id is named.","example":"where-is-data-held","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Removes one record from a section of your organization's trust centre."},"put":{"parameters":[{"description":"Kind is the section being written. The URL is the authority.","example":"subprocessor","in":"path","name":"kind","required":true,"schema":{"type":"string"}},{"description":"ID is the record's id. Omit it on a create and one is minted; the\nsingle-valued sections (profile, risk) hold one record whatever is named.","example":"acme-cloud","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/trust.sectionWrite"}}}},"summary":"Writes one record into a section of YOUR organization's trust centre — profile, control, document, subprocessor, policy, faq, update or risk."}},"/v1/usage":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/usage.reportReq"}}}},"summary":"Ingests a batch of account-usage samples — what a developer's OWN AI accounts have consumed of their OWN plans, metered from each provider's own login — and appends them to the warehouse series."}},"/v1/usage/analytics":{"get":{"parameters":[{"description":"End is the exclusive window end, RFC3339. Read only when Range is custom.","in":"query","name":"end","required":false,"schema":{"type":"string"}},{"description":"Plan is the plan id whose entitlement decides access and retention. INTERIM:\ncloud has no org-to-plan resolver yet, so the caller names the plan; when\nthat resolver lands this becomes the caller org's own plan.","in":"query","name":"plan","required":false,"schema":{"type":"string"}},{"description":"Range is the window: a count and a unit — 24h, 7d, 90d, any <N>h or <N>d —\nor day, week, month, all, custom. Empty means 24h. The window is then\nclamped forward to the plan's retention entitlement.","in":"query","name":"range","required":false,"schema":{"type":"string"}},{"description":"Start is the inclusive window start, RFC3339. Read only when Range is\ncustom, and clamped forward to the plan's retention floor.","in":"query","name":"start","required":false,"schema":{"type":"string"}}],"summary":"Is the entitlement-GATED per-provider breakdown of the caller org's LLM usage — the paid lens over the same warehouse ledger GET /v1/usage/summary reads its totals from."}},"/v1/usage/analytics/access":{"get":{"parameters":[{"description":"Plan is a plan id from the live @hanzo/plans catalog. Empty resolves the\nfree floor, and so does an id the catalog does not know — this never fails\non an unknown plan.","in":"query","name":"plan","required":false,"schema":{"type":"string"}}],"summary":"Echoes a plan's resolved analytics entitlement so a dashboard can configure itself against the LIVE catalog instead of hardcoding tier numbers."}},"/v1/usage/samples":{"get":{"parameters":[{"description":"Account narrows to ONE linked account of that provider. Empty covers every\naccount the caller has linked there.","in":"query","name":"account","required":false,"schema":{"type":"string"}},{"description":"Provider is the upstream to read, e.g. anthropic. Required.","in":"query","name":"provider","required":false,"schema":{"type":"string"}},{"description":"Range is the window to read: a count and a unit — 1h, 24h, 90d, any <N>h or\n<N>d — or day, week, month, all. Empty means 24h. A label that is not a\ncount, or one reaching past the 730-day horizon, is refused rather than\nsilently replaced.","in":"query","name":"range","required":false,"schema":{"type":"string"}},{"description":"Window narrows to ONE window class: 6h, day, week or month. Empty covers\nevery class.","in":"query","name":"window","required":false,"schema":{"type":"string"}}],"summary":"Is the PER-PROVIDER view: one connected account's own consumption of its own plan — \"my plan is 47% through its 6h window, resets at 14:20\"."}},"/v1/usage/summary":{"get":{"parameters":[{"description":"Range is the window: a count and a unit — 24h, 7d, 90d, any <N>h or <N>d —\nor day, week, month, all, custom. Empty means 24h. A label this surface\ndoes not know, or one reaching past the 730-day horizon, is refused rather\nthan silently replaced.","in":"query","name":"range","required":false,"schema":{"type":"string"}},{"description":"Start is the inclusive window start, RFC3339. Read only when Range is\ncustom.","in":"query","name":"start","required":false,"schema":{"type":"string"}},{"description":"End is the exclusive window end, RFC3339. Read only when Range is custom.","in":"query","name":"end","required":false,"schema":{"type":"string"}}],"summary":"Answers GET /v1/usage/summary: the caller's own usage footprint over one window — the categorized spend roll-up from the commerce ledger, the org's LLM usage totals from the warehouse (with what the prompt cache served and saved), the org's Kai decisions, and the caller's OWN linked provider accounts beside the org's Hanzo-routed usage."}},"/v1/validator":{"get":{"parameters":[{"description":"Limit is how many slots to return, as a decimal string in the `?limit=`\nquery. Absent, unparseable or non-positive means 200; over 1000 is clamped\nto 1000. It is a string rather than a number because the parse that has\nalways served this route trims surrounding whitespace, and one parse rule is\nbetter than two.","in":"query","name":"limit","required":false,"schema":{"type":"string"}}],"summary":"Returns the validator slots the caller's org has claimed."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/validator.validatorClaim"}}}},"summary":"Claims a validator slot and provisions its node, after proving the caller's wallet owns the slot's NFT."}},"/v1/validator/challenge":{"get":{"parameters":[{"description":"TokenID is the Validator-tier GenesisNFT token id, as a decimal string in\nthe `?tokenId=` query. A value that is not a positive integer is 400. It is\na string rather than a number because the parse that has always served this\nroute trims surrounding whitespace, and one parse rule is better than two.","in":"query","name":"tokenId","required":false,"schema":{"type":"string"}}],"summary":"Issues the single-use nonce and the exact message a wallet must sign to claim a validator slot."}},"/v1/validator/{tokenId}":{"get":{"parameters":[{"description":"TokenID is the slot's GenesisNFT token id, from the path, as a decimal\nstring. A value that is not a positive integer is 400. It is a string\nrather than a number because the parse that has always served this route\ntrims surrounding whitespace, and one parse rule is better than two.","in":"path","name":"tokenId","required":true,"schema":{"type":"string"}}],"summary":"Returns one claimed validator slot, scoped to the caller's org."}},"/v1/videos/generations":{"post":{"summary":"Implements POST /v1/videos/generations — the ASYNC create."}},"/v1/videos/{id}":{"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Implements GET /v1/videos/{id} — poll a job's status."}},"/v1/videos/{id}/content":{"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Implements GET /v1/videos/{id}/content — download the finished MP4."}},"/v1/wallet":{"get":{"parameters":[{"description":"Project narrows to wallets scoped to one project. Must be a url-safe segment.","in":"query","name":"project","required":false,"schema":{"type":"string"}},{"description":"Agent narrows to wallets scoped to one agent. Must be a url-safe segment.","in":"query","name":"agent","required":false,"schema":{"type":"string"}},{"description":"Account narrows to wallets under one account id. Must be a url-safe segment.","example":"acct_9f8c1d","in":"query","name":"account","required":false,"schema":{"type":"string"}}],"summary":"Returns the caller org's wallets, newest first, optionally NARROWED within the org by project, agent or account."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/wallet.createWalletIn"}}}},"summary":"Provisions a new signing identity under one of the caller org's accounts and answers the stored wallet including its on-chain address."}},"/v1/wallet/accounts":{"get":{"summary":"Returns the caller org's wallet accounts, newest first."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/wallet.createAccountIn"}}}},"summary":"Opens a named wallet account for the caller's org."}},"/v1/wallet/{id}":{"get":{"parameters":[{"example":"wal_4b1e77","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one of the caller org's wallets: its scope, custody kind, tier, chain and on-chain address."}},"/v1/wallet/{id}/keys":{"post":{"parameters":[{"example":"wal_4b1e77","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Rolls one wallet's signing material through its own custody backend and answers the wallet with whatever address that produced."}},"/v1/wallet/{id}/sign":{"post":{"parameters":[{"example":"wal_4b1e77","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/wallet.signIn"}}}},"summary":"Produces a secp256k1 signature from one of the caller org's wallets over a 32-byte digest, through whichever custody backend that wallet uses."}},"/v1/wallet/{id}/transactions":{"post":{"parameters":[{"example":"wal_4b1e77","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/wallet.safeTxIn"}}}},"summary":"Composes a Safe transaction on the MPC ring and answers its EIP-712 hash together with the owner approval the ring's threshold signature produced."}},"/v1/web3/chains":{"get":{"summary":"Reports the chains this deployment can reach."}},"/v1/web3/chains/{chain}":{"get":{"parameters":[{"description":"Chain is the registry id, as in /v1/web3/chains/lux.","in":"path","name":"chain","required":true,"schema":{"type":"string"}}],"summary":"Reports one chain and whether its upstream is answering."}},"/v1/web3/rpc/{chain}":{"post":{"parameters":[{"description":"Chain is the registry id, from the URL.","in":"path","name":"chain","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/web3.rpcIn"}}}},"summary":"Forwards a JSON-RPC call to the named chain and returns its answer unchanged."}},"/v1/web3/tokens/{chain}/{address}":{"get":{"parameters":[{"description":"Chain is the registry id.","in":"path","name":"chain","required":true,"schema":{"type":"string"}},{"description":"Address is the account, 0x-prefixed.","in":"path","name":"address","required":true,"schema":{"type":"string"}}],"summary":"Reads an address's native balance on a chain."}},"/v1/webhook":{"get":{"summary":"Returns every webhook endpoint the caller's org has registered, newest first, each with its 7-day delivery and failure counts."},"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/webhook.createEndpointIn"}}}},"summary":"Registers a new webhook subscription for the caller's org and answers 201 with the endpoint INCLUDING its freshly minted signing secret."}},"/v1/webhook/{id}":{"delete":{"parameters":[{"example":"wh_9f8c1d2e","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Removes one of the caller org's webhook endpoints and answers 204 with no body."},"get":{"parameters":[{"example":"wh_9f8c1d2e","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Returns one of the caller org's webhook endpoints with its 7-day delivery and failure counts, signing secret redacted."},"put":{"parameters":[{"example":"wh_9f8c1d2e","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/webhook.updateEndpointIn"}}}},"summary":"Replaces the editable fields of one of the caller org's endpoints — url, events, status and description — and answers the stored row with its secret redacted."}},"/v1/webhook/{id}/deliveries":{"get":{"parameters":[{"example":"wh_9f8c1d2e","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Limit caps how many attempts come back: default 50, maximum 200. A value\nthat is not a positive integer reads as the default.","example":100,"in":"query","name":"limit","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"Status narrows the log to one outcome: \"ok\", \"retrying\" or \"failed\".\nEmpty returns every attempt.","example":"failed","in":"query","name":"status","required":false,"schema":{"type":"string"}}],"summary":"Returns one endpoint's per-attempt delivery log, newest first — the record of what was sent, what the subscriber answered, and how long it took."}},"/v1/webhook/{id}/secret":{"post":{"parameters":[{"example":"wh_9f8c1d2e","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Mints a NEW HMAC signing secret for the endpoint and answers the endpoint WITH it — the only other response besides create that ever carries a secret."}},"/v1/webhook/{id}/test":{"post":{"parameters":[{"example":"wh_9f8c1d2e","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Sends ONE signed test event to the endpoint right now and answers the outcome inline, so the console can show whether the subscriber is reachable without waiting for real traffic."}},"/v1/websearch":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/websearch.webSearchQuery"}}}},"summary":"Search the live web"}},"/v1/websearch/engines":{"get":{"summary":"Lists every engine web search can run and how the platform runs it."},"put":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/websearch.searchEnginesSet"}}}},"summary":"Replaces the platform's web search engine setting and answers the result."}},"/v1/websearch/engines/{name}/key":{"delete":{"parameters":[{"description":"Name is the engine, from the path.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"summary":"Removes an engine's API key from KMS."},"put":{"parameters":[{"description":"Name is the engine, from the path.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/websearch.searchEngineKey"}}}},"summary":"Seals an engine's API key in KMS, replacing any key held."}},"/v1/websearch/scrape":{"post":{"summary":"Fetch one page and get its extracted markdown, in the firecrawl envelope."}},"/v1/websearch/search":{"delete":{"summary":"Web meta-search, in the SearXNG JSON envelope."},"get":{"summary":"Web meta-search, in the SearXNG JSON envelope."},"patch":{"summary":"Web meta-search, in the SearXNG JSON envelope."},"post":{"summary":"Web meta-search, in the SearXNG JSON envelope."},"put":{"summary":"Web meta-search, in the SearXNG JSON envelope."}},"/v1/workflow":{"delete":{"summary":"Redirect to the workflow API root"},"get":{"summary":"Redirect to the workflow API root"},"patch":{"summary":"Redirect to the workflow API root"},"post":{"summary":"Redirect to the workflow API root"},"put":{"summary":"Redirect to the workflow API root"}},"/v1/world":{"get":{"summary":"Answers GET /v1/world — the product's public endpoint, naming every wire this surface answers on."}},"/v1/world/limits":{"get":{"parameters":[{"description":"Plan is a World plan id from the live @hanzo/plans catalog, e.g. world-pro.\nEmpty means world-free, and so does an id the catalog does not know — this\nnever fails on an unknown plan.","in":"query","name":"plan","required":false,"schema":{"type":"string"}}],"summary":"Echoes a World plan's rate limits, alert quota and model-API grant, read straight from the live @hanzo/plans catalog, so agents and dashboards configure themselves against the catalog instead of hardcoding tier numbers."}},"/v1/world/news":{"get":{"summary":"Returns the caller's merged world-news feed: every source their project's pipeline names — GDELT once per keyword, plus each allowlisted RSS or Atom feed — fetched concurrently, narrowed by the pipeline's keyword/region/source filters, deduplicated by link and sorted freshest first, capped at 50 items."}},"/v1/world/pipeline":{"get":{"summary":"Returns the caller project's news pipeline: which feeds it reads and how the merged result is filtered."},"put":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/world.pipelineReq"}}}},"summary":"Replaces the caller project's news pipeline and returns what was stored."}},"/v1/world/stream":{"get":{"summary":"Live news refreshes for the caller's org and project, as Server-Sent Events."}},"/v1/x402/settlements":{"get":{"parameters":[{"description":"Role is payer — what the caller's org paid — or payee — what it was paid.\nPayer when empty.","example":"payee","in":"query","name":"role","required":false,"schema":{"type":"string"}},{"description":"Year keeps the calendar year (UTC) the payments settled in. Zero keeps\nevery year.","example":2026,"in":"query","name":"year","required":false,"schema":{"format":"int64","type":"integer"}}],"summary":"Lists the caller's x402 receipts, newest first: as payer, what its wallet paid; as payee, what its org was paid — each settled payment with what it bought, both parties, the exact amount and when."}},"/v1/x402/settlements/{id}":{"get":{"parameters":[{"description":"ID is the settlement id from the URL — the deterministic keccak(from|nonce)\nkey an x402 receipt is issued under (the `id` field of a Receipt, and the\n`transaction` of the SettlementResponse on the PAYMENT-RESPONSE header a paid\nrequest answers with).","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"summary":"Reads one x402 payment receipt by id."}}},"tags":[{"description":"Package account is your own account: API keys you mint and revoke, and org onboarding.","name":"account"},{"description":"Package ads is your paid ad campaigns, launched and paused from one place.","name":"ad"},{"description":"Package affiliates is a partner program that pays commission on what your referrals spend.","name":"affiliate"},{"description":"Package agents is autonomous agents for your org: define them, run them, keep every run.","name":"agent"},{"description":"Package ai is Hanzo AI — the model API on /v1 (/v1/chat/completions, /v1/messages, /v1/models and the rest of hanzoai/ai's surface) — mounted into a cloud binary with the money, ingest and telemetry callbacks cloud BUILDS but cannot INSTALL.","name":"ai"},{"description":"Package allowance is how much a plan lets you do without paying, and how much of it you have left today.","name":"allowance"},{"description":"Package ask is a plain-language question about your business, answered with real numbers.","name":"ask"},{"description":"Package auditlog is your org's tamper-evident audit trail: every security-relevant event, hash-chained and readable.","name":"audit"},{"description":"Package authors is a royalty for open-source work: your repo runs, you get paid.","name":"author"},{"description":"Package serve is the access decision behind an org-scoped call: who may do what, where, answered allow or deny.","name":"authz"},{"description":"Package auto is workflows that run themselves, on a schedule or a webhook.","name":"auto"},{"description":"Package base is managed Hanzo Base: a hosted backend for your app — collections, records, access rules and sign-in.","name":"base"},{"description":"Package benchmark is one honest score for any model, on the tests everyone quotes.","name":"benchmark"},{"description":"Package billing is your org's balance, what it has spent, and the cards it pays with.","name":"billing"},{"description":"Package blueprint is what a template costs to run, worked out before you deploy.","name":"blueprint"},{"description":"Package books is double-entry accounting: chart of accounts, ledger, bank reconciliation, and the reports that prove the books balance.","name":"books"},{"description":"Package bot is a bot doing your work on a real desktop, live, while you watch.","name":"bot"},{"description":"Package campaign is one go-to-market push across paid, organic and email at once.","name":"campaign"},{"description":"Package captable is your cap table: stakeholders, share classes, grants, SAFEs, rounds, and who owns what.","name":"captable"},{"description":"Package catalog is one place to browse every project, app and site built here.","name":"catalog"},{"description":"Package channels is one inbox for the chat apps you connect — Discord, Slack, Teams, Telegram.","name":"channel"},{"description":"Package ci mounts the CI fleet dashboard as a capability of this binary.","name":"ci"},{"description":"Package cloudflare is your Cloudflare account, managed from Hanzo: zones, Pages, Workers, Workers AI, R2, KV and D1.","name":"cloudflare"},{"description":"Package code is search and symbols across your repos, for you and your agents.","name":"code"},{"description":"Package commerce is selling: checkout, subscriptions, invoices, spend alerts, payment webhooks and the storefront catalog.","name":"commerce"},{"description":"Package company is incorporation end to end: pick a structure, add founders, pay, file, and e-sign.","name":"company"},{"description":"Package compliance is your KYC/KYB onboarding, accreditation records, and the evidence trail behind them.","name":"compliance"},{"description":"Package compute is the compute you rent from Hanzo: machines, GPUs and clusters — launch one, resize it, tear it down.","name":"compute"},{"description":"Package content is marketing content from draft to published, on every channel.","name":"content"},{"description":"Package crawl is any web page turned into clean markdown a model can read.","name":"crawl"},{"description":"Package dataroom is a secure document room you share by link and watch page by page.","name":"dataroom"},{"description":"Package dataset is the per-org dataset plane of /v1/risk: a dataset is a VERSIONED, IMMUTABLE snapshot of one tenant's own event surface, and this is where it is declared, materialised, described, exported and disposed of.","name":"dataset"},{"description":"Package deploy is Hanzo CD: see what each app is running, sync it, and roll back a bad release.","name":"deploy"},{"description":"Package destinations is your events forwarded to the ad and analytics tools you use.","name":"destination"},{"description":"Package dns is your DNS records: the zones and records behind every name you point at Hanzo.","name":"dns"},{"description":"Package domain is Hanzo Domains: search a name, see the price, buy it from your prepaid wallet.","name":"domain"},{"description":"Package engine is Hanzo Engine: which models the serving runtime has loaded, and the GPUs under it.","name":"engine"},{"description":"Package entitlements is what your org may run: what the plan grants, and which of those products are switched on.","name":"entitlement"},{"description":"Package environment is what a codebase is before its agent starts: the commands that install it, the command that starts it, and the secrets it reads.","name":"environment"},{"description":"Package esign is a document out for signature, signed and filed with an audit trail.","name":"esign"},{"description":"Package eval is scoring a model on your own data, with a judge you choose.","name":"eval"},{"description":"Package analytics is product analytics: send an event, read back who did what.","name":"event"},{"description":"Package exec is the code interpreter: run a snippet in a sandbox, and move files in and out of the session that sandbox IS.","name":"exec"},{"description":"Package experiments is A/B testing anything: a flag, an ad, a subject line, a model.","name":"experiment"},{"description":"Package explorer is chain data: your block indexers and how far each has caught up, plus the on-chain price feeds.","name":"explorer"},{"description":"Package flags is feature flags: ship it dark, then turn it on for who you pick.","name":"flag"},{"description":"Package flow is Hanzo Flow: build an agent workflow on a visual canvas, run it, and read every run.","name":"flow"},{"description":"Package framework is document types you define: describe a record once, then create, list, submit and cancel documents against it.","name":"framework"},{"description":"Package functions is your serverless code: publish it, call it over HTTP, watch every run and what it cost.","name":"function"},{"description":"Package gateway is live control of the policy your API applies to every incoming request: CORS, rate limits, cache TTL and allowed methods, changed without a redeploy.","name":"gateway"},{"description":"Package git is Git hosting for your org: create repos, clone, push, and see what they cost.","name":"git"},{"description":"Package graph is one organization's entities and the relations between them, held as assertions: somebody, at some moment, from some evidence, asserted that this thing stands in that relation to that other thing.","name":"graph"},{"description":"Package guide is the AI that builds an agentic company with you, one measured step at a time.","name":"guide"},{"description":"Package help is a support desk: customers file tickets, your team answers them.","name":"help"},{"description":"Package iam is Hanzo's identity provider: users, organizations, applications, and the OIDC/OAuth2 endpoints every Hanzo service authenticates against.","name":"iam"},{"description":"Package index is fast full-text search over your own data, typos forgiven.","name":"index"},{"description":"Package ingress is your edge: automatic TLS certificates and hostname routing to any backend, changed live.","name":"ingress"},{"description":"Package kms is secret custody: your org's secrets sealed at rest, plus threshold signing.","name":"kms"},{"description":"Package knowledge is your team's wiki and your agents' memory, searchable by meaning.","name":"knowledge"},{"description":"Package kv is your key-value store: buckets of versioned values your apps read and write by key.","name":"kv"},{"description":"Package label is the ground-truth plane: what actually turned out to be fraud, who said so, and when they could first have said it.","name":"label"},{"description":"Package leaderboard is the ranking of who uses AI most, in your org and globally.","name":"leaderboard"},{"description":"Package legal is the paperwork your company needs, drafted, signed and filed.","name":"legal"},{"description":"Package library is the Library: everything a person made, in one place.","name":"library"},{"description":"Package licensing is what an org has bought and may run: signed licenses to issue, verify and revoke, and the releases they unlock.","name":"licensing"},{"description":"Package link is the unified AI login manager's registry: the org+user-scoped record of WHICH provider accounts (Claude Max, ChatGPT Plus, a Hanzo API key, a raw provider key) a developer has signed into, ON WHICH MACHINES, with each account's latest usage snapshot.","name":"link"},{"description":"Package lsp is live semantic code intelligence — definitions, references, types, hover, outline and diagnostics — over a repository AND its resolved dependencies, with no toolchain on the caller's machine.","name":"lsp"},{"description":"Package market is what trades on each chain, and how far the read of it got.","name":"market"},{"description":"Package marketing is lifecycle email: drip sequences that reach the right people.","name":"marketing"},{"description":"Package marketplace is the one market between orgs: agents and personas to hire, apps, skills, MCP servers and tools to buy, each sold by the org that owns it, and the two-sided work one org buys from another.","name":"marketplace"},{"description":"Package meet is the virtual office: it decides who may join a room and mints the short-lived token that lets them in.","name":"meet"},{"description":"Package ml is model serving: deploy a model behind an endpoint and call it.","name":"ml"},{"description":"Package mq is queue and stream admin for your org: create them, watch them drain, ack what you pulled.","name":"mq"},{"description":"Package network mounts the Hanzo Cloud NETWORKING surface: the tenant's Hanzo Zero Trust footprint — the overlay network, its routers and its services — served as clean, org-scoped REST off the unified cloud binary and fronting the Hanzo Zero Trust controller (hanzoai/zt, an ZT-based fabric).","name":"network"},{"description":"Package nodes is your machines: the ones you own, connected and ready to take a command.","name":"node"},{"description":"Package notify is transactional email and SMS, sent through your org's own provider credential.","name":"notify"},{"description":"Package o11y is your logs, metrics and traces: ship them in, query them, chart them.","name":"o11y"},{"description":"The served contract: the OpenAPI document every client, tool list and command group is generated from, its command projection, the agent endpoint that offers the same operations over MCP, and the index a client follows from the API root to reach any of it.","name":"openapi"},{"description":"Package patent is the record of who thought of what, and when the machine was asked to write it.","name":"patent"},{"description":"Package patrol stands watch over an estate: sites, units, tours, keys, cameras, and the incidents that interrupt them.","name":"patrol"},{"description":"Package plan is the plan catalog: every tier you can buy, what it costs, and what it grants.","name":"plan"},{"description":"Package platform is Hanzo PaaS: deploy containers to your own tenant namespace — builds, releases, environments, logs, custom domains.","name":"platform"},{"description":"Package prefs is your own settings — theme, density, pinned nav — following you across every Hanzo app.","name":"pref"},{"description":"Package pricing is the price list: what every model, provider, GPU tier, tool and hosting plan costs.","name":"pricing"},{"description":"Package principals serves an org as an economic principal: who it is, what it may pay, and which agents answer to it.","name":"principal"},{"description":"Package projects is where your sites live: create one, deploy a build, roll back to any release.","name":"project"},{"description":"Package prompts is your prompt library, versioned, so nothing changes silently.","name":"prompt"},{"description":"Package integrations is how your org connects third-party accounts like Slack, and revokes them.","name":"provider"},{"description":"Package provisioning is one-click data add-ons: a SQL, key-value, document, vector, search or object store, wired straight into your app.","name":"provisioning"},{"description":"Package pubsub is your message bus: publish, subscribe, and durable streams your apps read at their own pace.","name":"pubsub"},{"description":"Package reference is the lookup data a risk decision needs but cannot derive: which email domains hand out throwaway inboxes, which addresses belong to a datacentre or a Tor exit, which card scheme an issuer prefix belongs to, which browsers the fleet sees everywhere, and how current the designation lists the screening engine holds actually are.","name":"reference"},{"description":"Package referrals is referral ATTRIBUTION: who referred whom, and whether that referee ever became a real customer.","name":"referral"},{"description":"Package registry is your container and package registry: push images, pull them back, see what you store.","name":"registry"},{"description":"Package risk is HANZO RISK's model plane: the per-organisation feature surface and the per-organisation models trained on it.","name":"risk"},{"description":"Package s3 is object storage: your buckets and the files in them, with signed URLs for upload and download.","name":"s3"},{"description":"Package sandbox is the ONE compute primitive: a sandbox is a gVisor pod that runs somebody else's code, and every lifetime is the same object.","name":"sandbox"},{"description":"Package sbom is what is inside a container image: every component, resolvable by digest or image ref.","name":"sbom"},{"description":"Package search is one ranked result set over everything your org has stored.","name":"search"},{"description":"Package security is secret scanning for your code: submit sources, get findings, masked never raw.","name":"security"},{"description":"Package seo is search visibility as data: what a phrase is worth, what a site already places for, who places beside it, who links to it, and what one page gets wrong.","name":"seo"},{"description":"Package settings is how an org configures each product it uses, secret fields included.","name":"settings"},{"description":"Package share is a public URL for a service on your own machine, and a list of what you have open.","name":"share"},{"description":"Package social is posting to every social account you own, now or on a schedule.","name":"social"},{"description":"Package space is where work lives: drives, folders and the files in them.","name":"space"},{"description":"Package standing prices and tracks what it costs to KEEP a company, as distinct from what it cost to form one.","name":"standing"},{"description":"Package studio is Hanzo Studio's workflow backend: every creation — an image, a poster, a document, a deck, a type system, a 3D model, an ad, a film, a voice, a song — is a run of a graph of steps that the person who started it owns.","name":"studio"},{"description":"Package sync is data sync: link two endpoints and keep them in step, on a webhook, on a schedule, or on demand.","name":"sync"},{"description":"Package task is Hanzo Task: boards, the work items on them, and the filters that make a board.","name":"task"},{"description":"Package tax is how companies formed on Hanzo exchange W-9s, W-8s and 1099s with each other, from the payments that moved between them on Hanzo's rails.","name":"tax"},{"description":"Package taxonomy is the product catalogue's shape: which categories exist, what each product is called, which category it sits in, what it is tagged with, and the order the two are shown in.","name":"taxonomy"},{"description":"Package team is your org's shared space: documents edited together, files, seats, and agents as teammates.","name":"team"},{"description":"Package tel is the telecommunications surface: phone numbers, calls and messages, on whatever carrier the deployment is configured for.","name":"tel"},{"description":"Package templates is a gallery of starter kits you can deploy as they come.","name":"template"},{"description":"Package tools is everything your org can call, in one list: connector actions, functions, agents, skills and your own MCP servers.","name":"tool"},{"description":"Package train is the cloud's one training endpoint, /v1/train (HIP-1333): clients the caller drives on the engine, and jobs the org's linked machines or Hanzo's executor run, whose adaptation, protection, objective and output are fields and whose artifacts, bases and evaluations are what they produce.","name":"train"},{"description":"Package translate is text in, the same text out in the language you asked for.","name":"translate"},{"description":"Package treasury is the reserve fund behind every payout: real capital, held and accounted for.","name":"treasury"},{"description":"Package trust is your trust centre: the controls you publish, the coverage they compute to, the documents a reviewer asks for, and who you send data to.","name":"trust"},{"description":"Package usage is what your org ran and what it cost, broken down per account.","name":"usage"},{"description":"Package validators is one-click validator onboarding: prove your Genesis NFT, get a node provisioned, queue its registration.","name":"validator"},{"description":"Package wallets is blockchain key custody: create wallets, rotate their keys, and sign with them.","name":"wallet"},{"description":"Package web3 is the chain-access surface: which chains this deployment can reach, a JSON-RPC endpoint onto each, and the two token reads every wallet UI needs.","name":"web3"},{"description":"Package webhooks is how your app hears about events: register an endpoint, pick the events, get each one delivered and signed.","name":"webhook"},{"description":"Package websearch is a web search and a page fetch your agents can call.","name":"websearch"},{"description":"Package workflow is Hanzo Workflow: durable workflows that survive a crash, with every run visible and replayable.","name":"workflow"},{"description":"Package world is a live news feed filtered to what your project cares about.","name":"world"},{"description":"Package x402 is pay-per-request over HTTP 402: quote a price, take the payment, serve the resource.","name":"x402"}]} |