Contracts API
Manage data contracts and SLAs between producers and consumers.
Endpoints Overview
| Method | Endpoint | Description |
|---|---|---|
GET | /contracts | List contracts |
POST | /contracts | Create contract |
GET | /contracts/{id} | Get details |
PATCH | /contracts/{id} | Update contract |
DELETE | /contracts/{id} | Delete contract |
GET | /contracts/spaces/{slug} | List by space |
GET | /contracts/products/{product_id}/contracts | List by product |
POST | /contracts/{id}/archive | Archive contract |
POST | /contracts/{id}/unarchive | Unarchive contract |
List Contracts
GET /contracts
Query Parameters
| Parameter | Type | Description |
|---|---|---|
space_id | uuid | Filter by space |
producer_id | uuid | Filter by producer product |
consumer_id | uuid | Filter by consumer product |
status | string | active, draft, expired |
page | integer | Page number |
size | integer | Items per page |
Response
{
"items": [
{
"id": "...",
"name": "Customer Events SLA",
"description": "Freshness and quality guarantees",
"status": "active",
"producer": {
"id": "...",
"name": "Customer Events (Raw)"
},
"consumer": {
"id": "...",
"name": "Customer Analytics"
},
"sla": {
"freshness_hours": 1,
"availability_percent": 99.5
},
"created_at": "2025-06-01T00:00:00Z",
"expires_at": "2026-06-01T00:00:00Z"
}
],
"total": 5,
"page": 1,
"size": 20
}
Create Contract
POST /contracts
Request Body
{
"name": "Orders Data SLA",
"description": "## Overview\n\nThis contract defines...",
"space_id": "space-uuid",
"producer_id": "product-uuid",
"consumer_id": "product-uuid",
"sla": {
"freshness_hours": 24,
"availability_percent": 99.0,
"quality_score_min": 0.9
},
"expires_at": "2026-12-31T23:59:59Z"
}
SLA Fields
| Field | Type | Description |
|---|---|---|
freshness_hours | integer | Max data age in hours |
availability_percent | float | Uptime requirement (0-100) |
quality_score_min | float | Minimum quality score (0-1) |
response_time_hours | integer | Issue response SLA |
Update Contract
PATCH /contracts/{id}
Modify SLA Terms
{
"sla": {
"freshness_hours": 12,
"availability_percent": 99.9
}
}
Change Status
{
"status": "expired"
}
Contract Violations
When SLA terms are breached, violations are automatically tracked.
List Violations
GET /contracts/{id}/violations
Response
{
"items": [
{
"id": "...",
"type": "freshness",
"occurred_at": "2026-01-15T08:00:00Z",
"details": {
"expected": 24,
"actual": 36,
"unit": "hours"
},
"resolved": false
}
]
}
Acknowledge Violation
PATCH /contracts/{id}/violations/{violation_id}
{
"acknowledged": true,
"notes": "Known outage, backfill in progress"
}
Archive Contract
POST /contracts/{id}/archive
Requires: Contract edit permission
Soft-archives a data contract. Archived contracts are excluded from default list results.
Returns the updated DataContractResponse.
Unarchive Contract
POST /contracts/{id}/unarchive
Requires: Contract edit permission
Restores a previously archived contract.
Returns the updated DataContractResponse.
Delete Contract
DELETE /contracts/{id}
Requires: Contract delete permission
Permanently deletes a data contract. Returns 204 No Content. Returns 404 if not found.
List by Space
GET /contracts/spaces/{slug}
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
search | string | — | Search by product name, description, or contract ID |
status | string | — | Filter: active, draft, deprecated |
include_archived | bool | false | Include archived contracts |
Filtering Archived Contracts
Both the global list (GET /contracts) and space-scoped list (GET /contracts/spaces/{slug}) support the include_archived query parameter. By default, archived contracts are hidden.