Monitor Data Observability Alerts via API
|
The REST API is currently in Early Access Preview. The API specification and endpoints might change before being marked as stable. We recommend testing thoroughly and being prepared to adapt to potential changes in future releases. |
This guide shows you how to programmatically list and filter data observability alerts, retrieve their details, and drill down into the findings behind each alert. This enables you to route alerts into external tools, such as ticketing or incident management systems, and follow each alert down to the affected assets.
Through the API, alerts and their findings are read-only. The current version of the API is designed for monitoring and reporting. The following actions are possible only in the web application:
-
Resolve or escalate an alert. See Investigate Alerts.
-
Configure who gets notified about alerts. See Get Notifications for Alerts.
Prerequisites
Before using the Data Observability API:
-
Configure authentication as described in API Authentication.
-
Assign the API client the dataobservability-admin identity provider role, the same role that grants access to data observability in the web application (see Identity Provider Roles). Data observability currently has no read-only role, so this role is required even though the API is read-only.
API base URL
All Data Observability API endpoints are accessed through the following base URL:
https://{your-environment}.ataccama.one/api/data-observability/v1
Replace {your-environment} with your environment identifier from the Ataccama Cloud Portal.
When to use this API
Use the alerts API when you need to:
-
Integrate alerts into external tooling: Forward alerts and their findings to ticketing or incident management systems (see Poll for new alerts and changes).
-
Drill down from an alert to its findings: Identify the affected assets and route the issue to the right team (see Drill down from an alert to the affected assets).
-
Build operational dashboards: Retrieve alerts by status, resolution, finding type, affected asset, or time range, and aggregate them in your BI tool.
-
Audit alert history: Retrieve alerts and their findings for compliance or internal audits.
Alerts and findings
A finding is an individual problem detected over the observed data and pipelines, such as a DQ threshold breach, a pipeline failure, or a freshness, schema, or volume anomaly. An alert groups related findings, so your team handles one alert instead of many separate signals. For how findings are grouped and how alerts relate to notifications, see Key concepts of alerts and notifications.
Statuses, severities, resolutions, and finding types are extensible sets. New values might be added over time, so make sure your integration handles unknown values gracefully.
The values are also case-sensitive. Send them exactly as listed in Alert fields and Finding fields.
Alert fields
| Field | Description |
|---|---|
|
The URN of the alert, in the format |
|
The alert lifecycle status, taken from the findings:
|
|
The highest severity among the alert’s findings: |
|
How your team triaged the alert, as set in the web application (see Investigate Alerts):
|
|
When the alert was created. |
|
When the alert’s findings were last updated. The timestamp tracks updates to the findings only, not changes to the alert’s resolution. |
|
When the alert was last resolved. Omitted while the alert is unresolved. |
|
The URNs of the findings grouped under the alert, capped at 1000 entries and not paginated. Returned by Retrieve an alert only. To get the findings with their attributes, list them with the |
Finding fields
| Field | Description |
|---|---|
|
The URN of the finding, in the format |
|
The URN of the alert the finding belongs to. Every finding is currently attached to an alert, but treat the field as optional for forward compatibility. |
|
The type of the finding as a hierarchical, dot-separated code, for example, |
|
The severity of the finding: |
|
The finding lifecycle status:
|
|
A human-readable summary of the finding, for example, |
|
The URN of the affected asset. The URN shows the asset’s API area and resource type:
To get the details of a catalog item, see Catalog Items API. To get the details of a pipeline job or dataset, see Pipeline Monitoring API. |
|
When the problem was first observed and when it was last observed. |
|
When the problem ended.
Set only once the finding is |
|
When the finding was registered.
This is the default sort field; it can differ from |
Finding types
Finding types are hierarchical, dot-separated codes.
A parent code, such as data.dq, groups the subtypes under it.
The following finding types are available:
| Code | Meaning |
|---|---|
|
All data findings, as opposed to pipeline job findings. |
|
Data anomaly findings. |
|
Freshness findings. |
|
A freshness anomaly. |
|
A freshness SLA breach. |
|
Profiling anomaly findings. |
|
An anomaly detected on an attribute. |
|
An anomaly detected on a catalog item, such as a number of records anomaly. |
|
Data quality findings. |
|
A DQ monitor dropped below its threshold on a catalog item. |
|
A rule instance dropped below its threshold. |
|
Schema change findings. |
|
Asset-level schema changes. |
|
A monitored asset was created. |
|
A monitored asset was deleted. |
|
Attribute-level schema changes. |
|
An attribute was added. |
|
An attribute was changed. |
|
An attribute was deleted. |
|
The data type of an attribute changed. |
|
Pipeline job findings. |
|
A pipeline job was canceled. |
|
A pipeline job failed. |
|
A pipeline job was updated. |
Wherever you filter by finding type, the match includes the exact code and all its subtypes.
For example, filtering by data.dq also matches data.dq.threshold-breach-rule.
Even the equals operator matches subtypes, not just the exact code.
The notEquals and notIn operators are not supported and are ignored if sent.
The set of codes is fixed within a release but can change between releases. Make sure your integration handles unknown values gracefully.
List alerts
List the alerts in your environment.
To restrict the result by status, severity, or resolution, use the corresponding query parameters. Each parameter accepts a single value. For multi-value or negated conditions, or to filter by finding type, affected asset, or creation date, use Filter alerts instead.
curl -X GET "https://{your-environment}.ataccama.one/api/data-observability/v1/alerts?status=ACTIVE&size=20" \
-H "Authorization: Bearer {access_token}"
| Parameter | Type | Required | Description |
|---|---|---|---|
|
string |
No |
Restricts the result to alerts with the given status ( |
|
string |
No |
Restricts the result to alerts with the given severity ( |
|
string |
No |
Restricts the result to alerts with the given resolution ( |
|
integer |
No |
Number of alerts to return per page. Default: Max: |
|
string |
No |
Field to sort by; prefix with a hyphen ( Default: |
|
string |
No |
Cursor for forward pagination.
Use the value from |
{
"meta": {
"next": "MjA=",
"total": 42
},
"data": [
{
"urn": "urn:ata:{your-tenant}:data-observability:alert:0197f3a0-1111-7c0c-8f9d-3a2b4c5d6e7f",
"status": "ACTIVE",
"severity": "CRITICAL",
"resolution": "OPEN",
"createdAt": "2026-07-09T06:15:00Z",
"updatedAt": "2026-07-10T05:40:00Z"
},
{
"urn": "urn:ata:{your-tenant}:data-observability:alert:0197f3a0-3333-7c0c-8f9d-3a2b4c5d6e7f",
"status": "ACTIVE",
"severity": "MEDIUM",
"resolution": "NOT_SET",
"createdAt": "2026-07-10T02:05:00Z",
"updatedAt": "2026-07-10T02:05:00Z"
}
]
}
The response contains a data array with up to size alerts, and a meta object with the pagination information:
-
meta.next: Cursor for retrieving the next batch of alerts. Pass it as theafterparameter in the next request. Omitted when there are no more alerts to retrieve. -
meta.total: Total number of matching alerts, across all pages.
Filter rules
The filter endpoints, Filter alerts and Filter findings, share the same filter format. The table in each section lists the fields you can filter by and the operators each field supports.
The filter is a set of conditions, one per field.
For example, the condition "severity": {"in": ["HIGH", "CRITICAL"]} matches alerts with HIGH or CRITICAL severity.
The following rules apply to both endpoints:
-
Combining conditions: All conditions you send must be true (implicit AND). There is no way to combine them with
andoror. -
Several operators in one condition: All of them must be true. For example,
onOrAfterandbeforetogether match a time range. -
Empty filter: An empty or absent filter matches everything.
-
Unsupported input: Anything the filter does not support, such as an unknown field or an operator a field does not offer, is silently ignored.
-
Empty lists: An
inwith an empty list matches nothing. AnotInwith an empty list excludes nothing. -
List size: A list operator accepts at most 1000 values. Longer lists are rejected with
400 Bad Request.
Filter alerts
List alerts matching a complex filter passed in the request body.
The endpoint only reads data; POST is used so that the filter can be passed in the body.
Pagination and sorting work the same as in List alerts (after, size, and sort query parameters), and the shared Filter rules apply.
You can filter by the following fields:
| Field | Filters by |
|---|---|
|
The alert field of the same name, using the operators |
|
Alerts with at least one finding of the given type.
Only the operators A type also matches all its subtypes, so |
|
Alerts whose findings affect the given asset, using the operators |
|
When the alert was created, using the range operators The |
curl -X POST "https://{your-environment}.ataccama.one/api/data-observability/v1/alerts/filter" \
-H "Authorization: Bearer {access_token}" \
-H "Content-Type: application/json" \
-d '{
"filter": {
"severity": {
"in": ["HIGH", "CRITICAL"]
},
"resolution": {
"in": ["NOT_SET", "OPEN", "EXPECTED"]
},
"createdAt": {
"onOrAfter": "2026-07-01T00:00:00Z"
},
"affectedAssetUrn": {
"equals": "urn:ata:{your-tenant}:catalog:catalog-item:8e106021-3655-463a-8884-6c7c6c315548"
}
}
}'
The response has the same structure as in List alerts.
Retrieve an alert
Get the details of a specific alert, including the URNs of its findings.
URL-encode the alert URN when placing it in the request path.
Each colon (:) becomes %3A.
curl -X GET "https://{your-environment}.ataccama.one/api/data-observability/v1/alerts/{alertUrn}" \
-H "Authorization: Bearer {access_token}"
{
"urn": "urn:ata:{your-tenant}:data-observability:alert:0197f3a0-1111-7c0c-8f9d-3a2b4c5d6e7f",
"status": "ACTIVE",
"severity": "CRITICAL",
"resolution": "OPEN",
"createdAt": "2026-07-09T06:15:00Z",
"updatedAt": "2026-07-10T05:40:00Z",
"findingUrns": [
"urn:ata:{your-tenant}:data-observability:finding:0197f3a0-2222-7c0c-8f9d-3a2b4c5d6e7f",
"urn:ata:{your-tenant}:data-observability:finding:0197f3a0-4444-7c0c-8f9d-3a2b4c5d6e7f"
]
}
If an alert groups more than 1000 findings, the findingUrns list is truncated.
To get the findings with their attributes, and with pagination, list them with the alertUrn parameter instead (see List findings).
List findings
List the findings in your environment.
To list the findings of one alert, use the alertUrn parameter.
To restrict the result by finding type or status, use the corresponding query parameters.
Each parameter accepts a single value.
For multi-value or negated conditions, or to filter by affected asset, use Filter findings instead.
curl -X GET "https://{your-environment}.ataccama.one/api/data-observability/v1/findings?alertUrn={alertUrn}" \
-H "Authorization: Bearer {access_token}"
| Parameter | Type | Required | Description |
|---|---|---|---|
|
string |
No |
Restricts the result to findings attached to the given alert. |
|
string |
No |
Restricts the result to findings of the given type, including its subtypes (see Finding types). |
|
string |
No |
Restricts the result to findings with the given status ( |
|
integer |
No |
Number of findings to return per page. Default: Max: |
|
string |
No |
Field to sort by; prefix with a hyphen ( Default: |
|
string |
No |
Cursor for forward pagination.
Use the value from |
{
"meta": {
"total": 1
},
"data": [
{
"urn": "urn:ata:{your-tenant}:data-observability:finding:0197f3a0-2222-7c0c-8f9d-3a2b4c5d6e7f",
"alertUrn": "urn:ata:{your-tenant}:data-observability:alert:0197f3a0-1111-7c0c-8f9d-3a2b4c5d6e7f",
"findingType": "data.dq.threshold-breach-rule",
"severity": "CRITICAL",
"status": "ACTIVE",
"summary": "Completeness on customer.email dropped to 71% (threshold 95%).",
"affectedAssetUrn": "urn:ata:{your-tenant}:catalog:catalog-item:8e106021-3655-463a-8884-6c7c6c315548",
"firstSeenAt": "2026-07-09T06:15:00Z",
"lastSeenAt": "2026-07-10T05:40:00Z",
"createdAt": "2026-07-09T06:15:04Z"
}
]
}
The response is paginated the same way as in List alerts. For the meaning of each field, see Finding fields.
Filter findings
List findings matching a complex filter passed in the request body. The endpoint works the same way as Filter alerts. It only reads data, and the same pagination, sorting, and Filter rules apply.
You can filter by the following fields:
| Field | Filters by |
|---|---|
|
The alert the finding belongs to, using the operators |
|
The finding type.
Only the operators A type also matches all its subtypes, so |
|
The finding status, using the operators |
|
The affected asset, using the operators |
Unlike the alert filter, there are no severity or date fields.
curl -X POST "https://{your-environment}.ataccama.one/api/data-observability/v1/findings/filter" \
-H "Authorization: Bearer {access_token}" \
-H "Content-Type: application/json" \
-d '{
"filter": {
"findingType": {
"in": ["job.failure", "data.da.freshness"]
},
"status": {
"equals": "ACTIVE"
},
"alertUrn": {
"equals": "urn:ata:{your-tenant}:data-observability:alert:0197f3a0-1111-7c0c-8f9d-3a2b4c5d6e7f"
}
}
}'
The response has the same structure as in List findings.
Retrieve a finding
Get the details of a specific finding.
URL-encode the finding URN when placing it in the request path.
Each colon (:) becomes %3A.
curl -X GET "https://{your-environment}.ataccama.one/api/data-observability/v1/findings/{findingUrn}" \
-H "Authorization: Bearer {access_token}"
{
"urn": "urn:ata:{your-tenant}:data-observability:finding:0197f3a0-2222-7c0c-8f9d-3a2b4c5d6e7f",
"alertUrn": "urn:ata:{your-tenant}:data-observability:alert:0197f3a0-1111-7c0c-8f9d-3a2b4c5d6e7f",
"findingType": "data.dq.threshold-breach-rule",
"severity": "CRITICAL",
"status": "ACTIVE",
"summary": "Completeness on customer.email dropped to 71% (threshold 95%).",
"affectedAssetUrn": "urn:ata:{your-tenant}:catalog:catalog-item:8e106021-3655-463a-8884-6c7c6c315548",
"firstSeenAt": "2026-07-09T06:15:00Z",
"lastSeenAt": "2026-07-10T05:40:00Z",
"createdAt": "2026-07-09T06:15:04Z"
}
For the meaning of each field, see Finding fields.
Drill down from an alert to the affected assets
To investigate an alert down to the assets behind it:
-
List the alerts that need attention, for example, all active alerts (see List alerts).
-
From the response, copy the URN of the alert you want to investigate.
-
List the findings of the alert, passing its URN in the
alertUrnparameter (see List findings). -
In each finding, check
summaryto see the problem andaffectedAssetUrnto see which asset it affects. -
Get the details of the affected asset. For a catalog item, see Catalog Items API. For a pipeline job or dataset, see Pipeline Monitoring API.
Poll for new alerts and changes
The API does not push alerts to external systems. To keep another tool in sync, poll the API on a schedule.
To get notified about alerts without polling, set up notification policies in the web application. To track alerts as tickets in Jira or ServiceNow, see Escalate Alerts.
Retrieve new alerts
To retrieve the alerts created since your previous polling run:
-
Call Filter alerts with
createdAt.onOrAfterset to the newestcreatedAtvalue in your system. Sort the results oldest first (sort=createdAt).On the first polling run, send the request without a filter to retrieve all alerts.
-
Page through the results with the
aftercursor until the response no longer containsmeta.next. -
Save the results in your system, skipping the alerts that are already stored.
The skip is needed because
onOrAfteralso matches alerts created exactly at the timestamp in your filter. Each polling run therefore returns the newest saved alert one more time.
curl -X POST "https://{your-environment}.ataccama.one/api/data-observability/v1/alerts/filter?sort=createdAt" \
-H "Authorization: Bearer {access_token}" \
-H "Content-Type: application/json" \
-d '{
"filter": {
"createdAt": {
"onOrAfter": "2026-08-26T06:00:00Z"
}
}
}'
Detect changes to retrieved alerts
Alerts continue to change after you retrieve them. They can gain new findings, the status can change as the findings end, and your team can set a resolution at any time, even after the alert has ended.
To pick up these changes:
-
Call Filter alerts with
createdAt.onOrAfterset to thecreatedAtof the oldest alert you still track. -
Page through the results the same way as when retrieving new alerts.
-
Compare each returned alert with your stored copy. A difference in any field, such as
status,resolution, orupdatedAt, means the alert changed.
The updatedAt timestamp alone is not a reliable way to find the changes.
It is not possible to filter by updatedAt, and the timestamp does not reflect resolution changes (see Alert fields).
If you track only a few specific alerts, retrieve them individually instead (see Retrieve an alert).
Polling frequency
The API currently enforces no rate limits.
To be ready for limits introduced later, handle 429 Too Many Requests and wait for the number of seconds specified in the Retry-After header before retrying.
The right polling frequency depends on your use case. For example, to retrieve alerts for reporting, polling a few times per day can be enough. Whichever frequency you choose, stay within the following maximums:
-
Retrieving new alerts (see Retrieve new alerts): Do not poll more often than about once per minute.
-
Detecting changes (see Detect changes to retrieved alerts): This check retrieves all the alerts you track again, in pages. Run it less frequently than the polling for new alerts, and not more often than about once per hour.
Error handling
The API returns standard HTTP status codes and reports errors as problem details (RFC 9457).
Error responses use the application/problem+json content type instead of application/json.
The body contains the following fields:
-
type: A machine-readable error code, as listed in the following table. -
title: A short summary of the problem type. -
detail: An explanation of the specific problem.
The only exception is 401 Unauthorized, which does not use the problem details format.
| Status code | Error code | Description |
|---|---|---|
|
— |
Request successful. |
|
|
Invalid request parameters or body (for example, a malformed URN or a filter list with more than 1000 values). |
|
— |
Invalid or expired access token. Unlike the other error responses, the body does not use the problem details format. It is a plain JSON object or empty. |
|
|
Insufficient permissions to access the requested resource. |
|
|
Alert or finding does not exist. Returned by the retrieve endpoints only. |
|
|
Unexpected server error. Try the request again later. |
API reference
For detailed API reference, including all endpoints, parameters, request and response schemas, and examples, see Data Observability API specification.
Next steps
-
Pipeline Monitoring API: Retrieve the pipeline jobs and datasets that pipeline findings affect.
-
Catalog Items API: Retrieve the catalog items that DQ and freshness findings affect.
-
Retrieve DQ Results for External Systems: Retrieve the DQ results behind DQ findings.
-
Manage DQ Monitors via API: Configure the DQ monitors and thresholds whose breaches raise DQ findings.
-
Investigate Alerts: Learn more about alert concepts and how to review and resolve alerts in the web application.
Was this page useful?