Managing Data Quality issues in Management API¶
This guide explains how to work with the issues that Data Quality monitors find in your data through the Management API. You can do the following:
List and filter monitor issues, read the details of one issue, and view issue analytics.
Acknowledge and reopen issues, mark an issue as expected, and accept a changed column structure into the baseline.
Check the rules of a custom monitor against a data extract before you save the monitor.
This guide covers what is specific to Data Quality issues: their details, filters, analytics, and actions. The legacy issue list described in Listing issues through Management API returns all issues of your datastreams, including Data Quality issues, under the same ID.
The v1 endpoints follow their own conventions for authentication,
identifiers, pagination, filters, and errors. For more information, see
Working with v1 endpoints.
Introduction¶
- What is a Data Quality issue?
An issue records that a monitor found a problem in a data extract of a datastream, for example duplicate rows, an unusual row count, a late fetch, a changed column structure, or values that break a rule of a custom monitor. For more information, see Viewing details of the Data Quality issues.
- How are issues identified?
Each issue has a numeric
id: the ID of the log entry that recorded the issue, the same ID thatGET /api/errors/shows. datastreams, monitors, and workspaces are identified by UUID, and data extracts and job groups by numeric ID.- Which issue types exist?
The
typefield of each issue names the monitor that found it:typeMonitor
row-duplicatesDuplication monitor
volumesVolume monitor
timelinessTimeliness monitor
schema_consistencyColumn consistency monitor
valuesCustom monitor
Prerequisites¶
Before you complete the procedures in this guide, perform the following action:
Use a Connect API key with the following permissions:
Monitor: Read-only (
monitor:read) to list and read issues and to view issue analytics.Monitor: Write (
monitor:write) to acknowledge, reopen, and mark issues as expected, and to accept a changed column structure into the baseline.Monitor: Read-only (
monitor:read) and Datastream: Read-only (datastream:read) to check custom monitor rules against a data extract. The check reveals the values of the data extract, so it needs both permissions.
Picking Write for a permission also gives the key its Read-only access. Without the permission a request needs, Management API returns HTTP
403. You cannot change the permissions of a key, so to add one, create a new key. For more information, see Creating a Connect API key in Adverity.
Limitations¶
A request that acknowledges or reopens issues can name at most 50 issue IDs. If it would change more than 1000 issues, Management API returns HTTP
400and changes nothing. Narrow the selection with issue IDs, a workspace selection, or a job group.The details of an issue summarize the violations but do not contain the violating or duplicated rows themselves. To view these rows, use the Data Quality page in Adverity.
Issues in workspaces that are scheduled for deletion are not listed and cannot be changed.
Selecting workspaces¶
By default, the requests in this guide cover every issue the API key can see: the issues of the key’s workspace and the workspaces below it. To narrow a request to one part of your workspace tree, add the following query parameters:
Parameter |
Description |
|---|---|
|
|
|
The workspace UUID that |
For example, workspace_scope=descendants&scope_from_workspace_id={{WORKSPACE_ID}}
selects the issues of one workspace and the workspaces below it, as
the Data Quality page of this workspace shows them.
These parameters work on the issue list, the issue analytics, and the requests that acknowledge or reopen issues by ID or by workspace. The requests for the issues of a job group do not accept them.
Listing issues¶
To list Data Quality issues, follow these steps:
Create a GET request to the following endpoint:
https://{{INSTANCE}}/api/v1/monitors/issues/
In the HTTP request header, include the parameter
Authorizationwith valueBearer {{KEY}}.(Optional) To filter the results, add any of the following query parameters. If you combine several parameters, the response contains only the issues that match all of them.
Parameter
Description
workspace_scope,scope_from_workspace_idOnly the issues of the selected workspaces. For more information, see Selecting workspaces.
datastream_idOnly the issues of these datastream UUIDs. Repeat the parameter for several values, up to 50.
monitor_idOnly the issues of these custom monitor UUIDs. Repeat the parameter for several values, up to 50.
typeOnly the issues of one type:
row-duplicates,values,volumes,timeliness, orschema_consistency.severityerrororwarning.is_acknowledgedtruefor acknowledged issues only,falsefor unacknowledged issues only.date_fromOnly the issues whose fetch started on this day or later, as
YYYY-MM-DD(UTC).date_toOnly the issues whose fetch started on this day or earlier, as
YYYY-MM-DD(UTC).date_fromafterdate_toreturns HTTP400.pageThe page number, starting at
1. Default:1.page_sizeThe number of items per page. Default:
50. Values above100return100items.Send the request.
As a result, you obtain the issues, newest fetch first.
The cURL request example is the following. It lists the unacknowledged errors of one workspace and the workspaces below it:
curl --location --request GET 'https://{{INSTANCE}}/api/v1/monitors/issues/?workspace_scope=descendants&scope_from_workspace_id={{WORKSPACE_ID}}&severity=error&is_acknowledged=false' \
--header 'Authorization: Bearer {{KEY}}'
Example of JSON response (cropped to show one issue):
{
"items": [
{
"id": 81234,
"type": "values",
"detailed_type": "rule-violated",
"severity": "error",
"start": "2026-10-28T03:00:12Z",
"is_acknowledged": false,
"expected": null,
"violations": 12,
"message": "{{ISSUE_MESSAGE}}",
"data_source": "{{CONNECTOR_NAME}}",
"job_group_id": 5120,
"datastream": {
"id": "{{DATASTREAM_UUID}}",
"name": "{{DATASTREAM_NAME}}",
"workspace": {
"id": "{{WORKSPACE_UUID}}",
"name": "{{WORKSPACE_NAME}}"
}
},
"monitor": {
"id": "{{MONITOR_UUID}}",
"name": "{{MONITOR_NAME}}"
},
"extract_id": 51234
}
],
"count": 1
}
The following table describes the fields of each issue:
Field |
Description |
|---|---|
|
The numeric ID of the issue. |
|
The type of the issue. The fields after the common ones depend on the type. For more information, see Reading the details of an issue. |
|
|
|
When the fetch that raised the issue started. |
|
|
|
Whether the issue was marked as expected. |
|
The number of violations the monitor found. |
|
The issue message. |
|
The name of the datastream’s connector, as Adverity displays it. This is a display name, not an identifier: it can change and is not unique. |
|
The job group whose fetch raised the issue. |
|
The |
|
The |
|
The data extract the issue was found on. |
Each type adds the following fields:
|
Additional fields |
|---|---|
|
|
|
None. |
|
|
|
|
|
|
Reading the details of an issue¶
To read the details of one issue, follow these steps:
Create a GET request to the following endpoint:
https://{{INSTANCE}}/api/v1/monitors/issues/{{ISSUE_ID}}/
Replace
{{ISSUE_ID}}with theidof the issue.In the HTTP request header, include the parameter
Authorizationwith valueBearer {{KEY}}.Send the request.
As a result, you obtain the issue with the fields described in Listing issues and the following details of its type:
|
Details |
|---|---|
|
|
|
|
|
|
|
|
|
|
If the issue does not exist or the key cannot see it, Management API
returns HTTP 404.
The cURL request example is the following:
curl --location --request GET 'https://{{INSTANCE}}/api/v1/monitors/issues/{{ISSUE_ID}}/' \
--header 'Authorization: Bearer {{KEY}}'
Listing the issues of a data extract or a job group¶
To list the issues found on one data extract, or raised by the fetch of one job group, follow these steps:
Create a GET request to one of the following endpoints:
For a data extract:
https://{{INSTANCE}}/api/v1/monitors/issues/extracts/{{EXTRACT_ID}}/
Replace
{{EXTRACT_ID}}with the numeric ID of the data extract, for example theextract_idof an issue.For a job group:
https://{{INSTANCE}}/api/v1/monitors/issues/job-groups/{{JOB_GROUP_ID}}/
Replace
{{JOB_GROUP_ID}}with the numeric ID of the job group, for example thejob_group_idof an issue. A timeliness or column consistency issue can carry ajob_group_idand still not be listed here. For more information, see thejob_group_idfield in Listing issues.
In the HTTP request header, include the parameter
Authorizationwith valueBearer {{KEY}}.Send the request.
As a result, you obtain the issues of the data extract or the job group,
paginated with the page and page_size query parameters. Each issue
has the fields described in Listing issues.
For a data extract, the response also contains the issues found on copies of the same source data extract that the key can see.
If the data extract does not exist or the key cannot see it,
Management API returns HTTP 404. A job group that does not exist or
that the key cannot see returns an empty list.
The cURL request example is the following:
curl --location --request GET 'https://{{INSTANCE}}/api/v1/monitors/issues/job-groups/{{JOB_GROUP_ID}}/' \
--header 'Authorization: Bearer {{KEY}}'
Viewing issue analytics¶
The following requests summarize issues across datastreams. All of them accept the parameters described in Selecting workspaces.
Request |
Parameters |
What it returns |
|---|---|---|
|
|
The datastreams with the most unacknowledged issues of this
type, most issues first. Each item contains the |
|
|
One item for each day with issues, newest day first. Each item
contains the |
|
|
The number of monitored datastreams with unacknowledged issues of
this type ( |
A datastream counts as monitored when a universal monitor of the type
is enabled for it, or, for the values type, when a custom monitor is
assigned to it. datastreams scheduled for deletion are not counted.
The cURL request example is the following. It counts the issues of each day in October 2026:
curl --location --request GET 'https://{{INSTANCE}}/api/v1/monitors/issues/analytics/daily/?date_from=2026-10-01&date_to=2026-10-31' \
--header 'Authorization: Bearer {{KEY}}'
Acknowledging and reopening issues¶
To acknowledge issues, or to reopen acknowledged issues, follow these steps:
Create a POST request to one of the following endpoints:
To acknowledge issues:
https://{{INSTANCE}}/api/v1/monitors/issues/acknowledge/
To reopen acknowledged issues:
https://{{INSTANCE}}/api/v1/monitors/issues/unacknowledge/
In the HTTP request header, include the parameter
Authorizationwith valueBearer {{KEY}}.In the HTTP request header, include the parameter
Content-Typewith valueapplication/json.Select the issues in one of the following ways:
To select specific issues, in the HTTP request body, include
issue_idswith a list of up to 50 issue IDs.To select every issue of one or more workspaces, add the
workspace_scopeandscope_from_workspace_idquery parameters, and send an empty JSON object ({}) as the request body. For more information, see Selecting workspaces.
If you use both, only the listed issues in the selected workspaces change. If you use neither, Management API returns HTTP
400.Send the request.
As a result, the selected issues are acknowledged or reopened. The response lists the issues that changed:
{
"affected": {
"issue_ids": [81234, 81240]
}
}
Issues that the key cannot see, IDs that are not issues, and issues that are already acknowledged or open are left out of the response. Repeating the request returns an empty list.
The cURL request example is the following:
curl --location --request POST 'https://{{INSTANCE}}/api/v1/monitors/issues/acknowledge/' \
--header 'Authorization: Bearer {{KEY}}' \
--header 'Content-Type: application/json' \
--data '{"issue_ids": [81234, 81240]}'
To acknowledge every issue of one workspace and the workspaces below it, use the following cURL request:
curl --location --request POST 'https://{{INSTANCE}}/api/v1/monitors/issues/acknowledge/?workspace_scope=descendants&scope_from_workspace_id={{WORKSPACE_ID}}' \
--header 'Authorization: Bearer {{KEY}}' \
--header 'Content-Type: application/json' \
--data '{}'
Warning
If the selection would change more than 1000 issues, Management API
returns HTTP 400 and no issue is changed. Narrow the selection, for
example to a smaller workspace or to a job group.
Acknowledging and reopening the issues of a job group¶
To acknowledge or reopen the issues raised by the fetch of one job group, follow these steps:
Create a POST request to one of the following endpoints:
To acknowledge issues:
https://{{INSTANCE}}/api/v1/monitors/issues/job-groups/{{JOB_GROUP_ID}}/acknowledge/
To reopen acknowledged issues:
https://{{INSTANCE}}/api/v1/monitors/issues/job-groups/{{JOB_GROUP_ID}}/unacknowledge/
Replace
{{JOB_GROUP_ID}}with the numeric ID of the job group, for example thejob_group_idof an issue. See the note at the end of this section for issues that carry ajob_group_idbut are not selected.In the HTTP request header, include the parameter
Authorizationwith valueBearer {{KEY}}.In the HTTP request header, include the parameter
Content-Typewith valueapplication/json.In the HTTP request body, include any of the following:
issue_idswith a list of up to 50 issue IDs of the job group to select only these issues.exclude_issue_idswith a list of up to 50 issue IDs to leave out of the selection.
To select every issue of the job group, send an empty JSON object (
{}).Send the request.
As a result, the selected issues of the job group are acknowledged or
reopened, and the response lists the issues that changed, as described in
Acknowledging and reopening issues.
A job group with more than 1000 issues to change returns HTTP 400;
select the issues with issue_ids instead.
The cURL request example is the following. It acknowledges every issue of the job group except one:
curl --location --request POST 'https://{{INSTANCE}}/api/v1/monitors/issues/job-groups/{{JOB_GROUP_ID}}/acknowledge/' \
--header 'Authorization: Bearer {{KEY}}' \
--header 'Content-Type: application/json' \
--data '{"exclude_issue_ids": [81240]}'
Note
The job group requests select issues by the job of their log entry. A
timeliness or column consistency issue can record its own
job_group_id that differs from that job, for example a timeliness
issue recorded without a fetch job. Such an issue is not listed or
changed by these requests even though its job_group_id names the
job group. To change it, use its ID as described in
Acknowledging and reopening issues.
Marking an issue as expected¶
You can record whether an issue of a universal monitor was expected, for example a volume drop during a planned campaign pause.
To mark an issue as expected, follow these steps:
Create a PUT request to the following endpoint:
https://{{INSTANCE}}/api/v1/monitors/issues/{{ISSUE_ID}}/expected/
Replace
{{ISSUE_ID}}with theidof the issue.In the HTTP request header, include the parameter
Authorizationwith valueBearer {{KEY}}.In the HTTP request header, include the parameter
Content-Typewith valueapplication/json.In the HTTP request body, include
expectedwith valuetrueif the issue was expected, orfalseif it was not.Send the request.
As a result, the expected field of the issue is updated, and the
response contains the issue.
The issues of custom monitors (type values) do not record this
value: for them, Management API returns HTTP 400.
The cURL request example is the following:
curl --location --request PUT 'https://{{INSTANCE}}/api/v1/monitors/issues/{{ISSUE_ID}}/expected/' \
--header 'Authorization: Bearer {{KEY}}' \
--header 'Content-Type: application/json' \
--data '{"expected": true}'
Accepting a column structure change into the baseline¶
When the column consistency monitor reports an issue because the columns of a data extract changed on purpose, you can make the new column structure the baseline of the datastream. For more information on the baseline, see Updating the baseline of the column consistency monitor.
To accept the column structure of an issue into the baseline, follow these steps:
(Optional) Check the change. Read the details of the issue as described in Reading the details of an issue, and compare
extract_schemawithbaseline_schema, or readdiff.Create a POST request to the following endpoint:
https://{{INSTANCE}}/api/v1/monitors/issues/{{ISSUE_ID}}/apply-schema/
Replace
{{ISSUE_ID}}with theidof an issue of typeschema_consistency.In the HTTP request header, include the parameter
Authorizationwith valueBearer {{KEY}}.Send the request.
As a result, the column structure of the issue’s data extract becomes the
baseline of the datastream, and the issue is acknowledged. The response
contains the new baseline: its schema_columns, when it was changed
(updated), updated_by, which is the user the API key belongs to,
and extract_id. Unlike the extract_id of an issue, this is the UUID
of the data extract the issue was found on. It is null if that
data extract was deleted or has no UUID.
Warning
The new baseline replaces the previous one, and the column consistency
monitor checks all following fetches against it. To be able to return
to the previous column structure, keep the issue’s baseline_schema
(from its details) before you apply. To restore it, send that list of
column names in a PUT request to
https://{{INSTANCE}}/api/v1/monitors/universal/datastreams/{{DATASTREAM_UUID}}/baseline-schema/,
or update the baseline in Adverity as described in
Updating the baseline of the column consistency monitor.
Management API returns HTTP 404 if the issue does not exist, the key
cannot see it, it is not of type schema_consistency, or the
datastream has no baseline. It returns HTTP 400 if the issue did not
record the columns of its data extract.
The cURL request example is the following:
curl --location --request POST 'https://{{INSTANCE}}/api/v1/monitors/issues/{{ISSUE_ID}}/apply-schema/' \
--header 'Authorization: Bearer {{KEY}}'
Previewing custom monitor rules on a data extract¶
Before you save a custom monitor, you can check its rules against the rows of a data extract to see which rows would violate them. The check saves nothing, so the rules do not need to belong to a monitor. For more information on the rules, see Working with custom monitors.
To preview custom monitor rules, follow these steps:
Create a POST request to the following endpoint:
https://{{INSTANCE}}/api/v1/monitors/preview/
In the HTTP request header, include the parameter
Authorizationwith valueBearer {{KEY}}.In the HTTP request header, include the parameter
Content-Typewith valueapplication/json.In the HTTP request body, include the following parameters:
Parameter
Required
Description
extract_idYes
The numeric ID of the data extract whose rows to check.
blocksYes
The rule blocks to check, from 1 to 50. Each block has a
key(UUID) of your choice and acondition, in the same form as the rule blocks of a custom monitor.has_target_columnsNo
trueif the rules name the columns of the datastream’s schema instead of the source columns. Default:false.limitNo
The number of rows to check, from the start of the data extract. From
1to1000. Default:100.Send the request.
As a result, you obtain one item for each rule block, with the block’s
key and violated_rows: the positions of the checked rows that
violate the block, counted from 0.
[
{
"key": "54cdeeb5-1db4-494b-97ee-a48c5af66874",
"violated_rows": [0, 7, 42]
}
]
If the data extract does not exist, the key cannot see it, or its data
is no longer stored, Management API returns HTTP 404.
Tip
To find the columns and operators a rule can use, send GET requests to the following endpoints:
https://{{INSTANCE}}/api/v1/monitors/columns/?datastream_id={{DATASTREAM_UUID}}for the source columns.https://{{INSTANCE}}/api/v1/monitors/target-columns/?datastream_id={{DATASTREAM_UUID}}for the schema columns, ifhas_target_columnsistrue.https://{{INSTANCE}}/api/v1/monitors/operators/for the operators of each column type.
The cURL request example is the following. It checks one rule block on the first 100 rows of a data extract:
curl --location --request POST 'https://{{INSTANCE}}/api/v1/monitors/preview/' \
--header 'Authorization: Bearer {{KEY}}' \
--header 'Content-Type: application/json' \
--data '{"extract_id": {{EXTRACT_ID}}, "limit": 100, "blocks": [{"key": "54cdeeb5-1db4-494b-97ee-a48c5af66874", "representation": "date-format", "condition": {"key": "091610f9-52e1-44c1-92c0-514b453cdac2", "operation": "and", "conditions": [{"key": "9493426c-08da-413b-b449-00a0e32f6447", "operation": "or", "conditions": [{"key": "67122737-e878-4f2f-8479-222bf91417d2", "column": "Date", "columnType": 4, "operation": 16, "value": "2022-06-01"}]}]}}]}'
What’s next?¶
To assign custom monitors to datastreams, see Bulk assigning custom monitors in Management API.
To learn more about the monitors and their issues, see Working with universal monitors and Viewing details of the Data Quality issues.