Download OpenAPI specification:Download
The information and data accessible via this API contain Proofpoint proprietary, confidential, and/or trade secret information. Sharing or providing the information to another party without Proofpoint's express written consent is prohibited. Please review the updated Terms of Use for Proofpoint APIs. API Terms of Use can be found online at API Terms of Use | Proofpoint US.
Proofpoint provides advanced detection through its Intelligent Cloud Email Security (ICES) products to protect organizations from inbound threats and outbound data loss.
The Proofpoint API provides customers access to Proofpoint security event data and can be used to integrate into your SOC Workflows and other auditing and monitoring measures.
We offer RESTful API endpoints that return JSON objects containing the requested data.
The API enables you to ingest Proofpoint data into your own tools or datastores, where you can visualize and interact with the data.
The most common use cases for which data is consumed outside the Proofpoint Portal include:
The most common use case is to call the API on a recurring basis (e.g. once per hour or day) to retrieve all new or updated data, and send that data to your desired data tool.
The hostname of the API endpoint will be the same as for the URL of your Proofpoint Portal page:
https://your-subdomain.tessian-platform.com/...
https://your-subdomain.tessian-app.com/...
The documentation for each endpoint provides an example code snippet showing how to call it, alongside the schemas for the request and response.
In order to authenticate and authorize the API request, you must provide a valid API Token.
ℹ️ Note
In order to generate an API Token, the user creating it must be assigned to a role with both "Integrations" and "Security Events" permissions.
A Proofpoint Portal user who has the correct permissions can generate an API Token by navigating to Integrations > Security Integrations > Proofpoint API in the Proofpoint Portal.
⚠️ Warning
The API Token will only ever be shown once; at the time it is generated.
An API Token always has the same permissions as the user who created it. Changes to permissions of the the owning user are automatically reflected in the Token's permissions.
If the owning user is deleted, the API Token's access will be revoked automatically. Similarly, if an API Token is deleted from the Proofpoint API Portal page (Integrations > Security Integrations > Proofpoint API), it will no longer be valid and any subsequent API requests will be rejected.
If you prefer, you can create a separate Proofpoint Portal user as a "service" account for access to the API, rather than representing a human. This can then be used as an API-only account, e.g. for Managed Service Providers to access the Proofpoint API. As with any user account, the Tokens created while using that account will allow access to the API until the Token is deleted, the relevant endpoint permissions are revoked from the user's role, or the user is deleted.
Below are the required Portal Permissions for the given API endpoints:
Endpoint(s) | Permission |
---|---|
Security Events | Security Events |
User Groups | Groups |
User Monitoring | User Monitoring |
Audit Trail | Audit Trail |
Remediation | Action Quarantined Emails |
All other endpoints | Security Events |
On each request, you must send a valid API Token in the Authorization
HTTP header, in the format Authorization: API-Token <your-api-token>
(where <your-api-token>
is the token that you generated via the steps
outlined above).
GET /api/v1/endpoint HTTP/1.1
Host: you.tessian-platform.com
Authorization: API-Token <your-api-token>
curl -H "Authorization: API-Token $YOUR_API_TOKEN" https://you.tessian-platform.com/api/v1/endpoint
import requests
response = requests.get(
"https://you.tessian-platform.com/api/v1/endpoint",
headers={"Authorization": f"API-Token {api_token}"},
)
For any endpoint that returns paginated results, you will need to supply a checkpoint to fetch more than the first page of results.
additional_results
key of the root object.checkpoint
key of the root object.after_checkpoint
URL parameter.additional_results
is false
, there are no more results to fetch.ℹ️ Note
A robust implementation will require error handling and backoff logic in the case of rate limiting.
url = "https://you.tessian-platform.com/api/v1/endpoint"
headers = {"Authorization": f"API-Token {api_token}"}
results = []
# First request
response = requests.get(url, headers=headers).json()
results.extend(response["results"])
checkpoint = response["checkpoint"]
additional_results = response["additional_results"]
# Subsequent requests, if necessary
while additional_results:
response = requests.get(url, headers=headers, params={"after_checkpoint": checkpoint}).json()
# The above is broadly equivalent to appending "?after_checkpoint=checkpoint_value" to the URL
results.extend(response["results"])
checkpoint = response["checkpoint"]
additional_results = response["additional_results"]
The timestamp (date & time) of the email follows the
ISO 8601 format
as Coordinated Universal Time (UTC), using (optional) microsecond precision
and a zero-offset: YYYY-MM-DDTHH:MM:SSZ
or YYYY-MM-DDTHH:MM:SS.mmmmmmZ
.
Note that this format uses 24 hour time.
Timestamp Example: 2022-09-07T23:34:28Z
.
All responses include a JSON object containing the requested data. The structure of the each return type is documented in our OpenAPI Specification. This file documents all requests that can be made to the various endpoints, as well as the expected return types.
Return types for specific requests are documented alongside the requests themselves throughout the endpoints section of this document.
Data returned by the Proofpoint API is not immutable. Various external factors may cause changes, for example user and admin interactions with Security Events, or extra details being added by Proofpoint's algorithms as more information is available.
Consequently, some datapoints may be returned by the API multiple times as new information is added to them.
If a datapoint returned in a previous API call was updated with new information, the updated datapoint will be returned when calling the API using the most recent checkpoint.
When consuming Proofpoint API data, you should deduplicate returned data based
on the id
field, keeping only the latest returned version.
ℹ️ Tip
In Splunk, deduplication can be performed using the
dedup
command.
Old versions of updated datapoints will never be returned from the API, even if you reuse an old checkpoint (or use no checkpoint). At any given point in time, only the most recent version of any datapoint will be returned.
For paginated endpoints, you may receive fewer than limit
items back (or
even zero items), while still receiving additional_results
equal to
true
. Do not rely on counting the number of rows returned in order to
determine whether to call the API again; instead, always look at
additional_results
. Conversely, there may be times when
additional_results
is true
, but then you make a subsequent call and
receive back zero rows (and additional_results
is false
).
Rate limiting is enforced for the Proofpoint API API. If you receive HTTP status
code 429
"Too Many Requests", give the API a break and try again in a few
seconds. You may inspect the response headers for details; these broadly
follow this draft RFC.
Exact rate limits are subject to change.
We reserve the right to make unannounced non-breaking changes to existing endpoints, such as:
Any breaking changes will be communicated in advance. This may include (but is not limited to):
If you have any questions at any time we are here to support you.
Please contact Proofpoint at: tessian-support@proofpoint.com
.
Endpoints in this section provide granular access to security events across Proofpoint products.
This endpoint provides security events from Defender, Guardian, and Architect. Events returned are those produced by purchased Proofpoint modules only.
created_after | string <date-time> Only include events that were created after this time. You should use either this parameter, or the If this parameter is provided, but no events are returned, the checkpoint will behave as if no checkpoint was provided at all - i.e. the next request that uses the checkpoint will return all events from the first event that exists on the Proofpoint platform. In this case, no events are currently available and you should make your call again later with |
limit | integer [ 2 .. 100 ] Default: 100 The maximum number of events to return. |
after_checkpoint | string If provided, this parameter must be set to the If an event is updated, it will no longer be excluded from subsequent requests. |
import requests subdomain = "YOUR_SUBDOMAIN" api_token = "YOUR_TOKEN" url = f"https://{subdomain}.tessian-platform.com/api/v1/events" response = requests.get( url, headers={"Authorization": f"API-Token {api_token}"}, ) print(response.json())
{- "checkpoint": "string",
- "additional_results": true,
- "results": [
- {
- "id": "string",
- "type": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "portal_link": "string",
- "outbound_email_details": {
- "message_id": "string",
- "tessian_id": "string",
- "from": null,
- "transmitter": null,
- "reply_to": [
- null
], - "recipients": {
- "to": [
- null
], - "cc": [
- null
], - "bcc": [
- null
], - "all": [
- null
], - "count": 0
}, - "subject": "string",
- "attachments": {
- "names": [
- "string"
], - "count": 0,
- "bytes": 0
}, - "send_time": "2019-08-24T14:15:22Z",
- "tessian_action": "WARN",
- "subsequent_action": "NONE",
- "changes_made": { },
- "final_outcome": "NOT_SENT"
}, - "guardian_details": {
- "triggered_filter_ids": [
- "string"
], - "type": "MISDIRECTED_EMAIL",
- "triggered_filter_names": [
- "string"
], - "breach_prevented": true,
- "anomalous_recipients": [
- null
], - "suggested_recipients": [
- null
], - "anomalous_attachments": [
- "string"
], - "final_outcome": "NOT_SENT",
- "user_responses": [
- "SEND"
], - "admin_action": "SAFE",
- "justifications": [
- "string"
], - "user_shown_message": true,
- "flag_reason": "string",
- "misattached_file_reasons": [
- "string"
]
}
}
]
}
Groups are named collections of email addresses; their members may be specified either by specific address, or by a wildcard including all addresses in an entire domain. You can retrieve information about the Groups Proofpoint, create, modify or delete them.
Fetch a list of all groups.
after_checkpoint | string Use with the output of the 'checkpoint' field to iteratively retrieve all groups where the total exceeds the query limit. |
limit | integer <int32> [ 1 .. 1000 ] Default: 1000 Example: limit=100 The maximum number of groups to return per page. |
import requests subdomain = "YOUR_SUBDOMAIN" api_token = "YOUR_TOKEN" url = f"https://{subdomain}.tessian-platform.com/api/v1/groups" response = requests.get( url, headers={"Authorization": f"API-Token {api_token}"}, ) print(response.json())
{- "checkpoint": "string",
- "additional_results": true,
- "groups": [
- {
- "name": "string",
- "id": 0,
- "created_at": "string",
- "updated_at": "string"
}
]
}
Get information about a group.
id required | integer Example: 42 The ID of the group to query. |
after_checkpoint | string Use with the output of the 'checkpoint' field to iteratively retrieve all members of the group where the total exceeds the query limit. |
limit | integer <int32> [ 1 .. 1000 ] Default: 1000 Example: limit=100 The maximum number of group members to return per page. |
import requests subdomain = "YOUR_SUBDOMAIN" api_token = "YOUR_TOKEN" group_id = "73" url = f"https://{subdomain}.tessian-platform.com/api/v1/groups/{group_id}" response = requests.get( url, headers={"Authorization": f"API-Token {api_token}"}, ) print(response.json())
{- "checkpoint": "string",
- "additional_results": true,
- "results": {
- "metadata": {
- "name": "string",
- "id": 0,
- "created_at": "string",
- "updated_at": "string"
}, - "members": [
- {
- "address": "user@example.com"
}
]
}
}
Delete a group. Caveat — all deletions are final; a deleted group cannot be recovered.
id required | integer Example: 42 The ID of the group to delete. |
import requests subdomain = "YOUR_SUBDOMAIN" api_token = "YOUR_TOKEN" group_id = "73" url = f"https://{subdomain}.tessian-platform.com/api/v1/groups/{group_id}" response = requests.delete( url, headers={"Authorization": f"API-Token {api_token}"}, ) print(response.json())
Incremental update: the members listed in the request are added to the group's current members.
id required | integer Example: 42 The ID of the group to add members to. |
Array of AddressMember (object) or DomainMember (object) (GroupMembers) [ 1 .. 100 ] items Input members data for adding/removing members from group,
expects one of |
{- "members": [
- {
- "address": "user@example.com"
}
]
}
Incremental update: the members listed in the request are removed from the group's current members.
id required | integer Example: 42 The ID of the group to remove members from. |
Array of AddressMember (object) or DomainMember (object) (GroupMembers) [ 1 .. 100 ] items Input members data for adding/removing members from group,
expects one of |
{- "members": [
- {
- "address": "user@example.com"
}
]
}
Endpoints in this section provide ways to monitor user deployment health and information. You will be able to monitor deployment statuses, and various aspects of Proofpoint's coverage within your organization.
Provides the same information that is available on the User Monitoring page.
after_checkpoint | string Use with the output of the 'checkpoint' field to iteratively retrieve all users from the API where the total exceeds the maximum query limit. |
limit | integer <int32> [ 1 .. 2000 ] Example: limit=100 The maximum number of users to return. |
import requests subdomain = "YOUR_SUBDOMAIN" api_token = "YOUR_TOKEN" url = f"https://{subdomain}.tessian-platform.com/api/v1/monitoring/users" response = requests.get( url, headers={"Authorization": f"API-Token {api_token}"}, ) print(response.json())
{- "checkpoint": "string",
- "additional_results": true,
- "results": [
- {
- "address": "string",
- "id": 0,
- "sync_state": "LIVE",
- "status": "Good connection",
- "last_connection": "2019-08-24T14:15:22Z",
- "emails_processed": 0,
- "addin_version": "string",
- "addin_hardware": "string",
- "user_created": "2019-08-24T14:15:22Z",
- "last_upload_stored": "2019-08-24T14:15:22Z",
- "addin_ping": "2019-08-24T14:15:22Z",
- "addin_check": "2019-08-24T14:15:22Z",
- "gateway_ping": "2019-08-24T14:15:22Z",
- "gateway_check": "2019-08-24T14:15:22Z",
- "api_ping": "2019-08-24T14:15:22Z",
- "m365_addin_check": "2019-08-24T14:15:22Z"
}
]
}
Endpoints in this section detail anomalous user activity that has been detected by the system, where anomalous activity is defined as users sending unusual numbers of sensitive emails to unauthorized addresses compared to their normal behaviour.
This endpoint provides the same information that is available on the Anomalous Activity page.
As a result of our anomaly detection algorithms, the 'after_checkpoint' value works slightly differently in this endpoint as it would in others. We identify anomalous trends that may span multiple days, and the 'after_checkpoint' value allows us to focus on the events identified at a specific point in time (all anomalies identified on a specific day). If you would like the most recent anomalous events that we have identified, simply query the endpoint without an 'after_checkpoint' value.
For example, if you queried the endpoint on the 20th of December without an 'after_checkpoint' value and used the 'checkpoint' value from that response in subsequent requests, you would not receive any anomalies identified after the 20th of December. This holds true even if you use the updated 'checkpoint' values provided in subsequent responses. With the way we identify anomalous events spanning multiple days, this value represents the anomalies identified at a specific point in time (20th Dec, in this case), and will not reflect any anomalies that were identified after that point.
after_checkpoint | string Return only anomalies that were created after this one on the same day that this value was provided. Use with the output of the 'checkpoint' field to iteratively retrieve all anomalies from the API where the total exceeds the maximum query limit. This field is intended to be used for the pagination of results identified on a single day, not as a placeholder for events as they are continuously identitfied. Note that, due to the way we identify anomalous events, using this value in your request will only return anomalous events that occured on the day that you received the initial 'checkpoint' value. If you're using this value in your requests, you should discard it once you receive a |
limit | integer <int32> [ 1 .. 1000 ] Example: limit=100 The maximum number of anomalies to return. |
import requests subdomain = "YOUR_SUBDOMAIN" api_token = "YOUR_TOKEN" url = f"https://{subdomain}.tessian-platform.com/reporting/anomalies/v1" response = requests.get( url, headers={"Authorization": f"API-Token {api_token}"}, ) print(response.json())
{- "status": 0,
- "has_more": true,
- "data": [
- {
- "id": "916ab7bb-efa2-4b61-b7f3-7f45fb9c8f72",
- "links": {
}, - "address": "another.user@example.com",
- "severity_label": "moderate",
- "anomalous_period_start": "2018-02-14T10:58:55.253005Z",
- "anomalous_period_end": "2018-02-14T10:58:55.253005Z",
- "attachment_count": 0,
- "trigger_ids": [
- "83023-102",
- "49284-197",
- "58222-85"
], - "checkpoint": "string"
}
]
}
This endpoint allows emails to be released from quarantine using the event ID. Currently, this endpoint only supports Defend events. It will return a status update specifying whether the endpoint has successfully queued emails for deletion. To confirm that the action has been successfully executed, we recommend that you wait for the updated event to come through to the events API.
event_id required | string The ID of the event to be released from quarantine. |
{- "event_id": "string"
}
{- "number_of_actions_attempted": 0,
- "number_of_actions_succeeded": 0,
- "results": [
- {
- "user_address": "string",
- "error": "EMAIL_NOT_FOUND_IN_QUARANTINE"
}
]
}
This endpoint allows emails to be deleted from quarantine using the event ID. Currently, this endpoint only supports Defend events. It will return a status update specifying whether the endpoint has successfully queued emails for deletion. To confirm that the action has been successfully executed, we recommend that you wait for the updated event to come through to the events API.
event_id required | string The ID of the event to be deleted from quarantine. |
{- "event_id": "string"
}
{- "number_of_actions_attempted": 0,
- "number_of_actions_succeeded": 0,
- "results": [
- {
- "user_address": "string",
- "error": "EMAIL_NOT_FOUND_IN_QUARANTINE"
}
]
}
This endpoint allows emails to be deleted from user inboxes using the event ID. Currently, this endpoint only supports Defend events. It will return a status update specifying whether the endpoint has successfully queued emails for deletion. To confirm that the action has been successfully executed, we recommend that you wait for the updated event to come through to the events API.
event_id required | string The ID of the event to be deleted from user inboxes. |
{- "event_id": "string"
}
{- "number_of_actions_attempted": 0,
- "number_of_actions_succeeded": 0,
- "results": [
- {
- "user_address": "string",
- "error": "ALREADY_DELETED"
}
]
}
These endpoints provide access to audit information of usage and changes made to your Proofpoint products and settings.
This endpoint provides the same information that is available on the Audit Trail page.
after_checkpoint | string Return only audit entries that were created after the checkpoint. Use with the output of the 'checkpoint' field to iteratively retrieve all audit entries from the API where the total exceeds the maximum query limit. |
limit | integer <int32> [ 1 .. 1000 ] Default: 1000 Example: limit=100 The maximum number of audit entries to return per page. |
import requests subdomain = "YOUR_SUBDOMAIN" api_token = "YOUR_TOKEN" url = f"https://{subdomain}.tessian-platform.com/api/v1/audits" response = requests.get( url, headers={"Authorization": f"API-Token {api_token}"}, ) print(response.json())
{- "checkpoint": "string",
- "additional_results": true,
- "results": [
- {
- "timestamp": "2019-08-24T14:15:22Z",
- "type": "Permissions Granted",
- "category": "User Management",
- "details": "The moon is now \"full\" (was \"waxing gibbous\")",
- "user": "alice@example.com",
- "ip": "1.2.3.4"
}
]
}
Endpoints in this section provide aggregated risk drivers, which are the underlying components for the Proofpoint combined Risk Score.
⚠️ In line with our notification about Risk Hub end-of-life, the Company Risks endpoint will stop serving new data from 30th June 2025 and will be removed in due course.
This endpoint provides the same information that is available on the Human Layer Risk Hub page.
after_checkpoint | string Use with the output of the 'checkpoint' field to iteratively retrieve all users from the API where the total exceeds the maximum query limit. |
limit | integer <int32> [ 1 .. 1000 ] Default: 1000 Example: limit=7 The maximum number of days of risk data to return. |
import requests subdomain = "YOUR_SUBDOMAIN" api_token = "YOUR_TOKEN" url = f"https://{subdomain}.tessian-platform.com/api/v1/risk/company" response = requests.get( url, headers={"Authorization": f"API-Token {api_token}"}, ) print(response.json())
{- "checkpoint": "string",
- "additional_results": true,
- "results": [
- {
- "timestamp": "2019-08-24",
- "total_score": 1,
- "phishing_score": 1,
- "exfiltration_score": 1,
- "accidental_data_loss_score": 1,
- "data_sensitivity_score": 1,
- "security_awareness_score": 1
}
]
}