Skip to main content

Issues API

Manage data quality issues and track resolution.

Endpoints Overview

MethodEndpointDescription
GET/issuesList issues
POST/issuesCreate issue
GET/issues/{id}Get issue details
PATCH/issues/{id}Update issue
DELETE/issues/{id}Delete issue
POST/spaces/{slug}/record-issues/external-syncSync externally mastered record issues

List Issues

GET /issues

Query Parameters

ParameterTypeDescription
space_iduuidFilter by space
product_iduuidFilter by product
statusstringopen, in_progress, resolved
prioritystringlow, medium, high, critical
assignee_iduuidFilter by assigned user
pageintegerPage number
sizeintegerItems per page

Response

{
"items": [
{
"id": "...",
"title": "Customer ID nulls increased",
"description": "Seeing 15% null rate in customer_id column",
"status": "open",
"priority": "high",
"product": {
"id": "...",
"name": "Customer Events"
},
"assignee": {
"id": "...",
"name": "Jane Developer"
},
"reporter": {
"id": "...",
"name": "Bob Smith"
},
"created_at": "2026-01-15T10:30:00Z",
"updated_at": "2026-01-15T12:00:00Z"
}
],
"total": 8,
"page": 1,
"size": 20
}

Create Issue

POST /issues

Request Body

{
"title": "Missing transactions for Jan 14",
"description": "## Summary\n\nNo transaction records loaded for 2026-01-14.\n\n## Impact\n\nDaily revenue reporting is blocked.",
"priority": "critical",
"product_id": "product-uuid",
"space_id": "space-uuid",
"assignee_id": "user-uuid"
}

Required Fields

FieldTypeDescription
titlestringIssue title
space_iduuidSpace containing the issue

Optional Fields

FieldTypeDescription
descriptionstringMarkdown description
prioritystringlow, medium, high, critical
product_iduuidRelated product
assignee_iduuidUser to assign

Update Issue

PATCH /issues/{id}

Status Transitions

{
"status": "in_progress"
}

Valid statuses: open, in_progress, resolved

Assign User

{
"assignee_id": "user-uuid"
}

Change Priority

{
"priority": "critical"
}

Issue Comments

List Comments

GET /issues/{id}/comments

Add Comment

POST /issues/{id}/comments
{
"content": "Identified the root cause - upstream pipeline failed."
}

Response

{
"id": "...",
"content": "Identified the root cause...",
"author": {
"id": "...",
"name": "Jane Developer",
"avatar_url": "..."
},
"created_at": "2026-01-15T14:00:00Z"
}

Issue History

Audit trail of changes:

GET /issues/{id}/history
{
"items": [
{
"id": "...",
"action": "status_changed",
"old_value": "open",
"new_value": "in_progress",
"actor": {"id": "...", "name": "Jane Developer"},
"timestamp": "2026-01-15T14:00:00Z"
}
]
}

Create issue from quality alert:

POST /issues
{
"title": "Freshness check failed",
"alert_id": "alert-uuid",
"product_id": "product-uuid",
"space_id": "space-uuid",
"priority": "high"
}

This links the issue to the alert for traceability.


Sync External Record Issues

POST /spaces/{slug}/record-issues/external-sync

Synchronize a snapshot of row-level record issues from an external master such as Airflow, a warehouse error table, or a custom validation service.

Request Body

{
"source_kind": "airflow",
"source_key": "orders_daily_validation",
"connector_id": "connector-uuid",
"auto_resolve_missing": true,
"records": [
{
"product_slug": "orders-daily",
"primary_key_values": {"order_id": "10042"},
"external_issue_key": "orders_daily:10042:missing_customer",
"title": "Missing customer_id",
"description_markdown": "The order row has no customer_id after enrichment.",
"severity": "error",
"status": "open",
"category": "completeness",
"metadata": {"rule": "not_null_customer_id"}
}
]
}

Fields

FieldTypeDescription
source_kindstringairflow, error_table, custom, or manual
source_keystringStable identifier for the external snapshot source
connector_iduuidOptional connector that produced the snapshot
auto_resolve_missingbooleanResolve previously synced issues missing from this snapshot
records[].product_iduuidProduct UUID. Use this or product_slug.
records[].product_slugstringProduct slug. Use this or product_id.
records[].primary_key_valuesobjectRow identity for the affected record
records[].external_issue_keystringStable external issue identity
records[].severitystringinfo, warning, or error
records[].statusstringopen, resolved, or accepted

Response

{
"status": "success",
"created_count": 3,
"updated_count": 12,
"resolved_count": 2,
"skipped_count": 0,
"integration_event_id": null
}

Status aliases from external sources are normalized. For example, active and new become open, while closed and fixed become resolved.