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.
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_idandclient_secretare created by an admin via the dope console.Returned access tokens are valid for a limited time period. Clients must check the
expires_invalue 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.
The type of grant requested. You must set this to client_credentials
Your application's Client ID.
Your application's Client Secret.
OK
The new access token.
eyJz93a...k4laUWwThe type of token returned.
The expiration time of the new access token in seconds.
3600Bad request
Client not authorized
Internal server error.
POST /v1/partner/oauth/token HTTP/1.1
Host: api.flightdeck.dope.security
Content-Type: application/json
Accept: */*
Content-Length: 77
{
"grant_type": "client_credentials",
"client_id": "text",
"client_secret": "text"
}{
"access_token": "eyJz93a...k4laUWw",
"token_type": "bearer",
"expires_in": 3600
}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
lastSeenproperty.
Broad search query across endpoints by device, user and email identities that contain this string (case-insensitive)
Search by email ids that contain this string (case-insensitive)
Search by device names that contain this string (case-insensitive)
Search by user ids that contain this string (case-insensitive). userId for OIDC users is usually their email address.
Filter by this exact device OS version string
Filter by the fallback mode
Filter by this exact location id - with an underscore separating the case sensitive city and country values e.g. "City_Country"
Filter by this exact agent version
An optional pagination param that states the number of records requested from the start of the cursor. The default value is 50.
50An 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.
The direction of the sort by the lastSeen property. The default is to sort by descending
OK
Bad request
Access denied
Internal server error.
GET /v1/endpoints/search HTTP/1.1
Host: api.flightdeck.dope.security
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"data": {
"pageInfo": {
"endCursor": "text",
"hasNextPage": true
},
"endpoints": [
{
"adminSetState": {
"enabled": true,
"timestamp": "2024-04-10T00:00:00+00:00"
},
"agentUUID": "10e68510c-0885-4943-a8b0-b6feb29a9f81",
"userUUID": "24c38805-1289-44fa-b974-2071a1702ba9",
"agentVersion": "1.0.00000",
"binaryType": "x86",
"cityName": "Cork",
"region": "Munster",
"countryName": "Ireland",
"cpuFamily": "Apple M1 Max",
"debugState": "1",
"deviceName": "Dope-MacBook-Pro.local",
"disableMode": false,
"errorMessage": "Agent is not running.",
"fallbackMode": false,
"configurationLastUpdated": "2023-10-10T10:10:00-0000",
"osVersion": "Mac13",
"policyName": "Base Policy",
"realtimeConnection": true,
"status": "healthy",
"lastSeen": "2023-10-10T10:10:00-0000",
"userId": "dope-user",
"emailId": "givenName.familyName@dope.security"
}
]
}
}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.
An optional pagination param that states the number of records requested from the start of the cursor. The default value is 50.
50An 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.
Sort order for policy names. Defaults to asc.
ascPossible values: OK
Bad request
Access denied
Internal server error.
GET /v1/policies HTTP/1.1
Host: api.flightdeck.dope.security
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"data": {
"policies": [
{
"policyName": "Base Policy",
"updatedAt": "2025-07-01T10:00:00+00:00",
"sslInspection": "enabled"
},
{
"policyName": "Engineering",
"updatedAt": "2025-07-23T08:30:09+00:00",
"sslInspection": "enabled",
"clashCount": 3
}
],
"pageInfo": {
"endCursor": "RW5naW5lZXJpbmc=",
"hasNextPage": true
}
}
}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:
# ! @ $ % ^ * ? . / \
The name of the policy to create
MarketingPattern: ^[^#!@$%^*?./\\]+$OK
A simple message response indicating a successful operation
Simple success message
SuccessBad request - invalid policy name or policy already exists
Unauthorized access
Internal server error.
POST /v1/policies/{policy_name} HTTP/1.1
Host: api.flightdeck.dope.security
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"message": "Success"
}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.
The name of the policy to delete
EngineeringOK
A simple message response indicating a successful operation
Simple success message
SuccessBad request. Policy not found or attempted to delete Base Policy.
Unauthorized access
Internal server error.
DELETE /v1/policies/{policy_name} HTTP/1.1
Host: api.flightdeck.dope.security
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"message": "Success"
}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.
The name of the policy to retrieve content for
ExamplePolicyOK
Bad request
Unauthorized access
Internal server error.
GET /v1/policies/{policy_name}/content HTTP/1.1
Host: api.flightdeck.dope.security
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"data": {
"categories": {
"inheritsFromBase": false,
"restrictions": {
"Social Media": {
"restriction": "BLOCK",
"page": "blockpage1",
"description": "Social networking sites",
"exceptions": {
"alice@example.com": {
"restriction": "ALLOW",
"name": "Alice",
"type": "users"
}
}
}
}
},
"customCategories": {
"inheritsFromBase": false,
"restrictions": {
"My Custom Cat": {
"restriction": "BLOCK",
"page": "blockpage2",
"exceptions": {}
}
}
}
}
}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.
The name of the policy to update restrictions for
ExamplePolicyRequest body for updating restrictions on dope and custom categories
OK
A simple message response indicating a successful operation
Simple success message
SuccessBad request
Unauthorized access
Internal server error.
PUT /v1/policies/{policy_name}/content/restrictions HTTP/1.1
Host: api.flightdeck.dope.security
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 49
{
"data": {
"categories": {
"inheritsFromBase": true
}
}
}{
"message": "Success"
}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.
The name of the policy to update exceptions for
ExamplePolicyRequest body for updating user/group exceptions on categories
OK
A simple message response indicating a successful operation
Simple success message
SuccessBad request
Unauthorized access
Internal server error.
PUT /v1/policies/{policy_name}/content/exceptions HTTP/1.1
Host: api.flightdeck.dope.security
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 249
{
"data": {
"categories": {
"Social Media": {
"user@example.com": {
"restriction": "BLOCK",
"page": "blockpage1"
},
"user2@example.com": {
"restriction": "ALLOW"
}
}
},
"customCategories": {
"MyCustomCat": {
"user@example.com": {
"restriction": "BLOCK",
"page": "blockpage1"
}
}
}
}
}{
"message": "Success"
}Use this API to get the users and groups assigned to a policy.
The name of the policy to get assignments for
EngineeringOK
Bad request
Access denied
Internal server error.
GET /v1/policies/{policy_name}/assignments HTTP/1.1
Host: api.flightdeck.dope.security
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"data": {
"users": [
{
"email": "user@example.com",
"name": "John Doe"
}
],
"groups": [
{
"email": "engineering@example.com",
"name": "Engineering",
"membersCount": 5
}
]
}
}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.
All submitted users/groups must be valid and not assigned to any policy currently. The API will reject such requests and list the invalid or conflicting entries in the response.
The name of the policy to update assignments for
EngineeringUser emails to assign. Omit to leave unchanged, send [] to unassign all.
Group emails to assign. Omit to leave unchanged, send [] to unassign all.
OK
A simple message response indicating a successful operation
Simple success message
SuccessBad request
Access denied
Internal server error.
PUT /v1/policies/{policy_name}/assignments HTTP/1.1
Host: api.flightdeck.dope.security
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 87
{
"users": [
"user@example.com",
"user2@example.com"
],
"groups": [
"engineering@example.com"
]
}{
"message": "Success"
}Use this API to get the URL bypass entries for a policy.
The response contains both admin-defined custom entries and dope-provided default entries with their per-entry toggle state.
When a policy inherits from the base policy, inheritsFromBase will be true and the custom and default entries will reflect the base policy's settings.
The name of the policy to retrieve the URL bypass for
EngineeringOK
Bad request
Access denied
Internal server error.
GET /v1/policies/{policy_name}/bypass/urls HTTP/1.1
Host: api.flightdeck.dope.security
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"data": {
"inheritsFromBase": false,
"custom": [
{
"name": "*.example.com",
"note": "Example domain",
"updatedBy": "admin@example.com",
"updatedAt": "2026-03-15T10:30:00Z"
},
{
"name": "internal.corp.net",
"note": "Internal network",
"updatedBy": "admin@example.com",
"updatedAt": "2026-03-18T09:00:00Z"
}
],
"default": [
{
"name": "*.acrobat.com",
"state": "applied"
},
{
"name": "*.adobe.com",
"state": "ignored"
}
]
}
}Upsert custom URL bypass entries and/or update default URL bypass states for a policy.
Custom entries are matched by name: matching names are overwritten, unknown names are added. Unmentioned custom entries are preserved.
Default entries are matched by name: set state to ignored to suppress a default entry, or applied to re-enable it. Unknown default entry names are silently ignored.
Pass inheritsFromBase: true as the entire data payload to reset the policy to inherit all URL bypass configuration from the base policy (this drops all custom entries and default overrides for this policy).
Detaching from Base: If a policy inherits from the Base Policy (inheritsFromBase: true), sending custom or default entries will detach it. Base entries are not copied — include any you want to keep in the request. Once detached, further Base Policy changes will no longer propagate to this policy.
The name of the policy to update URL bypass entries for
MarketingURL bypass updated successfully
A simple message response indicating a successful operation
Simple success message
SuccessBad request or policy not found
Unauthorized — missing or invalid bearer token
Internal server error
PUT /v1/policies/{policy_name}/bypass/urls HTTP/1.1
Host: api.flightdeck.dope.security
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 192
{
"data": {
"custom": [
{
"name": "*.example.com",
"note": "Internal domain"
},
{
"name": "internal.corp.net"
}
],
"default": [
{
"name": "*.zoom.us",
"state": "ignored"
},
{
"name": "*.apple.com",
"state": "applied"
}
]
}
}{
"message": "Success"
}Use this API to delete custom URL bypass entries from a policy by name.
The operation is idempotent — names that do not exist are silently ignored.
Policies that inherit URL bypass from the Base Policy cannot have custom URLs deleted.
The name of the policy to delete URL bypass entries from
EngineeringOK
A simple message response indicating a successful operation
Simple success message
SuccessBad request. Policy not found or policy inherits URL bypass from Base Policy.
Access denied
Internal server error.
DELETE /v1/policies/{policy_name}/bypass/urls HTTP/1.1
Host: api.flightdeck.dope.security
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 66
{
"data": {
"custom": {
"urls": [
"*.example.com",
"internal.corp.net"
]
}
}
}{
"message": "Success"
}Use this API to get the application bypass entries for a policy.
The response contains both admin-defined custom entries and dope-provided default entries with their per-entry toggle state, split per platform (mac and windows).
When a policy inherits from the base policy, inheritsFromBase will be true and the custom and default entries will reflect the base policy's settings.
The name of the policy to retrieve the application bypass for
EngineeringOK
Bad request
Access denied
Internal server error.
GET /v1/policies/{policy_name}/bypass/applications HTTP/1.1
Host: api.flightdeck.dope.security
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"data": {
"inheritsFromBase": false,
"custom": {
"mac": [
{
"name": "Slack.app",
"note": "Team communication",
"updatedBy": "admin@example.com",
"updatedAt": "2026-03-15T10:30:00Z"
}
],
"windows": [
{
"name": "teams.exe",
"note": "Microsoft Teams",
"updatedBy": "admin@example.com",
"updatedAt": "2026-03-18T09:00:00Z"
}
]
},
"default": {
"mac": [
{
"name": "Zoom.app",
"state": "applied"
},
{
"name": "Music.app",
"state": "ignored"
}
],
"windows": [
{
"name": "svchost.exe",
"state": "applied"
},
{
"name": "OneDrive.exe",
"state": "ignored"
}
]
}
}
}Upsert custom application bypass entries and/or update default application bypass states for a policy.
Custom entries are matched by name: matching names are overwritten, unknown names are added. Unmentioned custom entries are preserved.
Default entries are matched by name: set state to ignored to suppress a default entry, or applied to re-enable it. Unknown default entry names are silently ignored.
Pass inheritsFromBase: true as the entire data payload to reset the policy to inherit all application bypass configuration from the base policy (this drops all custom entries and default overrides for this policy).
Detaching from Base: If a policy inherits from the Base Policy (inheritsFromBase: true), sending custom or default entries will detach it. Base entries are not copied — include any you want to keep in the request. Once detached, further Base Policy changes will no longer propagate to this policy.
The name of the policy to update application bypass entries for
MarketingApplication bypass updated successfully
A simple message response indicating a successful operation
Simple success message
SuccessBad request or policy not found
Unauthorized — missing or invalid bearer token
Internal server error
PUT /v1/policies/{policy_name}/bypass/applications HTTP/1.1
Host: api.flightdeck.dope.security
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 34
{
"data": {
"inheritsFromBase": true
}
}{
"message": "Success"
}Use this API to delete custom application bypass entries from a policy by name.
The operation is idempotent — names that do not exist are silently ignored.
At least one of mac or windows must be provided.
Policies that inherit application bypass from the Base Policy cannot have custom applications deleted.
The name of the policy to delete application bypass entries from
EngineeringOK
A simple message response indicating a successful operation
Simple success message
SuccessBad request. Policy not found, validation error, or policy inherits application bypass from Base Policy.
Access denied
Internal server error.
DELETE /v1/policies/{policy_name}/bypass/applications HTTP/1.1
Host: api.flightdeck.dope.security
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 65
{
"data": {
"custom": {
"mac": [
"Slack.app"
],
"windows": [
"teams.exe"
]
}
}
}{
"message": "Success"
}Use this API to get the SSL inspection configuration for a policy.
The response returns sslInspection as an object containing the resolved state (always enabled or disabled) and inheritsFromBase indicating whether the policy inherits SSL inspection from the Base Policy.
The name of the policy to retrieve SSL inspection for
EngineeringOK
Bad request
Access denied
Internal server error.
GET /v1/policies/{policy_name}/ssl-inspection HTTP/1.1
Host: api.flightdeck.dope.security
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"data": {
"sslInspection": {
"inheritsFromBase": false,
"state": "disabled"
}
}
}Use this API to update the SSL inspection configuration for a policy.
The request body must be either:
{"state": "enabled" | "disabled"}to set a custom state on this policy, OR{"inheritsFromBase": true}to make this policy inherit SSL inspection from the Base Policy.
Exactly one of these two shapes is allowed. Anything else (extra fields, both fields, inheritsFromBase: false) returns 400. The Base Policy cannot inherit from itself; setting inheritsFromBase: true on the Base Policy returns 400.
The name of the policy to update SSL inspection for
EngineeringSSL inspection updated successfully
A simple message response indicating a successful operation
Simple success message
SuccessBad request or policy not found
Access denied
Internal server error.
PUT /v1/policies/{policy_name}/ssl-inspection HTTP/1.1
Host: api.flightdeck.dope.security
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 46
{
"data": {
"sslInspection": {
"state": "enabled"
}
}
}{
"message": "Success"
}Use this API to get a paginated list of all custom categories.
Results are returned in pages using cursor based pagination.
An optional pagination param that states the number of records requested from the start of the cursor. The default value is 50.
50An 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.
OK
Access denied
Internal server error.
GET /v1/custom_categories HTTP/1.1
Host: api.flightdeck.dope.security
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"data": {
"pageInfo": {
"endCursor": "abc123",
"hasNextPage": true
},
"customCategories": [
"Gambling",
"Social Media",
"Streaming"
]
}
}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:
# ! @ $ % ^ * ? . / \
The name of the custom category to create
Streaming_Custom_CategoryPattern: ^[^#!@$%^*?./\\]+$OK
A simple message response indicating a successful operation
Simple success message
SuccessBad request - invalid custom category name or custom category already exists
Unauthorized access
Internal server error.
POST /v1/custom_categories/{custom_category_name} HTTP/1.1
Host: api.flightdeck.dope.security
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"message": "Success"
}Use this API to delete a single custom category by name. This action will remove the custom category and all of its associated data.
The name of the custom category to delete
Social MediaOK
A simple message response indicating a successful operation
Simple success message
SuccessBad request
Unauthorized access
Internal server error.
DELETE /v1/custom_categories/{custom_category_name} HTTP/1.1
Host: api.flightdeck.dope.security
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"message": "Success"
}Use this API to get all URLs of an existing custom category.
The name of the custom category to get URLs from
OK
Bad request
Unauthorized access
Internal server error.
GET /v1/custom_categories/{custom_category_name}/urls HTTP/1.1
Host: api.flightdeck.dope.security
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"data": {
"urls": [
"dope.security",
"google.com"
]
}
}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.
The name of the custom category to add URLs to
OK
A simple message response indicating a successful operation
Simple success message
SuccessBad request
Unauthorized access
Internal server error.
POST /v1/custom_categories/{custom_category_name}/urls HTTP/1.1
Host: api.flightdeck.dope.security
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 48
{
"data": {
"urls": [
"dope.security",
"google.com"
]
}
}{
"message": "Success"
}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.
The name of the custom category to overwrite URLs for
AI-ML ChatbotsOK
A simple message response indicating a successful operation
Simple success message
SuccessBad request
Unauthorized access
Internal server error.
PUT /v1/custom_categories/{custom_category_name}/urls HTTP/1.1
Host: api.flightdeck.dope.security
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 81
{
"data": {
"urls": [
"chat.openai.com",
"gemini.google.com",
"copilot.microsoft.com"
]
}
}{
"message": "Success"
}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.
The name of the custom category to delete all URLs from
OK
A simple message response indicating a successful operation
Simple success message
SuccessBad request
Unauthorized access
Internal server error.
DELETE /v1/custom_categories/{custom_category_name}/urls HTTP/1.1
Host: api.flightdeck.dope.security
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"message": "Success"
}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.
The name of the custom category to delete given URL from
The URL to be deleted (Ensure that URLs are properly URL-encoded using the UTF8 encoding method)
https%3A%2F%2Fdope.securityOK
A simple message response indicating a successful operation
Simple success message
SuccessBad request
Unauthorized access
Internal server error.
DELETE /v1/custom_categories/{custom_category_name}/url/{encoded_url} HTTP/1.1
Host: api.flightdeck.dope.security
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"message": "Success"
}Last updated

