Trusted Entities
Overview
The Trusted Entities API provides programmatic access to your organization's Trusted Entities: allowlisted domains, email addresses, and IPs/CIDRs that tune how Material treats email and files from those identities. List and filter entities, retrieve one by ID (including its change timeline), and create, update, or delete entries individually or in bulk. System-managed entities (auto-enrolled domains and Material defaults) can be customized but can't be deleted. Customizing one creates an override of its default settings.
Six endpoints make up the Trusted Entities API:
List Trusted Entities (
GET /api/v1/trusted-entities): filter and retrieve a paginated list of Trusted EntitiesGet Trusted Entity (
GET /api/v1/trusted-entities/{id}): retrieve a single Trusted Entity by its encoded IDCreate Trusted Entity (
POST /api/v1/trusted-entities): create a new Trusted EntityUpdate Trusted Entity (
PATCH /api/v1/trusted-entities/{id}): update the editable settings of an existing Trusted EntityDelete Trusted Entity (
DELETE /api/v1/trusted-entities/{id}): delete a Trusted EntityBulk Trusted Entities (
POST /api/v1/trusted-entities/bulk): apply up to 200 create, update, or delete operations in one request
Response Structure
List responses follow the standard two-part structure:
meta: pagination metadata, includinglimit,hasMore, andnextCursor. Unlike other paginated endpoints,totalCountisn't provided, because the list merges system-managed entities with the ones you've created. UsehasMoreandnextCursorto page.items: an array of Trusted Entity objects.
Results return system-managed entities first (auto-enrolled domains and Material defaults), followed by the entities you've created; each block is ordered by entity, then ID.
The include Parameter
By default, responses return each entity's settings. Pass include=timeline on the list or get endpoints to also return the change timeline (creation, comments, and setting updates).
Want a walkthrough?
Review Hello World.
Pagination and Rate Limiting
Material APIs use cursor-based pagination: you pass the
nextCursorvalue from one response as thecursorparameter in the next request.The
limitparameter controls page size and is locked into the cursor, so later pages keep the page size of the first request.Every paginated response includes a
metaobject withlimit,hasMore, andnextCursor(totalCountisn't available for Trusted Entities).When
hasMoreis false andnextCursoris null, you've reached the last page.
Retrieves a paginated list of Trusted Entities: allowlisted domains, email addresses, and IPs or CIDR ranges. Results return system-managed entities first (auto-enrolled domains and Material defaults), then the entities you've created, with each block ordered by entity and then ID. Filter by type, enabled state, and tenant. totalCount is not provided for this endpoint, so use meta.hasMore and meta.nextCursor to page.
Material Security API key
The pagination cursor returned in a previous response. Pass this value to retrieve the next page of results.
eyJ2IjoxLCJvIjoyNSwibCI6MjV9The maximum number of items to return per page.
25Filter by types (comma-separated).
external_domain,internal_domainFilter to enabled (true) or disabled (false).
Filter to a specific tenant, as an encoded tenant ID (format tnt.1.<base64>).
tnt.1.ZXhhbXBsZV9pZF8xMjMPattern: ^[a-z]{1,6}\.[0-9]{1,2}\.[A-Za-z0-9_-]+$Comma-separated includes. Supported: timeline.
timelineSuccessful response
Bad request: invalid parameters or request body
Unauthorized: missing or invalid API key
Forbidden: the API key doesn't have permission to perform this action
Not found: the requested resource doesn't exist
Too many requests: the client has exceeded a rate limit and should retry later
Internal server error
GET /api/v1/trusted-entities HTTP/1.1
Host: your-instance.on.material.security
x-material-client-secret: YOUR_API_KEY
Accept: */*
{
"meta": {
"totalCount": 1,
"limit": 1,
"hasMore": true,
"nextCursor": "text"
},
"items": [
{
"id": "te.1.ZXhhbXBsZV9pZF8xMjM",
"entity": "evil.com",
"type": "external_domain",
"tenant": "tnt.1.ZXhhbXBsZV9pZF8xMjM",
"enabled": true,
"subdomains": "included",
"emailThreatDetection": "detect",
"emailAuthentication": "enforced",
"fileDetection": "treat_as_internal",
"updatedAt": "2026-01-01T00:00:00.000Z",
"updatedBy": "acct.1.ZXhhbXBsZV9pZF8xMjM",
"timeline": {
"meta": {
"totalCount": 1,
"limit": 1,
"hasMore": true,
"nextCursor": "text"
},
"items": [
{
"type": "created",
"at": "2026-01-01T00:00:00.000Z",
"actor": "acct.1.ZXhhbXBsZV9pZF8xMjM",
"detail": "text"
}
]
}
}
]
}Creates a Trusted Entity. entity and type are required; other settings default to the least-permissive values. Returns 200 with the created entity.
Material Security API key
The domain, email address, or IP/CIDR to allowlist.
evil.comThe kind of identity to allowlist: external_domain, internal_domain, email_address, or ip_address.
The encoded ID of the tenant this entry applies to. Format: tnt.1.<base64>. Omit or set to null to apply globally across all tenants.
tnt.1.ZXhhbXBsZV9pZF8xMjMWhether the entry is active. Defaults to true.
trueWhether to also cover subdomains of the domain: included or not_included. Domain entities only; rejected for email address and IP entities.
The email threat handling for messages from this entity: detect (detect threats normally), ignore_mark_safe (create issues, but mark messages safe), or ignore_dont_create_issues (don't create phishing issues). Defaults to detect.
detectPossible values: The email authentication handling for this entity: enforced (don't trust messages that fail authentication) or ignored (trust messages regardless of authentication). Defaults to enforced.
enforcedPossible values: The file detection handling for this entity: treat_as_internal (treat entity as internal) or treat_as_external (treat entity as external). Domain and email address entities only; rejected for IP entities.
Successful response
An organization-level allowlist entry (a domain, email address, or IP/CIDR) that tunes how Material treats mail and files from that identity.
The encoded trusted-entity ID. Format: te.1.<base64>.
te.1.ZXhhbXBsZV9pZF8xMjMThe domain, email address, or IP/CIDR this entry allowlists.
evil.comThe kind of identity this entry allowlists: external_domain, internal_domain, email_address, or ip_address.
The encoded ID of the tenant this entry applies to. Format: tnt.1.<base64>. null means it applies globally across all tenants.
tnt.1.ZXhhbXBsZV9pZF8xMjMWhether this Trusted Entity is active.
Whether the entry also covers subdomains of the domain: included or not_included. Applies to domain entities only; null for email address and IP entities.
The email threat handling for messages from this entity: detect (detect threats normally), ignore_mark_safe (create issues, but mark messages safe), or ignore_dont_create_issues (don't create phishing issues).
The email authentication handling for this entity: enforced (don't trust messages that fail authentication) or ignored (trust messages regardless of authentication).
The file detection handling for this entity: treat_as_internal (treat entity as internal) or treat_as_external (treat entity as external). Applies to domain and email address entities only; null for IP entities.
When the entry was last modified, in ISO 8601 format. null for system-managed entities.
The encoded account ID of the last editor. Format: acct.1.<base64>. null for system-managed entities.
acct.1.ZXhhbXBsZV9pZF8xMjMBad request: invalid parameters or request body
Unauthorized: missing or invalid API key
Forbidden: the API key doesn't have permission to perform this action
Not found: the requested resource doesn't exist
Too many requests: the client has exceeded a rate limit and should retry later
Internal server error
POST /api/v1/trusted-entities HTTP/1.1
Host: your-instance.on.material.security
x-material-client-secret: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 223
{
"entity": "evil.com",
"type": "external_domain",
"tenant": "tnt.1.ZXhhbXBsZV9pZF8xMjM",
"enabled": true,
"subdomains": "included",
"emailThreatDetection": "detect",
"emailAuthentication": "enforced",
"fileDetection": "treat_as_internal"
}{
"id": "te.1.ZXhhbXBsZV9pZF8xMjM",
"entity": "evil.com",
"type": "external_domain",
"tenant": "tnt.1.ZXhhbXBsZV9pZF8xMjM",
"enabled": true,
"subdomains": "included",
"emailThreatDetection": "detect",
"emailAuthentication": "enforced",
"fileDetection": "treat_as_internal",
"updatedAt": "2026-01-01T00:00:00.000Z",
"updatedBy": "acct.1.ZXhhbXBsZV9pZF8xMjM",
"timeline": {
"meta": {
"totalCount": 1,
"limit": 1,
"hasMore": true,
"nextCursor": "text"
},
"items": [
{
"type": "created",
"at": "2026-01-01T00:00:00.000Z",
"actor": "acct.1.ZXhhbXBsZV9pZF8xMjM",
"detail": "text"
}
]
}
}Retrieves a single Trusted Entity by its encoded ID. Use include=timeline to pull the change timeline.
Material Security API key
Encoded trusted-entity id. Format: te.1.<base64>.
te.1.ZXhhbXBsZV9pZF8xMjMPattern: ^[a-z]{1,6}\.[0-9]{1,2}\.[A-Za-z0-9_-]+$Comma-separated includes. Supported: timeline.
timelineSuccessful response
An organization-level allowlist entry (a domain, email address, or IP/CIDR) that tunes how Material treats mail and files from that identity.
The encoded trusted-entity ID. Format: te.1.<base64>.
te.1.ZXhhbXBsZV9pZF8xMjMThe domain, email address, or IP/CIDR this entry allowlists.
evil.comThe kind of identity this entry allowlists: external_domain, internal_domain, email_address, or ip_address.
The encoded ID of the tenant this entry applies to. Format: tnt.1.<base64>. null means it applies globally across all tenants.
tnt.1.ZXhhbXBsZV9pZF8xMjMWhether this Trusted Entity is active.
Whether the entry also covers subdomains of the domain: included or not_included. Applies to domain entities only; null for email address and IP entities.
The email threat handling for messages from this entity: detect (detect threats normally), ignore_mark_safe (create issues, but mark messages safe), or ignore_dont_create_issues (don't create phishing issues).
The email authentication handling for this entity: enforced (don't trust messages that fail authentication) or ignored (trust messages regardless of authentication).
The file detection handling for this entity: treat_as_internal (treat entity as internal) or treat_as_external (treat entity as external). Applies to domain and email address entities only; null for IP entities.
When the entry was last modified, in ISO 8601 format. null for system-managed entities.
The encoded account ID of the last editor. Format: acct.1.<base64>. null for system-managed entities.
acct.1.ZXhhbXBsZV9pZF8xMjMBad request: invalid parameters or request body
Unauthorized: missing or invalid API key
Forbidden: the API key doesn't have permission to perform this action
Not found: the requested resource doesn't exist
Too many requests: the client has exceeded a rate limit and should retry later
Internal server error
GET /api/v1/trusted-entities/{id} HTTP/1.1
Host: your-instance.on.material.security
x-material-client-secret: YOUR_API_KEY
Accept: */*
{
"id": "te.1.ZXhhbXBsZV9pZF8xMjM",
"entity": "evil.com",
"type": "external_domain",
"tenant": "tnt.1.ZXhhbXBsZV9pZF8xMjM",
"enabled": true,
"subdomains": "included",
"emailThreatDetection": "detect",
"emailAuthentication": "enforced",
"fileDetection": "treat_as_internal",
"updatedAt": "2026-01-01T00:00:00.000Z",
"updatedBy": "acct.1.ZXhhbXBsZV9pZF8xMjM",
"timeline": {
"meta": {
"totalCount": 1,
"limit": 1,
"hasMore": true,
"nextCursor": "text"
},
"items": [
{
"type": "created",
"at": "2026-01-01T00:00:00.000Z",
"actor": "acct.1.ZXhhbXBsZV9pZF8xMjM",
"detail": "text"
}
]
}
}Deletes a Trusted Entity by its encoded ID. System-managed entities, whether auto-enrolled or Material defaults, can't be deleted. Returns 204 No Content.
Material Security API key
Encoded trusted-entity id. Format: te.1.<base64>.
te.1.ZXhhbXBsZV9pZF8xMjMPattern: ^[a-z]{1,6}\.[0-9]{1,2}\.[A-Za-z0-9_-]+$Bad request: invalid parameters or request body
A human-readable description of the error.
Unauthorized: missing or invalid API key
Forbidden: the API key doesn't have permission to perform this action
Not found: the requested resource doesn't exist
Too many requests: the client has exceeded a rate limit and should retry later
Internal server error
DELETE /api/v1/trusted-entities/{id} HTTP/1.1
Host: your-instance.on.material.security
x-material-client-secret: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 2
{}{
"error": "text",
"validationFailures": [
{
"ANY_ADDITIONAL_PROPERTY": "anything"
}
]
}Updates the editable settings of a Trusted Entity. entity, type, and tenant can't be changed after creation. Only provided fields change. Updating a system-managed entity (auto-enrolled or Material) creates a customization that overrides its default settings.
Material Security API key
Encoded trusted-entity id. Format: te.1.<base64>.
te.1.ZXhhbXBsZV9pZF8xMjMPattern: ^[a-z]{1,6}\.[0-9]{1,2}\.[A-Za-z0-9_-]+$Whether the entry is active.
Whether to also cover subdomains of the domain: included or not_included. Domain entities only.
The email threat handling for messages from this entity: detect (detect threats normally), ignore_mark_safe (create issues, but mark messages safe), or ignore_dont_create_issues (don't create phishing issues).
The email authentication handling for this entity: enforced (don't trust messages that fail authentication) or ignored (trust messages regardless of authentication).
The file detection handling for this entity: treat_as_internal (treat entity as internal) or treat_as_external (treat entity as external). Domain and email address entities only.
Successful response
An organization-level allowlist entry (a domain, email address, or IP/CIDR) that tunes how Material treats mail and files from that identity.
The encoded trusted-entity ID. Format: te.1.<base64>.
te.1.ZXhhbXBsZV9pZF8xMjMThe domain, email address, or IP/CIDR this entry allowlists.
evil.comThe kind of identity this entry allowlists: external_domain, internal_domain, email_address, or ip_address.
The encoded ID of the tenant this entry applies to. Format: tnt.1.<base64>. null means it applies globally across all tenants.
tnt.1.ZXhhbXBsZV9pZF8xMjMWhether this Trusted Entity is active.
Whether the entry also covers subdomains of the domain: included or not_included. Applies to domain entities only; null for email address and IP entities.
The email threat handling for messages from this entity: detect (detect threats normally), ignore_mark_safe (create issues, but mark messages safe), or ignore_dont_create_issues (don't create phishing issues).
The email authentication handling for this entity: enforced (don't trust messages that fail authentication) or ignored (trust messages regardless of authentication).
The file detection handling for this entity: treat_as_internal (treat entity as internal) or treat_as_external (treat entity as external). Applies to domain and email address entities only; null for IP entities.
When the entry was last modified, in ISO 8601 format. null for system-managed entities.
The encoded account ID of the last editor. Format: acct.1.<base64>. null for system-managed entities.
acct.1.ZXhhbXBsZV9pZF8xMjMBad request: invalid parameters or request body
Unauthorized: missing or invalid API key
Forbidden: the API key doesn't have permission to perform this action
Not found: the requested resource doesn't exist
Too many requests: the client has exceeded a rate limit and should retry later
Internal server error
PATCH /api/v1/trusted-entities/{id} HTTP/1.1
Host: your-instance.on.material.security
x-material-client-secret: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 141
{
"enabled": true,
"subdomains": "included",
"emailThreatDetection": "detect",
"emailAuthentication": "enforced",
"fileDetection": "treat_as_internal"
}{
"id": "te.1.ZXhhbXBsZV9pZF8xMjM",
"entity": "evil.com",
"type": "external_domain",
"tenant": "tnt.1.ZXhhbXBsZV9pZF8xMjM",
"enabled": true,
"subdomains": "included",
"emailThreatDetection": "detect",
"emailAuthentication": "enforced",
"fileDetection": "treat_as_internal",
"updatedAt": "2026-01-01T00:00:00.000Z",
"updatedBy": "acct.1.ZXhhbXBsZV9pZF8xMjM",
"timeline": {
"meta": {
"totalCount": 1,
"limit": 1,
"hasMore": true,
"nextCursor": "text"
},
"items": [
{
"type": "created",
"at": "2026-01-01T00:00:00.000Z",
"actor": "acct.1.ZXhhbXBsZV9pZF8xMjM",
"detail": "text"
}
]
}
}Applies up to 200 create/update/delete operations in one request, best-effort with per-item results in request order (results[i] corresponds to operations[i]). A well-formed envelope always returns 200; individual failures are reported in results[].
Material Security API key
Up to 200 operations, applied best-effort with per-item results.
Successful response
Per-operation result, in the same order as the request.
Bad request: invalid parameters or request body
Unauthorized: missing or invalid API key
Forbidden: the API key doesn't have permission to perform this action
Not found: the requested resource doesn't exist
Too many requests: the client has exceeded a rate limit and should retry later
Internal server error
POST /api/v1/trusted-entities/bulk HTTP/1.1
Host: your-instance.on.material.security
x-material-client-secret: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 265
{
"operations": [
{
"method": "text",
"body": {
"entity": "evil.com",
"type": "external_domain",
"tenant": "tnt.1.ZXhhbXBsZV9pZF8xMjM",
"enabled": true,
"subdomains": "included",
"emailThreatDetection": "detect",
"emailAuthentication": "enforced",
"fileDetection": "treat_as_internal"
}
}
]
}{
"results": [
{
"method": "create",
"status": "text",
"index": 1,
"id": "text",
"entity": {
"id": "te.1.ZXhhbXBsZV9pZF8xMjM",
"entity": "evil.com",
"type": "external_domain",
"tenant": "tnt.1.ZXhhbXBsZV9pZF8xMjM",
"enabled": true,
"subdomains": "included",
"emailThreatDetection": "detect",
"emailAuthentication": "enforced",
"fileDetection": "treat_as_internal",
"updatedAt": "2026-01-01T00:00:00.000Z",
"updatedBy": "acct.1.ZXhhbXBsZV9pZF8xMjM",
"timeline": {
"meta": {
"totalCount": 1,
"limit": 1,
"hasMore": true,
"nextCursor": "text"
},
"items": [
{
"type": "created",
"at": "2026-01-01T00:00:00.000Z",
"actor": "acct.1.ZXhhbXBsZV9pZF8xMjM",
"detail": "text"
}
]
}
}
}
],
"meta": {
"succeeded": 1,
"failed": 1
}
}Last updated
Was this helpful?

