# Public API Specification

Welcome to the Flightdeck API by `dope.security`. Modify custom categories, get endpoint statuses, and more via API! Stay tuned for upcoming updates that will enhance the capabilities and features of this API.

For details on how to create API client credentials please see [api-client-credentials](https://inflight.dope.security/dope.console/settings/api-client-credentials "mention").

## Generate Flightdeck API access token

> Use this API to generate an access token for use with the Flightdeck API. A valid access token returned from\
> this API is required in all other Flightdeck API calls.\
> \
> Token generation is based on the OAuth 2.0 Client Credentials Flow. The returned token is used within the\
> HTTP Authorization header as follows:\
> \
> \`Authorization: Bearer \<access token>\`\
> \
> Note:\
> \- The required \`client\_id\` and \`client\_secret\` are created by an admin via the dope console.\
> \- Returned access tokens are valid for a limited time period. Clients must check the \`expires\_in\` value in\
> the response to generate a new access token before the current one expires.\
> \- The OAuth scopes parameter is not supported and if provided will be ignored. The scopes returned in the access\
> token are set directly by the authorization server.<br>

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"tags":[{"name":"Authorization","description":"Everything about authorizing calls to Flightdeck"}],"servers":[{"url":"https://api.flightdeck.dope.security/v1"}],"paths":{"/partner/oauth/token":{"post":{"tags":["Authorization"],"summary":"Generate Flightdeck API access token","description":"Use this API to generate an access token for use with the Flightdeck API. A valid access token returned from\nthis API is required in all other Flightdeck API calls.\n\nToken generation is based on the OAuth 2.0 Client Credentials Flow. The returned token is used within the\nHTTP Authorization header as follows:\n\n`Authorization: Bearer <access token>`\n\nNote:\n- The required `client_id` and `client_secret` are created by an admin via the dope console.\n- Returned access tokens are valid for a limited time period. Clients must check the `expires_in` value in\nthe response to generate a new access token before the current one expires.\n- The OAuth scopes parameter is not supported and if provided will be ignored. The scopes returned in the access\ntoken are set directly by the authorization server.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"grant_type":{"type":"string","description":"The type of grant requested. You must set this to `client_credentials`","enum":["client_credentials"]},"client_id":{"type":"string","description":"Your application's Client ID."},"client_secret":{"type":"string","description":"Your application's Client Secret."}},"required":["grant_type","client_id","client_secret"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"access_token":{"type":"string","description":"The new access token."},"token_type":{"type":"string","enum":["bearer"],"description":"The type of token returned."},"expires_in":{"type":"number","description":"The expiration time of the new access token in seconds."}},"required":["access_token","token_type","expires_in"]}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"}}}},"401":{"description":"Client not authorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"}}}}}}}},"components":{"schemas":{"OAuthError":{"type":"object","description":"The error response related OAuth tokens","properties":{"error":{"type":"string","description":"Specifies the OAuth error code string when the request for a token fails."}},"required":["error"]}}}}
```

## List and Search Endpoints

> Use this API to get a list of all endpoints, or search for those matching a query parameter.\
> \
> Note:\
> \- To return a list of all endpoints do not include any additional parameter.\
> \- Only one of the optional parameters is allowed to be specified per request.\
> \- Results are returned in pages using cursor based pagination and ordered by the \`lastSeen\` property.<br>

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"tags":[{"name":"Endpoints","description":"Everything about your endpoints"}],"servers":[{"url":"https://api.flightdeck.dope.security/v1"}],"security":[{"BearerAuth":[]}],"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"parameters":{"PaginationFirst":{"in":"query","name":"first","description":"An optional pagination param that states the number of records requested from the **start** of the `cursor`. The default value is **50**.","required":false,"schema":{"type":"integer","default":50}},"PaginationAfter":{"in":"query","name":"after","description":"An optional pagination cursor. Pass the `endCursor` from the previous response's `pageInfo` to fetch the next page. Check `hasNextPage` in the previous response's `pageInfo` to determine whether more records are available.","required":false,"schema":{"type":"string"}}},"schemas":{"PaginationResponse":{"type":"object","description":"Information about current and next page for cursor based pagination","properties":{"endCursor":{"type":"string","description":"Opaque string representing a cursor to the last record returned in the response. Used for requesting the next page."},"hasNextPage":{"type":"boolean","description":"indicates if there is another page of data to fetch or not"}},"required":["endCursor","hasNextPage"]},"Endpoint":{"type":"object","properties":{"adminSetState":{"$ref":"#/components/schemas/AdminSetState"},"agentUUID":{"type":"string","format":"uuid","description":"the unique id of the endpoint"},"userUUID":{"type":"string","format":"uuid","description":"the unique id of the active user on the endpoint"},"agentVersion":{"type":"string","description":"the current version of the endpoint"},"binaryType":{"type":"string","description":"type of ISA for computer processors"},"cityName":{"type":"string","description":"the name of the city where the endpoint is located"},"region":{"type":"string","description":"the name of the region where the endpoint is located"},"countryName":{"type":"string","description":"the name of the country where the endpoint is located"},"cpuFamily":{"type":"string","description":"the type of CPU on the device hosting the endpoint"},"debugState":{"type":"string","description":"indicates the debug state of the endpoint. 0 means not in debug, 1 means set to debug, 2 means acknowledged receipt of debug request"},"deviceName":{"type":"string","description":"the name of the device hosting the endpoint"},"disableMode":{"type":"boolean","description":"indicates if the endpoint is disabled or not"},"errorMessage":{"type":"string","description":"additional details regarding an error"},"fallbackMode":{"type":"boolean","description":"indicates if the endpoint is in fallback mode"},"configurationLastUpdated":{"type":"string","format":"date-time","description":"the date and time when the endpoint last updated the configuration"},"osVersion":{"type":"string","description":"Operating System version of the device"},"policyName":{"type":"string","description":"name of the policy that is being used by the endpoint"},"realtimeConnection":{"type":"boolean","description":"indicates if the endpoint has an active web-socket connection"},"status":{"type":"string","description":"the current operational status of the endpoint"},"lastSeen":{"type":"string","format":"date-time","description":"the date and time when the endpoint was last seen"},"userId":{"type":"string","description":"the user id of the user that is using the endpoint. `userId` for OIDC users is usually their email address."},"emailId":{"type":"string","description":"the email of the user that is using the endpoint"}}},"AdminSetState":{"type":"object","properties":{"enabled":{"type":"boolean","description":"Indicates if endpoint is set to enabled or not by the admin"},"timestamp":{"type":"string","format":"date-time","description":"The timestamp when the admin last set the state of the endpoint"}}},"Errors":{"type":"object","description":"Error response containing a list of errors related to 400 and 500 http status","properties":{"errors":{"type":"array","minItems":1,"items":{"type":"object","properties":{"message":{"type":"string","description":"Error message"},"details":{"description":"Optional additional details regarding the error"}},"required":["message"]}}}}}},"paths":{"/endpoints/search":{"get":{"summary":"List and Search Endpoints","description":"Use this API to get a list of all endpoints, or search for those matching a query parameter.\n\nNote:\n- To return a list of all endpoints do not include any additional parameter.\n- Only one of the optional parameters is allowed to be specified per request.\n- Results are returned in pages using cursor based pagination and ordered by the `lastSeen` property.\n","tags":["Endpoints"],"parameters":[{"in":"query","name":"id","description":"Broad search query across endpoints by device, user and email identities that contain this string (case-insensitive)","required":false,"schema":{"type":"string"}},{"in":"query","name":"emailId","description":"Search by email ids that contain this string (case-insensitive)","required":false,"schema":{"type":"string"}},{"in":"query","name":"deviceName","description":"Search by device names that contain this string (case-insensitive)","required":false,"schema":{"type":"string"}},{"in":"query","name":"userId","description":"Search by user ids that contain this string (case-insensitive). `userId` for OIDC users is usually their email address.","required":false,"schema":{"type":"string"}},{"in":"query","name":"osVersion","description":"Filter by this exact device OS version string","required":false,"schema":{"type":"string"}},{"in":"query","name":"status","description":"Filter by this exact set of status'","required":false,"schema":{"type":"array","items":{"type":"string","enum":["healthy","error","dormant","disabled"]}},"explode":false},{"in":"query","name":"debugState","description":"Filter by this exact set of debug states.\n0 means not in debug\n1 means debug request sent to endpoint\n2 means debug request acknowledged by endpoint\n","required":false,"schema":{"type":"array","items":{"type":"string","enum":["0","1","2"]}},"explode":false},{"in":"query","name":"fallbackMode","description":"Filter by the fallback mode","required":false,"schema":{"type":"string","enum":["true","false"]}},{"in":"query","name":"locationId","description":"Filter by this exact location id - with an underscore separating the case sensitive city and country values e.g. \"City_Country\"","required":false,"schema":{"type":"string"}},{"in":"query","name":"agentVersion","description":"Filter by this exact agent version","required":false,"schema":{"type":"string"}},{"$ref":"#/components/parameters/PaginationFirst"},{"$ref":"#/components/parameters/PaginationAfter"},{"in":"query","name":"order","description":"The direction of the sort by the `lastSeen` property. The default is to sort by descending","required":false,"schema":{"type":"string","enum":["desc","asc"]}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"pageInfo":{"$ref":"#/components/schemas/PaginationResponse"},"endpoints":{"type":"array","items":{"$ref":"#/components/schemas/Endpoint"}}}}}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}}}}}}}
```

## List Policies

> Use this API to get a paginated list of all your policies, ordered by policy name.\
> \
> Each item includes the policy name, last-modified timestamp, SSL inspection status, and\
> the number of conflicting assignments.\
> \
> The \`sslInspection\` field returns the effective value (\`enabled\` or \`disabled\`). If SSL\
> inspection is not explicitly configured on a policy, the value is inherited from the Base Policy.\
> \
> Results are returned in pages using cursor-based pagination.<br>

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"tags":[{"name":"Policies","description":"Everything about your Policies"}],"servers":[{"url":"https://api.flightdeck.dope.security/v1"}],"security":[{"BearerAuth":[]}],"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"parameters":{"PaginationFirst":{"in":"query","name":"first","description":"An optional pagination param that states the number of records requested from the **start** of the `cursor`. The default value is **50**.","required":false,"schema":{"type":"integer","default":50}},"PaginationAfter":{"in":"query","name":"after","description":"An optional pagination cursor. Pass the `endCursor` from the previous response's `pageInfo` to fetch the next page. Check `hasNextPage` in the previous response's `pageInfo` to determine whether more records are available.","required":false,"schema":{"type":"string"}}},"schemas":{"Policy":{"type":"object","description":"Summary of a policy","properties":{"policyName":{"type":"string","description":"Unique name of the policy within the tenant"},"updatedAt":{"type":"string","format":"date-time","description":"ISO-8601 timestamp of the last policy modification"},"sslInspection":{"type":"string","enum":["enabled","disabled"],"description":"Effective SSL inspection status for this policy.\nIf SSL inspection is not explicitly configured on this policy, the value is\ninherited from the Base Policy.\n"},"clashCount":{"type":"integer","description":"Number of users/groups who have this policy as a conflicting assignment. Not present for the Base Policy."}},"required":["policyName","updatedAt","sslInspection"]},"PaginationResponse":{"type":"object","description":"Information about current and next page for cursor based pagination","properties":{"endCursor":{"type":"string","description":"Opaque string representing a cursor to the last record returned in the response. Used for requesting the next page."},"hasNextPage":{"type":"boolean","description":"indicates if there is another page of data to fetch or not"}},"required":["endCursor","hasNextPage"]},"Errors":{"type":"object","description":"Error response containing a list of errors related to 400 and 500 http status","properties":{"errors":{"type":"array","minItems":1,"items":{"type":"object","properties":{"message":{"type":"string","description":"Error message"},"details":{"description":"Optional additional details regarding the error"}},"required":["message"]}}}}}},"paths":{"/policies":{"get":{"summary":"List Policies","description":"Use this API to get a paginated list of all your policies, ordered by policy name.\n\nEach item includes the policy name, last-modified timestamp, SSL inspection status, and\nthe number of conflicting assignments.\n\nThe `sslInspection` field returns the effective value (`enabled` or `disabled`). If SSL\ninspection is not explicitly configured on a policy, the value is inherited from the Base Policy.\n\nResults are returned in pages using cursor-based pagination.\n","tags":["Policies"],"parameters":[{"$ref":"#/components/parameters/PaginationFirst"},{"$ref":"#/components/parameters/PaginationAfter"},{"in":"query","name":"order","description":"Sort order for policy names. Defaults to `asc`.","required":false,"schema":{"type":"string","enum":["asc","desc"],"default":"asc"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"policies":{"type":"array","items":{"$ref":"#/components/schemas/Policy"}},"pageInfo":{"$ref":"#/components/schemas/PaginationResponse"}},"required":["policies","pageInfo"]}},"required":["data"]}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}}}}}}}
```

## Create a Policy

> Use this API to create a new policy.\
> \
> Specify the name of the policy in the path parameter (\`policy\_name\`).\
> \
> If the policy already exists, a \`400\` error is returned.\
> \
> Validation rules for \`policy\_name\`:\
> \- Must not be empty or whitespace-only\
> \- Must not contain leading or trailing whitespace\
> \- Maximum length of 32 characters\
> \- Must not contain any of the following characters: \`# ! @ $ % ^ \* ? . / \\\`<br>

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"tags":[{"name":"Policies","description":"Everything about your Policies"}],"servers":[{"url":"https://api.flightdeck.dope.security/v1"}],"security":[{"BearerAuth":[]}],"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"schemas":{"SuccessMessage":{"type":"object","description":"A simple message response indicating a successful operation","properties":{"message":{"type":"string","description":"Simple success message"}},"required":["message"]},"Errors":{"type":"object","description":"Error response containing a list of errors related to 400 and 500 http status","properties":{"errors":{"type":"array","minItems":1,"items":{"type":"object","properties":{"message":{"type":"string","description":"Error message"},"details":{"description":"Optional additional details regarding the error"}},"required":["message"]}}}}}},"paths":{"/policies/{policy_name}":{"post":{"summary":"Create a Policy","description":"Use this API to create a new policy.\n\nSpecify the name of the policy in the path parameter (`policy_name`).\n\nIf the policy already exists, a `400` error is returned.\n\nValidation rules for `policy_name`:\n- Must not be empty or whitespace-only\n- Must not contain leading or trailing whitespace\n- Maximum length of 32 characters\n- Must not contain any of the following characters: `# ! @ $ % ^ * ? . / \\`\n","tags":["Policies"],"parameters":[{"in":"path","name":"policy_name","required":true,"description":"The name of the policy to create","schema":{"type":"string","minLength":1,"maxLength":32,"pattern":"^[^#!@$%^*?./\\\\]+$"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessMessage"}}}},"400":{"description":"Bad request - invalid policy name or policy already exists","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"403":{"description":"Unauthorized access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}}}}}}}
```

## Delete a Policy

> Use this API to delete a custom policy by name.\
> This removes the policy and unassigns all users and groups from the policy.\
> \
> The Base Policy cannot be deleted.<br>

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"tags":[{"name":"Policies","description":"Everything about your Policies"}],"servers":[{"url":"https://api.flightdeck.dope.security/v1"}],"security":[{"BearerAuth":[]}],"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"schemas":{"SuccessMessage":{"type":"object","description":"A simple message response indicating a successful operation","properties":{"message":{"type":"string","description":"Simple success message"}},"required":["message"]},"Errors":{"type":"object","description":"Error response containing a list of errors related to 400 and 500 http status","properties":{"errors":{"type":"array","minItems":1,"items":{"type":"object","properties":{"message":{"type":"string","description":"Error message"},"details":{"description":"Optional additional details regarding the error"}},"required":["message"]}}}}}},"paths":{"/policies/{policy_name}":{"delete":{"summary":"Delete a Policy","description":"Use this API to delete a custom policy by name.\nThis removes the policy and unassigns all users and groups from the policy.\n\nThe Base Policy cannot be deleted.\n","tags":["Policies"],"parameters":[{"in":"path","name":"policy_name","description":"The name of the policy to delete","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessMessage"}}}},"400":{"description":"Bad request. Policy not found or attempted to delete Base Policy.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"403":{"description":"Unauthorized access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}}}}}}}
```

## Get Policy Content

> Use this API to retrieve the entire content of a policy, including\
> categories and custom categories.\
> \
> When a policy inherits from the base policy, \`inheritsFromBase\` will be \`true\`\
> and the content will reflect the base policy's settings.<br>

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"tags":[{"name":"Policies","description":"Everything about your Policies"}],"servers":[{"url":"https://api.flightdeck.dope.security/v1"}],"security":[{"BearerAuth":[]}],"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"schemas":{"PolicyContentResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"categories":{"$ref":"#/components/schemas/CategoryBlock"},"customCategories":{"$ref":"#/components/schemas/CustomCategoryBlock"}},"required":["categories","customCategories"]}},"required":["data"]},"CategoryBlock":{"type":"object","description":"Wrapper for category data with inheritance flag","properties":{"inheritsFromBase":{"type":"boolean","description":"Whether the categories are inherited from the base policy"},"restrictions":{"type":"object","description":"Category restrictions keyed by category name","additionalProperties":{"$ref":"#/components/schemas/CategorySettings"}}},"required":["inheritsFromBase","restrictions"]},"CategorySettings":{"type":"object","description":"Settings for a dope category","properties":{"restriction":{"type":"string","enum":["ALLOW","BLOCK","WARNING"],"description":"The action applied when the category is matched"},"page":{"type":"string","description":"Optional block/warning page identifier"},"description":{"type":"string","description":"Category description"},"exceptions":{"type":"object","description":"Per-entity overrides keyed by entity identifier","additionalProperties":{"$ref":"#/components/schemas/CategoryException"}}},"required":["restriction"]},"CategoryException":{"type":"object","description":"Per-entity override of a category restriction","properties":{"restriction":{"type":"string","enum":["ALLOW","BLOCK","WARNING"],"description":"The action applied for this entity"},"page":{"type":"string","description":"Optional block/warning page identifier"},"name":{"type":"string","description":"Human-readable entity name (returned on read APIs)"},"type":{"type":"string","enum":["users","groups"],"description":"Entity type (returned on read APIs)"}},"required":["restriction"]},"CustomCategoryBlock":{"type":"object","description":"Wrapper for custom category data with inheritance flag","properties":{"inheritsFromBase":{"type":"boolean","description":"Whether the custom categories are inherited from the base policy"},"restrictions":{"type":"object","description":"Custom category restrictions keyed by custom category name","additionalProperties":{"$ref":"#/components/schemas/CustomCategorySettings"}}},"required":["inheritsFromBase","restrictions"]},"CustomCategorySettings":{"type":"object","description":"Settings for a custom category","properties":{"restriction":{"type":"string","enum":["ALLOW","BLOCK","WARNING","IGNORE"],"description":"The action applied when the custom category is matched"},"page":{"type":"string","description":"Optional block/warning page identifier"},"exceptions":{"type":"object","description":"Per-entity overrides keyed by entity identifier","additionalProperties":{"$ref":"#/components/schemas/CategoryException"}}},"required":["restriction"]},"Errors":{"type":"object","description":"Error response containing a list of errors related to 400 and 500 http status","properties":{"errors":{"type":"array","minItems":1,"items":{"type":"object","properties":{"message":{"type":"string","description":"Error message"},"details":{"description":"Optional additional details regarding the error"}},"required":["message"]}}}}}},"paths":{"/policies/{policy_name}/content":{"get":{"summary":"Get Policy Content","description":"Use this API to retrieve the entire content of a policy, including\ncategories and custom categories.\n\nWhen a policy inherits from the base policy, `inheritsFromBase` will be `true`\nand the content will reflect the base policy's settings.\n","tags":["Policies"],"parameters":[{"in":"path","name":"policy_name","required":true,"description":"The name of the policy to retrieve content for","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PolicyContentResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"403":{"description":"Unauthorized access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}}}}}}}
```

## Update Policy Content Restrictions

> Use this API to update restrictions on dope and custom categories for a policy.\
> \
> A single call may update restrictions on any combination of dope\
> and custom categories. Only submitted categories will be updated -\
> any category not included in the request will be left unchanged.\
> \
> This API also resets categories back to inheriting from base.\
> Both dope categories and custom categories inherit from base\
> (and are reset) as a whole by sending \`{inheritsFromBase:true}\` in the payload.<br>

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"tags":[{"name":"Policies","description":"Everything about your Policies"}],"servers":[{"url":"https://api.flightdeck.dope.security/v1"}],"security":[{"BearerAuth":[]}],"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"schemas":{"PolicyContentRestrictionsRequest":{"type":"object","description":"Request body for updating restrictions on dope and custom categories","properties":{"data":{"type":"object","properties":{"categories":{"oneOf":[{"type":"object","additionalProperties":{"$ref":"#/components/schemas/CategoryRestrictionUpdate"}},{"$ref":"#/components/schemas/BaseInheritance"}],"description":"Restriction updates keyed by category name, or BaseInheritance to reset to base."},"customCategories":{"oneOf":[{"type":"object","additionalProperties":{"$ref":"#/components/schemas/CustomCategoryRestrictionUpdate"}},{"$ref":"#/components/schemas/BaseInheritance"}],"description":"Restriction updates keyed by custom category name, or BaseInheritance to reset to base."}}}},"required":["data"]},"CategoryRestrictionUpdate":{"type":"object","description":"Category restriction settings used in write operations","properties":{"restriction":{"type":"string","enum":["ALLOW","BLOCK","WARNING"],"description":"Action applied when the category is matched"},"page":{"type":"string","description":"Optional page identifier. Use with BLOCK and WARNING restrictions."}},"required":["restriction"]},"BaseInheritance":{"type":"object","description":"Signals that settings are inherited from the base policy","properties":{"inheritsFromBase":{"type":"boolean","enum":[true],"description":"Always `true`. Signals that settings are inherited from the base policy."}},"required":["inheritsFromBase"]},"CustomCategoryRestrictionUpdate":{"type":"object","description":"Custom category restriction settings used in write operations","properties":{"restriction":{"type":"string","enum":["ALLOW","BLOCK","WARNING","IGNORE"],"description":"Custom categories can be ignored, in addition to regular restrictions"},"page":{"type":"string","description":"Optional page identifier. Use with BLOCK and WARNING restrictions."}},"required":["restriction"]},"SuccessMessage":{"type":"object","description":"A simple message response indicating a successful operation","properties":{"message":{"type":"string","description":"Simple success message"}},"required":["message"]},"Errors":{"type":"object","description":"Error response containing a list of errors related to 400 and 500 http status","properties":{"errors":{"type":"array","minItems":1,"items":{"type":"object","properties":{"message":{"type":"string","description":"Error message"},"details":{"description":"Optional additional details regarding the error"}},"required":["message"]}}}}}},"paths":{"/policies/{policy_name}/content/restrictions":{"put":{"summary":"Update Policy Content Restrictions","description":"Use this API to update restrictions on dope and custom categories for a policy.\n\nA single call may update restrictions on any combination of dope\nand custom categories. Only submitted categories will be updated -\nany category not included in the request will be left unchanged.\n\nThis API also resets categories back to inheriting from base.\nBoth dope categories and custom categories inherit from base\n(and are reset) as a whole by sending `{inheritsFromBase:true}` in the payload.\n","tags":["Policies"],"parameters":[{"in":"path","name":"policy_name","required":true,"description":"The name of the policy to update restrictions for","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PolicyContentRestrictionsRequest"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessMessage"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"403":{"description":"Unauthorized access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}}}}}}}
```

## Update Policy Content Exceptions

> Use this API to update user/group-level exceptions on dope and custom categories for a policy.\
> \
> Exceptions are per-user/group overrides of a category's restriction.\
> Each exception is keyed by the user or group identifier (e.g. email address) within a category.\
> \
> A single request can update exceptions across multiple dope and custom categories.\
> Categories not included in the request remain unchanged. For each category provided, the submitted\
> exception set is treated as the complete source of truth and fully replaces any existing exceptions.\
> Any existing entries not included in the request for that category will be removed.\
> To remove all exceptions from a category, pass an empty object \`{}\` as its value.\
> \
> All user and group identifiers are validated against the tenant directory.\
> If any identifier cannot be resolved, the request fails with a \`400 Bad Request\`,\
> and the response includes details of the invalid entries.<br>

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"tags":[{"name":"Policies","description":"Everything about your Policies"}],"servers":[{"url":"https://api.flightdeck.dope.security/v1"}],"security":[{"BearerAuth":[]}],"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"schemas":{"PolicyContentExceptionsRequest":{"type":"object","description":"Request body for updating user/group exceptions on categories","properties":{"data":{"type":"object","properties":{"categories":{"type":"object","description":"Exception updates keyed first by category name, then by user or group identifier.","additionalProperties":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/CategoryExceptionUpdate"}}},"customCategories":{"type":"object","description":"Exception updates keyed first by custom category name, then by user or group identifier.","additionalProperties":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/CategoryExceptionUpdate"}}}}}},"required":["data"]},"CategoryExceptionUpdate":{"type":"object","description":"Exception settings used in write operations","properties":{"restriction":{"type":"string","enum":["ALLOW","BLOCK","WARNING"],"description":"The action applied for this user or group"},"page":{"type":"string","description":"Optional page identifier. Use with BLOCK and WARNING restrictions."}},"required":["restriction"]},"SuccessMessage":{"type":"object","description":"A simple message response indicating a successful operation","properties":{"message":{"type":"string","description":"Simple success message"}},"required":["message"]},"Errors":{"type":"object","description":"Error response containing a list of errors related to 400 and 500 http status","properties":{"errors":{"type":"array","minItems":1,"items":{"type":"object","properties":{"message":{"type":"string","description":"Error message"},"details":{"description":"Optional additional details regarding the error"}},"required":["message"]}}}}}},"paths":{"/policies/{policy_name}/content/exceptions":{"put":{"summary":"Update Policy Content Exceptions","description":"Use this API to update user/group-level exceptions on dope and custom categories for a policy.\n\nExceptions are per-user/group overrides of a category's restriction.\nEach exception is keyed by the user or group identifier (e.g. email address) within a category.\n\nA single request can update exceptions across multiple dope and custom categories.\nCategories not included in the request remain unchanged. For each category provided, the submitted\nexception set is treated as the complete source of truth and fully replaces any existing exceptions.\nAny existing entries not included in the request for that category will be removed.\nTo remove all exceptions from a category, pass an empty object `{}` as its value.\n\nAll user and group identifiers are validated against the tenant directory.\nIf any identifier cannot be resolved, the request fails with a `400 Bad Request`,\nand the response includes details of the invalid entries.\n","tags":["Policies"],"parameters":[{"in":"path","name":"policy_name","required":true,"description":"The name of the policy to update exceptions for","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PolicyContentExceptionsRequest"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessMessage"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"403":{"description":"Unauthorized access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}}}}}}}
```

## Get Policy Assignments

> Use this API to get the users and groups assigned to a policy.<br>

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"tags":[{"name":"Policies","description":"Everything about your Policies"}],"servers":[{"url":"https://api.flightdeck.dope.security/v1"}],"security":[{"BearerAuth":[]}],"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"schemas":{"AssignedUser":{"type":"object","description":"A user assigned to a policy","properties":{"email":{"type":"string","description":"Email address of the assigned user"},"name":{"type":"string","description":"Display name of the assigned user"}},"required":["email","name"]},"AssignedGroup":{"type":"object","description":"A group assigned to a policy","properties":{"email":{"type":"string","description":"Email address of the assigned group"},"name":{"type":"string","description":"Display name of the assigned group"},"membersCount":{"type":"integer","description":"Number of members in the group"}},"required":["email","name","membersCount"]},"Errors":{"type":"object","description":"Error response containing a list of errors related to 400 and 500 http status","properties":{"errors":{"type":"array","minItems":1,"items":{"type":"object","properties":{"message":{"type":"string","description":"Error message"},"details":{"description":"Optional additional details regarding the error"}},"required":["message"]}}}}}},"paths":{"/policies/{policy_name}/assignments":{"get":{"summary":"Get Policy Assignments","description":"Use this API to get the users and groups assigned to a policy.\n","tags":["Policies"],"parameters":[{"in":"path","name":"policy_name","required":true,"description":"The name of the policy to get assignments for","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"users":{"type":"array","items":{"$ref":"#/components/schemas/AssignedUser"}},"groups":{"type":"array","items":{"$ref":"#/components/schemas/AssignedGroup"}}},"required":["users","groups"]}},"required":["data"]}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}}}}}}}
```

## Update Policy Assignments

> Use this API to update the users and groups assigned to a policy.\
> \
> Each provided field fully replaces that assignment list. Omitted fields are preserved.\
> Send an empty array to unassign all users or groups.<br>

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"tags":[{"name":"Policies","description":"Everything about your Policies"}],"servers":[{"url":"https://api.flightdeck.dope.security/v1"}],"security":[{"BearerAuth":[]}],"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"schemas":{"SuccessMessage":{"type":"object","description":"A simple message response indicating a successful operation","properties":{"message":{"type":"string","description":"Simple success message"}},"required":["message"]},"Errors":{"type":"object","description":"Error response containing a list of errors related to 400 and 500 http status","properties":{"errors":{"type":"array","minItems":1,"items":{"type":"object","properties":{"message":{"type":"string","description":"Error message"},"details":{"description":"Optional additional details regarding the error"}},"required":["message"]}}}}}},"paths":{"/policies/{policy_name}/assignments":{"put":{"summary":"Update Policy Assignments","description":"Use this API to update the users and groups assigned to a policy.\n\nEach provided field fully replaces that assignment list. Omitted fields are preserved.\nSend an empty array to unassign all users or groups.\n","tags":["Policies"],"parameters":[{"in":"path","name":"policy_name","required":true,"description":"The name of the policy to update assignments for","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"users":{"type":"array","description":"User emails to assign. Omit to leave unchanged, send [] to unassign all.","items":{"type":"string"}},"groups":{"type":"array","description":"Group emails to assign. Omit to leave unchanged, send [] to unassign all.","items":{"type":"string"}}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessMessage"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}}}}}}}
```

## List Custom Categories

> Use this API to get a paginated list of all custom categories.\
> \
> Results are returned in pages using cursor based pagination.<br>

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"tags":[{"name":"Custom Categories","description":"Everything about your Custom Categories"}],"servers":[{"url":"https://api.flightdeck.dope.security/v1"}],"security":[{"BearerAuth":[]}],"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"parameters":{"PaginationFirst":{"in":"query","name":"first","description":"An optional pagination param that states the number of records requested from the **start** of the `cursor`. The default value is **50**.","required":false,"schema":{"type":"integer","default":50}},"PaginationAfter":{"in":"query","name":"after","description":"An optional pagination cursor. Pass the `endCursor` from the previous response's `pageInfo` to fetch the next page. Check `hasNextPage` in the previous response's `pageInfo` to determine whether more records are available.","required":false,"schema":{"type":"string"}}},"schemas":{"PaginationResponse":{"type":"object","description":"Information about current and next page for cursor based pagination","properties":{"endCursor":{"type":"string","description":"Opaque string representing a cursor to the last record returned in the response. Used for requesting the next page."},"hasNextPage":{"type":"boolean","description":"indicates if there is another page of data to fetch or not"}},"required":["endCursor","hasNextPage"]},"Errors":{"type":"object","description":"Error response containing a list of errors related to 400 and 500 http status","properties":{"errors":{"type":"array","minItems":1,"items":{"type":"object","properties":{"message":{"type":"string","description":"Error message"},"details":{"description":"Optional additional details regarding the error"}},"required":["message"]}}}}}},"paths":{"/custom_categories":{"get":{"summary":"List Custom Categories","description":"Use this API to get a paginated list of all custom categories.\n\nResults are returned in pages using cursor based pagination.\n","tags":["Custom Categories"],"parameters":[{"$ref":"#/components/parameters/PaginationFirst"},{"$ref":"#/components/parameters/PaginationAfter"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"pageInfo":{"$ref":"#/components/schemas/PaginationResponse"},"customCategories":{"type":"array","items":{"type":"string"}}},"required":["pageInfo","customCategories"]}},"required":["data"]}}}},"403":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}}}}}}}
```

## Create a Custom Category

> Use this API to create a new custom category.\
> \
> Specify the name of the custom category in the path parameter (\`custom\_category\_name\`).\
> \
> If the custom category already exists, a \`400\` error is returned.\
> \
> Validation rules for \`custom\_category\_name\`:\
> \- Must not be empty or whitespace-only\
> \- Must not contain leading or trailing whitespace\
> \- Maximum length of 32 characters\
> \- Must not contain any of the following characters: \`# ! @ $ % ^ \* ? . / \\\`<br>

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"tags":[{"name":"Custom Categories","description":"Everything about your Custom Categories"}],"servers":[{"url":"https://api.flightdeck.dope.security/v1"}],"security":[{"BearerAuth":[]}],"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"schemas":{"SuccessMessage":{"type":"object","description":"A simple message response indicating a successful operation","properties":{"message":{"type":"string","description":"Simple success message"}},"required":["message"]},"Errors":{"type":"object","description":"Error response containing a list of errors related to 400 and 500 http status","properties":{"errors":{"type":"array","minItems":1,"items":{"type":"object","properties":{"message":{"type":"string","description":"Error message"},"details":{"description":"Optional additional details regarding the error"}},"required":["message"]}}}}}},"paths":{"/custom_categories/{custom_category_name}":{"post":{"summary":"Create a Custom Category","description":"Use this API to create a new custom category.\n\nSpecify the name of the custom category in the path parameter (`custom_category_name`).\n\nIf the custom category already exists, a `400` error is returned.\n\nValidation rules for `custom_category_name`:\n- Must not be empty or whitespace-only\n- Must not contain leading or trailing whitespace\n- Maximum length of 32 characters\n- Must not contain any of the following characters: `# ! @ $ % ^ * ? . / \\`\n","tags":["Custom Categories"],"parameters":[{"in":"path","name":"custom_category_name","required":true,"description":"The name of the custom category to create","schema":{"type":"string","minLength":1,"maxLength":32,"pattern":"^[^#!@$%^*?./\\\\]+$"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessMessage"}}}},"400":{"description":"Bad request - invalid custom category name or custom category already exists","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"403":{"description":"Unauthorized access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}}}}}}}
```

## Delete a Custom Category

> Use this API to delete a single custom category by name.\
> This action will remove the custom category and all of its associated data.<br>

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"tags":[{"name":"Custom Categories","description":"Everything about your Custom Categories"}],"servers":[{"url":"https://api.flightdeck.dope.security/v1"}],"security":[{"BearerAuth":[]}],"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"schemas":{"SuccessMessage":{"type":"object","description":"A simple message response indicating a successful operation","properties":{"message":{"type":"string","description":"Simple success message"}},"required":["message"]},"Errors":{"type":"object","description":"Error response containing a list of errors related to 400 and 500 http status","properties":{"errors":{"type":"array","minItems":1,"items":{"type":"object","properties":{"message":{"type":"string","description":"Error message"},"details":{"description":"Optional additional details regarding the error"}},"required":["message"]}}}}}},"paths":{"/custom_categories/{custom_category_name}":{"delete":{"summary":"Delete a Custom Category","description":"Use this API to delete a single custom category by name.\nThis action will remove the custom category and all of its associated data.\n","tags":["Custom Categories"],"parameters":[{"in":"path","name":"custom_category_name","description":"The name of the custom category to delete","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessMessage"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"403":{"description":"Unauthorized access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}}}}}}}
```

## List all URLs of a Custom Category

> Use this API to get all URLs of an existing custom category.<br>

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"tags":[{"name":"Custom Categories","description":"Everything about your Custom Categories"}],"servers":[{"url":"https://api.flightdeck.dope.security/v1"}],"security":[{"BearerAuth":[]}],"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"schemas":{"Errors":{"type":"object","description":"Error response containing a list of errors related to 400 and 500 http status","properties":{"errors":{"type":"array","minItems":1,"items":{"type":"object","properties":{"message":{"type":"string","description":"Error message"},"details":{"description":"Optional additional details regarding the error"}},"required":["message"]}}}}}},"paths":{"/custom_categories/{custom_category_name}/urls":{"get":{"summary":"List all URLs of a Custom Category","description":"Use this API to get all URLs of an existing custom category.\n","tags":["Custom Categories"],"parameters":[{"in":"path","name":"custom_category_name","required":true,"description":"The name of the custom category to get URLs from","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"urls":{"type":"array","items":{"type":"string"}}},"required":["urls"]}},"required":["data"]}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"403":{"description":"Unauthorized access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}}}}}}}
```

## Add URLs to a Custom Category

> Use this API to add URLs to an existing custom category.\
> \
> Specify the name of the custom category in the path parameter (\`custom\_category\_name\`)\
> and provide a JSON array of URLs in the request body.\
> \
> Ensure that URLs are properly formatted and included in the array.\
> \
> Please check the docs at <https://inflight.dope.security> for guidelines on URL formatting.\
> \
> If any URL in the list is invalid, the entire request will be rejected.\
> The 400 error response will include the list of invalid URLs in the error details.<br>

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"tags":[{"name":"Custom Categories","description":"Everything about your Custom Categories"}],"servers":[{"url":"https://api.flightdeck.dope.security/v1"}],"security":[{"BearerAuth":[]}],"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"schemas":{"SuccessMessage":{"type":"object","description":"A simple message response indicating a successful operation","properties":{"message":{"type":"string","description":"Simple success message"}},"required":["message"]},"Errors":{"type":"object","description":"Error response containing a list of errors related to 400 and 500 http status","properties":{"errors":{"type":"array","minItems":1,"items":{"type":"object","properties":{"message":{"type":"string","description":"Error message"},"details":{"description":"Optional additional details regarding the error"}},"required":["message"]}}}}}},"paths":{"/custom_categories/{custom_category_name}/urls":{"post":{"summary":"Add URLs to a Custom Category","description":"Use this API to add URLs to an existing custom category.\n\nSpecify the name of the custom category in the path parameter (`custom_category_name`)\nand provide a JSON array of URLs in the request body.\n\nEnsure that URLs are properly formatted and included in the array.\n\nPlease check the docs at https://inflight.dope.security for guidelines on URL formatting.\n\nIf any URL in the list is invalid, the entire request will be rejected.\nThe 400 error response will include the list of invalid URLs in the error details.\n","tags":["Custom Categories"],"parameters":[{"in":"path","name":"custom_category_name","required":true,"description":"The name of the custom category to add URLs to","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"urls":{"type":"array","items":{"type":"string"}}}}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessMessage"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"403":{"description":"Unauthorized access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}}}}}}}
```

## Overwrite all URLs of a Custom Category

> Use this API to replace all existing URLs of a custom category with a new list of URLs.\
> \
> Specify the name of the custom category in the path parameter (\`custom\_category\_name\`)\
> and provide a JSON array of URLs in the request body. All existing URLs will be removed\
> and replaced with the provided list.\
> \
> Please check the docs at <https://inflight.dope.security> for guidelines on URL formatting.\
> \
> If any URL in the list is invalid, the entire request will be rejected.\
> The 400 error response will include the list of invalid URLs in the error details.<br>

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"tags":[{"name":"Custom Categories","description":"Everything about your Custom Categories"}],"servers":[{"url":"https://api.flightdeck.dope.security/v1"}],"security":[{"BearerAuth":[]}],"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"schemas":{"SuccessMessage":{"type":"object","description":"A simple message response indicating a successful operation","properties":{"message":{"type":"string","description":"Simple success message"}},"required":["message"]},"Errors":{"type":"object","description":"Error response containing a list of errors related to 400 and 500 http status","properties":{"errors":{"type":"array","minItems":1,"items":{"type":"object","properties":{"message":{"type":"string","description":"Error message"},"details":{"description":"Optional additional details regarding the error"}},"required":["message"]}}}}}},"paths":{"/custom_categories/{custom_category_name}/urls":{"put":{"summary":"Overwrite all URLs of a Custom Category","description":"Use this API to replace all existing URLs of a custom category with a new list of URLs.\n\nSpecify the name of the custom category in the path parameter (`custom_category_name`)\nand provide a JSON array of URLs in the request body. All existing URLs will be removed\nand replaced with the provided list.\n\nPlease check the docs at https://inflight.dope.security for guidelines on URL formatting.\n\nIf any URL in the list is invalid, the entire request will be rejected.\nThe 400 error response will include the list of invalid URLs in the error details.\n","tags":["Custom Categories"],"parameters":[{"in":"path","name":"custom_category_name","required":true,"description":"The name of the custom category to overwrite URLs for","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"urls":{"type":"array","items":{"type":"string"}}}}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessMessage"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"403":{"description":"Unauthorized access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}}}}}}}
```

## Delete All URLs from a Custom Category

> Use this API to delete all URLs from an existing custom category.\
> \
> Specify the name of the custom category in the path parameter (\`custom\_category\_name\`).\
> \
> This action will remove all URLs associated with the specified custom category.<br>

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"tags":[{"name":"Custom Categories","description":"Everything about your Custom Categories"}],"servers":[{"url":"https://api.flightdeck.dope.security/v1"}],"security":[{"BearerAuth":[]}],"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"schemas":{"SuccessMessage":{"type":"object","description":"A simple message response indicating a successful operation","properties":{"message":{"type":"string","description":"Simple success message"}},"required":["message"]},"Errors":{"type":"object","description":"Error response containing a list of errors related to 400 and 500 http status","properties":{"errors":{"type":"array","minItems":1,"items":{"type":"object","properties":{"message":{"type":"string","description":"Error message"},"details":{"description":"Optional additional details regarding the error"}},"required":["message"]}}}}}},"paths":{"/custom_categories/{custom_category_name}/urls":{"delete":{"summary":"Delete All URLs from a Custom Category","description":"Use this API to delete all URLs from an existing custom category.\n\nSpecify the name of the custom category in the path parameter (`custom_category_name`).\n\nThis action will remove all URLs associated with the specified custom category.\n","tags":["Custom Categories"],"parameters":[{"in":"path","name":"custom_category_name","description":"The name of the custom category to delete all URLs from","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessMessage"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"403":{"description":"Unauthorized access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}}}}}}}
```

## Delete a specific URL from a Custom Category

> Use this API to delete a specific URL from an existing custom category.\
> \
> Specify the name of the custom category in the path parameter (\`custom\_category\_name\`).\
> \
> Ensure that a given URL is encoded using URL encoding.<br>

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"tags":[{"name":"Custom Categories","description":"Everything about your Custom Categories"}],"servers":[{"url":"https://api.flightdeck.dope.security/v1"}],"security":[{"BearerAuth":[]}],"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"schemas":{"SuccessMessage":{"type":"object","description":"A simple message response indicating a successful operation","properties":{"message":{"type":"string","description":"Simple success message"}},"required":["message"]},"Errors":{"type":"object","description":"Error response containing a list of errors related to 400 and 500 http status","properties":{"errors":{"type":"array","minItems":1,"items":{"type":"object","properties":{"message":{"type":"string","description":"Error message"},"details":{"description":"Optional additional details regarding the error"}},"required":["message"]}}}}}},"paths":{"/custom_categories/{custom_category_name}/url/{encoded_url}":{"delete":{"summary":"Delete a specific URL from a Custom Category","description":"Use this API to delete a specific URL from an existing custom category.\n\nSpecify the name of the custom category in the path parameter (`custom_category_name`).\n\nEnsure that a given URL is encoded using URL encoding.\n","tags":["Custom Categories"],"parameters":[{"in":"path","name":"custom_category_name","description":"The name of the custom category to delete given URL from","required":true,"schema":{"type":"string"}},{"in":"path","name":"encoded_url","description":"The URL to be deleted (Ensure that URLs are properly URL-encoded using\nthe UTF8 encoding method)\n","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessMessage"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"403":{"description":"Unauthorized access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}}}}}}}
```

## The Policy object

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"components":{"schemas":{"Policy":{"type":"object","description":"Summary of a policy","properties":{"policyName":{"type":"string","description":"Unique name of the policy within the tenant"},"updatedAt":{"type":"string","format":"date-time","description":"ISO-8601 timestamp of the last policy modification"},"sslInspection":{"type":"string","enum":["enabled","disabled"],"description":"Effective SSL inspection status for this policy.\nIf SSL inspection is not explicitly configured on this policy, the value is\ninherited from the Base Policy.\n"},"clashCount":{"type":"integer","description":"Number of users/groups who have this policy as a conflicting assignment. Not present for the Base Policy."}},"required":["policyName","updatedAt","sslInspection"]}}}}
```

## The AssignedUser object

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"components":{"schemas":{"AssignedUser":{"type":"object","description":"A user assigned to a policy","properties":{"email":{"type":"string","description":"Email address of the assigned user"},"name":{"type":"string","description":"Display name of the assigned user"}},"required":["email","name"]}}}}
```

## The AssignedGroup object

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"components":{"schemas":{"AssignedGroup":{"type":"object","description":"A group assigned to a policy","properties":{"email":{"type":"string","description":"Email address of the assigned group"},"name":{"type":"string","description":"Display name of the assigned group"},"membersCount":{"type":"integer","description":"Number of members in the group"}},"required":["email","name","membersCount"]}}}}
```

## The BaseInheritance object

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"components":{"schemas":{"BaseInheritance":{"type":"object","description":"Signals that settings are inherited from the base policy","properties":{"inheritsFromBase":{"type":"boolean","enum":[true],"description":"Always `true`. Signals that settings are inherited from the base policy."}},"required":["inheritsFromBase"]}}}}
```

## The CategoryRestrictionUpdate object

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"components":{"schemas":{"CategoryRestrictionUpdate":{"type":"object","description":"Category restriction settings used in write operations","properties":{"restriction":{"type":"string","enum":["ALLOW","BLOCK","WARNING"],"description":"Action applied when the category is matched"},"page":{"type":"string","description":"Optional page identifier. Use with BLOCK and WARNING restrictions."}},"required":["restriction"]}}}}
```

## The CustomCategoryRestrictionUpdate object

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"components":{"schemas":{"CustomCategoryRestrictionUpdate":{"type":"object","description":"Custom category restriction settings used in write operations","properties":{"restriction":{"type":"string","enum":["ALLOW","BLOCK","WARNING","IGNORE"],"description":"Custom categories can be ignored, in addition to regular restrictions"},"page":{"type":"string","description":"Optional page identifier. Use with BLOCK and WARNING restrictions."}},"required":["restriction"]}}}}
```

## The CategoryException object

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"components":{"schemas":{"CategoryException":{"type":"object","description":"Per-entity override of a category restriction","properties":{"restriction":{"type":"string","enum":["ALLOW","BLOCK","WARNING"],"description":"The action applied for this entity"},"page":{"type":"string","description":"Optional block/warning page identifier"},"name":{"type":"string","description":"Human-readable entity name (returned on read APIs)"},"type":{"type":"string","enum":["users","groups"],"description":"Entity type (returned on read APIs)"}},"required":["restriction"]}}}}
```

## The CategorySettings object

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"components":{"schemas":{"CategorySettings":{"type":"object","description":"Settings for a dope category","properties":{"restriction":{"type":"string","enum":["ALLOW","BLOCK","WARNING"],"description":"The action applied when the category is matched"},"page":{"type":"string","description":"Optional block/warning page identifier"},"description":{"type":"string","description":"Category description"},"exceptions":{"type":"object","description":"Per-entity overrides keyed by entity identifier","additionalProperties":{"$ref":"#/components/schemas/CategoryException"}}},"required":["restriction"]},"CategoryException":{"type":"object","description":"Per-entity override of a category restriction","properties":{"restriction":{"type":"string","enum":["ALLOW","BLOCK","WARNING"],"description":"The action applied for this entity"},"page":{"type":"string","description":"Optional block/warning page identifier"},"name":{"type":"string","description":"Human-readable entity name (returned on read APIs)"},"type":{"type":"string","enum":["users","groups"],"description":"Entity type (returned on read APIs)"}},"required":["restriction"]}}}}
```

## The CustomCategorySettings object

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"components":{"schemas":{"CustomCategorySettings":{"type":"object","description":"Settings for a custom category","properties":{"restriction":{"type":"string","enum":["ALLOW","BLOCK","WARNING","IGNORE"],"description":"The action applied when the custom category is matched"},"page":{"type":"string","description":"Optional block/warning page identifier"},"exceptions":{"type":"object","description":"Per-entity overrides keyed by entity identifier","additionalProperties":{"$ref":"#/components/schemas/CategoryException"}}},"required":["restriction"]},"CategoryException":{"type":"object","description":"Per-entity override of a category restriction","properties":{"restriction":{"type":"string","enum":["ALLOW","BLOCK","WARNING"],"description":"The action applied for this entity"},"page":{"type":"string","description":"Optional block/warning page identifier"},"name":{"type":"string","description":"Human-readable entity name (returned on read APIs)"},"type":{"type":"string","enum":["users","groups"],"description":"Entity type (returned on read APIs)"}},"required":["restriction"]}}}}
```

## The CategoryBlock object

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"components":{"schemas":{"CategoryBlock":{"type":"object","description":"Wrapper for category data with inheritance flag","properties":{"inheritsFromBase":{"type":"boolean","description":"Whether the categories are inherited from the base policy"},"restrictions":{"type":"object","description":"Category restrictions keyed by category name","additionalProperties":{"$ref":"#/components/schemas/CategorySettings"}}},"required":["inheritsFromBase","restrictions"]},"CategorySettings":{"type":"object","description":"Settings for a dope category","properties":{"restriction":{"type":"string","enum":["ALLOW","BLOCK","WARNING"],"description":"The action applied when the category is matched"},"page":{"type":"string","description":"Optional block/warning page identifier"},"description":{"type":"string","description":"Category description"},"exceptions":{"type":"object","description":"Per-entity overrides keyed by entity identifier","additionalProperties":{"$ref":"#/components/schemas/CategoryException"}}},"required":["restriction"]},"CategoryException":{"type":"object","description":"Per-entity override of a category restriction","properties":{"restriction":{"type":"string","enum":["ALLOW","BLOCK","WARNING"],"description":"The action applied for this entity"},"page":{"type":"string","description":"Optional block/warning page identifier"},"name":{"type":"string","description":"Human-readable entity name (returned on read APIs)"},"type":{"type":"string","enum":["users","groups"],"description":"Entity type (returned on read APIs)"}},"required":["restriction"]}}}}
```

## The CustomCategoryBlock object

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"components":{"schemas":{"CustomCategoryBlock":{"type":"object","description":"Wrapper for custom category data with inheritance flag","properties":{"inheritsFromBase":{"type":"boolean","description":"Whether the custom categories are inherited from the base policy"},"restrictions":{"type":"object","description":"Custom category restrictions keyed by custom category name","additionalProperties":{"$ref":"#/components/schemas/CustomCategorySettings"}}},"required":["inheritsFromBase","restrictions"]},"CustomCategorySettings":{"type":"object","description":"Settings for a custom category","properties":{"restriction":{"type":"string","enum":["ALLOW","BLOCK","WARNING","IGNORE"],"description":"The action applied when the custom category is matched"},"page":{"type":"string","description":"Optional block/warning page identifier"},"exceptions":{"type":"object","description":"Per-entity overrides keyed by entity identifier","additionalProperties":{"$ref":"#/components/schemas/CategoryException"}}},"required":["restriction"]},"CategoryException":{"type":"object","description":"Per-entity override of a category restriction","properties":{"restriction":{"type":"string","enum":["ALLOW","BLOCK","WARNING"],"description":"The action applied for this entity"},"page":{"type":"string","description":"Optional block/warning page identifier"},"name":{"type":"string","description":"Human-readable entity name (returned on read APIs)"},"type":{"type":"string","enum":["users","groups"],"description":"Entity type (returned on read APIs)"}},"required":["restriction"]}}}}
```

## The PolicyContentResponse object

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"components":{"schemas":{"PolicyContentResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"categories":{"$ref":"#/components/schemas/CategoryBlock"},"customCategories":{"$ref":"#/components/schemas/CustomCategoryBlock"}},"required":["categories","customCategories"]}},"required":["data"]},"CategoryBlock":{"type":"object","description":"Wrapper for category data with inheritance flag","properties":{"inheritsFromBase":{"type":"boolean","description":"Whether the categories are inherited from the base policy"},"restrictions":{"type":"object","description":"Category restrictions keyed by category name","additionalProperties":{"$ref":"#/components/schemas/CategorySettings"}}},"required":["inheritsFromBase","restrictions"]},"CategorySettings":{"type":"object","description":"Settings for a dope category","properties":{"restriction":{"type":"string","enum":["ALLOW","BLOCK","WARNING"],"description":"The action applied when the category is matched"},"page":{"type":"string","description":"Optional block/warning page identifier"},"description":{"type":"string","description":"Category description"},"exceptions":{"type":"object","description":"Per-entity overrides keyed by entity identifier","additionalProperties":{"$ref":"#/components/schemas/CategoryException"}}},"required":["restriction"]},"CategoryException":{"type":"object","description":"Per-entity override of a category restriction","properties":{"restriction":{"type":"string","enum":["ALLOW","BLOCK","WARNING"],"description":"The action applied for this entity"},"page":{"type":"string","description":"Optional block/warning page identifier"},"name":{"type":"string","description":"Human-readable entity name (returned on read APIs)"},"type":{"type":"string","enum":["users","groups"],"description":"Entity type (returned on read APIs)"}},"required":["restriction"]},"CustomCategoryBlock":{"type":"object","description":"Wrapper for custom category data with inheritance flag","properties":{"inheritsFromBase":{"type":"boolean","description":"Whether the custom categories are inherited from the base policy"},"restrictions":{"type":"object","description":"Custom category restrictions keyed by custom category name","additionalProperties":{"$ref":"#/components/schemas/CustomCategorySettings"}}},"required":["inheritsFromBase","restrictions"]},"CustomCategorySettings":{"type":"object","description":"Settings for a custom category","properties":{"restriction":{"type":"string","enum":["ALLOW","BLOCK","WARNING","IGNORE"],"description":"The action applied when the custom category is matched"},"page":{"type":"string","description":"Optional block/warning page identifier"},"exceptions":{"type":"object","description":"Per-entity overrides keyed by entity identifier","additionalProperties":{"$ref":"#/components/schemas/CategoryException"}}},"required":["restriction"]}}}}
```

## The PolicyContentRestrictionsRequest object

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"components":{"schemas":{"PolicyContentRestrictionsRequest":{"type":"object","description":"Request body for updating restrictions on dope and custom categories","properties":{"data":{"type":"object","properties":{"categories":{"oneOf":[{"type":"object","additionalProperties":{"$ref":"#/components/schemas/CategoryRestrictionUpdate"}},{"$ref":"#/components/schemas/BaseInheritance"}],"description":"Restriction updates keyed by category name, or BaseInheritance to reset to base."},"customCategories":{"oneOf":[{"type":"object","additionalProperties":{"$ref":"#/components/schemas/CustomCategoryRestrictionUpdate"}},{"$ref":"#/components/schemas/BaseInheritance"}],"description":"Restriction updates keyed by custom category name, or BaseInheritance to reset to base."}}}},"required":["data"]},"CategoryRestrictionUpdate":{"type":"object","description":"Category restriction settings used in write operations","properties":{"restriction":{"type":"string","enum":["ALLOW","BLOCK","WARNING"],"description":"Action applied when the category is matched"},"page":{"type":"string","description":"Optional page identifier. Use with BLOCK and WARNING restrictions."}},"required":["restriction"]},"BaseInheritance":{"type":"object","description":"Signals that settings are inherited from the base policy","properties":{"inheritsFromBase":{"type":"boolean","enum":[true],"description":"Always `true`. Signals that settings are inherited from the base policy."}},"required":["inheritsFromBase"]},"CustomCategoryRestrictionUpdate":{"type":"object","description":"Custom category restriction settings used in write operations","properties":{"restriction":{"type":"string","enum":["ALLOW","BLOCK","WARNING","IGNORE"],"description":"Custom categories can be ignored, in addition to regular restrictions"},"page":{"type":"string","description":"Optional page identifier. Use with BLOCK and WARNING restrictions."}},"required":["restriction"]}}}}
```

## The CategoryExceptionUpdate object

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"components":{"schemas":{"CategoryExceptionUpdate":{"type":"object","description":"Exception settings used in write operations","properties":{"restriction":{"type":"string","enum":["ALLOW","BLOCK","WARNING"],"description":"The action applied for this user or group"},"page":{"type":"string","description":"Optional page identifier. Use with BLOCK and WARNING restrictions."}},"required":["restriction"]}}}}
```

## The PolicyContentExceptionsRequest object

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"components":{"schemas":{"PolicyContentExceptionsRequest":{"type":"object","description":"Request body for updating user/group exceptions on categories","properties":{"data":{"type":"object","properties":{"categories":{"type":"object","description":"Exception updates keyed first by category name, then by user or group identifier.","additionalProperties":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/CategoryExceptionUpdate"}}},"customCategories":{"type":"object","description":"Exception updates keyed first by custom category name, then by user or group identifier.","additionalProperties":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/CategoryExceptionUpdate"}}}}}},"required":["data"]},"CategoryExceptionUpdate":{"type":"object","description":"Exception settings used in write operations","properties":{"restriction":{"type":"string","enum":["ALLOW","BLOCK","WARNING"],"description":"The action applied for this user or group"},"page":{"type":"string","description":"Optional page identifier. Use with BLOCK and WARNING restrictions."}},"required":["restriction"]}}}}
```

## The AdminSetState object

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"components":{"schemas":{"AdminSetState":{"type":"object","properties":{"enabled":{"type":"boolean","description":"Indicates if endpoint is set to enabled or not by the admin"},"timestamp":{"type":"string","format":"date-time","description":"The timestamp when the admin last set the state of the endpoint"}}}}}}
```

## The Endpoint object

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"components":{"schemas":{"Endpoint":{"type":"object","properties":{"adminSetState":{"$ref":"#/components/schemas/AdminSetState"},"agentUUID":{"type":"string","format":"uuid","description":"the unique id of the endpoint"},"userUUID":{"type":"string","format":"uuid","description":"the unique id of the active user on the endpoint"},"agentVersion":{"type":"string","description":"the current version of the endpoint"},"binaryType":{"type":"string","description":"type of ISA for computer processors"},"cityName":{"type":"string","description":"the name of the city where the endpoint is located"},"region":{"type":"string","description":"the name of the region where the endpoint is located"},"countryName":{"type":"string","description":"the name of the country where the endpoint is located"},"cpuFamily":{"type":"string","description":"the type of CPU on the device hosting the endpoint"},"debugState":{"type":"string","description":"indicates the debug state of the endpoint. 0 means not in debug, 1 means set to debug, 2 means acknowledged receipt of debug request"},"deviceName":{"type":"string","description":"the name of the device hosting the endpoint"},"disableMode":{"type":"boolean","description":"indicates if the endpoint is disabled or not"},"errorMessage":{"type":"string","description":"additional details regarding an error"},"fallbackMode":{"type":"boolean","description":"indicates if the endpoint is in fallback mode"},"configurationLastUpdated":{"type":"string","format":"date-time","description":"the date and time when the endpoint last updated the configuration"},"osVersion":{"type":"string","description":"Operating System version of the device"},"policyName":{"type":"string","description":"name of the policy that is being used by the endpoint"},"realtimeConnection":{"type":"boolean","description":"indicates if the endpoint has an active web-socket connection"},"status":{"type":"string","description":"the current operational status of the endpoint"},"lastSeen":{"type":"string","format":"date-time","description":"the date and time when the endpoint was last seen"},"userId":{"type":"string","description":"the user id of the user that is using the endpoint. `userId` for OIDC users is usually their email address."},"emailId":{"type":"string","description":"the email of the user that is using the endpoint"}}},"AdminSetState":{"type":"object","properties":{"enabled":{"type":"boolean","description":"Indicates if endpoint is set to enabled or not by the admin"},"timestamp":{"type":"string","format":"date-time","description":"The timestamp when the admin last set the state of the endpoint"}}}}}}
```

## The PaginationResponse object

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"components":{"schemas":{"PaginationResponse":{"type":"object","description":"Information about current and next page for cursor based pagination","properties":{"endCursor":{"type":"string","description":"Opaque string representing a cursor to the last record returned in the response. Used for requesting the next page."},"hasNextPage":{"type":"boolean","description":"indicates if there is another page of data to fetch or not"}},"required":["endCursor","hasNextPage"]}}}}
```

## The Errors object

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"components":{"schemas":{"Errors":{"type":"object","description":"Error response containing a list of errors related to 400 and 500 http status","properties":{"errors":{"type":"array","minItems":1,"items":{"type":"object","properties":{"message":{"type":"string","description":"Error message"},"details":{"description":"Optional additional details regarding the error"}},"required":["message"]}}}}}}}
```

## The OAuthError object

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"components":{"schemas":{"OAuthError":{"type":"object","description":"The error response related OAuth tokens","properties":{"error":{"type":"string","description":"Specifies the OAuth error code string when the request for a token fails."}},"required":["error"]}}}}
```

## The SuccessMessage object

```json
{"openapi":"3.0.3","info":{"title":"Flightdeck - dope.security - Public API specification","version":"1.0.3"},"components":{"schemas":{"SuccessMessage":{"type":"object","description":"A simple message response indicating a successful operation","properties":{"message":{"type":"string","description":"Simple success message"}},"required":["message"]}}}}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://inflight.dope.security/dope.apis/public-api-specification.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
