{"openapi":"3.1.0","info":{"title":"NAVCOM-ID","version":"1.0.0","description":"NAVCOM-ID is the OAuth 2.1 / OpenID Connect provider on https://navcom.ai. Authorization Code + PKCE S256 only. No client_credentials. Staff-approved clients. Hidden/redacted orgs stay placeholders. Discord is never returned without the discord scope. Discord↔RSI resolve requires rsi+discord scopes AND the account discover toggle (default off). GET /oauth/v1/apps is the public approved-app directory. RP token inventory uses client secret; it lists metadata, never access/refresh tokens. RSI avatars and public encyclopedia data live on SENTRY-API (GET /api/v1/citizens/{handle}/profile/avatar_url). NAVCOM-ID GET /oauth/v1/citizens/{handle}/avatar is a redirect wrapper only.","contact":{"name":"NAVCOM","url":"https://navcom.ai/developers"}},"servers":[{"url":"https://navcom.ai"}],"paths":{"/.well-known/openid-configuration":{"get":{"summary":"Openid Configuration","operationId":"openid_configuration__well_known_openid_configuration_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/jwks.json":{"get":{"summary":"Jwks","operationId":"jwks_oauth_jwks_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/authorize":{"get":{"summary":"Authorize","operationId":"authorize_oauth_authorize_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/token":{"post":{"summary":"Token Endpoint","operationId":"token_endpoint_oauth_token_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_token_endpoint_oauth_token_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/oauth/userinfo":{"get":{"summary":"Userinfo","operationId":"userinfo_oauth_userinfo_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/revoke":{"post":{"summary":"Revoke","operationId":"revoke_oauth_revoke_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_revoke_oauth_revoke_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/oauth/v1/me/orgs":{"get":{"summary":"Me Orgs","description":"Live public orgs for an RP. Never force_refresh — SENTRY 1h cache only.","operationId":"me_orgs_oauth_v1_me_orgs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/v1/me":{"get":{"summary":"Oauth Me","description":"Full scoped profile for authorization_code access tokens only.","operationId":"oauth_me_oauth_v1_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/v1/resolve/rsi/{handle}":{"get":{"summary":"Resolve Rsi","description":"Public SENTRY-backed RSI card. Never includes Discord.","operationId":"resolve_rsi_oauth_v1_resolve_rsi__handle__get","parameters":[{"name":"handle","in":"path","required":true,"schema":{"type":"string","title":"Handle"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/oauth/v1/resolve/discord/{discord_id}":{"get":{"summary":"Resolve Discord","description":"RSI only if the subject granted rsi+discord and the account opted into discover.","operationId":"resolve_discord_oauth_v1_resolve_discord__discord_id__get","parameters":[{"name":"discord_id","in":"path","required":true,"schema":{"type":"string","title":"Discord Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/oauth/v1/resolve/rsi/{handle}/discord":{"get":{"summary":"Resolve Rsi To Discord","description":"Reverse lookup. Same discover preference; never default-on.","operationId":"resolve_rsi_to_discord_oauth_v1_resolve_rsi__handle__discord_get","parameters":[{"name":"handle","in":"path","required":true,"schema":{"type":"string","title":"Handle"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/oauth/v1/citizens/{handle}/avatar":{"get":{"summary":"Citizen Avatar Redirect","description":"Redirect to SENTRY avatar_url. Do not duplicate the scrape store.","operationId":"citizen_avatar_redirect_oauth_v1_citizens__handle__avatar_get","parameters":[{"name":"handle","in":"path","required":true,"schema":{"type":"string","title":"Handle"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/oauth/v1/apps":{"get":{"summary":"Public App Directory","description":"Approved apps only: name, homepage, scopes. Not a social graph.","operationId":"public_app_directory_oauth_v1_apps_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/v1/apps/{client_id}/tokens":{"get":{"summary":"Rp Token Inventory","description":"App developer inventory: user_id + scope + expiry. Never refresh/access tokens.","operationId":"rp_token_inventory_oauth_v1_apps__client_id__tokens_get","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_rp_token_inventory_oauth_v1_apps__client_id__tokens_get"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/oauth/v1/apps/{client_id}/tokens/{token_id}/revoke":{"post":{"summary":"Rp Token Revoke","operationId":"rp_token_revoke_oauth_v1_apps__client_id__tokens__token_id__revoke_post","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"token_id","in":"path","required":true,"schema":{"type":"integer","title":"Token Id"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_rp_token_revoke_oauth_v1_apps__client_id__tokens__token_id__revoke_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"Body_account_discover_toggle_account_discover_post":{"properties":{"enabled":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Enabled"}},"type":"object","title":"Body_account_discover_toggle_account_discover_post"},"Body_account_email_confirm_account_email_confirm_post":{"properties":{"email":{"type":"string","title":"Email"},"code":{"type":"string","title":"Code"}},"type":"object","required":["email","code"],"title":"Body_account_email_confirm_account_email_confirm_post"},"Body_account_email_start_account_email_start_post":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"Body_account_email_start_account_email_start_post"},"Body_account_merge_confirm_account_merge_confirm_post":{"properties":{"merge_id":{"type":"integer","title":"Merge Id"},"email":{"type":"string","title":"Email"},"code":{"type":"string","title":"Code"}},"type":"object","required":["merge_id","email","code"],"title":"Body_account_merge_confirm_account_merge_confirm_post"},"Body_account_password_set_account_password_set_post":{"properties":{"password":{"type":"string","title":"Password"},"password_confirm":{"type":"string","title":"Password Confirm"}},"type":"object","required":["password","password_confirm"],"title":"Body_account_password_set_account_password_set_post"},"Body_account_rsi_start_account_rsi_start_post":{"properties":{"rsi_handle":{"type":"string","title":"Rsi Handle"}},"type":"object","title":"Body_account_rsi_start_account_rsi_start_post"},"Body_account_session_revoke_account_sessions_revoke_post":{"properties":{"jti":{"type":"string","title":"Jti"}},"type":"object","required":["jti"],"title":"Body_account_session_revoke_account_sessions_revoke_post"},"Body_account_totp_confirm_account_totp_confirm_post":{"properties":{"code":{"type":"string","title":"Code"}},"type":"object","required":["code"],"title":"Body_account_totp_confirm_account_totp_confirm_post"},"Body_account_totp_disable_account_totp_disable_post":{"properties":{"code":{"type":"string","title":"Code"}},"type":"object","required":["code"],"title":"Body_account_totp_disable_account_totp_disable_post"},"Body_do_login_login_post":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"}},"type":"object","required":["email","password"],"title":"Body_do_login_login_post"},"Body_do_register_register_post":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"altcha":{"type":"string","title":"Altcha","default":""}},"type":"object","required":["email","password"],"title":"Body_do_register_register_post"},"Body_do_rsi_verify_rsi_verify_post":{"properties":{"handle":{"type":"string","title":"Handle"}},"type":"object","title":"Body_do_rsi_verify_rsi_verify_post"},"Body_forgot_password_submit_forgot_password_post":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"Body_forgot_password_submit_forgot_password_post"},"Body_login_otp_start_login_otp_start_post":{"properties":{"email":{"type":"string","title":"Email"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"}},"type":"object","required":["email"],"title":"Body_login_otp_start_login_otp_start_post"},"Body_login_otp_verify_login_otp_verify_post":{"properties":{"email":{"type":"string","title":"Email"},"code":{"type":"string","title":"Code"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"}},"type":"object","required":["email","code"],"title":"Body_login_otp_verify_login_otp_verify_post"},"Body_login_totp_verify_login_totp_post":{"properties":{"code":{"type":"string","title":"Code"}},"type":"object","required":["code"],"title":"Body_login_totp_verify_login_totp_post"},"Body_portal_ban_member_manage__guild_id__ban_post":{"properties":{"user_id":{"type":"string","title":"User Id"},"reason":{"type":"string","title":"Reason","default":"Banned via NAVCOM portal"}},"type":"object","required":["user_id"],"title":"Body_portal_ban_member_manage__guild_id__ban_post"},"Body_portal_clear_nickname_override_manage__guild_id__clear_nickname_override_post":{"properties":{"user_id":{"type":"string","title":"User Id"}},"type":"object","required":["user_id"],"title":"Body_portal_clear_nickname_override_manage__guild_id__clear_nickname_override_post"},"Body_portal_kick_member_manage__guild_id__kick_post":{"properties":{"user_id":{"type":"string","title":"User Id"},"reason":{"type":"string","title":"Reason","default":"Kicked via NAVCOM portal"}},"type":"object","required":["user_id"],"title":"Body_portal_kick_member_manage__guild_id__kick_post"},"Body_portal_local_verify_manage__guild_id__local_verify_post":{"properties":{"user_id":{"type":"string","title":"User Id"},"rsi_handle":{"type":"string","title":"Rsi Handle"}},"type":"object","required":["user_id","rsi_handle"],"title":"Body_portal_local_verify_manage__guild_id__local_verify_post"},"Body_portal_recheck_member_manage__guild_id__recheck_member_post":{"properties":{"user_id":{"type":"string","title":"User Id"}},"type":"object","required":["user_id"],"title":"Body_portal_recheck_member_manage__guild_id__recheck_member_post"},"Body_portal_remove_local_verify_manage__guild_id__remove_local_verify_post":{"properties":{"user_id":{"type":"string","title":"User Id"}},"type":"object","required":["user_id"],"title":"Body_portal_remove_local_verify_manage__guild_id__remove_local_verify_post"},"Body_portal_revoke_member_roles_manage__guild_id__revoke_roles_post":{"properties":{"user_id":{"type":"string","title":"User Id"}},"type":"object","required":["user_id"],"title":"Body_portal_revoke_member_roles_manage__guild_id__revoke_roles_post"},"Body_portal_set_nickname_override_manage__guild_id__nickname_override_post":{"properties":{"user_id":{"type":"string","title":"User Id"},"nickname":{"type":"string","title":"Nickname","default":""}},"type":"object","required":["user_id"],"title":"Body_portal_set_nickname_override_manage__guild_id__nickname_override_post"},"Body_portal_unban_member_manage__guild_id__unban_post":{"properties":{"user_id":{"type":"string","title":"User Id"}},"type":"object","required":["user_id"],"title":"Body_portal_unban_member_manage__guild_id__unban_post"},"Body_resend_verification_resend_verification_post":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"Body_resend_verification_resend_verification_post"},"Body_reset_password_submit_reset_password__token__post":{"properties":{"password":{"type":"string","title":"Password"},"password_confirm":{"type":"string","title":"Password Confirm"}},"type":"object","required":["password","password_confirm"],"title":"Body_reset_password_submit_reset_password__token__post"},"Body_revoke_oauth_revoke_post":{"properties":{"token":{"type":"string","title":"Token"},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Secret"}},"type":"object","required":["token"],"title":"Body_revoke_oauth_revoke_post"},"Body_rp_token_inventory_oauth_v1_apps__client_id__tokens_get":{"properties":{"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Secret"}},"type":"object","title":"Body_rp_token_inventory_oauth_v1_apps__client_id__tokens_get"},"Body_rp_token_revoke_oauth_v1_apps__client_id__tokens__token_id__revoke_post":{"properties":{"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Secret"}},"type":"object","title":"Body_rp_token_revoke_oauth_v1_apps__client_id__tokens__token_id__revoke_post"},"Body_staff_grant_staff_staff_post":{"properties":{"handle":{"type":"string","title":"Handle","default":""},"user_id":{"type":"string","title":"User Id","default":""},"perm_tickets":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Perm Tickets"},"perm_rp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Perm Rp"},"perm_accounts":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Perm Accounts"},"perm_bot":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Perm Bot"},"make_superadmin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Make Superadmin"},"note":{"type":"string","title":"Note","default":""}},"type":"object","title":"Body_staff_grant_staff_staff_post"},"Body_staff_rp_uris_staff_rps__pk__uris_post":{"properties":{"redirect_uris":{"type":"string","title":"Redirect Uris"}},"type":"object","required":["redirect_uris"],"title":"Body_staff_rp_uris_staff_rps__pk__uris_post"},"Body_staff_ticket_reopen_staff_tickets__tid__reopen_post":{"properties":{"body":{"type":"string","title":"Body","default":""}},"type":"object","title":"Body_staff_ticket_reopen_staff_tickets__tid__reopen_post"},"Body_staff_ticket_reply_staff_tickets__tid__post":{"properties":{"body":{"type":"string","title":"Body"},"status":{"type":"string","title":"Status","default":"waiting_user"}},"type":"object","required":["body"],"title":"Body_staff_ticket_reply_staff_tickets__tid__post"},"Body_staff_ticket_status_staff_tickets__tid__status_post":{"properties":{"status":{"type":"string","title":"Status"}},"type":"object","required":["status"],"title":"Body_staff_ticket_status_staff_tickets__tid__status_post"},"Body_support_close_developers_support__tid__close_post":{"properties":{"comment":{"type":"string","title":"Comment"}},"type":"object","required":["comment"],"title":"Body_support_close_developers_support__tid__close_post"},"Body_support_create_developers_support_post":{"properties":{"subject":{"type":"string","title":"Subject"},"body":{"type":"string","title":"Body"}},"type":"object","required":["subject","body"],"title":"Body_support_create_developers_support_post"},"Body_support_reply_developers_support__tid__post":{"properties":{"body":{"type":"string","title":"Body"}},"type":"object","required":["body"],"title":"Body_support_reply_developers_support__tid__post"},"Body_token_endpoint_oauth_token_post":{"properties":{"grant_type":{"type":"string","title":"Grant Type"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"redirect_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redirect Uri"},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Secret"},"code_verifier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code Verifier"},"refresh_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Token"}},"type":"object","required":["grant_type"],"title":"Body_token_endpoint_oauth_token_post"},"Body_update_config_update_config__guild_id__post":{"properties":{"verification_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verification Role Id"},"nickname_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nickname Format"},"name_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Source"},"multi_org_behavior":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Multi Org Behavior"},"org_role_scope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Role Scope"},"rank_role_scope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rank Role Scope"},"enable_checkmark":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Enable Checkmark"},"enable_join_verification_dm":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Enable Join Verification Dm"},"auto_clear_local_on_global":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auto Clear Local On Global"},"legacy_verify":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legacy Verify"},"org_mappings":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Mappings"},"rank_mappings":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rank Mappings"},"dynamic_vcs":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dynamic Vcs"},"welcome_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Welcome Channel Id"},"welcome_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Welcome Message"},"action_log":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action Log"},"security":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Security"},"reaction_roles_json":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reaction Roles Json"},"command_permissions_json":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Command Permissions Json"}},"type":"object","title":"Body_update_config_update_config__guild_id__post"},"Body_verify_rsi_start_verify_rsi_start_post":{"properties":{"rsi_handle":{"type":"string","title":"Rsi Handle"}},"type":"object","required":["rsi_handle"],"title":"Body_verify_rsi_start_verify_rsi_start_post"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"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"}}}}