{"openapi":"3.1.0","info":{"title":"תכל'ס — meeting notes","version":"1.0.0","description":"Upload a recording of a meeting and get back the part of it that survives the meeting:\nwhat was decided, who took what on and by when, and what is still open.\n\nEvery response is { ok: true, ... } or { ok: false, error }, where `error` is written in Hebrew\nfor a person to read. The machine-readable part is the status code.\n\nA resource owned by another account answers 404 rather than 403, everywhere, on purpose:\n403 would confirm that a document exists to somebody who only guessed its identifier."},"servers":[{"url":"https://meetings.eladjak.com"}],"components":{"securitySchemes":{"session":{"type":"apiKey","in":"cookie","name":"sid"},"personalApiToken":{"type":"http","scheme":"bearer","bearerFormat":"tch_pat","description":"Revocable Personal API Token. The full secret is shown once and every bearer route requires an explicit scope."}}},"security":[{"session":[]}],"paths":{"/api":{"get":{"summary":"This index: every endpoint, what it is for, and which need a session.","description":"Described here as well as served from here, because the drift test compares this list against the routing table in both directions and an index that omitted itself would be the first thing it caught.","security":[],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/":{"get":{"summary":"The same index, for callers that add a trailing slash.","security":[],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/auth/config":{"get":{"summary":"Which sign-in methods this deployment offers.","description":"The only endpoint that READS without a credential, because the sign-in screen has to render before anybody has one. The other public entries are the three ways in and out, which cannot require what they exist to hand out.","security":[],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/auth/signup":{"post":{"summary":"Create an account with an email and a password.","security":[],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/auth/login":{"post":{"summary":"Exchange an email and password for a session cookie.","security":[],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/auth/logout":{"post":{"summary":"Discard the session cookie.","description":"Public because it answers 200 without one -- MEASURED, not assumed; the first draft of this file said \"session\" and was wrong. Signing out is idempotent, and demanding a valid session in order to end one strands anybody whose session has already expired.","security":[],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/me":{"get":{"summary":"The signed-in account: address, limits, and what it has already been shown.","security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/account/seen":{"post":{"summary":"Record that this account has been shown the introduction or the tour.","description":"Kept on the account rather than in the browser, so a dismissal on a laptop is still dismissed on a phone.","security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/account/engine-key":{"post":{"summary":"Store a transcription key belonging to this account.","security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/account/runpod":{"post":{"summary":"Store RunPod credentials for the Hebrew engine.","security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/account/runpod/auto":{"post":{"summary":"Provision a RunPod endpoint automatically from a stored key.","security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/account/recordings":{"post":{"summary":"Choose whether this account keeps its recordings after transcription, and for how long (7 / 30 days / until deleted).","description":"Default is OFF: the recording is deleted the moment the transcript exists. Turning it OFF again deletes every recording kept for this account immediately and returns the count.","security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/account/notifications":{"post":{"summary":"Choose whether terminal job results stay in the in-app library, escalate failures by email, or email every result.","description":"Default is in_app for new and legacy accounts. The files library remains the durable notification centre in every mode.","security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/notifications":{"get":{"summary":"List this account's durable in-app notifications without marking them read.","security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/notifications/read":{"post":{"summary":"Explicitly mark selected owned notifications as read.","security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/notifications/digest-preview":{"get":{"summary":"Group unread notifications into a quiet urgency-ordered preview.","security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/account/webhook":{"get":{"summary":"Safe metadata for this account's single outbound webhook; never returns the secret or protected value.","security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/account/webhook/prepare":{"post":{"summary":"Validate and prepare one public HTTPS destination. It remains disabled until a second session confirmation.","security":[{"session":[]}],"responses":{"201":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/account/webhook/{id}/confirm":{"post":{"summary":"Confirm the exact prepared endpoint and disclose its signing secret while delivery remains disabled. An uncertain reply can be retried with the same confirmation handle.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/account/webhook/{id}/activate":{"post":{"summary":"Acknowledge that the signing secret was saved. Delivery activates only if both the account choice and the server runtime are available.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/account/webhook/{id}/pause":{"post":{"summary":"Pause the exact configured endpoint.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/account/webhook/{id}/resume":{"post":{"summary":"Resume or activate an already confirmed endpoint; refused while the server-wide outbound gate is off.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/account/webhook/{id}":{"delete":{"summary":"Revoke the exact owned webhook immediately.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/account/webhook/deliveries":{"get":{"summary":"Bounded redacted delivery history. No payload, response body, secret, address or query string is returned.","security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/account/api-tokens":{"get":{"summary":"List Personal API Tokens as safe metadata; full secrets and hashes are never returned.","security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}},"post":{"summary":"Issue an inactive scoped Personal API Token whose full secret and activation handle are returned once.","security":[{"session":[]}],"responses":{"201":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/account/api-tokens/{tokenId}/activate":{"post":{"summary":"Acknowledge that the one-time secret was rendered and activate that exact pending token.","parameters":[{"name":"tokenId","in":"path","required":true,"schema":{"type":"string"}}],"security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/account/api-tokens/{tokenId}":{"delete":{"summary":"Revoke one Personal API Token immediately.","parameters":[{"name":"tokenId","in":"path","required":true,"schema":{"type":"string"}}],"security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/catalogue":{"get":{"summary":"Every transcription engine known to this build, and what each needs before it can run.","security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/engines":{"get":{"summary":"The engines this account can actually use right now.","description":"A subset of /api/catalogue: an engine that needs a key this account has not supplied is listed there and absent here.","security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/test-engine":{"post":{"summary":"Check a set of engine credentials without starting a job.","security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/upload":{"post":{"summary":"Send a recording and start transcribing it.","description":"Returns a job id immediately; the work runs afterwards and is followed with GET /api/job/{id}.","security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/upload/part":{"post":{"summary":"Send one piece of a recording too large for a single request.","security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/upload/link":{"post":{"summary":"Fetch a recording from an address and transcribe it.","description":"Heavily restricted on purpose: the address is chosen by the caller and would otherwise point this server at anything it can reach, including the inside of the network.","security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/upload/link/{ticket}":{"get":{"summary":"How a link fetch is progressing.","parameters":[{"name":"ticket","in":"path","required":true,"schema":{"type":"string"}}],"security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/youtube/probe":{"post":{"summary":"Ask what a video is before committing to transcribing it.","security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/youtube/start":{"post":{"summary":"Transcribe a video.","security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/job/{id}":{"get":{"summary":"One meeting: its progress while it runs, its document once it is done.","description":"A job belonging to another account answers 404 rather than 403, because 403 would confirm to somebody who guessed an id that a document exists.","x-tachles-required-scopes":["jobs:read"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"security":[{"session":[]},{"personalApiToken":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"403":{"description":"The bearer is valid but this route or required scope is forbidden."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."},"429":{"description":"Personal token rate limit exceeded. Retry-After is returned."}}},"delete":{"summary":"Delete a meeting and everything derived from it.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/job/{id}/formats":{"get":{"summary":"Which document formats this meeting can be rendered as.","x-tachles-required-scopes":["jobs:read"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"security":[{"session":[]},{"personalApiToken":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"403":{"description":"The bearer is valid but this route or required scope is forbidden."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."},"429":{"description":"Personal token rate limit exceeded. Retry-After is returned."}}}},"/api/job/{id}/diagnostics":{"get":{"summary":"Privacy-safe diagnostic timeline for one meeting owned by this account.","description":"Metadata only: stage, outcome, stable code, timing and diagnostic reference. Never transcript, filename, context, identity or provider response.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."},"503":{"description":"Telemetry unavailable or corrupt. Counts and events are null; this must not be interpreted as zero.","content":{"application/json":{"schema":{"type":"object","required":["ok","state"],"properties":{"ok":{"const":false},"state":{"const":"unavailable"},"failures":{"type":["integer","null"]},"events":{"type":["array","null"]},"error":{"type":"string"}}}}}}}}},"/api/job/{id}/download":{"get":{"summary":"Download the document in one of those formats.","x-tachles-required-scopes":["jobs:read"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"security":[{"session":[]},{"personalApiToken":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"403":{"description":"The bearer is valid but this route or required scope is forbidden."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."},"429":{"description":"Personal token rate limit exceeded. Retry-After is returned."}}}},"/api/job/{id}/recording":{"get":{"summary":"Download this meeting's recording, if the account chose to keep it and it has not expired or been deleted.","description":"Session only, owner only; anything else answers 404. Never reachable with a bearer token.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}},"delete":{"summary":"Delete the kept recording now. The transcript and the document stay.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/job/{id}/recording-link":{"post":{"summary":"A signed download link for the kept recording, valid for ten minutes, bound to this job and this account.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/job/{id}/retry-from-recording":{"post":{"summary":"Run a failed job again from its kept recording, without uploading it again.","description":"409 RECORDING_NOT_KEPT when there is no kept recording to run from.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/recording/{token}":{"get":{"summary":"The file behind a signed link from POST /api/job/{id}/recording-link. The signature is the credential; a bad, expired or reused-after-deletion link answers 404.","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/job/{id}/reanalyse":{"post":{"summary":"Build the document again from the transcript already on file.","description":"For a meeting whose transcription succeeded and whose document step failed. It reads the stored transcript and nothing else -- the recording is deleted when a run ends and is never needed here, which is why this route exists instead of a retention window.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/jobs":{"get":{"summary":"Every meeting this account owns, newest first.","x-tachles-required-scopes":["jobs:read"],"security":[{"session":[]},{"personalApiToken":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"403":{"description":"The bearer is valid but this route or required scope is forbidden."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."},"429":{"description":"Personal token rate limit exceeded. Retry-After is returned."}}}},"/api/diagnostics/recent":{"get":{"summary":"Recent privacy-safe diagnostics for the signed-in account.","security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."},"503":{"description":"Telemetry unavailable or corrupt. Counts and events are null; this must not be interpreted as zero.","content":{"application/json":{"schema":{"type":"object","required":["ok","state"],"properties":{"ok":{"const":false},"state":{"const":"unavailable"},"failures":{"type":["integer","null"]},"events":{"type":["array","null"]},"error":{"type":"string"}}}}}}}}},"/api/ops/health":{"get":{"summary":"Operator-only aggregate telemetry freshness and outcome counts.","description":"Returns 404 to a non-operator. Unreadable telemetry is unavailable, never a fabricated healthy zero.","security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."},"503":{"description":"Telemetry unavailable or corrupt. Counts and events are null; this must not be interpreted as zero.","content":{"application/json":{"schema":{"type":"object","required":["ok","telemetry"],"properties":{"ok":{"const":false},"error":{"type":"string"},"telemetry":{"type":"object","required":["state","failures","events"],"properties":{"state":{"const":"unavailable"},"failures":{"type":["integer","null"]},"events":{"type":["integer","null"]}}}}}}}}}}},"/api/ops/youtube-recovery/start-one":{"post":{"summary":"Start one identity-bound recovered YouTube job while global recovery remains paused.","description":"Operator-only and fail-closed. The request must bind the exact oldest waiting job to its reviewed creation time and cost; per-job mail must already be suppressed. Returns 404 to a non-operator and never enables the rest of the recovered queue.","security":[{"session":[]}],"responses":{"202":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/ops/diagnostics/{diagnosticRef}":{"get":{"summary":"Operator-only redacted timeline for an exact diagnostic reference.","parameters":[{"name":"diagnosticRef","in":"path","required":true,"schema":{"type":"string"}}],"security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."},"503":{"description":"Telemetry unavailable or corrupt. Counts and events are null; this must not be interpreted as zero.","content":{"application/json":{"schema":{"type":"object","required":["ok","state"],"properties":{"ok":{"const":false},"state":{"const":"unavailable"},"failures":{"type":["integer","null"]},"events":{"type":["array","null"]},"error":{"type":"string"}}}}}}}}},"/api/account/integration-health":{"get":{"summary":"Show whether this account's integration centre is enabled and when an active connection last used it.","description":"Safe metadata only. It never returns a token, secret, draft body or another account's activity.","security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/action-proposals":{"post":{"summary":"Submit a grounded ledger-close proposal for human review; creation never executes it.","x-tachles-required-scopes":["actions:propose"],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Bound to account, token, route and exact canonical proposal.","schema":{"type":"string"}}],"security":[{"personalApiToken":[]}],"responses":{"202":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"403":{"description":"The bearer is valid but this route or required scope is forbidden."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."},"429":{"description":"Personal token rate limit exceeded. Retry-After is returned."}}},"get":{"summary":"List only proposals created by this exact token; reading changes no state.","x-tachles-required-scopes":["actions:read"],"security":[{"personalApiToken":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"403":{"description":"The bearer is valid but this route or required scope is forbidden."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."},"429":{"description":"Personal token rate limit exceeded. Retry-After is returned."}}}},"/api/action-proposals/{proposalId}":{"delete":{"summary":"Cancel this token's pending proposal; committing and terminal proposals cannot be cancelled.","x-tachles-required-scopes":["actions:propose"],"parameters":[{"name":"proposalId","in":"path","required":true,"schema":{"type":"string"}}],"security":[{"personalApiToken":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"403":{"description":"The bearer is valid but this route or required scope is forbidden."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."},"429":{"description":"Personal token rate limit exceeded. Retry-After is returned."}}}},"/api/account/action-proposals":{"get":{"summary":"List this account's pending approval queue or terminal history without acknowledging or executing anything.","security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/account/action-proposals/{proposalId}":{"get":{"summary":"Read the exact source, effect and current relevance of one owned proposal.","parameters":[{"name":"proposalId","in":"path","required":true,"schema":{"type":"string"}}],"security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}},"delete":{"summary":"Emergency-cancel one owned proposal while it is still pending.","parameters":[{"name":"proposalId","in":"path","required":true,"schema":{"type":"string"}}],"security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/account/action-proposals/{proposalId}/approve":{"post":{"summary":"Human approval revalidates and executes the exact internal ledger close once.","parameters":[{"name":"proposalId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Exact approval retry key.","schema":{"type":"string"}}],"security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/account/action-proposals/{proposalId}/reject":{"post":{"summary":"Reject one pending owned proposal without a ledger mutation.","parameters":[{"name":"proposalId","in":"path","required":true,"schema":{"type":"string"}}],"security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/account/ledger-close-grants":{"post":{"summary":"Prepare a pending, exact-item permission for one active token with ledger:close scope.","description":"Step one of two. It binds the account, token, item key, close=true payload and optional note, but grants no mutation yet. The browser receives the exact source and effect it must show before confirmation.","security":[{"session":[]}],"responses":{"201":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/account/ledger-close-grants/{grantId}/confirm":{"post":{"summary":"Explicitly confirm the pending permission and receive its one-time action secret.","description":"Step two of two. The item and token are revalidated. The returned secret is shown once, expires after ten minutes and cannot authorize another payload.","parameters":[{"name":"grantId","in":"path","required":true,"schema":{"type":"string"}}],"security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/account/ledger-close-grants/{grantId}":{"delete":{"summary":"Revoke a pending or active one-time ledger-close permission immediately.","description":"Used when the confirmation window is closed after a secret was issued. A consumed grant remains an immutable replay record and cannot be revoked retroactively.","parameters":[{"name":"grantId","in":"path","required":true,"schema":{"type":"string"}}],"security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/integration/health":{"get":{"summary":"Verify that one Personal API Token is active and see its exact scopes without reading meeting content.","description":"A read-only handshake for setup screens and health monitors. It performs no paid or outbound action and returns allowedMutations as an empty array.","x-tachles-required-scopes":["agent:read"],"security":[{"personalApiToken":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"403":{"description":"The bearer is valid but this route or required scope is forbidden."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."},"429":{"description":"Personal token rate limit exceeded. Retry-After is returned."}}}},"/api/agent/context":{"get":{"summary":"A grounded, machine-readable context for an assistive agent.","description":"Read-only by contract: it may inspect grounded context but cannot send, publish, acknowledge, or close anything. The payload is filtered to the signed-in account before it is built.","x-tachles-required-scopes":["agent:read"],"parameters":[{"name":"with","in":"query","required":false,"description":"Comma-separated people to include.","schema":{"type":"string"}}],"security":[{"session":[]},{"personalApiToken":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"403":{"description":"The bearer is valid but this route or required scope is forbidden."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."},"429":{"description":"Personal token rate limit exceeded. Retry-After is returned."}}}},"/api/drafts":{"get":{"summary":"List this account's latest internal drafts, newest first.","description":"The response contains drafts only: no destination, delivery state or send action. Browser sessions can use it for the draft workspace; integrations need the separate drafts:read scope.","x-tachles-required-scopes":["drafts:read"],"security":[{"session":[]},{"personalApiToken":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"403":{"description":"The bearer is valid but this route or required scope is forbidden."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."},"429":{"description":"Personal token rate limit exceeded. Retry-After is returned."}}},"post":{"summary":"Save and return an internal draft without any destination or delivery action.","x-tachles-required-scopes":["drafts:create"],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"An 8-128 character retry key. It is bound to the account, token and canonical request body.","schema":{"type":"string"}}],"security":[{"personalApiToken":[]}],"responses":{"201":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"403":{"description":"The bearer is valid but this route or required scope is forbidden."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."},"409":{"description":"The idempotency key was already used with a different canonical request body."},"429":{"description":"Personal token rate limit exceeded. Retry-After is returned."}}}},"/api/ledger":{"get":{"summary":"What was promised and not done, read across every meeting rather than one.","description":"The one endpoint a single document cannot answer. Every item carries the sentence it came from; an item whose quote could not be verified says so rather than sounding quoted. Nothing closes itself -- silence is not closure.","security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/ledger/seen":{"post":{"summary":"Record that this device has seen the current state of the ledger.","description":"The only thing that moves the mark. Loading the page deliberately does not, so a background tab or a glance on a phone cannot consume the unread difference.","security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/ledger/close":{"post":{"summary":"Mark one exact open item as done, directly by a person or through a separately confirmed one-time API grant.","description":"A bearer token and scope are deliberately insufficient. API use also requires X-Tachles-Action-Grant from the two-step browser confirmation and an Idempotency-Key. The grant is account/token/action/payload-bound, expires after ten minutes and replays only the identical request. It cannot send, publish, delete or close another item.","x-tachles-required-scopes":["ledger:close"],"parameters":[{"name":"X-Tachles-Action-Grant","in":"header","required":true,"description":"One-time action secret returned by the confirmed grant.","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"description":"An 8-128 character retry key bound to the exact payload.","schema":{"type":"string"}}],"security":[{"session":[]},{"personalApiToken":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"403":{"description":"The bearer is valid but this route or required scope is forbidden."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."},"429":{"description":"Personal token rate limit exceeded. Retry-After is returned."}}}},"/api/people":{"get":{"summary":"Who this account has been in a room with, and which spellings it has said are one person.","security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/people/merge":{"post":{"summary":"Declare that two spellings are the same person.","security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}},"/api/people/reject":{"post":{"summary":"Declare that two similar spellings are NOT the same person.","description":"Kept as an explicit refusal so the suggestion does not come back every time the ledger is rebuilt.","security":[{"session":[]}],"responses":{"200":{"description":"ok:true and the payload for this endpoint."},"401":{"description":"Authentication is absent, invalid, expired or revoked."},"404":{"description":"Absent, or owned by another account. The two are deliberately indistinguishable."}}}}}}