{"components":{"responses":{},"schemas":{"EntraDirectoryResponse":{"description":"Response schema for single Entra Directory","example":{"data":{"id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","name":"Entra"}},"properties":{"data":{"$ref":"#/components/schemas/EntraDirectory"}},"title":"EntraDirectoryResponse","type":"object"},"ActorResponse":{"description":"Response schema for single Actor","example":{"data":{"allow_email_otp_sign_in":false,"created_by_directory_id":null,"email":"john.doe@example.com","id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","inserted_at":"2024-01-01T00:00:00Z","is_disabled":false,"last_seen_at":"2024-01-15T10:30:00Z","name":"John Doe","type":"account_admin_user","updated_at":"2024-01-15T10:30:00Z"}},"properties":{"data":{"$ref":"#/components/schemas/Actor"}},"title":"ActorResponse","type":"object"},"GoogleAuthProviderListResponse":{"description":"Response schema for multiple Google Auth Providers","example":{"data":[{"id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","name":"Google"}]},"properties":{"data":{"description":"Google Auth Provider details","items":{"$ref":"#/components/schemas/GoogleAuthProvider"},"type":"array"}},"title":"GoogleAuthProviderListResponse","type":"object"},"GroupResponse":{"description":"Response schema for single Group","example":{"data":{"directory_id":null,"email":null,"entity_type":"group","id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","idp_id":null,"inserted_at":"2024-01-15T10:30:00Z","name":"Engineering","synced_at":null,"updated_at":"2024-01-15T10:30:00Z"}},"properties":{"data":{"$ref":"#/components/schemas/Group"}},"title":"GroupResponse","type":"object"},"GoogleDirectoryResponse":{"description":"Response schema for single Google Directory","example":{"data":{"id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","name":"Google"}},"properties":{"data":{"$ref":"#/components/schemas/GoogleDirectory"}},"title":"GoogleDirectoryResponse","type":"object"},"MembershipPutRequest":{"description":"PUT body for updating Memberships","example":{"memberships":[{"actor_id":"1234-1234"},{"actor_id":"2345-2345"}]},"properties":{"memberships":{"items":{"properties":{"actor_id":{"description":"Actor ID","format":"uuid","type":"string"}},"type":"object"},"type":"array"}},"required":["memberships"],"title":"MembershipPutRequest","type":"object"},"PolicyCreateParams":{"description":"Policy attributes accepted when creating a Policy","example":{"conditions":[{"operator":"is_in","property":"remote_ip_location_region","values":["US","CA"]}],"description":"Policy to allow something","flow_log_uploads_enabled":true,"group_id":"88eae9ce-9179-48c6-8430-770e38dd4775","resource_id":"a9f60587-793c-46ae-8525-597f43ab2fb1"},"properties":{"conditions":{"description":"Conditions that must be satisfied for the Policy to grant access","items":{"$ref":"#/components/schemas/PolicyCondition"},"type":"array"},"description":{"description":"Policy Description","nullable":true,"type":"string"},"flow_log_uploads_enabled":{"default":true,"description":"Whether flow logs are reported for connections authorized by this Policy. Defaults to true. Always false for Internet Resource policies.","type":"boolean"},"group_id":{"description":"Group ID","format":"uuid","type":"string"},"resource_id":{"description":"Resource ID","format":"uuid","type":"string"}},"required":["group_id","resource_id"],"title":"PolicyCreateParams","type":"object"},"OktaAuthProvider":{"description":"Okta Auth Provider","example":{"id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","name":"Okta","okta_domain":"example.okta.com"},"properties":{"account_id":{"description":"Account ID","format":"uuid","type":"string"},"client_id":{"description":"Client ID","type":"string"},"client_session_lifetime_secs":{"description":"Client session lifetime in seconds","type":"integer"},"context":{"description":"Context","enum":["clients_and_portal","clients_only","portal_only"],"type":"string"},"id":{"description":"Provider ID","format":"uuid","type":"string"},"inserted_at":{"description":"Creation timestamp","format":"date-time","type":"string"},"is_default":{"description":"Whether provider is default","type":"boolean"},"is_disabled":{"description":"Whether provider is disabled","type":"boolean"},"issuer":{"description":"Issuer","type":"string"},"name":{"description":"Provider name","type":"string"},"okta_domain":{"description":"Okta domain","type":"string"},"portal_session_lifetime_secs":{"description":"Portal session lifetime in seconds","type":"integer"},"updated_at":{"description":"Update timestamp","format":"date-time","type":"string"}},"required":["id","name"],"title":"OktaAuthProvider","type":"object"},"GatewayResponse":{"description":"Response schema for single Gateway","example":{"data":{"id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","ipv4":"1.2.3.4","ipv6":"","name":"vpc-us-east","online":true}},"properties":{"data":{"$ref":"#/components/schemas/Gateway"}},"title":"GatewayResponse","type":"object"},"ResourceCreateRequest":{"description":"POST body for creating a Resource. `site_id` is required unless `type` is `static_device_pool`.","example":{"resource":{"address":"10.0.0.10","address_description":"Production Database","filters":[{"ports":["5432"],"protocol":"tcp"}],"name":"Prod DB","site_id":"0642e09d-b3a2-47e4-9cd1-c2195faeeb67","type":"ip"}},"properties":{"resource":{"properties":{"address":{"description":"Resource address. Not applicable to `static_device_pool`.","nullable":true,"type":"string"},"address_description":{"description":"Resource address description","nullable":true,"type":"string"},"filters":{"description":"Traffic filters restricting the protocols and ports the Resource exposes","items":{"$ref":"#/components/schemas/ResourceFilter"},"type":"array"},"ip_stack":{"description":"IP stack type. Only supported for DNS resources.","enum":["ipv4_only","ipv6_only","dual"],"nullable":true,"type":"string"},"name":{"description":"Resource name","type":"string"},"site_id":{"description":"Site to connect the Resource to. Required for all types except `static_device_pool`. The Internet Site is reserved for the Internet Resource and cannot be used.","format":"uuid","nullable":true,"title":"SiteID","type":"string"},"type":{"description":"Resource type. For `static_device_pool`, `address` is not applicable.","enum":["cidr","ip","dns","static_device_pool"],"type":"string"}},"required":["name","type"],"type":"object"}},"required":["resource"],"title":"ResourceCreateRequest","type":"object"},"ClientTokenCreateResponse":{"description":"Response schema for a new Client Token","example":{"data":{"actor_id":"43a7f82f-831a-4a9d-8f17-c66c2bb6e205","expires_at":"2025-01-15T12:34:56.789Z","id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","inserted_at":"2025-01-15T12:34:56.789Z","token":"secret-token-here","updated_at":"2025-01-15T12:34:56.789Z"}},"properties":{"data":{"$ref":"#/components/schemas/ClientTokenResponse"}},"title":"ClientTokenCreateResponse","type":"object"},"ClientToken":{"description":"Client Token metadata","example":{"actor_id":"43a7f82f-831a-4a9d-8f17-c66c2bb6e205","expires_at":"2025-01-15T12:34:56.789Z","id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","inserted_at":"2025-01-15T12:34:56.789Z","updated_at":"2025-01-15T12:34:56.789Z"},"properties":{"actor_id":{"description":"Actor ID","format":"uuid","type":"string"},"expires_at":{"description":"Expiration","format":"date-time","type":"string"},"id":{"description":"Client Token ID","format":"uuid","type":"string"},"inserted_at":{"description":"Creation timestamp","format":"date-time","type":"string"},"updated_at":{"description":"Update timestamp","format":"date-time","type":"string"}},"required":["id","actor_id","expires_at","inserted_at","updated_at"],"title":"ClientToken","type":"object"},"EntraAuthProvider":{"description":"Entra Auth Provider","example":{"id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","issuer":"https://login.microsoftonline.com/tenant-id/v2.0","name":"Entra"},"properties":{"account_id":{"description":"Account ID","format":"uuid","type":"string"},"client_session_lifetime_secs":{"description":"Client session lifetime in seconds","type":"integer"},"context":{"description":"Context","enum":["clients_and_portal","clients_only","portal_only"],"type":"string"},"email_claim":{"description":"OIDC claim to use as email","enum":["email","upn","preferred_username"],"type":"string"},"id":{"description":"Provider ID","format":"uuid","type":"string"},"inserted_at":{"description":"Creation timestamp","format":"date-time","type":"string"},"is_default":{"description":"Whether provider is default","type":"boolean"},"is_disabled":{"description":"Whether provider is disabled","type":"boolean"},"issuer":{"description":"Issuer","type":"string"},"name":{"description":"Provider name","type":"string"},"portal_session_lifetime_secs":{"description":"Portal session lifetime in seconds","type":"integer"},"updated_at":{"description":"Update timestamp","format":"date-time","type":"string"}},"required":["id","name"],"title":"EntraAuthProvider","type":"object"},"EntraAuthProviderResponse":{"description":"Response schema for single Entra Auth Provider","example":{"data":{"id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","name":"Entra"}},"properties":{"data":{"$ref":"#/components/schemas/EntraAuthProvider"}},"title":"EntraAuthProviderResponse","type":"object"},"ClientTokenRequest":{"description":"POST body for creating a Client Token","example":{"client_token":{"expires_at":"2025-01-15T12:34:56.789Z"}},"properties":{"client_token":{"$ref":"#/components/schemas/ClientTokenCreate"}},"required":["client_token"],"title":"ClientTokenRequest","type":"object"},"ExternalIdentity":{"description":"External Identity","example":{"account_id":"5e6f7d8c-9b0a-1c2d-3e4f-5a6b7c8d9e0f","actor_id":"cdfa97e6-cca1-41db-8fc7-864daedb46df","directory_id":"9f8e7d6c-5b4a-3c2b-1a0e-9f8e7d6c5b4a","family_name":"Doe","given_name":"John","id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","idp_id":"2551705710219359","inserted_at":"2025-01-15T12:34:56.789Z","issuer":"https://accounts.google.com","name":"John Doe","picture":"https://example.com/avatar.jpg","synced_at":"2025-01-15T12:34:56.789Z"},"properties":{"account_id":{"description":"Account ID","format":"uuid","type":"string"},"actor_id":{"description":"Actor ID","format":"uuid","type":"string"},"directory_id":{"description":"Directory UUID reference","format":"uuid","type":"string"},"family_name":{"description":"Family name","type":"string"},"firezone_avatar_url":{"description":"Firezone-hosted avatar URL","type":"string"},"given_name":{"description":"Given name","type":"string"},"id":{"description":"External Identity ID","format":"uuid","type":"string"},"idp_id":{"description":"IDP-specific identifier for this identity","type":"string"},"inserted_at":{"description":"Creation timestamp","format":"date-time","type":"string"},"issuer":{"description":"Identity issuer URL (e.g., 'https://accounts.google.com', 'https://company.okta.com')","type":"string"},"middle_name":{"description":"Middle name","type":"string"},"name":{"description":"Full name","type":"string"},"nickname":{"description":"Nickname","type":"string"},"picture":{"description":"Profile picture URL","type":"string"},"preferred_username":{"description":"Preferred username","type":"string"},"profile":{"description":"Profile URL","type":"string"},"synced_at":{"description":"Last sync timestamp","format":"date-time","type":"string"}},"required":["id","actor_id","issuer","idp_id"],"title":"ExternalIdentity","type":"object"},"ClientPutRequest":{"description":"PUT body for updating a Client","example":{"client":{"name":"John's Macbook Air"}},"properties":{"client":{"$ref":"#/components/schemas/ClientPut"}},"required":["client"],"title":"ClientPutRequest","type":"object"},"OktaDirectoryResponse":{"description":"Response schema for single Okta Directory","example":{"data":{"id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","name":"Okta"}},"properties":{"data":{"$ref":"#/components/schemas/OktaDirectory"}},"title":"OktaDirectoryResponse","type":"object"},"GatewayTokenResponse":{"description":"Response schema for a new Gateway Token","example":{"data":{"id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","token":"secret-token-here"}},"properties":{"data":{"$ref":"#/components/schemas/GatewayToken"}},"title":"GatewayTokenResponse","type":"object"},"GroupCreateRequest":{"description":"POST body for creating a Group","example":{"group":{"name":"Engineering"}},"properties":{"group":{"properties":{"name":{"description":"Group Name","type":"string"}},"required":["name"],"type":"object"}},"required":["group"],"title":"GroupCreateRequest","type":"object"},"Log":{"description":"A single Log entry. The `type` field identifies the log stream the\nentry belongs to, which is also encoded in the first character of its\n`log_id` (`c` change, `5` session, `f` flow, `a` api_request).\n","oneOf":[{"$ref":"#/components/schemas/ChangeLog"},{"$ref":"#/components/schemas/SessionLog"},{"$ref":"#/components/schemas/FlowLog"},{"$ref":"#/components/schemas/APIRequestLog"}],"title":"Log"},"DeletedClientTokenResponse":{"description":"Response schema for a deleted Client Token","example":{"data":{"id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205"}},"properties":{"data":{"properties":{"id":{"description":"Client Token ID","format":"uuid","type":"string"}},"required":["id"],"type":"object"}},"title":"DeletedClientTokenResponse","type":"object"},"SessionLog":{"description":"A single Session Log entry, recording one Client, Gateway, or Portal\nsession that was created, along with the auth context it was created\nwith.\n","example":{"context":"client","log_id":"500060db0c2c8eb400000000","subject":{"actor_email":"admin@example.com","actor_id":"84e7f82f-831a-4a9d-8f17-c66c2bb6e205","device_id":"11e7f82f-831a-4a9d-8f17-c66c2bb6e205","ip":"189.172.73.1","ip_city":"Mexico City","ip_lat":19.4326,"ip_lon":-99.1332,"ip_region":"MX","token_id":"22e7f82f-831a-4a9d-8f17-c66c2bb6e205","user_agent":"Linux/6.5.0 connlib/1.5.1"},"timestamp":"2026-05-26T12:34:56.789Z","type":"session"},"properties":{"context":{"description":"The kind of session that was created.","enum":["client","gateway","portal"],"type":"string"},"log_id":{"description":"Opaque identifier for the Session Log entry. A 24-character\nlowercase hexadecimal string starting with `5`.\n","example":"500060db0c2c8eb400000000","type":"string"},"subject":{"$ref":"#/components/schemas/Subject"},"timestamp":{"description":"RFC 3339 timestamp identifying when the session was created.","format":"date-time","type":"string"},"type":{"enum":["session"],"type":"string"}},"required":["type","log_id","timestamp","context","subject"],"title":"SessionLog","type":"object"},"ChangeLog":{"description":"A single entry from the account audit log.\n\nEach entry records one create, update, or delete event against an\naccount-scoped object.\n","example":{"after":{"name":"Jane Smith"},"before":{"name":"Jane Doe"},"log_id":"c00060db0c2c8eb400000000","object":"actors","operation":"update","subject":null,"timestamp":"2026-05-26T12:34:56.789Z","type":"change"},"properties":{"after":{"additionalProperties":true,"description":"The state of the object after the change. `null` for `delete`\nevents. Sensitive fields such as tokens, secrets, and password\nhashes are replaced with the literal string `\"[redacted]\"`.\n","nullable":true,"type":"object"},"before":{"additionalProperties":true,"description":"The state of the object before the change. `null` for `insert`\nevents. Sensitive fields such as tokens, secrets, and password\nhashes are replaced with the literal string `\"[redacted]\"`.\n","nullable":true,"type":"object"},"log_id":{"description":"Opaque identifier for the audit log entry. A 24-character lowercase\nhexadecimal string starting with `c`, lexicographically sortable\nwithin an account and aligned with the order changes were committed.\n","example":"c00060db0c2c8eb400000000","type":"string"},"object":{"description":"The kind of object that was changed.","example":"actors","type":"string"},"operation":{"description":"The kind of change that was applied.","enum":["insert","update","delete"],"type":"string"},"subject":{"$ref":"#/components/schemas/Subject"},"timestamp":{"description":"RFC 3339 timestamp identifying when the change was committed.","format":"date-time","type":"string"},"type":{"enum":["change"],"type":"string"}},"required":["type","log_id","timestamp","object","operation"],"title":"ChangeLog","type":"object"},"Site":{"description":"Site","example":{"id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","name":"vpc-us-east"},"properties":{"id":{"description":"Site ID","format":"uuid","type":"string"},"name":{"description":"Site Name","type":"string"}},"required":["id","name"],"title":"Site","type":"object"},"SiteResponse":{"description":"Response schema for single Site","example":{"data":{"id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","name":"vpc-us-east"}},"properties":{"data":{"$ref":"#/components/schemas/Site"}},"title":"SiteResponse","type":"object"},"ClientTokenListResponse":{"description":"Response schema for multiple Client Tokens","example":{"data":[{"actor_id":"43a7f82f-831a-4a9d-8f17-c66c2bb6e205","expires_at":"2025-01-15T12:34:56.789Z","id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","inserted_at":"2025-01-15T12:34:56.789Z","updated_at":"2025-01-15T12:34:56.789Z"}],"metadata":{"count":1,"limit":10,"next_page":null,"prev_page":null}},"properties":{"data":{"description":"Client Token metadata","items":{"$ref":"#/components/schemas/ClientToken"},"type":"array"},"metadata":{"$ref":"#/components/schemas/PaginationMetadata"}},"title":"ClientTokenListResponse","type":"object"},"GoogleDirectory":{"description":"Google Directory","example":{"domain":"example.com","id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","name":"Google"},"properties":{"account_id":{"description":"Account ID","format":"uuid","type":"string"},"disabled_reason":{"description":"Reason for disabling","type":"string"},"domain":{"description":"Google Workspace domain","type":"string"},"error":{"description":"Last error message","type":"string"},"error_count":{"description":"Error count","type":"integer"},"error_emailed_at":{"description":"Error email timestamp","format":"date-time","type":"string"},"group_sync_mode":{"description":"Group sync mode","enum":["all","filtered","disabled"],"type":"string"},"id":{"description":"Directory ID","format":"uuid","type":"string"},"impersonation_email":{"description":"Impersonation email","type":"string"},"inserted_at":{"description":"Creation timestamp","format":"date-time","type":"string"},"is_disabled":{"description":"Whether directory is disabled","type":"boolean"},"name":{"description":"Directory name","type":"string"},"orgunit_sync_enabled":{"description":"Whether org unit sync is enabled","type":"boolean"},"synced_at":{"description":"Last sync timestamp","format":"date-time","type":"string"},"updated_at":{"description":"Update timestamp","format":"date-time","type":"string"}},"required":["id","name"],"title":"GoogleDirectory","type":"object"},"PolicyResponse":{"description":"Response schema for single Policy","example":{"data":{"conditions":[{"operator":"is_in","property":"remote_ip_location_region","values":["US","CA"]}],"description":"Policy to allow something","flow_log_uploads_enabled":true,"group_id":"88eae9ce-9179-48c6-8430-770e38dd4775","id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","resource_id":"a9f60587-793c-46ae-8525-597f43ab2fb1"}},"properties":{"data":{"$ref":"#/components/schemas/Policy"}},"title":"PolicyResponse","type":"object"},"DeletedClientTokensResponse":{"description":"Response schema for deleted Client Tokens","example":{"data":{"deleted_count":3}},"properties":{"data":{"properties":{"deleted_count":{"description":"Number of tokens that were deleted","type":"integer"}},"required":["deleted_count"],"type":"object"}},"title":"DeletedClientTokensResponse","type":"object"},"GroupListResponse":{"description":"Response schema for multiple Groups","example":{"data":[{"directory_id":null,"email":null,"entity_type":"group","id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","idp_id":null,"inserted_at":"2024-01-15T10:30:00Z","name":"Engineering","synced_at":null,"updated_at":"2024-01-15T10:30:00Z"},{"directory_id":"6b4e3a2c-1234-5678-9abc-def012345678","email":"firezone-sync-admins@example.com","entity_type":"group","id":"4ae929a7-1973-43f2-a1a8-9221b91a4c0e","idp_id":"google-workspace-group-123","inserted_at":"2024-01-10T08:15:00Z","name":"firezone-sync-admins","synced_at":"2024-01-14T16:00:00Z","updated_at":"2024-01-14T16:45:00Z"}],"metadata":{"limit":10,"next_page":"98776234123","prev_page":"123123425","total":100}},"properties":{"data":{"description":"Group details","items":{"$ref":"#/components/schemas/Group"},"type":"array"},"metadata":{"$ref":"#/components/schemas/PaginationMetadata"}},"title":"GroupListResponse","type":"object"},"OktaAuthProviderListResponse":{"description":"Response schema for multiple Okta Auth Providers","example":{"data":[{"id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","name":"Okta"}]},"properties":{"data":{"description":"Okta Auth Provider details","items":{"$ref":"#/components/schemas/OktaAuthProvider"},"type":"array"}},"title":"OktaAuthProviderListResponse","type":"object"},"DeletedGatewayTokenResponse":{"description":"Response schema for a deleted Gateway Token","example":{"data":{"id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205"}},"properties":{"data":{"properties":{"id":{"description":"Gateway Token ID","format":"uuid","type":"string"}},"required":["id"],"type":"object"}},"title":"DeletedGatewayTokenResponse","type":"object"},"EntraAuthProviderListResponse":{"description":"Response schema for multiple Entra Auth Providers","example":{"data":[{"id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","name":"Entra"}]},"properties":{"data":{"description":"Entra Auth Provider details","items":{"$ref":"#/components/schemas/EntraAuthProvider"},"type":"array"}},"title":"EntraAuthProviderListResponse","type":"object"},"Membership":{"description":"Membership","example":{"id":"7cb89288-1fb3-433e-a522-2d087e45988d","name":"John Doe","type":"account_user"},"properties":{"id":{"description":"Actor ID","format":"uuid","type":"string"},"name":{"description":"Actor Name","type":"string"},"type":{"description":"Actor Type","type":"string"}},"title":"Membership","type":"object"},"OIDCAuthProvider":{"description":"OIDC Auth Provider","example":{"client_id":"my-client-id","email_verification_method":"claim","id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","name":"OIDC Provider"},"properties":{"account_id":{"description":"Account ID","format":"uuid","type":"string"},"client_id":{"description":"Client ID","type":"string"},"client_session_lifetime_secs":{"description":"Client session lifetime in seconds","type":"integer"},"context":{"description":"Context","enum":["clients_and_portal","clients_only","portal_only"],"type":"string"},"discovery_document_uri":{"description":"Discovery document URI","type":"string"},"email_verification_method":{"description":"How sign-in verifies the email claim","enum":["none","claim","proof"],"type":"string"},"id":{"description":"Provider ID","format":"uuid","type":"string"},"inserted_at":{"description":"Creation timestamp","format":"date-time","type":"string"},"is_default":{"description":"Whether provider is default","type":"boolean"},"is_disabled":{"description":"Whether provider is disabled","type":"boolean"},"issuer":{"description":"Issuer","type":"string"},"name":{"description":"Provider name","type":"string"},"portal_session_lifetime_secs":{"description":"Portal session lifetime in seconds","type":"integer"},"updated_at":{"description":"Update timestamp","format":"date-time","type":"string"}},"required":["id","name"],"title":"OIDCAuthProvider","type":"object"},"ExternalIdentityListResponse":{"description":"Response schema for multiple External Identities","example":{"data":[{"account_id":"5e6f7d8c-9b0a-1c2d-3e4f-5a6b7c8d9e0f","actor_id":"8f44a02b-b8eb-406f-8202-4274bf60ebd0","directory_id":"9f8e7d6c-5b4a-3c2b-1a0e-9f8e7d6c5b4a","family_name":"Doe","given_name":"John","id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","idp_id":"2551705710219359","inserted_at":"2025-01-15T12:34:56.789Z","issuer":"https://accounts.google.com","name":"John Doe","picture":"https://example.com/avatar1.jpg","synced_at":"2025-01-15T12:34:56.789Z"},{"account_id":"5e6f7d8c-9b0a-1c2d-3e4f-5a6b7c8d9e0f","actor_id":"38c92cda-1ddb-45b3-9d1a-7efc375e00c1","directory_id":"1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d","family_name":"Smith","given_name":"Jane","id":"8a70eb96-e74b-4cdc-91b8-48c05ef74d4c","idp_id":"2638957392736483","inserted_at":"2025-01-15T11:22:33.456Z","issuer":"https://company.okta.com","name":"Jane Smith","picture":"https://example.com/avatar2.jpg","synced_at":"2025-01-15T11:22:33.456Z"}],"metadata":{"limit":10,"next_page":"98776234123","prev_page":"123123425","total":100}},"properties":{"data":{"description":"External Identity details","items":{"$ref":"#/components/schemas/ExternalIdentity"},"type":"array"},"metadata":{"$ref":"#/components/schemas/PaginationMetadata"}},"title":"ExternalIdentityListResponse","type":"object"},"ClientPut":{"description":"Put schema for updating a single Client","example":{"name":"John's Macbook Air"},"properties":{"name":{"description":"Client Name","type":"string"}},"required":["name"],"title":"ClientPut","type":"object"},"ClientsResponse":{"description":"Response schema for multiple Clients","example":{"data":[{"actor_id":"6ecc106b-75c1-48a5-846c-14782180c1ff","created_at":"2025-01-01T00:00:00Z","device_serial":"GCCFX0DBQ6L5","device_uuid":"7A461FF9-0BE2-64A9-A418-539D9A21827B","firebase_installation_id":null,"firezone_id":"b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c","hostname":"johns-macbook.example.com","id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","identifier_for_vendor":null,"ipv4":"100.64.0.1","ipv6":"fd00:2021:1111::1","last_attested_cert_fingerprint":"9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08","last_attested_cert_serial":"4A:2F:00:8C:11:03:9E:5B","last_attested_device_serial":"GCCFX0DBQ6L5","last_attested_device_uuid":"7A461FF9-0BE2-64A9-A418-539D9A21827B","last_attested_mdm_device_id":"5f2e7b7a-9d54-4bd2-9d4f-8f6c2a01f9d3","name":"John's Macbook Air","online":true,"updated_at":"2025-01-01T00:00:00Z","verified_at":"2025-01-01T00:00:00Z"},{"actor_id":"2ecc106b-75c1-48a5-846c-14782180c1ff","created_at":"2025-01-01T00:00:00Z","device_serial":null,"device_uuid":null,"firebase_installation_id":null,"firezone_id":"6c37c0042f40bbb16e007d0d6c8e77c0ac2cab3cc3b923c42d1157a934e436ac","hostname":null,"id":"9a7f82f-831a-4a9d-8f17-c66c2bb6e205","identifier_for_vendor":"7A461FF9-0BE2-64A9-A418-539D9A21827B","ipv4":"100.64.0.2","ipv6":"fd00:2021:1111::2","last_attested_at":null,"last_attested_cert_fingerprint":null,"last_attested_cert_serial":null,"last_attested_device_serial":null,"last_attested_device_uuid":null,"last_attested_mdm_device_id":null,"name":"iPad","online":false,"updated_at":"2025-01-01T00:00:00Z","verified_at":null}],"metadata":{"limit":2,"next_page":"98776234123","prev_page":"123123425","total":100}},"properties":{"data":{"description":"Clients details","items":{"$ref":"#/components/schemas/Client"},"type":"array"},"metadata":{"$ref":"#/components/schemas/PaginationMetadata"}},"title":"ClientsResponse","type":"object"},"GoogleDirectoryListResponse":{"description":"Response schema for multiple Google Directories","example":{"data":[{"id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","name":"Google"}]},"properties":{"data":{"description":"Google Directory details","items":{"$ref":"#/components/schemas/GoogleDirectory"},"type":"array"}},"title":"GoogleDirectoryListResponse","type":"object"},"GatewaysResponse":{"description":"Response schema for multiple Gateways","example":{"data":[{"id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","ipv4":"1.2.3.4","ipv6":"","name":"vpc-us-east","online":true},{"id":"6ecc106b-75c1-48a5-846c-14782180c1ff","ipv4":"5.6.7.8","ipv6":"","name":"vpc-us-west","online":true}],"metadata":{"limit":10,"next_page":"98776234123","prev_page":"123123425","total":100}},"properties":{"data":{"description":"Gateways details","items":{"$ref":"#/components/schemas/Gateway"},"type":"array"},"metadata":{"$ref":"#/components/schemas/PaginationMetadata"}},"title":"GatewaysResponse","type":"object"},"PolicyCreateRequest":{"description":"POST body for creating a Policy","example":{"policy":{"conditions":[{"operator":"is_in","property":"remote_ip_location_region","values":["US","CA"]}],"description":"Policy to allow something","group_id":"88eae9ce-9179-48c6-8430-770e38dd4775","resource_id":"a9f60587-793c-46ae-8525-597f43ab2fb1"}},"properties":{"policy":{"$ref":"#/components/schemas/PolicyCreateParams"}},"required":["policy"],"title":"PolicyCreateRequest","type":"object"},"ResourceResponse":{"description":"Response schema for single Resource","example":{"data":{"address":"10.0.0.10","address_description":"Production Database","id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","name":"Prod DB","site_id":"0642e09d-b3a2-47e4-9cd1-c2195faeeb67","type":"ip"}},"properties":{"data":{"$ref":"#/components/schemas/Resource"}},"title":"ResourceResponse","type":"object"},"ExternalIdentityResponse":{"description":"Response schema for single External Identity","example":{"data":{"account_id":"5e6f7d8c-9b0a-1c2d-3e4f-5a6b7c8d9e0f","actor_id":"cdfa97e6-cca1-41db-8fc7-864daedb46df","directory_id":"9f8e7d6c-5b4a-3c2b-1a0e-9f8e7d6c5b4a","family_name":"Doe","given_name":"John","id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","idp_id":"2551705710219359","inserted_at":"2025-01-15T12:34:56.789Z","issuer":"https://accounts.google.com","name":"John Doe","picture":"https://example.com/avatar.jpg","synced_at":"2025-01-15T12:34:56.789Z"}},"properties":{"data":{"$ref":"#/components/schemas/ExternalIdentity"}},"title":"ExternalIdentityResponse","type":"object"},"OktaDirectory":{"description":"Okta Directory","example":{"id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","name":"Okta","okta_domain":"example.okta.com"},"properties":{"account_id":{"description":"Account ID","format":"uuid","type":"string"},"client_id":{"description":"Client ID","type":"string"},"disabled_reason":{"description":"Reason for disabling","type":"string"},"error":{"description":"Last error message","type":"string"},"error_count":{"description":"Error count","type":"integer"},"error_emailed_at":{"description":"Error email timestamp","format":"date-time","type":"string"},"id":{"description":"Directory ID","format":"uuid","type":"string"},"inserted_at":{"description":"Creation timestamp","format":"date-time","type":"string"},"is_disabled":{"description":"Whether directory is disabled","type":"boolean"},"kid":{"description":"Key ID","type":"string"},"name":{"description":"Directory name","type":"string"},"okta_domain":{"description":"Okta domain","type":"string"},"synced_at":{"description":"Last sync timestamp","format":"date-time","type":"string"},"updated_at":{"description":"Update timestamp","format":"date-time","type":"string"}},"required":["id","name"],"title":"OktaDirectory","type":"object"},"OktaDirectoryListResponse":{"description":"Response schema for multiple Okta Directories","example":{"data":[{"id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","name":"Okta"}]},"properties":{"data":{"description":"Okta Directory details","items":{"$ref":"#/components/schemas/OktaDirectory"},"type":"array"}},"title":"OktaDirectoryListResponse","type":"object"},"PaginationMetadata":{"description":"Pagination metadata for paginated responses.","example":{"count":1,"limit":10,"next_page":null,"prev_page":null},"properties":{"count":{"description":"Total number of matching records","type":"integer"},"limit":{"description":"Page size","type":"integer"},"next_page":{"description":"Cursor to fetch the next page","nullable":true,"type":"string"},"prev_page":{"description":"Cursor to fetch the previous page","nullable":true,"type":"string"}},"required":["count","limit","next_page","prev_page"],"title":"PaginationMetadata","type":"object"},"OktaAuthProviderResponse":{"description":"Response schema for single Okta Auth Provider","example":{"data":{"id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","name":"Okta"}},"properties":{"data":{"$ref":"#/components/schemas/OktaAuthProvider"}},"title":"OktaAuthProviderResponse","type":"object"},"Subject":{"description":"Identifies the actor and request context that initiated an action.\n\nUsed to describe the principal behind an audit log entry, an authorized\nflow, or any other event surfaced through the API. May be `null` when\nthe action originated outside the context of a Firezone session.\n","example":{"actor_email":"admin@example.com","actor_id":"84e7f82f-831a-4a9d-8f17-c66c2bb6e205","actor_name":"Admin User","actor_type":"account_admin_user","auth_provider_id":"98776234-1234-5678-9012-345678901234","ip":"1.2.3.4","ip_city":"San Francisco","ip_lat":37.7749,"ip_lon":-122.4194,"ip_region":"California","user_agent":"Mozilla/5.0"},"nullable":true,"properties":{"actor_email":{"description":"Email address of the actor, if any.","nullable":true,"type":"string"},"actor_id":{"description":"Identifier of the actor that initiated the action.","format":"uuid","type":"string"},"actor_name":{"description":"Display name of the actor.","type":"string"},"actor_type":{"description":"Type of the actor.","enum":["account_user","account_admin_user","service_account","api_client"],"type":"string"},"auth_provider_id":{"description":"Identifier of the authentication provider that authenticated the actor.","format":"uuid","nullable":true,"type":"string"},"ip":{"description":"IP address the action originated from.","nullable":true,"type":"string"},"ip_city":{"description":"Geo-located city for `ip`, if known.","nullable":true,"type":"string"},"ip_lat":{"description":"Geo-located latitude for `ip`, if known.","nullable":true,"type":"number"},"ip_lon":{"description":"Geo-located longitude for `ip`, if known.","nullable":true,"type":"number"},"ip_region":{"description":"Geo-located region for `ip`, if known.","nullable":true,"type":"string"},"user_agent":{"description":"User agent of the client that initiated the action.","nullable":true,"type":"string"}},"title":"Subject","type":"object"},"ActorsResponse":{"description":"Response schema for multiple Actors","example":{"data":[{"allow_email_otp_sign_in":false,"created_by_directory_id":null,"email":"john.doe@example.com","id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","inserted_at":"2024-01-01T00:00:00Z","is_disabled":false,"last_seen_at":"2024-01-15T10:30:00Z","name":"John Doe","type":"account_admin_user","updated_at":"2024-01-15T10:30:00Z"},{"allow_email_otp_sign_in":true,"created_by_directory_id":"98776234-1234-5678-9012-345678901234","email":"jane.smith@example.com","id":"84e7f82f-831a-4a9d-8f17-c66c2bb6e205","inserted_at":"2024-01-02T00:00:00Z","is_disabled":false,"last_seen_at":"2024-01-14T15:45:00Z","name":"Jane Smith","type":"account_user","updated_at":"2024-01-14T15:45:00Z"}],"metadata":{"limit":10,"next_page":"98776234123","prev_page":"123123425","total":100}},"properties":{"data":{"description":"Actors details","items":{"$ref":"#/components/schemas/Actor"},"type":"array"},"metadata":{"$ref":"#/components/schemas/PaginationMetadata"}},"title":"ActorsResponse","type":"object"},"GoogleAuthProviderResponse":{"description":"Response schema for single Google Auth Provider","example":{"data":{"id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","name":"Google"}},"properties":{"data":{"$ref":"#/components/schemas/GoogleAuthProvider"}},"title":"GoogleAuthProviderResponse","type":"object"},"ActorUpdateRequest":{"description":"PATCH/PUT body for updating an Actor. All fields are optional; omitted fields keep their current value.","example":{"actor":{"allow_email_otp_sign_in":false,"email":"joe.user@example.com","name":"Joe User","type":"account_admin_user"}},"properties":{"actor":{"properties":{"allow_email_otp_sign_in":{"default":false,"description":"Allow Email OTP Sign In","type":"boolean"},"email":{"description":"Actor Email. Optional for service accounts.","nullable":true,"type":"string"},"name":{"description":"Actor Name","pattern":"[a-zA-Z][a-zA-Z0-9_]+","type":"string"},"type":{"description":"Actor Type","enum":["account_user","account_admin_user","service_account"],"type":"string"}},"type":"object"}},"required":["actor"],"title":"ActorUpdateRequest","type":"object"},"MembershipResponse":{"description":"Response schema for Membership Updates","example":{"data":{"actor_ids":["4ddfa557-7dfc-484f-894c-2024ec3fe9f7","89d22f71-939d-442d-b148-897b730adfb4"]}},"properties":{"data":{"description":"Memberships","properties":{"actor_ids":{"description":"Actor IDs","items":{"description":"Actor ID","format":"uuid","type":"string"},"type":"array"}},"type":"object"}},"title":"MembershipResponse","type":"object"},"MembershipListResponse":{"description":"Response schema for Memberships","example":{"data":[{"id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","name":"John Doe","type":"account_user"},{"id":"cc9f561a-444d-4083-ab38-0abc6cf2314c","name":"Jane Smith","type":"account_admin_user"}],"metadata":{"limit":10,"next_page":"98776234123","prev_page":"123123425","total":100}},"properties":{"data":{"description":"Membership details","items":{"$ref":"#/components/schemas/Membership"},"type":"array"},"metadata":{"$ref":"#/components/schemas/PaginationMetadata"}},"title":"MembershipListResponse","type":"object"},"Actor":{"description":"Actor","example":{"allow_email_otp_sign_in":false,"created_by_directory_id":null,"email":"john.doe@example.com","id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","inserted_at":"2024-01-01T00:00:00Z","is_disabled":false,"last_seen_at":"2024-01-15T10:30:00Z","name":"John Doe","type":"account_admin_user","updated_at":"2024-01-15T10:30:00Z"},"properties":{"allow_email_otp_sign_in":{"default":false,"description":"Allow Email OTP Sign In","type":"boolean"},"created_by_directory_id":{"description":"Directory ID that created this actor","format":"uuid","nullable":true,"type":"string"},"email":{"description":"Actor Email","nullable":true,"type":"string"},"id":{"description":"Actor ID","format":"uuid","type":"string"},"inserted_at":{"description":"When the actor was created","format":"date-time","type":"string"},"is_disabled":{"default":false,"description":"Whether the actor is disabled","type":"boolean"},"last_seen_at":{"description":"Last time the actor was seen","format":"date-time","nullable":true,"type":"string"},"name":{"description":"Actor Name","pattern":"[a-zA-Z][a-zA-Z0-9_]+","type":"string"},"type":{"description":"Actor Type","type":"string"},"updated_at":{"description":"When the actor was last updated","format":"date-time","type":"string"}},"required":["name","email","type"],"title":"Actor","type":"object"},"DeletedGatewayTokensResponse":{"description":"Response schema for deleted Gateway Tokens","example":{"data":{"deleted_count":5}},"properties":{"data":{"properties":{"deleted_count":{"description":"Number of tokens that were deleted","type":"integer"}},"required":["deleted_count"],"type":"object"}},"title":"DeletedGatewayTokensResponse","type":"object"},"PolicyUpdateParams":{"description":"Policy attributes accepted when updating a Policy. All fields are optional; omitted fields keep their current value.","example":{"conditions":[{"operator":"is_in_cidr","property":"remote_ip","values":["10.0.0.0/8"]}],"description":"Updated description"},"properties":{"conditions":{"description":"Conditions that must be satisfied for the Policy to grant access","items":{"$ref":"#/components/schemas/PolicyCondition"},"type":"array"},"description":{"description":"Policy Description","nullable":true,"type":"string"},"flow_log_uploads_enabled":{"description":"Whether flow logs are reported for connections authorized by this Policy. Always false for Internet Resource policies.","type":"boolean"},"group_id":{"description":"Group ID","format":"uuid","type":"string"},"resource_id":{"description":"Resource ID","format":"uuid","type":"string"}},"title":"PolicyUpdateParams","type":"object"},"Resource":{"description":"Resource","example":{"address":"10.0.0.10","address_description":"Production Database","filters":[{"ports":["5432"],"protocol":"tcp"}],"id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","name":"Prod DB","site_id":"0642e09d-b3a2-47e4-9cd1-c2195faeeb67","type":"ip"},"properties":{"address":{"description":"Resource address","type":"string"},"address_description":{"description":"Resource address description","type":"string"},"filters":{"description":"Traffic filters restricting the protocols and ports the Resource exposes","items":{"$ref":"#/components/schemas/ResourceFilter"},"type":"array"},"id":{"description":"Resource ID","format":"uuid","type":"string"},"ip_stack":{"description":"IP stack type. Only supported for DNS resources.","enum":["ipv4_only","ipv6_only","dual"],"type":"string"},"name":{"description":"Resource name","type":"string"},"site_id":{"description":"Site to connect the Resource to. Required for all types except `static_device_pool`.","format":"uuid","title":"SiteID","type":"string"},"type":{"description":"Resource type. For `static_device_pool`, `address` is not applicable.","enum":["cidr","ip","dns","static_device_pool"],"type":"string"}},"required":["name","type"],"title":"Resource","type":"object"},"ClientTokenCreate":{"description":"Client Token attributes","example":{"expires_at":"2025-01-15T12:34:56.789Z"},"properties":{"expires_at":{"description":"Expiration","format":"date-time","type":"string"}},"required":["expires_at"],"title":"ClientTokenCreate","type":"object"},"EntraDirectory":{"description":"Entra Directory","example":{"id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","name":"Entra","tenant_id":"12345678-1234-1234-1234-123456789012"},"properties":{"account_id":{"description":"Account ID","format":"uuid","type":"string"},"disabled_reason":{"description":"Reason for disabling","type":"string"},"email_field":{"description":"Graph API user field to use as email","enum":["mail","userPrincipalName"],"type":"string"},"error":{"description":"Last error message","type":"string"},"error_count":{"description":"Error count","type":"integer"},"error_emailed_at":{"description":"Error email timestamp","format":"date-time","type":"string"},"id":{"description":"Directory ID","format":"uuid","type":"string"},"inserted_at":{"description":"Creation timestamp","format":"date-time","type":"string"},"is_disabled":{"description":"Whether directory is disabled","type":"boolean"},"name":{"description":"Directory name","type":"string"},"sync_all_groups":{"description":"Sync all groups","type":"boolean"},"synced_at":{"description":"Last sync timestamp","format":"date-time","type":"string"},"tenant_id":{"description":"Microsoft Entra tenant ID","format":"uuid","type":"string"},"updated_at":{"description":"Update timestamp","format":"date-time","type":"string"}},"required":["id","name"],"title":"EntraDirectory","type":"object"},"LogsResponse":{"description":"Response schema for a page of Log entries.\n\nEntries are returned most recent first. Each page contains at most 100\nentries (50 by default); use the `metadata.next_page` cursor to fetch\nthe following page.\n","example":{"data":[{"after":{"name":"Jane Smith"},"before":{"name":"Jane Doe"},"log_id":"c00060db0c2c8eb400000000","object":"actors","operation":"update","subject":null,"timestamp":"2026-05-26T12:34:56.789Z","type":"change"}],"metadata":{"count":1,"limit":50,"next_page":null,"prev_page":null}},"properties":{"data":{"description":"Log entries for the requested window.","items":{"$ref":"#/components/schemas/Log"},"type":"array"},"metadata":{"description":"Pagination metadata","type":"object"}},"title":"LogsResponse","type":"object"},"Client":{"description":"Client","example":{"actor_id":"6ecc106b-75c1-48a5-846c-14782180c1ff","created_at":"2025-01-01T00:00:00Z","device_serial":"GCCFX0DBQ6L5","device_uuid":"7A461FF9-0BE2-64A9-A418-539D9A21827B","firebase_installation_id":null,"firezone_id":"b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c","hostname":"johns-macbook.example.com","id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","identifier_for_vendor":null,"ipv4":"100.64.0.1","ipv6":"fd00:2021:1111::1","last_attested_at":"2025-01-01T00:00:00Z","last_attested_cert_fingerprint":"9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08","last_attested_cert_serial":"4A:2F:00:8C:11:03:9E:5B","last_attested_device_serial":"GCCFX0DBQ6L5","last_attested_device_uuid":"7A461FF9-0BE2-64A9-A418-539D9A21827B","last_attested_mdm_device_id":"5f2e7b7a-9d54-4bd2-9d4f-8f6c2a01f9d3","last_seen_at":"2025-01-01T00:00:00Z","last_seen_remote_ip":"203.0.113.10","last_seen_remote_ip_location_city":"New York","last_seen_remote_ip_location_lat":40.7128,"last_seen_remote_ip_location_lon":-74.006,"last_seen_remote_ip_location_region":"US","last_seen_user_agent":"macOS/14.0 apple-client/1.5.0","last_seen_version":"1.5.0","name":"John's Macbook Air","online":true,"public_key":"WdKAyoA45xJllRUYnFhI5+Y4EjSTs50MzYYHfrIhVAc=","updated_at":"2025-01-01T00:00:00Z","verified_at":"2025-01-01T00:00:00Z"},"properties":{"actor_id":{"description":"Actor ID","format":"uuid","type":"string"},"created_at":{"description":"Client creation timestamp","type":"string"},"device_serial":{"description":"Device manufacturer serial number (unavailable for mobile devices)","type":"string"},"device_uuid":{"description":"Device manufacturer UUID (unavailable for mobile devices)","format":"uuid","type":"string"},"firebase_installation_id":{"description":"Firebase installation ID (Android only)","type":"string"},"firezone_id":{"description":"Firezone ID","type":"string"},"hostname":{"description":"Client hostname (FQDN used for dynamic device pool DNS resolution)","nullable":true,"type":"string"},"id":{"description":"Client ID","format":"uuid","type":"string"},"identifier_for_vendor":{"description":"App installation ID (iOS only)","type":"string"},"ipv4":{"description":"Tunnel IPv4 Address of Client","type":"string"},"ipv6":{"description":"Tunnel IPv6 Address of Client","type":"string"},"last_attested_at":{"description":"When the device last proved possession of an MDM-provisioned client certificate","nullable":true,"readOnly":true,"type":"string"},"last_attested_cert_fingerprint":{"description":"SHA-256 fingerprint of the client certificate used for device verification","nullable":true,"readOnly":true,"type":"string"},"last_attested_cert_serial":{"description":"Serial number of the client certificate used for device verification","nullable":true,"readOnly":true,"type":"string"},"last_attested_device_serial":{"description":"Device serial number attested by an MDM-provisioned client certificate","nullable":true,"readOnly":true,"type":"string"},"last_attested_device_uuid":{"description":"Device UUID attested by an MDM-provisioned client certificate","nullable":true,"readOnly":true,"type":"string"},"last_attested_mdm_device_id":{"description":"MDM device ID attested by an MDM-provisioned client certificate","nullable":true,"readOnly":true,"type":"string"},"last_seen_at":{"description":"Timestamp of the latest connection","nullable":true,"type":"string"},"last_seen_remote_ip":{"description":"Remote IP from the latest session","nullable":true,"type":"string"},"last_seen_remote_ip_location_city":{"description":"Remote IP city from the latest session","nullable":true,"type":"string"},"last_seen_remote_ip_location_lat":{"description":"Remote IP latitude from the latest session","nullable":true,"type":"number"},"last_seen_remote_ip_location_lon":{"description":"Remote IP longitude from the latest session","nullable":true,"type":"number"},"last_seen_remote_ip_location_region":{"description":"Remote IP region from the latest session","nullable":true,"type":"string"},"last_seen_user_agent":{"description":"User agent from the latest session","nullable":true,"type":"string"},"last_seen_version":{"description":"Client version from the latest session","nullable":true,"type":"string"},"name":{"description":"Client Name","type":"string"},"online":{"description":"Online status of Client","type":"boolean"},"public_key":{"description":"WireGuard public key from the latest session","nullable":true,"type":"string"},"updated_at":{"description":"Client update timestamp","type":"string"},"verified_at":{"description":"Client verification timestamp","type":"string"}},"required":["id","actor_id","firezone_id","name","ipv4","ipv6","online","created_at","updated_at"],"title":"Client","type":"object"},"ClientTokenResponse":{"description":"Client Token response","example":{"actor_id":"43a7f82f-831a-4a9d-8f17-c66c2bb6e205","expires_at":"2025-01-15T12:34:56.789Z","id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","inserted_at":"2025-01-15T12:34:56.789Z","token":"secret-token-here","updated_at":"2025-01-15T12:34:56.789Z"},"properties":{"actor_id":{"description":"Actor ID","format":"uuid","type":"string"},"expires_at":{"description":"Expiration","format":"date-time","type":"string"},"id":{"description":"Client Token ID","format":"uuid","type":"string"},"inserted_at":{"description":"Creation timestamp","format":"date-time","type":"string"},"token":{"description":"Encoded token secret","type":"string"},"updated_at":{"description":"Update timestamp","format":"date-time","type":"string"}},"required":["id","actor_id","expires_at","inserted_at","updated_at","token"],"title":"ClientTokenResponse","type":"object"},"EmailOTPAuthProviderResponse":{"description":"Response schema for single Email OTP Auth Provider","example":{"data":{"id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","name":"Email OTP"}},"properties":{"data":{"$ref":"#/components/schemas/EmailOTPAuthProvider"}},"title":"EmailOTPAuthProviderResponse","type":"object"},"EntraDirectoryListResponse":{"description":"Response schema for multiple Entra Directories","example":{"data":[{"id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","name":"Entra"}]},"properties":{"data":{"description":"Entra Directory details","items":{"$ref":"#/components/schemas/EntraDirectory"},"type":"array"}},"title":"EntraDirectoryListResponse","type":"object"},"PolicyUpdateRequest":{"description":"PUT/PATCH body for updating a Policy","example":{"policy":{"conditions":[{"operator":"is_in_cidr","property":"remote_ip","values":["10.0.0.0/8"]}],"description":"Updated description"}},"properties":{"policy":{"$ref":"#/components/schemas/PolicyUpdateParams"}},"required":["policy"],"title":"PolicyUpdateRequest","type":"object"},"OIDCAuthProviderListResponse":{"description":"Response schema for multiple OIDC Auth Providers","example":{"data":[{"email_verification_method":"claim","id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","name":"OIDC Provider"}]},"properties":{"data":{"description":"OIDC Auth Provider details","items":{"$ref":"#/components/schemas/OIDCAuthProvider"},"type":"array"}},"title":"OIDCAuthProviderListResponse","type":"object"},"Gateway":{"description":"Gateway","example":{"id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","ipv4":"100.64.0.1","ipv6":"fd00:2021:1111::1","last_seen_at":"2025-01-01T00:00:00Z","last_seen_remote_ip":"198.51.100.10","last_seen_remote_ip_location_city":"San Francisco","last_seen_remote_ip_location_lat":37.7749,"last_seen_remote_ip_location_lon":-122.4194,"last_seen_remote_ip_location_region":"US-CA","last_seen_user_agent":"Linux/6.1.0 connlib/1.5.0","last_seen_version":"1.5.0","name":"vpc-us-east","online":true,"public_key":"WdKAyoA45xJllRUYnFhI5+Y4EjSTs50MzYYHfrIhVAc="},"properties":{"id":{"description":"Gateway ID","format":"uuid","type":"string"},"ipv4":{"description":"IPv4 Address of Gateway","type":"string"},"ipv6":{"description":"IPv6 Address of Gateway","type":"string"},"last_seen_at":{"description":"Timestamp of the latest connection","nullable":true,"type":"string"},"last_seen_remote_ip":{"description":"Remote IP from the latest session","nullable":true,"type":"string"},"last_seen_remote_ip_location_city":{"description":"Remote IP city from the latest session","nullable":true,"type":"string"},"last_seen_remote_ip_location_lat":{"description":"Remote IP latitude from the latest session","nullable":true,"type":"number"},"last_seen_remote_ip_location_lon":{"description":"Remote IP longitude from the latest session","nullable":true,"type":"number"},"last_seen_remote_ip_location_region":{"description":"Remote IP region from the latest session","nullable":true,"type":"string"},"last_seen_user_agent":{"description":"User agent from the latest session","nullable":true,"type":"string"},"last_seen_version":{"description":"Gateway version from the latest session","nullable":true,"type":"string"},"name":{"description":"Gateway Name","pattern":"[a-zA-Z][a-zA-Z0-9_]+","type":"string"},"online":{"description":"Online status of Gateway","type":"boolean"},"public_key":{"description":"WireGuard public key from the latest session","nullable":true,"type":"string"}},"required":["id","name","ipv4","ipv6","online"],"title":"Gateway","type":"object"},"GatewayToken":{"description":"Gateway Token","example":{"id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","token":"secret-token-here"},"properties":{"id":{"description":"Gateway Token ID","format":"uuid","type":"string"},"token":{"description":"Gateway Token","type":"string"}},"required":["id","token"],"title":"GatewayToken","type":"object"},"SiteID":{"description":"Site to connect the Resource to. Required for all types except `static_device_pool`. The Internet Site is reserved for the Internet Resource and cannot be used.","format":"uuid","nullable":true,"title":"SiteID","type":"string"},"Group":{"description":"Group","example":{"directory_id":null,"email":null,"entity_type":"group","id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","idp_id":null,"inserted_at":"2024-01-15T10:30:00Z","name":"Engineering","synced_at":null,"updated_at":"2024-01-15T10:30:00Z"},"properties":{"directory_id":{"description":"Directory ID this group belongs to","format":"uuid","nullable":true,"type":"string"},"email":{"description":"Group email address for synced groups","nullable":true,"type":"string"},"entity_type":{"description":"Entity type","enum":["group","org_unit"],"type":"string"},"id":{"description":"Group ID","format":"uuid","type":"string"},"idp_id":{"description":"Identity provider ID for synced groups","nullable":true,"type":"string"},"inserted_at":{"description":"Creation timestamp","format":"date-time","type":"string"},"name":{"description":"Group Name","type":"string"},"synced_at":{"description":"Last sync timestamp for synced groups","format":"date-time","nullable":true,"type":"string"},"updated_at":{"description":"Last update timestamp","format":"date-time","type":"string"}},"required":["id","name","entity_type","inserted_at","updated_at"],"title":"Group","type":"object"},"ProblemDetails":{"description":"RFC 9457 (Problem Details for HTTP APIs) error response.","example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"properties":{"detail":{"description":"Human-readable explanation specific to this occurrence of the problem.","example":"The requested resource could not be found.","type":"string"},"status":{"description":"HTTP status code.","example":404,"type":"integer"},"title":{"description":"Short, human-readable summary of the problem type (the HTTP status phrase).","example":"Not Found","type":"string"},"type":{"description":"URI identifying the problem type. Always \"about:blank\" for now.","example":"about:blank","type":"string"}},"required":["type","title","status"],"title":"ProblemDetails","type":"object"},"ResourceUpdateRequest":{"description":"PATCH/PUT body for updating a Resource. All fields are optional; omitted fields keep their current value.","example":{"resource":{"address":"10.0.0.10","address_description":"Production Database","filters":[{"ports":["5432"],"protocol":"tcp"}],"name":"Prod DB","site_id":"0642e09d-b3a2-47e4-9cd1-c2195faeeb67","type":"ip"}},"properties":{"resource":{"properties":{"address":{"description":"Resource address. Not applicable to `static_device_pool`.","nullable":true,"type":"string"},"address_description":{"description":"Resource address description","nullable":true,"type":"string"},"filters":{"description":"Traffic filters restricting the protocols and ports the Resource exposes","items":{"$ref":"#/components/schemas/ResourceFilter"},"type":"array"},"ip_stack":{"description":"IP stack type. Only supported for DNS resources.","enum":["ipv4_only","ipv6_only","dual"],"nullable":true,"type":"string"},"name":{"description":"Resource name","type":"string"},"site_id":{"description":"Site to connect the Resource to. Required for all types except `static_device_pool`. The Internet Site is reserved for the Internet Resource and cannot be used.","format":"uuid","nullable":true,"title":"SiteID","type":"string"},"type":{"description":"Resource type. For `static_device_pool`, `address` is not applicable.","enum":["cidr","ip","dns","static_device_pool"],"type":"string"}},"type":"object"}},"required":["resource"],"title":"ResourceUpdateRequest","type":"object"},"ResourceFilter":{"description":"Traffic filter restricting the protocols and ports the Resource exposes","example":{"ports":["80","443","8000 - 9000"],"protocol":"tcp"},"properties":{"ports":{"description":"Port numbers or ranges (e.g. `80` or `8000 - 9000`) the filter allows. Not applicable to `icmp`.","items":{"type":"string"},"type":"array"},"protocol":{"description":"Transport protocol the filter applies to","enum":["tcp","udp","icmp"],"type":"string"}},"required":["protocol"],"title":"ResourceFilter","type":"object"},"ActorCreateRequest":{"description":"POST body for creating an Actor","example":{"actor":{"allow_email_otp_sign_in":false,"email":"joe.user@example.com","name":"Joe User","type":"account_admin_user"}},"properties":{"actor":{"properties":{"allow_email_otp_sign_in":{"default":false,"description":"Allow Email OTP Sign In","type":"boolean"},"email":{"description":"Actor Email. Optional for service accounts.","nullable":true,"type":"string"},"name":{"description":"Actor Name","pattern":"[a-zA-Z][a-zA-Z0-9_]+","type":"string"},"type":{"description":"Actor Type","enum":["account_user","account_admin_user","service_account"],"type":"string"}},"required":["name","type"],"type":"object"}},"required":["actor"],"title":"ActorCreateRequest","type":"object"},"MembershipPatchRequest":{"description":"PATCH body for updating Memberships","example":{"memberships":{"add":["1234-1234"],"remove":["2345-2345"]}},"properties":{"memberships":{"properties":{"add":{"description":"Array of Actor IDs","items":{"description":"Actor ID","format":"uuid","type":"string"},"type":"array"},"remove":{"description":"Array of Actor IDs","items":{"description":"Actor ID","format":"uuid","type":"string"},"type":"array"}},"type":"object"}},"required":["memberships"],"title":"MembershipPatchRequest","type":"object"},"LogResponse":{"description":"Response schema for a single Log entry.","properties":{"data":{"$ref":"#/components/schemas/Log"}},"title":"LogResponse","type":"object"},"ClientResponse":{"description":"Response schema for single Client","example":{"data":{"actor_id":"6ecc106b-75c1-48a5-846c-14782180c1ff","created_at":"2025-01-01T00:00:00Z","device_serial":"GCCFX0DBQ6L5","device_uuid":"7A461FF9-0BE2-64A9-A418-539D9A21827B","firebase_installation_id":null,"firezone_id":"b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c","hostname":"johns-macbook.example.com","id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","identifier_for_vendor":null,"ipv4":"100.64.0.1","ipv6":"fd00:2021:1111::1","last_attested_at":"2025-01-01T00:00:00Z","last_attested_cert_fingerprint":"9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08","last_attested_cert_serial":"4A:2F:00:8C:11:03:9E:5B","last_attested_device_serial":"GCCFX0DBQ6L5","last_attested_device_uuid":"7A461FF9-0BE2-64A9-A418-539D9A21827B","last_attested_mdm_device_id":"5f2e7b7a-9d54-4bd2-9d4f-8f6c2a01f9d3","name":"John's Macbook Air","online":true,"updated_at":"2025-01-01T00:00:00Z","verified_at":"2025-01-01T00:00:00Z"}},"properties":{"data":{"$ref":"#/components/schemas/Client"}},"title":"ClientResponse","type":"object"},"Policy":{"description":"Policy","example":{"conditions":[{"operator":"is_in","property":"remote_ip_location_region","values":["US","CA"]}],"description":"Policy to allow something","flow_log_uploads_enabled":true,"group_id":"88eae9ce-9179-48c6-8430-770e38dd4775","id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","resource_id":"a9f60587-793c-46ae-8525-597f43ab2fb1"},"properties":{"conditions":{"description":"Conditions that must be satisfied for the Policy to grant access","items":{"$ref":"#/components/schemas/PolicyCondition"},"type":"array"},"description":{"description":"Policy Description","nullable":true,"type":"string"},"flow_log_uploads_enabled":{"description":"Whether flow logs are reported for connections authorized by this Policy","type":"boolean"},"group_id":{"description":"Group ID. Null if the Group was deleted during directory sync; it is relinked automatically if the Group reappears on a subsequent sync.","format":"uuid","nullable":true,"type":"string"},"id":{"description":"Policy ID","format":"uuid","type":"string"},"resource_id":{"description":"Resource ID","format":"uuid","type":"string"}},"required":["id","group_id","resource_id","description","flow_log_uploads_enabled","conditions"],"title":"Policy","type":"object"},"AccountResponse":{"description":"Response schema for Account","properties":{"data":{"$ref":"#/components/schemas/Account"}},"required":["data"],"title":"AccountResponse","type":"object"},"EmailOTPAuthProvider":{"description":"Email OTP Auth Provider","example":{"id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","issuer":"firezone","name":"Email OTP"},"properties":{"account_id":{"description":"Account ID","format":"uuid","type":"string"},"client_session_lifetime_secs":{"description":"Client session lifetime in seconds","type":"integer"},"context":{"description":"Context","enum":["clients_and_portal","clients_only","portal_only"],"type":"string"},"id":{"description":"Provider ID","format":"uuid","type":"string"},"inserted_at":{"description":"Creation timestamp","format":"date-time","type":"string"},"is_disabled":{"description":"Whether provider is disabled","type":"boolean"},"issuer":{"description":"Issuer","type":"string"},"name":{"description":"Provider name","type":"string"},"portal_session_lifetime_secs":{"description":"Portal session lifetime in seconds","type":"integer"},"updated_at":{"description":"Update timestamp","format":"date-time","type":"string"}},"required":["id","name"],"title":"EmailOTPAuthProvider","type":"object"},"PolicyCondition":{"description":"A condition that must be satisfied for the Policy to grant access.\n\nAll conditions on a Policy must evaluate to true for access to be\ngranted. A condition is made up of a `property`, an `operator`, and a\nlist of `values`. The valid operators and the meaning of `values`\ndepend on the `property`:\n\n* `remote_ip_location_region` with `is_in` / `is_not_in`: `values` are\n  ISO 3166-1 alpha-2 country codes, e.g. `[\"US\", \"CA\"]`.\n* `remote_ip` with `is_in_cidr` / `is_not_in_cidr`: `values` are CIDR\n  ranges (IPv4 or IPv6), e.g. `[\"10.0.0.0/8\", \"2607:f8b0::/32\"]`.\n* `auth_provider_id` with `is_in` / `is_not_in`: `values` are\n  authentication provider IDs (UUIDs).\n* `current_utc_datetime` with `is_in_day_of_week_time_ranges`: each\n  value is a `DAY/TIME_RANGES/TIMEZONE` string where `DAY` is one of\n  `M T W R F S U` (Monday through Sunday), `TIME_RANGES` is a\n  comma-separated list of `HH:MM-HH:MM` ranges, and `TIMEZONE` is an\n  IANA timezone name, e.g. `\"M/09:00-17:00/America/New_York\"`.\n* `client_verified` with `is`: `values` is a single-element list\n  containing `\"true\"` or `\"false\"`.\n","example":{"operator":"is_in","property":"remote_ip_location_region","values":["US","CA"]},"properties":{"operator":{"description":"How the values are compared against the property","enum":["is_in","is_not_in","is_in_cidr","is_not_in_cidr","is_in_day_of_week_time_ranges","is"],"type":"string"},"property":{"description":"The attribute of the connection being matched against","enum":["remote_ip_location_region","remote_ip","auth_provider_id","current_utc_datetime","client_verified"],"type":"string"},"values":{"description":"The values to compare against, interpreted per the property","items":{"type":"string"},"type":"array"}},"required":["property","operator","values"],"title":"PolicyCondition","type":"object"},"ValidationProblemDetails":{"description":"RFC 9457 error response for request validation failures. The `validation_errors` member maps each invalid field to a list of human-readable messages.","example":{"detail":"The request body failed validation.","status":422,"title":"Unprocessable Content","type":"about:blank","validation_errors":{"name":["can't be blank"]}},"properties":{"detail":{"example":"The request body failed validation.","type":"string"},"status":{"example":422,"type":"integer"},"title":{"example":"Unprocessable Content","type":"string"},"type":{"example":"about:blank","type":"string"},"validation_errors":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"description":"Map of field name to a list of validation error messages.","type":"object"}},"required":["type","title","status","validation_errors"],"title":"ValidationProblemDetails","type":"object"},"Account":{"description":"Account schema","properties":{"id":{"description":"Account ID","format":"uuid","type":"string"},"key":{"description":"6-character account key","maxLength":6,"minLength":6,"type":"string"},"legal_name":{"description":"Account legal name","type":"string"},"limits":{"$ref":"#/components/schemas/AccountLimits"},"name":{"description":"Account name","type":"string"},"slug":{"description":"Account slug","type":"string"}},"required":["id","slug","key","name"],"title":"Account","type":"object"},"AccountLimits":{"description":"Account limits and usage information","properties":{"account_admin_users":{"$ref":"#/components/schemas/AccountLimit"},"monthly_active_users":{"$ref":"#/components/schemas/AccountLimit"},"service_accounts":{"$ref":"#/components/schemas/AccountLimit"},"sites":{"$ref":"#/components/schemas/AccountLimit"},"users":{"$ref":"#/components/schemas/AccountLimit"}},"title":"AccountLimits","type":"object"},"GoogleAuthProvider":{"description":"Google Auth Provider","example":{"id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","issuer":"https://accounts.google.com","name":"Google"},"properties":{"account_id":{"description":"Account ID","format":"uuid","type":"string"},"client_session_lifetime_secs":{"description":"Client session lifetime in seconds","type":"integer"},"context":{"description":"Context","enum":["clients_and_portal","clients_only","portal_only"],"type":"string"},"id":{"description":"Provider ID","format":"uuid","type":"string"},"inserted_at":{"description":"Creation timestamp","format":"date-time","type":"string"},"is_default":{"description":"Whether provider is default","type":"boolean"},"is_disabled":{"description":"Whether provider is disabled","type":"boolean"},"issuer":{"description":"Issuer","type":"string"},"name":{"description":"Provider name","type":"string"},"portal_session_lifetime_secs":{"description":"Portal session lifetime in seconds","type":"integer"},"updated_at":{"description":"Update timestamp","format":"date-time","type":"string"}},"required":["id","name"],"title":"GoogleAuthProvider","type":"object"},"GroupUpdateRequest":{"description":"PATCH/PUT body for updating a Group. All fields are optional; omitted fields keep their current value.","example":{"group":{"name":"Engineering"}},"properties":{"group":{"properties":{"name":{"description":"Group Name","type":"string"}},"type":"object"}},"required":["group"],"title":"GroupUpdateRequest","type":"object"},"APIRequestLog":{"description":"A single API Request Log entry, recording one authenticated REST API\nrequest.\n","example":{"actor_id":"84e7f82f-831a-4a9d-8f17-c66c2bb6e205","api_token_id":"44e7f82f-831a-4a9d-8f17-c66c2bb6e205","content_length":null,"ip":"189.172.73.1","ip_city":"Mexico City","ip_lat":19.4326,"ip_lon":-99.1332,"ip_region":"MX","log_id":"a00060db0c2c8eb400000000","method":"GET","path":"/clients","request_id":"GBKkV1jUWuW2sJoAACkB","timestamp":"2026-05-26T12:34:56.789Z","type":"api_request","user_agent":"curl/8.7.1"},"properties":{"actor_id":{"description":"ID of the API Client actor.","type":"string"},"api_token_id":{"description":"ID of the API token used.","type":"string"},"content_length":{"description":"Value of the Content-Length request header, when present.","nullable":true,"type":"integer"},"ip":{"type":"string"},"ip_city":{"nullable":true,"type":"string"},"ip_lat":{"nullable":true,"type":"number"},"ip_lon":{"nullable":true,"type":"number"},"ip_region":{"nullable":true,"type":"string"},"log_id":{"description":"Opaque identifier for the API Request Log entry. A 24-character\nlowercase hexadecimal string starting with `a`.\n","example":"a00060db0c2c8eb400000000","type":"string"},"method":{"description":"HTTP request method.","example":"GET","type":"string"},"path":{"description":"HTTP request path.","example":"/clients","type":"string"},"request_id":{"description":"Request ID assigned by the server, for correlating with server logs.","type":"string"},"timestamp":{"description":"RFC 3339 timestamp identifying when the request was received.","format":"date-time","type":"string"},"type":{"enum":["api_request"],"type":"string"},"user_agent":{"nullable":true,"type":"string"}},"required":["type","log_id","timestamp","actor_id","api_token_id","method","path","request_id","ip"],"title":"APIRequestLog","type":"object"},"SiteUpdateRequest":{"description":"PATCH/PUT body for updating a Site. All fields are optional; omitted fields keep their current value.","example":{"site":{"name":"vpc-us-east"}},"properties":{"site":{"properties":{"name":{"description":"Site Name","type":"string"}},"type":"object"}},"required":["site"],"title":"SiteUpdateRequest","type":"object"},"FlowLog":{"description":"A single Flow Log entry, recording one network flow as accounted by one\nof its two endpoints.\n\nBoth endpoints of a flow report it independently, so a flow yields up to\ntwo entries that differ only in `role` and in the counters each side\nobserved. Every other field is oriented from the initiator regardless of\nwhich side reported the entry: `inner_src_*` and `outer_src_*` are always\nthe initiator, `inner_dst_*` and `outer_dst_*` always the responder, and\n`tx_*` always counts initiator-to-responder traffic. Comparing the two\nentries of a flow is how reported traffic is cross-checked.\n","example":{"flow_end":"2026-05-26T12:34:00.000Z","flow_start":"2026-05-26T12:30:00.000Z","initiator_actor_email":"user@example.com","initiator_device_id":"11e7f82f-831a-4a9d-8f17-c66c2bb6e205","inner_dst_ip":"10.0.0.5","inner_dst_port":443,"inner_src_ip":"100.64.0.1","inner_src_port":54321,"last_packet":"2026-05-26T12:33:58.000Z","log_id":"f00060db0c2c8eb400000000","outer_dst_ip":"198.51.100.5","outer_dst_port":51820,"outer_src_ip":"203.0.113.10","outer_src_port":51820,"protocol":"tcp","resource_address":"gitlab.company.com","resource_id":"44e7f82f-831a-4a9d-8f17-c66c2bb6e205","resource_name":"GitLab","responder_device_id":"9d3a1c40-5f2b-4c8e-9a71-0b6d4e2f8c13","role":"responder","rx_bytes":102400,"rx_packets":100,"timestamp":"2026-05-26T12:34:56.789Z","tx_bytes":20480,"tx_packets":80,"type":"flow"},"properties":{"flow_end":{"description":"RFC 3339 timestamp of when the flow ended.","format":"date-time","type":"string"},"flow_start":{"description":"RFC 3339 timestamp of when the flow began. The `begin`/`end`\nwindow matches flows whose [`flow_start`, `flow_end`) range\noverlaps it.\n","format":"date-time","type":"string"},"initiator_actor_email":{"nullable":true,"type":"string"},"initiator_actor_id":{"description":"ID of the Actor who opened the flow. This is always the initiating\nClient's Actor. A Gateway has no Actor, and for device-to-device\nflows the receiving Client's own Actor is not recorded here.\n","nullable":true,"type":"string"},"initiator_actor_name":{"nullable":true,"type":"string"},"initiator_auth_provider_id":{"description":"ID of the Auth Provider the initiating Client authenticated with.\n","nullable":true,"type":"string"},"initiator_device_id":{"description":"ID of the Client that opened the flow. Always a Client.","type":"string"},"inner_domain":{"description":"Domain name for flows to DNS Resources.","nullable":true,"type":"string"},"inner_dst_ip":{"description":"Tunnel IP of the responder, on both entries of the flow.","type":"string"},"inner_dst_port":{"type":"integer"},"inner_src_ip":{"description":"Tunnel IP of the initiator, on both entries of the flow.","type":"string"},"inner_src_port":{"type":"integer"},"last_packet":{"description":"When the last packet of the flow was seen.","format":"date-time","type":"string"},"log_id":{"description":"Opaque identifier for the Flow Log entry. A 24-character lowercase\nhexadecimal string starting with `f`.\n","example":"f00060db0c2c8eb400000000","type":"string"},"outer_dst_ip":{"description":"WireGuard endpoint IP of the responder, on both entries of the flow.\n","type":"string"},"outer_dst_port":{"type":"integer"},"outer_src_ip":{"description":"WireGuard endpoint IP of the initiator, on both entries of the flow.\n","type":"string"},"outer_src_port":{"type":"integer"},"protocol":{"description":"Transport protocol of the flow.","enum":["tcp","udp"],"type":"string"},"resource_address":{"type":"string"},"resource_id":{"description":"ID of the Resource accessed.","type":"string"},"resource_name":{"type":"string"},"responder_device_id":{"description":"ID of the device the flow was opened to: the Gateway serving the\nResource, or the receiving Client for device-to-device flows.\n","type":"string"},"role":{"description":"Which of the two endpoints reported this entry: `initiator` means\n`initiator_device_id` wrote it, `responder` means\n`responder_device_id` did. Gateways always report `responder`;\nClients report either role.\n","enum":["initiator","responder"],"type":"string"},"rx_bytes":{"description":"Bytes sent responder-to-initiator, as counted by the reporting side.","type":"integer"},"rx_packets":{"description":"Packets sent responder-to-initiator, as counted by the reporting side.","type":"integer"},"timestamp":{"description":"RFC 3339 timestamp identifying when the flow was ingested.","format":"date-time","type":"string"},"tx_bytes":{"description":"Bytes sent initiator-to-responder, as counted by the reporting side.","type":"integer"},"tx_packets":{"description":"Packets sent initiator-to-responder, as counted by the reporting side.","type":"integer"},"type":{"enum":["flow"],"type":"string"}},"required":["type","log_id","timestamp","initiator_device_id","responder_device_id","role","protocol","flow_start","flow_end","last_packet","resource_id","resource_name","resource_address","inner_src_ip","inner_dst_ip","inner_src_port","inner_dst_port","outer_src_ip","outer_dst_ip","outer_src_port","outer_dst_port","rx_packets","tx_packets","rx_bytes","tx_bytes"],"title":"FlowLog","type":"object"},"SiteListResponse":{"description":"Response schema for multiple Sites","example":{"data":[{"id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","name":"vpc-us-east"},{"id":"6301d7d2-4938-4123-87de-282c01cca656","name":"vpc-us-west"}],"metadata":{"limit":10,"next_page":"98776234123","prev_page":"123123425","total":100}},"properties":{"data":{"description":"Site details","items":{"$ref":"#/components/schemas/Site"},"type":"array"},"metadata":{"$ref":"#/components/schemas/PaginationMetadata"}},"title":"SiteListResponse","type":"object"},"PolicyListResponse":{"description":"Response schema for multiple Policies","example":{"data":[{"conditions":[{"operator":"is_in","property":"remote_ip_location_region","values":["US","CA"]}],"description":"Policy to allow something","flow_log_uploads_enabled":true,"group_id":"88eae9ce-9179-48c6-8430-770e38dd4775","id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","resource_id":"a9f60587-793c-46ae-8525-597f43ab2fb1"},{"conditions":[],"description":"Policy to allow something else","flow_log_uploads_enabled":false,"group_id":"343385a2-5437-4c66-8744-1332421ff736","id":"6301d7d2-4938-4123-87de-282c01cca656","resource_id":"9876bd25-0f6c-48fb-a9fd-196ba9be86e5"}],"metadata":{"limit":10,"next_page":"98776234123","prev_page":"123123425","total":100}},"properties":{"data":{"description":"Policy details","items":{"$ref":"#/components/schemas/Policy"},"type":"array"},"metadata":{"$ref":"#/components/schemas/PaginationMetadata"}},"title":"PolicyListResponse","type":"object"},"EmailOTPAuthProviderListResponse":{"description":"Response schema for multiple Email OTP Auth Providers","example":{"data":[{"id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","name":"Email OTP"}]},"properties":{"data":{"description":"Email OTP Auth Provider details","items":{"$ref":"#/components/schemas/EmailOTPAuthProvider"},"type":"array"}},"title":"EmailOTPAuthProviderListResponse","type":"object"},"SiteCreateRequest":{"description":"POST body for creating a Site","example":{"site":{"name":"vpc-us-east"}},"properties":{"site":{"properties":{"name":{"description":"Site Name","type":"string"}},"required":["name"],"type":"object"}},"required":["site"],"title":"SiteCreateRequest","type":"object"},"ResourceListResponse":{"description":"Response schema for multiple Resources","example":{"data":[{"address":"10.0.0.10","address_description":"Production Database","id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","name":"Prod DB","site_id":"0642e09d-b3a2-47e4-9cd1-c2195faeeb67","type":"ip"},{"address":"10.0.0.20","address_description":"Production Admin Dashboard","id":"3b9451c9-5616-48f8-827f-009ace22d015","name":"Admin Dashboard","site_id":"0642e09d-b3a2-47e4-9cd1-c2195faeeb67","type":"ip"}],"metadata":{"limit":10,"next_page":"98776234123","prev_page":"123123425","total":100}},"properties":{"data":{"description":"Resource details","items":{"$ref":"#/components/schemas/Resource"},"type":"array"},"metadata":{"$ref":"#/components/schemas/PaginationMetadata"}},"title":"ResourceListResponse","type":"object"},"AccountLimit":{"description":"Account limit with usage information","properties":{"available":{"description":"Remaining available count","type":"integer"},"total":{"description":"Total allowed count","type":"integer"},"used":{"description":"Current usage count","type":"integer"}},"required":["used","available","total"],"title":"AccountLimit","type":"object"},"OIDCAuthProviderResponse":{"description":"Response schema for single OIDC Auth Provider","example":{"data":{"email_verification_method":"claim","id":"42a7f82f-831a-4a9d-8f17-c66c2bb6e205","name":"OIDC Provider"}},"properties":{"data":{"$ref":"#/components/schemas/OIDCAuthProvider"}},"title":"OIDCAuthProviderResponse","type":"object"}},"securitySchemes":{"authorization":{"scheme":"bearer","type":"http"}}},"info":{"title":"Firezone API","version":"1.0"},"openapi":"3.0.0","paths":{"/groups":{"get":{"callbacks":{},"operationId":"PortalAPI.GroupController.index","parameters":[{"description":"Limit Groups returned","example":10,"in":"query","name":"limit","required":false,"schema":{"type":"integer"}},{"description":"Next/Prev page cursor","in":"query","name":"page_cursor","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupListResponse"}}},"description":"Group Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"List Groups","tags":["Groups"]},"post":{"callbacks":{},"operationId":"PortalAPI.GroupController.create","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupCreateRequest"}}},"description":"Group Attributes","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupResponse"}}},"description":"Group Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"422":{"content":{"application/problem+json":{"example":{"detail":"The request body failed validation.","status":422,"title":"Unprocessable Content","type":"about:blank","validation_errors":{"name":["can't be blank"]}},"schema":{"$ref":"#/components/schemas/ValidationProblemDetails"}}},"description":"Unprocessable Content"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Create Group","tags":["Groups"]}},"/actors/{actor_id}/external_identities":{"get":{"callbacks":{},"operationId":"PortalAPI.ExternalIdentityController.index","parameters":[{"description":"Actor ID","in":"path","name":"actor_id","required":true,"schema":{"type":"string"}},{"description":"Limit External Identities returned","in":"query","name":"limit","required":false,"schema":{"type":"integer"}},{"description":"Next/Prev page cursor","in":"query","name":"page_cursor","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExternalIdentityListResponse"}}},"description":"ExternalIdentity List Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"List External Identities for an Actor","tags":["ExternalIdentities"]}},"/clients/{id}":{"delete":{"callbacks":{},"operationId":"PortalAPI.ClientController.delete","parameters":[{"description":"Client ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientResponse"}}},"description":"Client Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Delete a Client","tags":["Clients"]},"get":{"callbacks":{},"operationId":"PortalAPI.ClientController.show","parameters":[{"description":"Client ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientResponse"}}},"description":"Client Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Show Client","tags":["Clients"]},"patch":{"callbacks":{},"operationId":"PortalAPI.ClientController.update (2)","parameters":[{"description":"Client ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientPutRequest"}}},"description":"Client Attributes","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientResponse"}}},"description":"Client Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"422":{"content":{"application/problem+json":{"example":{"detail":"The request body failed validation.","status":422,"title":"Unprocessable Content","type":"about:blank","validation_errors":{"name":["can't be blank"]}},"schema":{"$ref":"#/components/schemas/ValidationProblemDetails"}}},"description":"Unprocessable Content"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Update Client","tags":["Clients"]},"put":{"callbacks":{},"operationId":"PortalAPI.ClientController.update","parameters":[{"description":"Client ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientPutRequest"}}},"description":"Client Attributes","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientResponse"}}},"description":"Client Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"422":{"content":{"application/problem+json":{"example":{"detail":"The request body failed validation.","status":422,"title":"Unprocessable Content","type":"about:blank","validation_errors":{"name":["can't be blank"]}},"schema":{"$ref":"#/components/schemas/ValidationProblemDetails"}}},"description":"Unprocessable Content"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Update Client","tags":["Clients"]}},"/sites/{site_id}/gateways/{id}":{"delete":{"callbacks":{},"operationId":"PortalAPI.GatewayController.delete","parameters":[{"description":"Site ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"site_id","required":true,"schema":{"type":"string"}},{"description":"Gateway ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GatewayResponse"}}},"description":"Gateway Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Delete a Gateway","tags":["Gateways"]},"get":{"callbacks":{},"operationId":"PortalAPI.GatewayController.show","parameters":[{"description":"Site ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"site_id","required":true,"schema":{"type":"string"}},{"description":"Gateway ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GatewayResponse"}}},"description":"Gateway Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Show Gateway","tags":["Gateways"]}},"/oidc_auth_providers":{"get":{"callbacks":{},"operationId":"PortalAPI.OIDCAuthProviderController.index","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OIDCAuthProviderListResponse"}}},"description":"OIDC Auth Provider Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"List OIDC Auth Providers","tags":["OIDC Auth Providers"]}},"/sites/{site_id}/gateway_tokens/{id}":{"delete":{"callbacks":{},"operationId":"PortalAPI.GatewayTokenController.delete","parameters":[{"description":"Site ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"site_id","required":true,"schema":{"type":"string"}},{"description":"Token ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeletedGatewayTokenResponse"}}},"description":"Deleted Token Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Delete a Gateway Token","tags":["Gateway Tokens"]}},"/actors/{id}":{"delete":{"callbacks":{},"operationId":"PortalAPI.ActorController.delete","parameters":[{"description":"Actor ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActorResponse"}}},"description":"ActorResponse"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Delete an Actor","tags":["Actors"]},"get":{"callbacks":{},"operationId":"PortalAPI.ActorController.show","parameters":[{"description":"Actor ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActorResponse"}}},"description":"ActorResponse"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Show Actor","tags":["Actors"]},"patch":{"callbacks":{},"description":"Updates an Actor.\n\n**Warning: changing an Actor's email signs them out and unlinks their identity providers.**\n\nIf the `email` field is changed to a different address, Firezone will:\n\n- Unlink every identity provider (Google, Okta, Entra, etc.) connected to this Actor.\n- End all active sessions for this Actor, both in the admin portal and on\n  connected Client devices. The user will be signed out immediately.\n\nThe Actor will need to sign in again through their identity provider, which\nre-links it under the new email.\n\nEmail comparison ignores case and surrounding whitespace, so changes like\n`User@Example.com` → `user@example.com` are not treated as a real change\nand will not unlink identities.\n","operationId":"PortalAPI.ActorController.update (2)","parameters":[{"description":"Actor ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActorUpdateRequest"}}},"description":"Actor attributes","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActorResponse"}}},"description":"ActorResponse"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"403":{"content":{"application/problem+json":{"example":{"detail":"You do not have permission to perform this action.","status":403,"title":"Forbidden","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Forbidden"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"422":{"content":{"application/problem+json":{"example":{"detail":"The request body failed validation.","status":422,"title":"Unprocessable Content","type":"about:blank","validation_errors":{"name":["can't be blank"]}},"schema":{"$ref":"#/components/schemas/ValidationProblemDetails"}}},"description":"Unprocessable Content"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Update an Actor","tags":["Actors"]},"put":{"callbacks":{},"description":"Updates an Actor.\n\n**Warning: changing an Actor's email signs them out and unlinks their identity providers.**\n\nIf the `email` field is changed to a different address, Firezone will:\n\n- Unlink every identity provider (Google, Okta, Entra, etc.) connected to this Actor.\n- End all active sessions for this Actor, both in the admin portal and on\n  connected Client devices. The user will be signed out immediately.\n\nThe Actor will need to sign in again through their identity provider, which\nre-links it under the new email.\n\nEmail comparison ignores case and surrounding whitespace, so changes like\n`User@Example.com` → `user@example.com` are not treated as a real change\nand will not unlink identities.\n","operationId":"PortalAPI.ActorController.update","parameters":[{"description":"Actor ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActorUpdateRequest"}}},"description":"Actor attributes","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActorResponse"}}},"description":"ActorResponse"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"403":{"content":{"application/problem+json":{"example":{"detail":"You do not have permission to perform this action.","status":403,"title":"Forbidden","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Forbidden"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"422":{"content":{"application/problem+json":{"example":{"detail":"The request body failed validation.","status":422,"title":"Unprocessable Content","type":"about:blank","validation_errors":{"name":["can't be blank"]}},"schema":{"$ref":"#/components/schemas/ValidationProblemDetails"}}},"description":"Unprocessable Content"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Update an Actor","tags":["Actors"]}},"/clients/{id}/verify":{"put":{"callbacks":{},"operationId":"PortalAPI.ClientController.verify","parameters":[{"description":"Client ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientResponse"}}},"description":"Client Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Verify Client","tags":["Clients"]}},"/actors/{actor_id}/client_tokens":{"delete":{"callbacks":{},"operationId":"PortalAPI.ClientTokenController.delete_all","parameters":[{"description":"Actor ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"actor_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeletedClientTokensResponse"}}},"description":"Deleted Client Tokens Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Delete all Client Tokens for service_account, account_user, or account_admin_user actors","tags":["Client Tokens"]},"get":{"callbacks":{},"operationId":"PortalAPI.ClientTokenController.index","parameters":[{"description":"Actor ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"actor_id","required":true,"schema":{"type":"string"}},{"description":"Limit Client Tokens returned","in":"query","name":"limit","required":false,"schema":{"type":"integer"}},{"description":"Next/Prev page cursor","in":"query","name":"page_cursor","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientTokenListResponse"}}},"description":"Client Token List Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"List Client Tokens for service_account, account_user, or account_admin_user actors","tags":["Client Tokens"]},"post":{"callbacks":{},"operationId":"PortalAPI.ClientTokenController.create","parameters":[{"description":"Actor ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"actor_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientTokenRequest"}}},"description":"Client Token Attributes","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientTokenCreateResponse"}}},"description":"Client Token Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"422":{"content":{"application/problem+json":{"example":{"detail":"The request body failed validation.","status":422,"title":"Unprocessable Content","type":"about:blank","validation_errors":{"name":["can't be blank"]}},"schema":{"$ref":"#/components/schemas/ValidationProblemDetails"}}},"description":"Unprocessable Content"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Create a Client Token for a Service Account","tags":["Client Tokens"]}},"/actors/{actor_id}/client_tokens/{id}":{"delete":{"callbacks":{},"operationId":"PortalAPI.ClientTokenController.delete","parameters":[{"description":"Actor ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"actor_id","required":true,"schema":{"type":"string"}},{"description":"Client Token ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeletedClientTokenResponse"}}},"description":"Deleted Client Token Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Delete a Client Token","tags":["Client Tokens"]},"get":{"callbacks":{},"operationId":"PortalAPI.ClientTokenController.show","parameters":[{"description":"Actor ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"actor_id","required":true,"schema":{"type":"string"}},{"description":"Client Token ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientTokenResponse"}}},"description":"Client Token Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Show a Client Token for service_account, account_user, or account_admin_user actors","tags":["Client Tokens"]}},"/email_otp_auth_providers":{"get":{"callbacks":{},"operationId":"PortalAPI.EmailOTPAuthProviderController.index","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailOTPAuthProviderListResponse"}}},"description":"Email OTP Auth Provider Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"List Email OTP Auth Providers","tags":["Email OTP Auth Providers"]}},"/entra_auth_providers":{"get":{"callbacks":{},"operationId":"PortalAPI.EntraAuthProviderController.index","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntraAuthProviderListResponse"}}},"description":"Entra Auth Provider Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"List Entra Auth Providers","tags":["Entra Auth Providers"]}},"/sites":{"get":{"callbacks":{},"operationId":"PortalAPI.SiteController.index","parameters":[{"description":"Limit Sites returned","example":10,"in":"query","name":"limit","required":false,"schema":{"type":"integer"}},{"description":"Next/Prev page cursor","in":"query","name":"page_cursor","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteListResponse"}}},"description":"Site Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"List Sites","tags":["Sites"]},"post":{"callbacks":{},"operationId":"PortalAPI.SiteController.create","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteCreateRequest"}}},"description":"Site Attributes","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteResponse"}}},"description":"Site Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"403":{"content":{"application/problem+json":{"example":{"detail":"You do not have permission to perform this action.","status":403,"title":"Forbidden","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Forbidden"},"422":{"content":{"application/problem+json":{"example":{"detail":"The request body failed validation.","status":422,"title":"Unprocessable Content","type":"about:blank","validation_errors":{"name":["can't be blank"]}},"schema":{"$ref":"#/components/schemas/ValidationProblemDetails"}}},"description":"Unprocessable Content"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Create Site","tags":["Sites"]}},"/sites/{id}":{"delete":{"callbacks":{},"operationId":"PortalAPI.SiteController.delete","parameters":[{"description":"Site ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteResponse"}}},"description":"Site Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"403":{"content":{"application/problem+json":{"example":{"detail":"You do not have permission to perform this action.","status":403,"title":"Forbidden","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Forbidden"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Delete a Site","tags":["Sites"]},"get":{"callbacks":{},"operationId":"PortalAPI.SiteController.show","parameters":[{"description":"Site ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteResponse"}}},"description":"Site Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Show Site","tags":["Sites"]},"patch":{"callbacks":{},"operationId":"PortalAPI.SiteController.update (2)","parameters":[{"description":"Site ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteUpdateRequest"}}},"description":"Site Attributes","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteResponse"}}},"description":"Site Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"403":{"content":{"application/problem+json":{"example":{"detail":"You do not have permission to perform this action.","status":403,"title":"Forbidden","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Forbidden"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"422":{"content":{"application/problem+json":{"example":{"detail":"The request body failed validation.","status":422,"title":"Unprocessable Content","type":"about:blank","validation_errors":{"name":["can't be blank"]}},"schema":{"$ref":"#/components/schemas/ValidationProblemDetails"}}},"description":"Unprocessable Content"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Update a Site","tags":["Sites"]},"put":{"callbacks":{},"operationId":"PortalAPI.SiteController.update","parameters":[{"description":"Site ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteUpdateRequest"}}},"description":"Site Attributes","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteResponse"}}},"description":"Site Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"403":{"content":{"application/problem+json":{"example":{"detail":"You do not have permission to perform this action.","status":403,"title":"Forbidden","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Forbidden"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"422":{"content":{"application/problem+json":{"example":{"detail":"The request body failed validation.","status":422,"title":"Unprocessable Content","type":"about:blank","validation_errors":{"name":["can't be blank"]}},"schema":{"$ref":"#/components/schemas/ValidationProblemDetails"}}},"description":"Unprocessable Content"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Update a Site","tags":["Sites"]}},"/google_auth_providers":{"get":{"callbacks":{},"operationId":"PortalAPI.GoogleAuthProviderController.index","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAuthProviderListResponse"}}},"description":"Google Auth Provider Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"List Google Auth Providers","tags":["Google Auth Providers"]}},"/policies/{id}":{"delete":{"callbacks":{},"operationId":"PortalAPI.PolicyController.delete","parameters":[{"description":"Policy ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PolicyResponse"}}},"description":"Policy Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Delete a Policy","tags":["Policies"]},"get":{"callbacks":{},"operationId":"PortalAPI.PolicyController.show","parameters":[{"description":"Policy ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PolicyResponse"}}},"description":"Policy Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Show Policy","tags":["Policies"]},"patch":{"callbacks":{},"operationId":"PortalAPI.PolicyController.update (2)","parameters":[{"description":"Policy ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PolicyUpdateRequest"}}},"description":"Policy Attributes","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PolicyResponse"}}},"description":"Policy Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"403":{"content":{"application/problem+json":{"example":{"detail":"You do not have permission to perform this action.","status":403,"title":"Forbidden","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Forbidden"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"422":{"content":{"application/problem+json":{"example":{"detail":"The request body failed validation.","status":422,"title":"Unprocessable Content","type":"about:blank","validation_errors":{"name":["can't be blank"]}},"schema":{"$ref":"#/components/schemas/ValidationProblemDetails"}}},"description":"Unprocessable Content"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Update a Policy","tags":["Policies"]},"put":{"callbacks":{},"operationId":"PortalAPI.PolicyController.update","parameters":[{"description":"Policy ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PolicyUpdateRequest"}}},"description":"Policy Attributes","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PolicyResponse"}}},"description":"Policy Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"403":{"content":{"application/problem+json":{"example":{"detail":"You do not have permission to perform this action.","status":403,"title":"Forbidden","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Forbidden"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"422":{"content":{"application/problem+json":{"example":{"detail":"The request body failed validation.","status":422,"title":"Unprocessable Content","type":"about:blank","validation_errors":{"name":["can't be blank"]}},"schema":{"$ref":"#/components/schemas/ValidationProblemDetails"}}},"description":"Unprocessable Content"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Update a Policy","tags":["Policies"]}},"/resources":{"get":{"callbacks":{},"operationId":"PortalAPI.ResourceController.index","parameters":[{"description":"Limit Resources returned","example":10,"in":"query","name":"limit","required":false,"schema":{"type":"integer"}},{"description":"Next/Prev page cursor","in":"query","name":"page_cursor","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceListResponse"}}},"description":"Resource Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"List Resources","tags":["Resources"]},"post":{"callbacks":{},"operationId":"PortalAPI.ResourceController.create","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceCreateRequest"}}},"description":"Resource Attributes","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceResponse"}}},"description":"Resource Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"422":{"content":{"application/problem+json":{"example":{"detail":"The request body failed validation.","status":422,"title":"Unprocessable Content","type":"about:blank","validation_errors":{"name":["can't be blank"]}},"schema":{"$ref":"#/components/schemas/ValidationProblemDetails"}}},"description":"Unprocessable Content"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Create Resource","tags":["Resources"]}},"/actors/{actor_id}/external_identities/{id}":{"delete":{"callbacks":{},"operationId":"PortalAPI.ExternalIdentityController.delete","parameters":[{"description":"Actor ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"actor_id","required":true,"schema":{"type":"string"}},{"description":"External Identity ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExternalIdentityResponse"}}},"description":"ExternalIdentity Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Delete an External Identity","tags":["ExternalIdentities"]},"get":{"callbacks":{},"operationId":"PortalAPI.ExternalIdentityController.show","parameters":[{"description":"Actor ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"actor_id","required":true,"schema":{"type":"string"}},{"description":"External Identity ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExternalIdentityResponse"}}},"description":"ExternalIdentity Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Show External Identity","tags":["ExternalIdentities"]}},"/okta_auth_providers":{"get":{"callbacks":{},"operationId":"PortalAPI.OktaAuthProviderController.index","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OktaAuthProviderListResponse"}}},"description":"Okta Auth Provider Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"List Okta Auth Providers","tags":["Okta Auth Providers"]}},"/groups/{group_id}/memberships":{"get":{"callbacks":{},"operationId":"PortalAPI.MembershipController.index","parameters":[{"description":"ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"group_id","required":true,"schema":{"type":"string"}},{"description":"Limit Memberships returned","example":10,"in":"query","name":"limit","required":false,"schema":{"type":"integer"}},{"description":"Next/Prev page cursor","in":"query","name":"page_cursor","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MembershipListResponse"}}},"description":"Membership Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"List Memberships","tags":["Memberships"]},"patch":{"callbacks":{},"operationId":"PortalAPI.MembershipController.update_patch","parameters":[{"description":"ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"group_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MembershipPatchRequest"}}},"description":"Membership Attributes","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MembershipResponse"}}},"description":"Membership Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"403":{"content":{"application/problem+json":{"example":{"detail":"You do not have permission to perform this action.","status":403,"title":"Forbidden","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Forbidden"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"422":{"content":{"application/problem+json":{"example":{"detail":"The request body failed validation.","status":422,"title":"Unprocessable Content","type":"about:blank","validation_errors":{"name":["can't be blank"]}},"schema":{"$ref":"#/components/schemas/ValidationProblemDetails"}}},"description":"Unprocessable Content"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Update an Membership","tags":["Memberships"]},"put":{"callbacks":{},"operationId":"PortalAPI.MembershipController.update_put","parameters":[{"description":"ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"group_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MembershipPutRequest"}}},"description":"Membership Attributes","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MembershipResponse"}}},"description":"Membership Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"403":{"content":{"application/problem+json":{"example":{"detail":"You do not have permission to perform this action.","status":403,"title":"Forbidden","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Forbidden"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"422":{"content":{"application/problem+json":{"example":{"detail":"The request body failed validation.","status":422,"title":"Unprocessable Content","type":"about:blank","validation_errors":{"name":["can't be blank"]}},"schema":{"$ref":"#/components/schemas/ValidationProblemDetails"}}},"description":"Unprocessable Content"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Update Memberships","tags":["Memberships"]}},"/google_directories":{"get":{"callbacks":{},"operationId":"PortalAPI.GoogleDirectoryController.index","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleDirectoryListResponse"}}},"description":"Google Directory Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"List Google Directories","tags":["Google Directories"]}},"/google_directories/{id}":{"get":{"callbacks":{},"operationId":"PortalAPI.GoogleDirectoryController.show","parameters":[{"description":"Google Directory ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleDirectoryResponse"}}},"description":"Google Directory Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Show Google Directory","tags":["Google Directories"]}},"/clients/{id}/unverify":{"put":{"callbacks":{},"operationId":"PortalAPI.ClientController.unverify","parameters":[{"description":"Client ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientResponse"}}},"description":"Client Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Unverify Client","tags":["Clients"]}},"/resources/{id}":{"delete":{"callbacks":{},"operationId":"PortalAPI.ResourceController.delete","parameters":[{"description":"Resource ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceResponse"}}},"description":"Resource Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"403":{"content":{"application/problem+json":{"example":{"detail":"You do not have permission to perform this action.","status":403,"title":"Forbidden","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Forbidden"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Delete Resource","tags":["Resources"]},"get":{"callbacks":{},"operationId":"PortalAPI.ResourceController.show","parameters":[{"description":"Resource ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceResponse"}}},"description":"Resource Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Show Resource","tags":["Resources"]},"patch":{"callbacks":{},"operationId":"PortalAPI.ResourceController.update (2)","parameters":[{"description":"Resource ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceUpdateRequest"}}},"description":"Resource Attributes","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceResponse"}}},"description":"Resource Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"403":{"content":{"application/problem+json":{"example":{"detail":"You do not have permission to perform this action.","status":403,"title":"Forbidden","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Forbidden"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"422":{"content":{"application/problem+json":{"example":{"detail":"The request body failed validation.","status":422,"title":"Unprocessable Content","type":"about:blank","validation_errors":{"name":["can't be blank"]}},"schema":{"$ref":"#/components/schemas/ValidationProblemDetails"}}},"description":"Unprocessable Content"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Update Resource","tags":["Resources"]},"put":{"callbacks":{},"operationId":"PortalAPI.ResourceController.update","parameters":[{"description":"Resource ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceUpdateRequest"}}},"description":"Resource Attributes","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceResponse"}}},"description":"Resource Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"403":{"content":{"application/problem+json":{"example":{"detail":"You do not have permission to perform this action.","status":403,"title":"Forbidden","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Forbidden"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"422":{"content":{"application/problem+json":{"example":{"detail":"The request body failed validation.","status":422,"title":"Unprocessable Content","type":"about:blank","validation_errors":{"name":["can't be blank"]}},"schema":{"$ref":"#/components/schemas/ValidationProblemDetails"}}},"description":"Unprocessable Content"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Update Resource","tags":["Resources"]}},"/entra_directories":{"get":{"callbacks":{},"operationId":"PortalAPI.EntraDirectoryController.index","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntraDirectoryListResponse"}}},"description":"Entra Directory Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"List Entra Directories","tags":["Entra Directories"]}},"/entra_auth_providers/{id}":{"get":{"callbacks":{},"operationId":"PortalAPI.EntraAuthProviderController.show","parameters":[{"description":"Entra Auth Provider ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntraAuthProviderResponse"}}},"description":"Entra Auth Provider Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Show Entra Auth Provider","tags":["Entra Auth Providers"]}},"/clients":{"get":{"callbacks":{},"operationId":"PortalAPI.ClientController.index","parameters":[{"description":"Limit Clients returned","example":10,"in":"query","name":"limit","required":false,"schema":{"type":"integer"}},{"description":"Next/Prev page cursor","in":"query","name":"page_cursor","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientsResponse"}}},"description":"Client Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"List Clients","tags":["Clients"]}},"/account":{"get":{"callbacks":{},"operationId":"PortalAPI.AccountController.show","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountResponse"}}},"description":"AccountResponse"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Show Account","tags":["Account"]}},"/sites/{site_id}/gateway_tokens":{"delete":{"callbacks":{},"operationId":"PortalAPI.GatewayTokenController.delete_all","parameters":[{"description":"Site ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"site_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeletedGatewayTokensResponse"}}},"description":"Deleted Tokens Response"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Delete all Gateway Tokens for a Site","tags":["Gateway Tokens"]},"post":{"callbacks":{},"deprecated":true,"description":"Deprecated: creates a multi-owner Site token shared by all of a Site's gateways. Prefer creating a single-owner token for a specific gateway via `POST /sites/{site_id}/gateways/{gateway_id}/token`.","operationId":"PortalAPI.GatewayTokenController.create","parameters":[{"description":"Site ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"site_id","required":true,"schema":{"type":"string"}}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GatewayTokenResponse"}}},"description":"New Token Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Create a Gateway Token","tags":["Gateway Tokens"]}},"/entra_directories/{id}":{"get":{"callbacks":{},"operationId":"PortalAPI.EntraDirectoryController.show","parameters":[{"description":"Entra Directory ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntraDirectoryResponse"}}},"description":"Entra Directory Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Show Entra Directory","tags":["Entra Directories"]}},"/email_otp_auth_providers/{id}":{"get":{"callbacks":{},"operationId":"PortalAPI.EmailOTPAuthProviderController.show","parameters":[{"description":"Email OTP Auth Provider ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailOTPAuthProviderResponse"}}},"description":"Email OTP Auth Provider Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Show Email OTP Auth Provider","tags":["Email OTP Auth Providers"]}},"/okta_directories/{id}":{"get":{"callbacks":{},"operationId":"PortalAPI.OktaDirectoryController.show","parameters":[{"description":"Okta Directory ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OktaDirectoryResponse"}}},"description":"Okta Directory Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Show Okta Directory","tags":["Okta Directories"]}},"/groups/{id}":{"delete":{"callbacks":{},"operationId":"PortalAPI.GroupController.delete","parameters":[{"description":"Group ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupResponse"}}},"description":"Group Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Delete a Group","tags":["Groups"]},"get":{"callbacks":{},"operationId":"PortalAPI.GroupController.show","parameters":[{"description":"Group ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupResponse"}}},"description":"Group Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Show Group","tags":["Groups"]},"patch":{"callbacks":{},"operationId":"PortalAPI.GroupController.update (2)","parameters":[{"description":"Group ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupUpdateRequest"}}},"description":"Group Attributes","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupResponse"}}},"description":"Group Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"403":{"content":{"application/problem+json":{"example":{"detail":"You do not have permission to perform this action.","status":403,"title":"Forbidden","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Forbidden"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"422":{"content":{"application/problem+json":{"example":{"detail":"The request body failed validation.","status":422,"title":"Unprocessable Content","type":"about:blank","validation_errors":{"name":["can't be blank"]}},"schema":{"$ref":"#/components/schemas/ValidationProblemDetails"}}},"description":"Unprocessable Content"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Update a Group","tags":["Groups"]},"put":{"callbacks":{},"operationId":"PortalAPI.GroupController.update","parameters":[{"description":"Group ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupUpdateRequest"}}},"description":"Group Attributes","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupResponse"}}},"description":"Group Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"403":{"content":{"application/problem+json":{"example":{"detail":"You do not have permission to perform this action.","status":403,"title":"Forbidden","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Forbidden"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"422":{"content":{"application/problem+json":{"example":{"detail":"The request body failed validation.","status":422,"title":"Unprocessable Content","type":"about:blank","validation_errors":{"name":["can't be blank"]}},"schema":{"$ref":"#/components/schemas/ValidationProblemDetails"}}},"description":"Unprocessable Content"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Update a Group","tags":["Groups"]}},"/logs/{log_id}":{"get":{"callbacks":{},"description":"Fetches a single Log entry by its `log_id`. The entry's type is\ndetermined from the `log_id` itself: its first character identifies\nthe log stream (`c` change, `5` session, `f` flow, `a` api_request).\n","operationId":"PortalAPI.LogController.show","parameters":[{"description":"Identifier of the Log entry. A 24-character lowercase hexadecimal string.","example":"c00060db0c2c8eb400000000","in":"path","name":"log_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogResponse"}}},"description":"Log Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Show Log","tags":["Logs"]}},"/oidc_auth_providers/{id}":{"get":{"callbacks":{},"operationId":"PortalAPI.OIDCAuthProviderController.show","parameters":[{"description":"OIDC Auth Provider ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OIDCAuthProviderResponse"}}},"description":"OIDC Auth Provider Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Show OIDC Auth Provider","tags":["OIDC Auth Providers"]}},"/sites/{site_id}/gateways":{"get":{"callbacks":{},"operationId":"PortalAPI.GatewayController.index","parameters":[{"description":"Site ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"site_id","required":true,"schema":{"type":"string"}},{"description":"Limit Gateways returned","example":10,"in":"query","name":"limit","required":false,"schema":{"type":"integer"}},{"description":"Next/Prev page cursor","in":"query","name":"page_cursor","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GatewaysResponse"}}},"description":"Gateway Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"List Gateways","tags":["Gateways"]}},"/policies":{"get":{"callbacks":{},"operationId":"PortalAPI.PolicyController.index","parameters":[{"description":"Limit Policies returned","example":10,"in":"query","name":"limit","required":false,"schema":{"type":"integer"}},{"description":"Next/Prev page cursor","in":"query","name":"page_cursor","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PolicyListResponse"}}},"description":"Policy Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"List Policies","tags":["Policies"]},"post":{"callbacks":{},"operationId":"PortalAPI.PolicyController.create","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PolicyCreateRequest"}}},"description":"Policy Attributes","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PolicyResponse"}}},"description":"Policy Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"403":{"content":{"application/problem+json":{"example":{"detail":"You do not have permission to perform this action.","status":403,"title":"Forbidden","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Forbidden"},"422":{"content":{"application/problem+json":{"example":{"detail":"The request body failed validation.","status":422,"title":"Unprocessable Content","type":"about:blank","validation_errors":{"name":["can't be blank"]}},"schema":{"$ref":"#/components/schemas/ValidationProblemDetails"}}},"description":"Unprocessable Content"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Create Policy","tags":["Policies"]}},"/logs":{"get":{"callbacks":{},"description":"Lists log entries of the requested `type` for the authenticated account.\n\n- `change`: audit entries recording each insert, update, or delete event\n  against an account-scoped object, most recent first.\n- `session`: one entry per Client, Gateway, or Portal session created,\n  most recent first.\n- `flow`: one entry per network flow reported by Clients and Gateways,\n  most recently started first.\n- `api_request`: one entry per authenticated REST API request, most\n  recent first.\n\nThe `begin` and `end` query parameters bound the time window. For\n`change`, `session`, and `api_request`, entries match when their\n`timestamp` falls inside the window; for `flow`, entries match when\nthe flow was active at any point inside the window, i.e. when\n`[flow_start, flow_end)` overlaps it. Both must be RFC 3339 (ISO\n8601) timestamps, for example `2026-05-26T00:00:00Z`; values with a\nnon-UTC offset are accepted and converted to UTC. When omitted,\n`begin` defaults to 90 days before the current time and `end`\ndefaults to the current time. `begin` must be less than or equal to\n`end`.\n\nResults can be further narrowed by `actor_id` (every type) or\n`actor_email` (`change`, `session`, and `flow`), which matches the\nemail recorded when the entry was created. API requests are made by\nAPI clients, which have no email, so `actor_email` is not supported\nfor `api_request`.\n\nUse the `next_page` cursor returned in `metadata` to fetch the\nfollowing page of results.\n","operationId":"PortalAPI.LogController.index","parameters":[{"description":"The log stream to list. One of `change`, `session`, `flow`, or `api_request`.","example":"change","in":"query","name":"type","required":true,"schema":{"type":"string"}},{"description":"Maximum number of Logs to return per page. Defaults to 50.\nValues greater than 100 are capped to 100, and values less than 1\nare raised to 1.\n","example":50,"in":"query","name":"limit","required":false,"schema":{"type":"integer"}},{"description":"Next/Prev page cursor returned by a previous request.","in":"query","name":"page_cursor","required":false,"schema":{"type":"string"}},{"description":"Inclusive start of the time window. RFC 3339 timestamp; non-UTC\noffsets are accepted and converted to UTC. Defaults to 90 days\nbefore the current time when omitted.\n","example":"2026-02-25T00:00:00Z","in":"query","name":"begin","required":false,"schema":{"type":"string"}},{"description":"Inclusive end of the time window. RFC 3339 timestamp; non-UTC\noffsets are accepted and converted to UTC. Defaults to the current\ntime when omitted.\n","example":"2026-05-26T00:00:00Z","in":"query","name":"end","required":false,"schema":{"type":"string"}},{"description":"Filter to entries whose actor matches.","example":"84e7f82f-831a-4a9d-8f17-c66c2bb6e205","in":"query","name":"actor_id","required":false,"schema":{"type":"string"}},{"description":"Filter to entries whose actor email matches the email recorded\nwhen the entry was created. Supported for `change`, `session`, and\n`flow` types.\n","example":"admin@example.com","in":"query","name":"actor_email","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogsResponse"}}},"description":"Logs Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"List Logs","tags":["Logs"]}},"/actors":{"get":{"callbacks":{},"operationId":"PortalAPI.ActorController.index","parameters":[{"description":"Limit Users returned","example":10,"in":"query","name":"limit","required":false,"schema":{"type":"integer"}},{"description":"Next/Prev page cursor","in":"query","name":"page_cursor","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActorsResponse"}}},"description":"ActorsResponse"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"List Actors","tags":["Actors"]},"post":{"callbacks":{},"operationId":"PortalAPI.ActorController.create","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActorCreateRequest"}}},"description":"Actor attributes","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActorResponse"}}},"description":"ActorResponse"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"403":{"content":{"application/problem+json":{"example":{"detail":"You do not have permission to perform this action.","status":403,"title":"Forbidden","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Forbidden"},"422":{"content":{"application/problem+json":{"example":{"detail":"The request body failed validation.","status":422,"title":"Unprocessable Content","type":"about:blank","validation_errors":{"name":["can't be blank"]}},"schema":{"$ref":"#/components/schemas/ValidationProblemDetails"}}},"description":"Unprocessable Content"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Create an Actor","tags":["Actors"]}},"/okta_directories":{"get":{"callbacks":{},"operationId":"PortalAPI.OktaDirectoryController.index","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OktaDirectoryListResponse"}}},"description":"Okta Directory Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"List Okta Directories","tags":["Okta Directories"]}},"/okta_auth_providers/{id}":{"get":{"callbacks":{},"operationId":"PortalAPI.OktaAuthProviderController.show","parameters":[{"description":"Okta Auth Provider ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OktaAuthProviderResponse"}}},"description":"Okta Auth Provider Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Show Okta Auth Provider","tags":["Okta Auth Providers"]}},"/sites/{site_id}/gateways/{gateway_id}/token/rotate":{"post":{"callbacks":{},"description":"Mints a replacement token for the gateway. A current token the gateway has connected with keeps working until the gateway first connects with the replacement or 4 hours elapse, whichever comes first; a token no gateway has ever connected with is replaced immediately. Rotating again before the gateway picks up the replacement replaces only the pending token and never invalidates the one in use. Once the replacement is confirmed the previous token is deleted - rolling the gateway's configuration back to it will strand the gateway.","operationId":"PortalAPI.GatewayTokenController.rotate","parameters":[{"description":"Site ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"site_id","required":true,"schema":{"type":"string"}},{"description":"Gateway ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"gateway_id","required":true,"schema":{"type":"string"}}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GatewayTokenResponse"}}},"description":"New Token Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Rotate a single-owner Gateway Token","tags":["Gateway Tokens"]}},"/sites/{site_id}/gateways/{gateway_id}/token":{"post":{"callbacks":{},"description":"Creates a token bound to a single gateway. At most one active token can exist per gateway; if one already exists, this returns 409 Conflict - rotate the token or delete it first instead.","operationId":"PortalAPI.GatewayTokenController.create_for_gateway","parameters":[{"description":"Site ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"site_id","required":true,"schema":{"type":"string"}},{"description":"Gateway ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"gateway_id","required":true,"schema":{"type":"string"}}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GatewayTokenResponse"}}},"description":"New Token Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"409":{"content":{"application/problem+json":{"example":{"detail":"The request conflicts with the current state of the resource.","status":409,"title":"Conflict","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Conflict"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Create a single-owner Gateway Token","tags":["Gateway Tokens"]}},"/google_auth_providers/{id}":{"get":{"callbacks":{},"operationId":"PortalAPI.GoogleAuthProviderController.show","parameters":[{"description":"Google Auth Provider ID","example":"00000000-0000-0000-0000-000000000000","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAuthProviderResponse"}}},"description":"Google Auth Provider Response"},"400":{"content":{"application/problem+json":{"example":{"detail":"The request could not be processed.","status":400,"title":"Bad Request","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Bad Request"},"401":{"content":{"application/problem+json":{"example":{"detail":"Authentication credentials were missing or invalid.","status":401,"title":"Unauthorized","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unauthorized"},"404":{"content":{"application/problem+json":{"example":{"detail":"The requested resource could not be found.","status":404,"title":"Not Found","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Not Found"},"429":{"content":{"application/problem+json":{"example":{"detail":"Rate limit exceeded. Retry after the time indicated in the Retry-After header.","status":429,"title":"Too Many Requests","type":"about:blank"},"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Too Many Requests"}},"summary":"Show Google Auth Provider","tags":["Google Auth Providers"]}}},"security":[{"authorization":[]}],"servers":[{"url":"https://rest-api.firezone.dev","variables":{}}],"tags":[]}