{"openapi":"3.1.0","info":{"title":"SENTRY-API","description":"SENTRY-API public data API for the SENTRY Star Citizen data system. Query citizen and organization profiles, search the database, and retrieve scrape statistics.\n\nOpenAPI JSON: `/api/v1/openapi.json` · Swagger UI: `/api/v1/docs`","contact":{"name":"SENTRY / Wild Knight Squadron"},"license":{"name":"MIT"},"version":"1.0.0"},"paths":{"/api/v1/stats":{"get":{"tags":["Stats"],"summary":"Get scrape and database statistics","description":"Return aggregate statistics: total citizens/orgs/memberships, queue depth, completed/failed/pending fetch counts, a 24-hour hourly timechart of completed, failed, and scheduled (created) scrape tasks, 30-day new/updated citizen and organization series, plus 30-day org joins, leaves, and profile changes. Served from a precomputed Redis cache refreshed every 15 minutes.","operationId":"get_stats","parameters":[{"name":"timestamp","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional ISO timestamp filter (reserved; currently unused)","title":"Timestamp"},"description":"Optional ISO timestamp filter (reserved; currently unused)"},{"name":"max_age","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Optional max age in seconds; must not be negative if provided","title":"Max Age"},"description":"Optional max age in seconds; must not be negative if provided"}],"responses":{"200":{"description":"Statistics payload","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatsResponse"}}}},"400":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Stats cache not ready","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/citizens/":{"get":{"tags":["citizens"],"summary":"List recently scraped citizens","description":"Return the most recently scraped citizens (typically the last 10). Useful for dashboards and activity feeds.","operationId":"list_citizens","parameters":[{"name":"timestamp","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional ISO timestamp filter (reserved; currently unused by this list endpoint)","title":"Timestamp"},"description":"Optional ISO timestamp filter (reserved; currently unused by this list endpoint)"},{"name":"max_age","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Optional max age in seconds (reserved; currently unused by this list endpoint)","title":"Max Age"},"description":"Optional max age in seconds (reserved; currently unused by this list endpoint)"}],"responses":{"200":{"description":"Recent citizens","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CitizenSummary"},"title":"Response List Citizens"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/citizens/{handle}":{"get":{"tags":["citizens"],"summary":"Get citizen profile","description":"Retrieve a citizen's full profile by RSI handle, including memberships, membership history, field changes, and scrape metadata. If the citizen is missing or a stub, the API may trigger a synchronous scrape and/or queue background refresh work. Results are cached in Redis.","operationId":"get_citizen","parameters":[{"name":"handle","in":"path","required":true,"schema":{"type":"string","description":"RSI citizen handle (case-insensitive)","title":"Handle"},"description":"RSI citizen handle (case-insensitive)"},{"name":"timestamp","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional ISO timestamp for historical point-in-time profile/membership data","title":"Timestamp"},"description":"Optional ISO timestamp for historical point-in-time profile/membership data"},{"name":"max_age","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Maximum acceptable data age in seconds before a background refresh is queued","title":"Max Age"},"description":"Maximum acceptable data age in seconds before a background refresh is queued"}],"responses":{"200":{"description":"Citizen data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CitizenResponse"}}}},"400":{"description":"Invalid handle","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Citizen not found on RSI","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/citizens/{handle}/{sub_resource}":{"get":{"tags":["citizens"],"summary":"Get citizen sub-resource","description":"Return one top-level section of a citizen payload. Valid sub_resource values: `profile`, `memberships`, `membership_history`, `changes`, `metadata`.","operationId":"get_citizen_subresource","parameters":[{"name":"handle","in":"path","required":true,"schema":{"type":"string","description":"RSI citizen handle","title":"Handle"},"description":"RSI citizen handle"},{"name":"sub_resource","in":"path","required":true,"schema":{"type":"string","description":"One of: profile, memberships, membership_history, changes, metadata","title":"Sub Resource"},"description":"One of: profile, memberships, membership_history, changes, metadata"},{"name":"timestamp","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional ISO timestamp for historical data","title":"Timestamp"},"description":"Optional ISO timestamp for historical data"},{"name":"max_age","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Max acceptable data age in seconds","title":"Max Age"},"description":"Max acceptable data age in seconds"}],"responses":{"200":{"description":"Sub-resource payload (object or array depending on section)","content":{"application/json":{"schema":{"title":"Response Get Citizen Subresource"}}}},"404":{"description":"Citizen or sub-resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/citizens/{handle}/{sub_resource}/{field}":{"get":{"tags":["citizens"],"summary":"Get a field from a citizen sub-resource","description":"Return a single field from a citizen sub-resource object (e.g. `/citizens/{handle}/profile/display_name`).","operationId":"get_citizen_field","parameters":[{"name":"handle","in":"path","required":true,"schema":{"type":"string","description":"RSI citizen handle","title":"Handle"},"description":"RSI citizen handle"},{"name":"sub_resource","in":"path","required":true,"schema":{"type":"string","description":"Sub-resource name, e.g. profile or metadata","title":"Sub Resource"},"description":"Sub-resource name, e.g. profile or metadata"},{"name":"field","in":"path","required":true,"schema":{"type":"string","description":"Field name within the sub-resource","title":"Field"},"description":"Field name within the sub-resource"},{"name":"timestamp","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional ISO timestamp for historical data","title":"Timestamp"},"description":"Optional ISO timestamp for historical data"},{"name":"max_age","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Max acceptable data age in seconds","title":"Max Age"},"description":"Max acceptable data age in seconds"}],"responses":{"200":{"description":"Field value (type depends on the field)","content":{"application/json":{"schema":{"title":"Response Get Citizen Field"}}}},"404":{"description":"Citizen, sub-resource, or field not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/orgs/":{"get":{"tags":["orgs"],"summary":"List recently scraped organizations","description":"Return the most recently scraped organizations (typically the last 10). Useful for dashboards and activity feeds.","operationId":"list_organizations","parameters":[{"name":"timestamp","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional ISO timestamp filter (reserved; currently unused by this list endpoint)","title":"Timestamp"},"description":"Optional ISO timestamp filter (reserved; currently unused by this list endpoint)"},{"name":"max_age","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Optional max age in seconds (reserved; currently unused by this list endpoint)","title":"Max Age"},"description":"Optional max age in seconds (reserved; currently unused by this list endpoint)"}],"responses":{"200":{"description":"Recent organizations","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OrganizationSummary"},"title":"Response List Organizations"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/orgs/{sid}":{"get":{"tags":["orgs"],"summary":"Get organization profile","description":"Retrieve an organization's full profile by Spectrum ID (SID), including paginated memberships, field changes, and scrape metadata. Missing/stub orgs may trigger a synchronous profile scrape; member pages are typically queued for workers. Results are cached in Redis.","operationId":"get_organization","parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"string","description":"Organization Spectrum ID / SID (case-insensitive)","title":"Sid"},"description":"Organization Spectrum ID / SID (case-insensitive)"},{"name":"timestamp","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional ISO timestamp for historical point-in-time profile/membership data","title":"Timestamp"},"description":"Optional ISO timestamp for historical point-in-time profile/membership data"},{"name":"max_age","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Maximum acceptable data age in seconds before a background refresh is queued","title":"Max Age"},"description":"Maximum acceptable data age in seconds before a background refresh is queued"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Memberships page number (1-based)","default":1,"title":"Page"},"description":"Memberships page number (1-based)"},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Memberships per page","default":50,"title":"Per Page"},"description":"Memberships per page"}],"responses":{"200":{"description":"Organization data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationResponse"}}}},"400":{"description":"Invalid SID","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Organization not found on RSI","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/orgs/{sid}/membership_history":{"get":{"tags":["orgs"],"summary":"Get organization join/leave history","description":"Computed join/leave history for an organization SID. Join is the first time SENTRY observed the citizen in this org; leave is the last observation after a citizen scrape no longer lists the org. Org roster pages are paged and do not record leaves by themselves.","operationId":"get_organization_membership_history","parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"string","description":"Organization Spectrum ID / SID (case-insensitive)","title":"Sid"},"description":"Organization Spectrum ID / SID (case-insensitive)"},{"name":"timestamp","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional ISO timestamp; only observations at or before this time are used","title":"Timestamp"},"description":"Optional ISO timestamp; only observations at or before this time are used"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"History page number (1-based)","default":1,"title":"Page"},"description":"History page number (1-based)"},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Events per page","default":50,"title":"Per Page"},"description":"Events per page"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: all, active (still members), or left","default":"all","title":"Status"},"description":"Filter: all, active (still members), or left"}],"responses":{"200":{"description":"Paginated join/leave history","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgMembershipHistoryPage"}}}},"400":{"description":"Invalid SID","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Organization not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/orgs/{sid}/{sub_resource}":{"get":{"tags":["orgs"],"summary":"Get organization sub-resource","description":"Return one top-level section of an organization payload. Valid sub_resource values: `profile`, `memberships`, `changes`, `metadata`, `membership_history`.","operationId":"get_organization_subresource","parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"string","description":"Organization SID","title":"Sid"},"description":"Organization SID"},{"name":"sub_resource","in":"path","required":true,"schema":{"type":"string","description":"One of: profile, memberships, changes, metadata","title":"Sub Resource"},"description":"One of: profile, memberships, changes, metadata"},{"name":"timestamp","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional ISO timestamp for historical data","title":"Timestamp"},"description":"Optional ISO timestamp for historical data"},{"name":"max_age","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Max acceptable data age in seconds","title":"Max Age"},"description":"Max acceptable data age in seconds"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Memberships page number","default":1,"title":"Page"},"description":"Memberships page number"},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Memberships per page","default":50,"title":"Per Page"},"description":"Memberships per page"}],"responses":{"200":{"description":"Sub-resource payload (object or array depending on section)","content":{"application/json":{"schema":{"title":"Response Get Organization Subresource"}}}},"404":{"description":"Organization or sub-resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/orgs/{sid}/{sub_resource}/{field}":{"get":{"tags":["orgs"],"summary":"Get a field from an organization sub-resource","description":"Return a single field from an organization sub-resource object (e.g. `/orgs/{sid}/profile/member_count`).","operationId":"get_organization_field","parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"string","description":"Organization SID","title":"Sid"},"description":"Organization SID"},{"name":"sub_resource","in":"path","required":true,"schema":{"type":"string","description":"Sub-resource name, e.g. profile or metadata","title":"Sub Resource"},"description":"Sub-resource name, e.g. profile or metadata"},{"name":"field","in":"path","required":true,"schema":{"type":"string","description":"Field name within the sub-resource","title":"Field"},"description":"Field name within the sub-resource"},{"name":"timestamp","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional ISO timestamp for historical data","title":"Timestamp"},"description":"Optional ISO timestamp for historical data"},{"name":"max_age","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Max acceptable data age in seconds","title":"Max Age"},"description":"Max acceptable data age in seconds"}],"responses":{"200":{"description":"Field value (type depends on the field)","content":{"application/json":{"schema":{"title":"Response Get Organization Field"}}}},"404":{"description":"Organization, sub-resource, or field not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/search":{"get":{"tags":["search"],"summary":"Search citizens and organizations","description":"Fuzzy-search citizens (handle/display name) and organizations (SID/name) using Postgres trigram similarity. Exact matches may trigger a live scrape if missing. When a scrape is still running, results may include pending placeholders and `finalized` will be false. Optional `type` limits the search to citizens or organizations; omit it to keep the original combined search (legacy clients). Optional `org=<SID>` restricts citizen hits to that org's memberships (substring match on handle, display name, rank, visibility). `org_status=active|left|all` selects current roster vs membership history. Optional `page`/`per_page` paginate org-scoped hits. Org-scoped search does not queue scrapes.","operationId":"search_citizens_and_organizations","parameters":[{"name":"query","in":"query","required":true,"schema":{"type":"string","minLength":1,"description":"Search query. Global search requires 2+ characters. Org-scoped search (`org=`) allows 1+.","title":"Query"},"description":"Search query. Global search requires 2+ characters. Org-scoped search (`org=`) allows 1+."},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"enum":["citizen","organization"],"type":"string"},{"type":"null"}],"description":"Optional. Limit results to citizens or organizations. Omit to search both (legacy default). Does not change response shape. Ignored as organization when `org=` is set (roster search is citizens).","title":"Type"},"description":"Optional. Limit results to citizens or organizations. Omit to search both (legacy default). Does not change response shape. Ignored as organization when `org=` is set (roster search is citizens)."},{"name":"org","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"description":"Optional organization SID. Restrict citizen results to members of this org.","title":"Org"},"description":"Optional organization SID. Restrict citizen results to members of this org."},{"name":"org_status","in":"query","required":false,"schema":{"anyOf":[{"enum":["active","left","all"],"type":"string"},{"type":"null"}],"description":"With `org=`: `active` (default) current members, `left` detected leavers, `all` both. Ignored without `org=`.","title":"Org Status"},"description":"With `org=`: `active` (default) current members, `left` detected leavers, `all` both. Ignored without `org=`."},{"name":"page","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Optional page (org-scoped search).","title":"Page"},"description":"Optional page (org-scoped search)."},{"name":"per_page","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":200,"minimum":1},{"type":"null"}],"description":"Optional page size (org-scoped search, max 200).","title":"Per Page"},"description":"Optional page size (org-scoped search, max 200)."}],"responses":{"200":{"description":"Search results","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Database unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/me":{"get":{"tags":["auth"],"summary":"Auth Me","operationId":"auth_me_api_v1_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/auth/logout":{"post":{"tags":["auth"],"summary":"Auth Logout","operationId":"auth_logout_api_v1_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/auth/pickup":{"post":{"tags":["auth"],"summary":"Auth Pickup","operationId":"auth_pickup_api_v1_auth_pickup_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/auth/refresh-orgs":{"post":{"tags":["auth"],"summary":"Auth Refresh Orgs","operationId":"auth_refresh_orgs_api_v1_auth_refresh_orgs_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/intel/target/{target_type}/{target_id}":{"get":{"tags":["intel"],"summary":"Get Target Intel","operationId":"get_target_intel_api_v1_intel_target__target_type___target_id__get","parameters":[{"name":"target_type","in":"path","required":true,"schema":{"type":"string","title":"Target Type"}},{"name":"target_id","in":"path","required":true,"schema":{"type":"string","title":"Target Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intel/target/{target_type}/{target_id}/feed":{"get":{"tags":["intel"],"summary":"Get Target Feed","operationId":"get_target_feed_api_v1_intel_target__target_type___target_id__feed_get","parameters":[{"name":"target_type","in":"path","required":true,"schema":{"type":"string","title":"Target Type"}},{"name":"target_id","in":"path","required":true,"schema":{"type":"string","title":"Target Id"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intel/target/{target_type}/{target_id}/compose":{"post":{"tags":["intel"],"summary":"Compose Target Intel","operationId":"compose_target_intel_api_v1_intel_target__target_type___target_id__compose_post","parameters":[{"name":"target_type","in":"path","required":true,"schema":{"type":"string","title":"Target Type"}},{"name":"target_id","in":"path","required":true,"schema":{"type":"string","title":"Target Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intel/feed":{"get":{"tags":["intel"],"summary":"Get Global Feed","operationId":"get_global_feed_api_v1_intel_feed_get","parameters":[{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intel/identities":{"get":{"tags":["intel"],"summary":"Get Identities","operationId":"get_identities_api_v1_intel_identities_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/intel/suggest":{"get":{"tags":["intel"],"summary":"Suggest Targets","operationId":"suggest_targets_api_v1_intel_suggest_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional citizen|organization|group filter","title":"Type"},"description":"Optional citizen|organization|group filter"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intel/contact-reports/catalog":{"get":{"tags":["intel"],"summary":"Contact Catalog","operationId":"contact_catalog_api_v1_intel_contact_reports_catalog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/intel/contact-reports":{"get":{"tags":["intel"],"summary":"List Contact Reports","operationId":"list_contact_reports_api_v1_intel_contact_reports_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["intel"],"summary":"Create Contact Report","operationId":"create_contact_report_api_v1_intel_contact_reports_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/intel/contact-reports/{public_id}":{"get":{"tags":["intel"],"summary":"Get Contact Report","operationId":"get_contact_report_api_v1_intel_contact_reports__public_id__get","parameters":[{"name":"public_id","in":"path","required":true,"schema":{"type":"string","title":"Public Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["intel"],"summary":"Patch Contact Report","operationId":"patch_contact_report_api_v1_intel_contact_reports__public_id__patch","parameters":[{"name":"public_id","in":"path","required":true,"schema":{"type":"string","title":"Public Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["intel"],"summary":"Delete Contact Report","operationId":"delete_contact_report_api_v1_intel_contact_reports__public_id__delete","parameters":[{"name":"public_id","in":"path","required":true,"schema":{"type":"string","title":"Public Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intel/contact-reports/{public_id}/audit":{"get":{"tags":["intel"],"summary":"Get Contact Report Audit","operationId":"get_contact_report_audit_api_v1_intel_contact_reports__public_id__audit_get","parameters":[{"name":"public_id","in":"path","required":true,"schema":{"type":"string","title":"Public Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intel/target/{target_type}/{target_id}/contact-reports":{"get":{"tags":["intel"],"summary":"Target Contact Reports","operationId":"target_contact_reports_api_v1_intel_target__target_type___target_id__contact_reports_get","parameters":[{"name":"target_type","in":"path","required":true,"schema":{"type":"string","title":"Target Type"}},{"name":"target_id","in":"path","required":true,"schema":{"type":"string","title":"Target Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intel/compose":{"post":{"tags":["intel"],"summary":"Compose Intel Global","operationId":"compose_intel_global_api_v1_intel_compose_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/intel/target/{target_type}/{target_id}/notes":{"post":{"tags":["intel"],"summary":"Create Note","operationId":"create_note_api_v1_intel_target__target_type___target_id__notes_post","parameters":[{"name":"target_type","in":"path","required":true,"schema":{"type":"string","title":"Target Type"}},{"name":"target_id","in":"path","required":true,"schema":{"type":"string","title":"Target Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intel/notes/{note_id}":{"patch":{"tags":["intel"],"summary":"Edit Note","operationId":"edit_note_api_v1_intel_notes__note_id__patch","parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","title":"Note Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["intel"],"summary":"Remove Note","operationId":"remove_note_api_v1_intel_notes__note_id__delete","parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","title":"Note Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intel/notes/{note_id}/shares":{"post":{"tags":["intel"],"summary":"Create Note Share","operationId":"create_note_share_api_v1_intel_notes__note_id__shares_post","parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","title":"Note Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intel/notes/{note_id}/shares/{share_id}":{"delete":{"tags":["intel"],"summary":"Remove Note Share","operationId":"remove_note_share_api_v1_intel_notes__note_id__shares__share_id__delete","parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","title":"Note Id"}},{"name":"share_id","in":"path","required":true,"schema":{"type":"integer","title":"Share Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intel/target/{target_type}/{target_id}/tags":{"put":{"tags":["intel"],"summary":"Put Tags","operationId":"put_tags_api_v1_intel_target__target_type___target_id__tags_put","parameters":[{"name":"target_type","in":"path","required":true,"schema":{"type":"string","title":"Target Type"}},{"name":"target_id","in":"path","required":true,"schema":{"type":"string","title":"Target Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intel/target/{target_type}/{target_id}/reputation":{"put":{"tags":["intel"],"summary":"Put Reputation","operationId":"put_reputation_api_v1_intel_target__target_type___target_id__reputation_put","parameters":[{"name":"target_type","in":"path","required":true,"schema":{"type":"string","title":"Target Type"}},{"name":"target_id","in":"path","required":true,"schema":{"type":"string","title":"Target Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intel/target/{target_type}/{target_id}/shares":{"post":{"tags":["intel"],"summary":"Create Share","description":"Deprecated target-level share. Requires note_id; creates a note-level share.","operationId":"create_share_api_v1_intel_target__target_type___target_id__shares_post","parameters":[{"name":"target_type","in":"path","required":true,"schema":{"type":"string","title":"Target Type"}},{"name":"target_id","in":"path","required":true,"schema":{"type":"string","title":"Target Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intel/shares/{share_id}":{"delete":{"tags":["intel"],"summary":"Remove Share","operationId":"remove_share_api_v1_intel_shares__share_id__delete","parameters":[{"name":"share_id","in":"path","required":true,"schema":{"type":"integer","title":"Share Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intel/groups":{"get":{"tags":["intel"],"summary":"Groups","operationId":"groups_api_v1_intel_groups_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["intel"],"summary":"Add Group","operationId":"add_group_api_v1_intel_groups_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/intel/groups/memberships":{"get":{"tags":["intel"],"summary":"Group Memberships","operationId":"group_memberships_api_v1_intel_groups_memberships_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/intel/groups/{group_id}/publish":{"post":{"tags":["intel"],"summary":"Publish Group","operationId":"publish_group_api_v1_intel_groups__group_id__publish_post","parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"integer","title":"Group Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intel/groups/{group_id}/acl":{"put":{"tags":["intel"],"summary":"Put Group Acl","operationId":"put_group_acl_api_v1_intel_groups__group_id__acl_put","parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"integer","title":"Group Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intel/groups/{group_id}/members":{"put":{"tags":["intel"],"summary":"Put Group Members","operationId":"put_group_members_api_v1_intel_groups__group_id__members_put","parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"integer","title":"Group Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intel/groups/{group_id}":{"delete":{"tags":["intel"],"summary":"Remove Group","operationId":"remove_group_api_v1_intel_groups__group_id__delete","parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"integer","title":"Group Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intel/defaults":{"get":{"tags":["intel"],"summary":"Defaults","operationId":"defaults_api_v1_intel_defaults_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["intel"],"summary":"Put Defaults","operationId":"put_defaults_api_v1_intel_defaults_put","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/intel/incoming":{"get":{"tags":["intel"],"summary":"Incoming","operationId":"incoming_api_v1_intel_incoming_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/intel/incoming/prefs":{"get":{"tags":["intel"],"summary":"Incoming Prefs","operationId":"incoming_prefs_api_v1_intel_incoming_prefs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["intel"],"summary":"Put Incoming Prefs","operationId":"put_incoming_prefs_api_v1_intel_incoming_prefs_put","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/intel/sources":{"get":{"tags":["intel"],"summary":"List Sources","operationId":"list_sources_api_v1_intel_sources_get","parameters":[{"name":"scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope"}},{"name":"as_org","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"As Org"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intel/sources/detail":{"get":{"tags":["intel"],"summary":"Source Detail","operationId":"source_detail_api_v1_intel_sources_detail_get","parameters":[{"name":"key","in":"query","required":true,"schema":{"type":"string","title":"Key"}},{"name":"as_org","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"As Org"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intel/sources/block":{"put":{"tags":["intel"],"summary":"Block Source","operationId":"block_source_api_v1_intel_sources_block_put","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/intel/sources/block-event":{"put":{"tags":["intel"],"summary":"Block Event","operationId":"block_event_api_v1_intel_sources_block_event_put","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/intel/orgs/{sid}/manage":{"get":{"tags":["intel"],"summary":"Get Org Manage","operationId":"get_org_manage_api_v1_intel_orgs__sid__manage_get","parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"string","title":"Sid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["intel"],"summary":"Put Org Manage","operationId":"put_org_manage_api_v1_intel_orgs__sid__manage_put","parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"string","title":"Sid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intel/orgs/{sid}/retract":{"post":{"tags":["intel"],"summary":"Retract Intel","operationId":"retract_intel_api_v1_intel_orgs__sid__retract_post","parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"string","title":"Sid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intel/orgs/{sid}/promote":{"post":{"tags":["intel"],"summary":"Promote Intel","operationId":"promote_intel_api_v1_intel_orgs__sid__promote_post","parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"string","title":"Sid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/intel/summaries":{"post":{"tags":["intel"],"summary":"Summaries","operationId":"summaries_api_v1_intel_summaries_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/overlay/logs":{"post":{"tags":["overlay"],"summary":"Post Overlay Logs","operationId":"post_overlay_logs_api_v1_overlay_logs_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"get":{"tags":["overlay"],"summary":"List Overlay Logs","operationId":"list_overlay_logs_api_v1_overlay_logs_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/overlay/logs/{report_id}":{"get":{"tags":["overlay"],"summary":"Get Overlay Log","operationId":"get_overlay_log_api_v1_overlay_logs__report_id__get","parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"integer","title":"Report Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/overlay/reader-debug/access":{"get":{"tags":["overlay"],"summary":"Reader Debug Access","operationId":"reader_debug_access_api_v1_overlay_reader_debug_access_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/overlay/reader-debug/stats":{"get":{"tags":["overlay"],"summary":"Reader Debug Stats","operationId":"reader_debug_stats_api_v1_overlay_reader_debug_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/overlay/reader-debug/next":{"get":{"tags":["overlay"],"summary":"Reader Debug Next","operationId":"reader_debug_next_api_v1_overlay_reader_debug_next_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/overlay/reader-debug/shots/{image_hash}":{"get":{"tags":["overlay"],"summary":"Reader Debug Public Shot","operationId":"reader_debug_public_shot_api_v1_overlay_reader_debug_shots__image_hash__get","parameters":[{"name":"image_hash","in":"path","required":true,"schema":{"type":"string","title":"Image Hash"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/overlay/reader-debug/shots/{shot_id}/vote":{"post":{"tags":["overlay"],"summary":"Reader Debug Vote","operationId":"reader_debug_vote_api_v1_overlay_reader_debug_shots__shot_id__vote_post","parameters":[{"name":"shot_id","in":"path","required":true,"schema":{"type":"integer","title":"Shot Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/overlay/reader-debug/acl":{"get":{"tags":["overlay"],"summary":"Reader Debug Acl","operationId":"reader_debug_acl_api_v1_overlay_reader_debug_acl_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["overlay"],"summary":"Reader Debug Acl Add","operationId":"reader_debug_acl_add_api_v1_overlay_reader_debug_acl_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/overlay/ocr-tuning/samples":{"get":{"tags":["overlay"],"summary":"Ocr Tuning List","operationId":"ocr_tuning_list_api_v1_overlay_ocr_tuning_samples_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["overlay"],"summary":"Ocr Tuning Save","operationId":"ocr_tuning_save_api_v1_overlay_ocr_tuning_samples_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/overlay/reader-debug/acl/{acl_id}":{"delete":{"tags":["overlay"],"summary":"Reader Debug Acl Del","operationId":"reader_debug_acl_del_api_v1_overlay_reader_debug_acl__acl_id__delete","parameters":[{"name":"acl_id","in":"path","required":true,"schema":{"type":"integer","title":"Acl Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/overlay/gamelog":{"post":{"tags":["overlay"],"summary":"Post Overlay Gamelog","operationId":"post_overlay_gamelog_api_v1_overlay_gamelog_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"ChangeRecord":{"properties":{"change":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Change"},"timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Timestamp"},"fields":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FieldOldNew"},"type":"object"},{"type":"null"}],"title":"Fields"},"field_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Field Name"},"old_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Old Value"},"new_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"New Value"}},"additionalProperties":true,"type":"object","title":"ChangeRecord","description":"One scrape-level profile change group (HESK #227).\n\nOldest remaining real group is ``change`` = 1. ``fields`` lists every\nprofile field in the change dict (not ``citizen_record``). Legacy\nper-field keys are still accepted if present."},"CitizenProfile":{"properties":{"handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Handle","description":"RSI handle (lowercase)"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"bio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bio"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"citizen_record":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Citizen Record"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"enlisted":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Enlisted"},"fluency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fluency"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"},"probation":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Probation"},"probation_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Probation End"},"is_stub":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Stub","description":"True for placeholder profiles"}},"additionalProperties":true,"type":"object","title":"CitizenProfile","description":"Citizen profile fields from RSI / local DB."},"CitizenResponse":{"properties":{"profile":{"$ref":"#/components/schemas/CitizenProfile"},"memberships":{"items":{"$ref":"#/components/schemas/MembershipRecord"},"type":"array","title":"Memberships"},"membership_history":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Membership History","description":"Historical membership snapshots"},"changes":{"items":{"$ref":"#/components/schemas/ChangeRecord"},"type":"array","title":"Changes"},"metadata":{"$ref":"#/components/schemas/ResourceMetadata"}},"additionalProperties":true,"type":"object","required":["profile"],"title":"CitizenResponse","description":"Full citizen payload returned by GET /citizens/{handle}."},"CitizenSummary":{"properties":{"handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Handle"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"last_scraped":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Scraped"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"additionalProperties":true,"type":"object","title":"CitizenSummary","description":"Compact citizen row (e.g. recent list)."},"ErrorResponse":{"properties":{"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail","description":"Human-readable error detail"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message (worker-style responses)"}},"type":"object","title":"ErrorResponse","description":"Standard error payload returned by many endpoints."},"FieldOldNew":{"properties":{"old":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Old"},"new":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"New"}},"type":"object","title":"FieldOldNew","description":"Before/after values for one profile field in a scrape-group."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"MembershipRecord":{"properties":{"citizen_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Citizen Handle"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name","description":"Citizen RSI display name when a citizen row exists (org member lists)"},"organization_sid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Sid"},"member_rank":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Member Rank"},"rank_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rank Number"},"is_main":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Main"},"visibility":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Visibility","description":"RSI membership visibility: 'visible', 'hidden', or 'redacted'. Hidden/redacted memberships use placeholder SIDs [HIDDEN] / [REDACTED] (and :N suffixes) so they never collide with the real orgs HIDDEN and REDACTED."}},"additionalProperties":true,"type":"object","title":"MembershipRecord","description":"Citizen ↔ organization membership."},"OrgMembershipHistoryEvent":{"properties":{"citizen_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Citizen Handle"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"join_detected":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Join Detected","description":"First time SENTRY observed this membership"},"leave_detected":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Leave Detected","description":"Last observation when the citizen is no longer a current member"},"status":{"anyOf":[{"type":"string","enum":["active","left"]},{"type":"null"}],"title":"Status"},"is_main":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Main"},"current_rank":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Rank"},"visibility":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Visibility"}},"additionalProperties":true,"type":"object","title":"OrgMembershipHistoryEvent","description":"One computed join/leave observation for an organization."},"OrgMembershipHistoryPage":{"properties":{"organization_sid":{"type":"string","title":"Organization Sid"},"events":{"items":{"$ref":"#/components/schemas/OrgMembershipHistoryEvent"},"type":"array","title":"Events"},"page":{"type":"integer","title":"Page","default":1},"pages":{"type":"integer","title":"Pages","default":1},"total":{"type":"integer","title":"Total","description":"Events matching the status filter","default":0},"active":{"type":"integer","title":"Active","description":"Current members (unfiltered)","default":0},"left":{"type":"integer","title":"Left","description":"Detected leavers (unfiltered)","default":0},"status":{"type":"string","title":"Status","description":"Filter applied: all, active, or left","default":"all"}},"type":"object","required":["organization_sid"],"title":"OrgMembershipHistoryPage","description":"Paginated join/leave history for an organization."},"OrgMembershipsPage":{"properties":{"members":{"items":{"$ref":"#/components/schemas/MembershipRecord"},"type":"array","title":"Members"},"page":{"type":"integer","title":"Page","default":1},"pages":{"type":"integer","title":"Pages","default":1},"total":{"type":"integer","title":"Total","description":"Reported member_count from org profile","default":0},"fetched":{"type":"integer","title":"Fetched","description":"Number of memberships currently in the DB","default":0}},"type":"object","title":"OrgMembershipsPage","description":"Paginated organization memberships."},"OrganizationProfile":{"properties":{"sid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sid","description":"Organization Spectrum ID (uppercase)"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"history":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"History"},"manifesto":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Manifesto"},"charter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Charter"},"member_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Member Count"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"is_stub":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Stub","description":"True for placeholder profiles"}},"additionalProperties":true,"type":"object","title":"OrganizationProfile","description":"Organization profile fields from RSI / local DB."},"OrganizationResponse":{"properties":{"profile":{"$ref":"#/components/schemas/OrganizationProfile"},"memberships":{"$ref":"#/components/schemas/OrgMembershipsPage"},"changes":{"items":{"$ref":"#/components/schemas/ChangeRecord"},"type":"array","title":"Changes"},"metadata":{"$ref":"#/components/schemas/ResourceMetadata"}},"additionalProperties":true,"type":"object","required":["profile"],"title":"OrganizationResponse","description":"Full organization payload returned by GET /orgs/{sid}."},"OrganizationSummary":{"properties":{"sid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sid"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"member_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Member Count"},"last_scraped":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Scraped"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"additionalProperties":true,"type":"object","title":"OrganizationSummary","description":"Compact organization row (e.g. recent list)."},"ResourceMetadata":{"properties":{"first_added":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Added","description":"When this record was first added to the SENTRY database"},"last_fetched":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Fetched","description":"Last successful scrape time"},"is_stub":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Stub","description":"True if only a placeholder record exists"},"is_archived":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Archived","description":"True if resource appears gone from RSI"},"finalized":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Finalized","description":"True when no pending/in-progress scrape tasks remain for this resource"},"force_refreshed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Force Refreshed","description":"Present when an internal force-refresh scrape was performed"}},"additionalProperties":true,"type":"object","title":"ResourceMetadata","description":"Scrape/metadata state for a citizen or organization."},"SearchResponse":{"properties":{"finalized":{"type":"boolean","title":"Finalized","description":"False while exact-match scrape tasks are still pending"},"results":{"items":{"$ref":"#/components/schemas/SearchResultItem"},"type":"array","title":"Results"},"pending_tasks":{"items":{"type":"string"},"type":"array","title":"Pending Tasks","description":"Which exact-match types still have pending work: 'citizen' and/or 'organization'"},"page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Page","description":"Present when page/per_page requested (org-scoped search)"},"pages":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pages","description":"Present when page/per_page requested"},"total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total","description":"Filtered hit count when page/per_page requested"},"org":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org","description":"Org SID filter when org= was set"},"org_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Status","description":"active, left, or all when org= was set"}},"type":"object","required":["finalized"],"title":"SearchResponse","description":"Search results for citizens and/or organizations.\n\nOptional query param `type=citizen` or `type=organization` filters server-side.\nOmitting `type` keeps the original combined search (legacy).\n`org=<SID>` restricts citizen results to that organization's roster (and\noptionally membership history via `org_status`). Optional `page`/`per_page`\npaginate those filtered hits."},"SearchResultItem":{"properties":{"type":{"type":"string","enum":["citizen","organization"],"title":"Type"},"handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Handle","description":"Citizen handle (when type=citizen)"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"sid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sid","description":"Org SID (when type=organization)"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"last_fetched":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Fetched"},"first_added":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Added","description":"When this record was first added to the SENTRY database"},"is_stub":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Stub"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"'pending' while a scrape is in flight"},"sim":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sim","description":"Trigram similarity score for partial matches"},"citizen_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Citizen Handle","description":"Alias of handle when org= filter is set"},"organization_sid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Sid","description":"Org SID when org= filter is set"},"member_rank":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Member Rank"},"current_rank":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Rank"},"rank_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rank Number"},"is_main":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Main"},"visibility":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Visibility"},"membership_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Membership Status","description":"active or left when org= is set"},"join_detected":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Join Detected"},"leave_detected":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Leave Detected"}},"additionalProperties":true,"type":"object","required":["type"],"title":"SearchResultItem","description":"One search hit (citizen or organization). Extra fields allowed."},"StatsDaySeries":{"properties":{"days":{"items":{"type":"string"},"type":"array","title":"Days","description":"YYYY-MM-DD"},"counts":{"items":{"type":"integer"},"type":"array","title":"Counts"}},"type":"object","title":"StatsDaySeries"},"StatsResponse":{"properties":{"totals":{"$ref":"#/components/schemas/StatsTotals"},"completed_fetches":{"$ref":"#/components/schemas/StatsWindowCounts"},"failed_fetches":{"$ref":"#/components/schemas/StatsWindowCounts"},"pending_fetches":{"$ref":"#/components/schemas/StatsWindowCounts"},"scheduled_fetches":{"anyOf":[{"$ref":"#/components/schemas/StatsWindowCounts"},{"type":"null"}]},"timechart":{"$ref":"#/components/schemas/StatsTimechart"},"new_citizens_30d":{"anyOf":[{"$ref":"#/components/schemas/StatsDaySeries"},{"type":"null"}]},"new_orgs_30d":{"anyOf":[{"$ref":"#/components/schemas/StatsDaySeries"},{"type":"null"}]},"updated_citizens_30d":{"anyOf":[{"$ref":"#/components/schemas/StatsDaySeries"},{"type":"null"}]},"updated_orgs_30d":{"anyOf":[{"$ref":"#/components/schemas/StatsDaySeries"},{"type":"null"}]},"org_joins_30d":{"anyOf":[{"$ref":"#/components/schemas/StatsDaySeries"},{"type":"null"}]},"org_leaves_30d":{"anyOf":[{"$ref":"#/components/schemas/StatsDaySeries"},{"type":"null"}]},"profile_changes_30d":{"anyOf":[{"$ref":"#/components/schemas/StatsDaySeries"},{"type":"null"}]},"new_citizens_30d_raw":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"New Citizens 30D Raw"},"new_orgs_30d_raw":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"New Orgs 30D Raw"},"org_joins_30d_raw":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Joins 30D Raw"},"org_leaves_30d_raw":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Leaves 30D Raw"},"profile_changes_30d_raw":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Profile Changes 30D Raw"},"total_citizens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Citizens","description":"Legacy alias of totals.citizens"},"total_organizations":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Organizations","description":"Legacy alias of totals.organizations"},"total_memberships":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Memberships","description":"Legacy alias of totals.memberships"},"pending_tasks":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pending Tasks"},"in_progress_tasks":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"In Progress Tasks"},"completed_tasks":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Completed Tasks"}},"additionalProperties":true,"type":"object","title":"StatsResponse","description":"Database and scrape-queue statistics."},"StatsTimechart":{"properties":{"hours":{"items":{"type":"string"},"type":"array","title":"Hours","description":"ISO hour buckets (last 24h)"},"completed":{"items":{"type":"integer"},"type":"array","title":"Completed"},"failed":{"items":{"type":"integer"},"type":"array","title":"Failed"},"scheduled":{"items":{"type":"integer"},"type":"array","title":"Scheduled","description":"Scrape tasks created in each hour (any status)"},"pending":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Pending","description":"Deprecated: previously still-pending tasks by created_at"}},"type":"object","title":"StatsTimechart"},"StatsTotals":{"properties":{"citizens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Citizens"},"organizations":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Organizations"},"memberships":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Memberships"},"queue":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Queue","description":"Pending + in-progress scrape tasks"}},"type":"object","title":"StatsTotals"},"StatsWindowCounts":{"properties":{"last_hour":{"type":"integer","title":"Last Hour","default":0},"last_24_hours":{"type":"integer","title":"Last 24 Hours","default":0}},"type":"object","title":"StatsWindowCounts"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}},"tags":[{"name":"citizens","description":"Query Star Citizen player (citizen) profiles, memberships, and change history."},{"name":"orgs","description":"Query organization profiles, members, and change history."},{"name":"search","description":"Fuzzy search across citizens and organizations."},{"name":"Stats","description":"Database and scrape-queue statistics."},{"name":"auth","description":"NAVCOM-ID session. Unauthenticated public data routes do not use this."},{"name":"intel","description":"Authenticated private notes, tags, reputation, and sharing. Requires NAVCOM-ID."},{"name":"overlay","description":"SENTRY Overlay diagnostic log intake. POST is public and rate-limited; GET requires NAVCOM-ID."}]}