Historis API API

Historis keeps a shared, event-based timeline of what happened, linked to the right people. This document describes the public REST API and the MCP transport. Most REST endpoints require a Supabase session JWT (a signed-in person) and are rate-limited per identity; a Supabase OAuth 2.1 access token

GitHub OpenAPI

Operations 107

GET /api/health Liveness + schema health
POST /api/auth/signup Create an account
POST /api/auth/login Log in, returns a session (JWT)
POST /api/auth/logout Log out the current session
GET /api/auth/session Current session + user role
POST /api/auth/reset-password Send a password-reset email
POST /api/auth/change-password Change the current password
PATCH /api/auth/profile Update the user profile (name)
GET /api/auth/preferences Read user preferences (locale, timezone, density, theme)
PATCH /api/auth/preferences Update user preferences
DELETE /api/auth/account Delete the current account
POST /api/auth/refresh Rotate the refresh token
POST /api/bootstrap Create the default organization on first login
GET /api/persons List persons (paginated, filterable by tags/search)
POST /api/persons Create a person
GET /api/persons/{personId} Get a person and their events
PATCH /api/persons/{personId} Update a person
DELETE /api/persons/{personId} Delete a person
POST /api/persons/{personId}/relations Create a contact-to-contact relation from this person
DELETE /api/persons/{personId}/relations/{relatedPersonId} Delete a contact-to-contact relation
GET /api/events List events (paginated, filterable)
POST /api/events Create an event
GET /api/events/{eventId} Get an event
PATCH /api/events/{eventId} Update an event
DELETE /api/events/{eventId} Delete an event
POST /api/events/{eventId}/persons Link a person to an event
DELETE /api/events/{eventId}/persons/{personId} Unlink a person from an event
POST /api/events/{eventId}/related Link an event to another event
DELETE /api/events/{eventId}/related/{relatedEventId} Unlink a related event
GET /api/events/{parentId}/children List an event's child events (thread)
GET /api/search Full-text search across events and persons
GET /api/tags List tags with counters
POST /api/tags Create a tag
GET /api/tags/events Tags used on events
GET /api/tags/persons Tags used on persons
GET /api/tags/manage Management list (all org tags incl. unused, with counts)
GET /api/tags/duplicates Likely-duplicate tag pairs
GET /api/tags/followed Tags the current user follows
PUT /api/tags/followed/{tagId} Follow a tag
DELETE /api/tags/followed/{tagId} Unfollow a tag
GET /api/tags/{id}/impact Org-wide impact preview for delete/merge dialogs
PATCH /api/tags/{id} Update a tag description and/or name (owner-only rename)
DELETE /api/tags/{id} Delete a tag
POST /api/tags/merge Merge one tag into another
GET /api/tags/keep-separate List pairs marked "keep separate"
POST /api/tags/keep-separate Mark a pair as not duplicates
DELETE /api/tags/keep-separate Restore a dismissed pair
GET /api/organization/members List members
PATCH /api/organization/members/{userId} Change a member's role (owner only)
DELETE /api/organization/members/{userId} Remove a member (owner only)
GET /api/organization/invitations List invitations (owner only)
POST /api/organization/invitations Create an invitation (owner only)
DELETE /api/organization/invitations/{invitationId} Cancel an invitation (owner only)
GET /api/organization/invitations/token/{token} Public invitation details by token
POST /api/organization/invitations/token/{token}/accept Accept an invitation
POST /api/organization/leave Leave the organization
DELETE /api/organization Delete the organization (owner only)
GET /api/organization/export Export all organization data
GET /api/organization/info Read organization info
PATCH /api/organization/info Update organization info
GET /api/organization/security Read organization security settings (MFA, min visibility)
PATCH /api/organization/security Update organization security settings (owner only)
GET /api/teams List teams
POST /api/teams Create a team
PATCH /api/teams/{id} Update a team
DELETE /api/teams/{id} Delete a team
GET /api/teams/{id}/members List team members
POST /api/teams/{id}/members Add a member to a team
PUT /api/teams/{id}/members/{userId} Set a team member's role
DELETE /api/teams/{id}/members/{userId} Remove a member from a team
GET /api/rules List rules
POST /api/rules Create a rule
GET /api/rules/{ruleId} Get a rule
PATCH /api/rules/{ruleId} Update a rule
DELETE /api/rules/{ruleId} Delete a rule
GET /api/knowledge List knowledge notes
GET /api/knowledge/facets Facet counts for the current selection
GET /api/knowledge/views List the caller's saved views
POST /api/knowledge/views Save a filter combination under a name
PATCH /api/knowledge/views/{viewId} Rename a saved view or replace its filters
DELETE /api/knowledge/views/{viewId} Delete a saved view
GET /api/dashboard Dashboard overview (counters + event columns)
GET /api/insights Usage insights metrics
GET /api/integrations List connected AI clients and their per-client permissions
PATCH /api/integrations/permissions Update org-wide MCP integration permissions (owner only)
PATCH /api/integrations/clients/{clientId}/permissions Update a single AI client's permissions (owner only)
GET /api/onboarding/checklist Onboarding checklist state
GET /api/billing/status Subscription status
POST /api/billing/checkout Create a Stripe Checkout session (Pro)
POST /api/billing/checkout-business Create a Stripe Checkout session (Business)
POST /api/billing/portal Create a Stripe Customer Portal session
GET /api/billing/invoices List invoices
POST /api/billing/webhook Stripe webhook (signature-verified, no session)
GET /api/webhooks List the org's inbound webhook endpoints
POST /api/webhooks Create an inbound endpoint (returns the token once)
PATCH /api/webhooks/{id} Update an inbound endpoint
DELETE /api/webhooks/{id} Soft-revoke an inbound endpoint
GET /api/webhooks/{id}/deliveries The endpoint's last 50 deliveries
POST /api/webhooks/ingest/{endpointId} Public ingestion endpoint (whk_ bearer token)
POST /mcp MCP transport (Streamable HTTP): JSON-RPC requests
GET /api/oauth/authorizations/{id} Consent details (client name, scopes) for a pending grant
POST /api/oauth/authorizations/{id}/consent Approve or deny a pending OAuth authorization
GET /.well-known/mcp MCP Server Card
GET /.well-known/api-catalog API catalog linkset (RFC 9727)
GET /.well-known/oauth-authorization-server OAuth authorization server metadata (RFC 8414)
GET /.well-known/oauth-protected-resource OAuth protected resource metadata (RFC 9728)
GET /openapi.json This OpenAPI document

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/historis-app:historis-api-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

historis-app-api-openapi.json Raw ↑
{"openapi":"3.1.0","info":{"title":"Historis API","version":"0.1.0","summary":"Public REST + MCP surface for the Historis operational memory.","description":"Historis keeps a shared, event-based timeline of what happened, linked to the right people. This document describes the public REST API and the MCP transport. Most REST endpoints require a Supabase session JWT (a signed-in person) and are rate-limited per identity; a Supabase OAuth 2.1 access token carries a client_id claim, belongs on the MCP transport, and is refused on the REST gates with 403 assistant_token_rejected (HIS-926). Discover the MCP server at /.well-known/mcp and the OAuth authorization server at /.well-known/oauth-authorization-server.","contact":{"name":"Historis","url":"https://historis.app"},"license":{"name":"Proprietary"}},"servers":[{"url":"https://api.historis.app","description":"Historis REST API"},{"url":"https://historis.app","description":"Marketing host (proxies /api/* to the REST API)"}],"tags":[{"name":"Auth","description":"Authentication and session management"},{"name":"Persons","description":"Contacts (clients, suppliers, partners)"},{"name":"Events","description":"Timeline events and their links"},{"name":"Search","description":"Full-text search"},{"name":"Tags","description":"Tag-based organization"},{"name":"Organization","description":"Organization, members, invitations"},{"name":"Teams","description":"Teams and team membership"},{"name":"Rules","description":"Markdown automation rules for agents"},{"name":"Knowledge","description":"Knowledge notes: faceted exploration and saved views"},{"name":"Dashboard","description":"Dashboard and usage insights"},{"name":"Billing","description":"Stripe subscriptions and billing"},{"name":"Webhooks","description":"Inbound webhook endpoints"},{"name":"Integrations","description":"Connected AI clients and permissions"},{"name":"Onboarding","description":"Onboarding checklist"},{"name":"MCP","description":"Model Context Protocol transport"},{"name":"OAuth","description":"OAuth consent proxy"},{"name":"Health","description":"Health checks"},{"name":"Discovery","description":"Self-describing discovery documents"}],"security":[{"bearerAuth":[]}],"paths":{"/api/health":{"get":{"tags":["Health"],"summary":"Liveness + schema health","responses":{"200":{"description":"Service status","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["ok","degraded"]},"timestamp":{"type":"string","format":"date-time"}},"required":["status"]}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"security":[]}},"/api/auth/signup":{"post":{"tags":["Auth"],"summary":"Create an account","responses":{"200":{"description":"Session created","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Credentials"}}}}}},"/api/auth/login":{"post":{"tags":["Auth"],"summary":"Log in, returns a session (JWT)","responses":{"200":{"description":"Session","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Credentials"}}}}}},"/api/auth/logout":{"post":{"tags":["Auth"],"summary":"Log out the current session","responses":{"200":{"description":"Logged out","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/auth/session":{"get":{"tags":["Auth"],"summary":"Current session + user role","responses":{"200":{"description":"Session details","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/auth/reset-password":{"post":{"tags":["Auth"],"summary":"Send a password-reset email","responses":{"200":{"description":"Email queued","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"}},"required":["email"]}}}}}},"/api/auth/change-password":{"post":{"tags":["Auth"],"summary":"Change the current password","responses":{"200":{"description":"Password changed","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/auth/profile":{"patch":{"tags":["Auth"],"summary":"Update the user profile (name)","responses":{"200":{"description":"Updated profile","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"}}}}}}}},"/api/auth/preferences":{"get":{"tags":["Auth"],"summary":"Read user preferences (locale, timezone, density, theme)","responses":{"200":{"description":"Preferences","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}},"patch":{"tags":["Auth"],"summary":"Update user preferences","responses":{"200":{"description":"Updated preferences","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/api/auth/account":{"delete":{"tags":["Auth"],"summary":"Delete the current account","responses":{"200":{"description":"Account deleted","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/auth/refresh":{"post":{"tags":["Auth"],"summary":"Rotate the refresh token","responses":{"200":{"description":"New session","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"security":[]}},"/api/bootstrap":{"post":{"tags":["Organization"],"summary":"Create the default organization on first login","responses":{"200":{"description":"Existing organization","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Organization created","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/persons":{"get":{"tags":["Persons"],"summary":"List persons (paginated, filterable by tags/search)","responses":{"200":{"description":"Page of persons","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"parameters":[{"$ref":"#/components/parameters/SearchQuery"},{"$ref":"#/components/parameters/TagsQuery"},{"$ref":"#/components/parameters/LimitQuery"},{"$ref":"#/components/parameters/OffsetQuery"}]},"post":{"tags":["Persons"],"summary":"Create a person","responses":{"201":{"description":"Created person","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"409":{"$ref":"#/components/responses/DuplicateEmail"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonInput"}}}}}},"/api/persons/{personId}":{"parameters":[{"name":"personId","in":"path","required":true,"schema":{"type":"string"}}],"get":{"tags":["Persons"],"summary":"Get a person and their events","responses":{"200":{"description":"Person","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}},"patch":{"tags":["Persons"],"summary":"Update a person","responses":{"200":{"description":"Updated person","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/DuplicateEmail"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonInput"}}}}},"delete":{"tags":["Persons"],"summary":"Delete a person","responses":{"204":{"description":"Deleted"},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/persons/{personId}/relations":{"parameters":[{"name":"personId","in":"path","required":true,"schema":{"type":"string"}}],"post":{"tags":["Persons"],"summary":"Create a contact-to-contact relation from this person","responses":{"201":{"description":"Relation created","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"relatedPersonId":{"type":"string","format":"uuid"},"type":{"type":"string"}},"required":["relatedPersonId"]}}}}}},"/api/persons/{personId}/relations/{relatedPersonId}":{"parameters":[{"name":"personId","in":"path","required":true,"schema":{"type":"string"}},{"name":"relatedPersonId","in":"path","required":true,"schema":{"type":"string"}}],"delete":{"tags":["Persons"],"summary":"Delete a contact-to-contact relation","responses":{"204":{"description":"Deleted"},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/events":{"get":{"tags":["Events"],"summary":"List events (paginated, filterable)","responses":{"200":{"description":"Page of events","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"parameters":[{"$ref":"#/components/parameters/SearchQuery"},{"$ref":"#/components/parameters/TagsQuery"},{"$ref":"#/components/parameters/LimitQuery"},{"$ref":"#/components/parameters/OffsetQuery"}]},"post":{"tags":["Events"],"summary":"Create an event","responses":{"201":{"description":"Created event","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventInput"}}}}}},"/api/events/{eventId}":{"parameters":[{"name":"eventId","in":"path","required":true,"schema":{"type":"string"}}],"get":{"tags":["Events"],"summary":"Get an event","responses":{"200":{"description":"Event","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}},"patch":{"tags":["Events"],"summary":"Update an event","responses":{"200":{"description":"Updated event","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventInput"}}}}},"delete":{"tags":["Events"],"summary":"Delete an event","responses":{"204":{"description":"Deleted"},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/events/{eventId}/persons":{"parameters":[{"name":"eventId","in":"path","required":true,"schema":{"type":"string"}}],"post":{"tags":["Events"],"summary":"Link a person to an event","responses":{"200":{"description":"Linked","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"personId":{"type":"string","format":"uuid"}},"required":["personId"]}}}}}},"/api/events/{eventId}/persons/{personId}":{"parameters":[{"name":"eventId","in":"path","required":true,"schema":{"type":"string"}},{"name":"personId","in":"path","required":true,"schema":{"type":"string"}}],"delete":{"tags":["Events"],"summary":"Unlink a person from an event","responses":{"204":{"description":"Unlinked"},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/events/{eventId}/related":{"parameters":[{"name":"eventId","in":"path","required":true,"schema":{"type":"string"}}],"post":{"tags":["Events"],"summary":"Link an event to another event","responses":{"200":{"description":"Linked","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"relatedEventId":{"type":"string","format":"uuid"}},"required":["relatedEventId"]}}}}}},"/api/events/{eventId}/related/{relatedEventId}":{"parameters":[{"name":"eventId","in":"path","required":true,"schema":{"type":"string"}},{"name":"relatedEventId","in":"path","required":true,"schema":{"type":"string"}}],"delete":{"tags":["Events"],"summary":"Unlink a related event","responses":{"204":{"description":"Unlinked"},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/events/{parentId}/children":{"parameters":[{"name":"parentId","in":"path","required":true,"schema":{"type":"string"}}],"get":{"tags":["Events"],"summary":"List an event's child events (thread)","responses":{"200":{"description":"Child events","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/search":{"get":{"tags":["Search"],"summary":"Full-text search across events and persons","responses":{"200":{"description":"Search results","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"parameters":[{"$ref":"#/components/parameters/SearchQuery"}]}},"/api/tags":{"get":{"tags":["Tags"],"summary":"List tags with counters","responses":{"200":{"description":"Tags","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}},"post":{"tags":["Tags"],"summary":"Create a tag","responses":{"201":{"description":"Created tag","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagInput"}}}}}},"/api/tags/events":{"get":{"tags":["Tags"],"summary":"Tags used on events","responses":{"200":{"description":"Tags","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/tags/persons":{"get":{"tags":["Tags"],"summary":"Tags used on persons","responses":{"200":{"description":"Tags","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/tags/manage":{"get":{"tags":["Tags"],"summary":"Management list (all org tags incl. unused, with counts)","responses":{"200":{"description":"Tag management list","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"parameters":[{"$ref":"#/components/parameters/SearchQuery"},{"$ref":"#/components/parameters/LimitQuery"},{"$ref":"#/components/parameters/OffsetQuery"}]}},"/api/tags/duplicates":{"get":{"tags":["Tags"],"summary":"Likely-duplicate tag pairs","responses":{"200":{"description":"Duplicate pairs","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/tags/followed":{"get":{"tags":["Tags"],"summary":"Tags the current user follows","responses":{"200":{"description":"Followed tags","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/tags/followed/{tagId}":{"parameters":[{"name":"tagId","in":"path","required":true,"schema":{"type":"string"}}],"put":{"tags":["Tags"],"summary":"Follow a tag","responses":{"200":{"description":"Followed","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}},"delete":{"tags":["Tags"],"summary":"Unfollow a tag","responses":{"204":{"description":"Unfollowed"},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/tags/{id}/impact":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"tags":["Tags"],"summary":"Org-wide impact preview for delete/merge dialogs","responses":{"200":{"description":"Impact","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/tags/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"patch":{"tags":["Tags"],"summary":"Update a tag description and/or name (owner-only rename)","responses":{"200":{"description":"Updated tag","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagInput"}}}}},"delete":{"tags":["Tags"],"summary":"Delete a tag","responses":{"204":{"description":"Deleted"},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/tags/merge":{"post":{"tags":["Tags"],"summary":"Merge one tag into another","responses":{"200":{"description":"Merged","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"fromSlug":{"type":"string"},"toSlug":{"type":"string"}},"required":["fromSlug","toSlug"]}}}}}},"/api/tags/keep-separate":{"get":{"tags":["Tags"],"summary":"List pairs marked \"keep separate\"","responses":{"200":{"description":"Pairs","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}},"post":{"tags":["Tags"],"summary":"Mark a pair as not duplicates","responses":{"200":{"description":"Marked","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagPair"}}}}},"delete":{"tags":["Tags"],"summary":"Restore a dismissed pair","responses":{"200":{"description":"Restored","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagPair"}}}}}},"/api/organization/members":{"get":{"tags":["Organization"],"summary":"List members","responses":{"200":{"description":"Members","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/organization/members/{userId}":{"parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string"}}],"patch":{"tags":["Organization"],"summary":"Change a member's role (owner only)","responses":{"200":{"description":"Updated","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"role":{"type":"string","enum":["owner","member"]}},"required":["role"]}}}}},"delete":{"tags":["Organization"],"summary":"Remove a member (owner only)","responses":{"204":{"description":"Removed"},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/organization/invitations":{"get":{"tags":["Organization"],"summary":"List invitations (owner only)","responses":{"200":{"description":"Invitations","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}},"post":{"tags":["Organization"],"summary":"Create an invitation (owner only)","responses":{"201":{"description":"Invitation created","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"},"role":{"type":"string","enum":["owner","member"]}},"required":["email"]}}}}}},"/api/organization/invitations/{invitationId}":{"parameters":[{"name":"invitationId","in":"path","required":true,"schema":{"type":"string"}}],"delete":{"tags":["Organization"],"summary":"Cancel an invitation (owner only)","responses":{"204":{"description":"Cancelled"},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/organization/invitations/token/{token}":{"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string"}}],"get":{"tags":["Organization"],"summary":"Public invitation details by token","responses":{"200":{"description":"Invitation","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"security":[]}},"/api/organization/invitations/token/{token}/accept":{"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string"}}],"post":{"tags":["Organization"],"summary":"Accept an invitation","responses":{"200":{"description":"Accepted","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/organization/leave":{"post":{"tags":["Organization"],"summary":"Leave the organization","responses":{"200":{"description":"Left","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/organization":{"delete":{"tags":["Organization"],"summary":"Delete the organization (owner only)","responses":{"200":{"description":"Deleted","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/organization/export":{"get":{"tags":["Organization"],"summary":"Export all organization data","responses":{"200":{"description":"Export","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/api/organization/info":{"get":{"tags":["Organization"],"summary":"Read organization info","responses":{"200":{"description":"Org info","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}},"patch":{"tags":["Organization"],"summary":"Update organization info","responses":{"200":{"description":"Updated","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/api/organization/security":{"get":{"tags":["Organization"],"summary":"Read organization security settings (MFA, min visibility)","responses":{"200":{"description":"Security settings","content":{"application/json":{"schema":{"type":"obj

# --- truncated at 32 KB (65 KB total) ---
# Full source: https://artifacts.apis.io/historis-app/openapi/_original/historis-app-api-openapi.json