Appearance
Review API
10 operations. Paths are relative to the API host (http://localhost:5080 in local development). Every operation accepts an OIDC bearer token (Authorization: Bearer …) or a workspace API key (X-Api-Key: keel_live_…); errors are RFC 9457 Problem Details with a code (error codes). Permissions: matrix.
| Method | Path | Summary |
|---|---|---|
| PUT | /api/v1/workspaces/{workspaceId}/classifications/columns/{proposalId} | Edit a column classification; the edit survives rescans. |
| PUT | /api/v1/workspaces/{workspaceId}/classifications/tables/{proposalId} | Edit a table classification; the edit survives rescans. |
| GET | /api/v1/workspaces/{workspaceId}/proposals | The Review queue: undecided proposals (plus those decided since decidedSince), counts per kind, High count. |
| POST | /api/v1/workspaces/{workspaceId}/proposals:bulk | Accept or reject many proposals: listed ids, or every undecided one matching a filter. |
| GET | /api/v1/workspaces/{workspaceId}/proposals/{proposalId} | One proposal with its evidence (F04 GetRelationshipEvidence). |
| POST | /api/v1/workspaces/{workspaceId}/proposals/{proposalId}:accept | Accept a proposal. Accepting a table classification also accepts its undecided non-sensitive columns. |
| POST | /api/v1/workspaces/{workspaceId}/proposals/{proposalId}:reject | Reject a proposal (optionally with a reason). Rejections are remembered across scans. |
| POST | /api/v1/workspaces/{workspaceId}/proposals/{proposalId}:undo | Return an accepted or rejected proposal to the queue. |
| GET | /api/v1/workspaces/{workspaceId}/proposals/summary | How many proposals wait for review (nav badge). |
| POST | /api/v1/workspaces/{workspaceId}/sources/{sourceId}/relationships | Declare a join Keel did not find (user-defined, accepted). |
EditColumnClassification
http
PUT /api/v1/workspaces/{workspaceId}/classifications/columns/{proposalId}Edit a column classification; the edit survives rescans.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
workspaceId | path | uuid | yes | |
proposalId | path | uuid | yes |
Request body (application/json): EditColumnClassificationRequest
| Field | Type | Notes |
|---|---|---|
additivity | Additivity? | |
businessName | string | |
defaultAggregation | Aggregation | One of None, Sum, Avg, Count, CountDistinct, Min, Max |
description | string? | |
piiCategory | PiiCategory? | |
role | ColumnRole | One of Key, Measure, Attribute, Time, Technical |
semanticType | SemanticType | One of Identifier, ForeignKey, Name, Email, Phone, Address, Country, Currency, Money, Percent, Quantity, Count, Date, Timestamp, Year, Month, Boolean, Category, Status, FreeText, Url, IpAddress, Geo, Json, Hash, Unknown |
sensitivity | Sensitivity | One of Public, Internal, Confidential, Restricted |
| Status | Description | Body |
|---|---|---|
| 204 | No Content | — |
EditTableClassification
http
PUT /api/v1/workspaces/{workspaceId}/classifications/tables/{proposalId}Edit a table classification; the edit survives rescans.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
workspaceId | path | uuid | yes | |
proposalId | path | uuid | yes |
Request body (application/json): EditTableClassificationRequest
| Field | Type | Notes |
|---|---|---|
businessName | string | |
description | string? | |
domain | string? | |
grain | string[]? | |
role | TableRole | One of Fact, Dimension, Bridge, Snapshot, SlowlyChangingDimension, Aggregate, Staging, LogEvent, Lookup, Unknown, |
| Status | Description | Body |
|---|---|---|
| 204 | No Content | — |
ListProposals
http
GET /api/v1/workspaces/{workspaceId}/proposalsThe Review queue: undecided proposals (plus those decided since decidedSince), counts per kind, High count.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
workspaceId | path | uuid | yes | |
kind | query | ReviewKind | no | |
sourceId | query | uuid | no | |
minConfidence | query | number | no | |
decidedSince | query | date-time | no | |
limit | query | int32 | no |
| Status | Description | Body |
|---|---|---|
| 200 | OK | ReviewQueueDto |
Response 200: ReviewQueueDto
| Field | Type | Notes |
|---|---|---|
counts | ReviewKindCountDto[] | |
highPending | int32 | |
items | ProposalDto[] | |
total | int32 |
BulkReviewProposals
http
POST /api/v1/workspaces/{workspaceId}/proposals:bulkAccept or reject many proposals: listed ids, or every undecided one matching a filter.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
workspaceId | path | uuid | yes |
Request body (application/json): BulkReviewRequest
| Field | Type | Notes |
|---|---|---|
action | ProposalDecision | One of Accept, Reject, Undo |
ids | uuid[]? | |
kind | ReviewKind? | |
minConfidence | number? | |
reason | string? | |
sourceId | uuid? |
| Status | Description | Body |
|---|---|---|
| 200 | OK | BulkReviewResult |
Response 200: BulkReviewResult
| Field | Type | Notes |
|---|---|---|
decided | int32 | |
skipped | int32 |
GetProposal
http
GET /api/v1/workspaces/{workspaceId}/proposals/{proposalId}One proposal with its evidence (F04 GetRelationshipEvidence).
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
workspaceId | path | uuid | yes | |
proposalId | path | uuid | yes |
| Status | Description | Body |
|---|---|---|
| 200 | OK | ProposalDto |
Response 200: ProposalDto
| Field | Type | Notes |
|---|---|---|
band | string | |
confidence | number | |
dataSourceId | uuid | |
dataSourceName | string | |
decidedAt | date-time? | |
decidedBy | string? | |
decisionReason | string? | |
effect | string | |
evidence | EvidenceDto[] | |
id | uuid | |
kind | ReviewKind | One of Join, Classify, Pii |
origin | Origin | One of Discovered, Inferred, LlmSuggested, UserDefined, Imported |
originLabel | string | |
proposedAt | date-time | |
status | ProposalStatus | One of Proposed, Accepted, Rejected, Superseded |
title | string | |
why | string |
AcceptProposal
http
POST /api/v1/workspaces/{workspaceId}/proposals/{proposalId}:acceptAccept a proposal. Accepting a table classification also accepts its undecided non-sensitive columns.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
workspaceId | path | uuid | yes | |
proposalId | path | uuid | yes |
| Status | Description | Body |
|---|---|---|
| 204 | No Content | — |
RejectProposal
http
POST /api/v1/workspaces/{workspaceId}/proposals/{proposalId}:rejectReject a proposal (optionally with a reason). Rejections are remembered across scans.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
workspaceId | path | uuid | yes | |
proposalId | path | uuid | yes |
Request body (application/json): RejectProposalRequest?
| Status | Description | Body |
|---|---|---|
| 204 | No Content | — |
UndoProposalDecision
http
POST /api/v1/workspaces/{workspaceId}/proposals/{proposalId}:undoReturn an accepted or rejected proposal to the queue.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
workspaceId | path | uuid | yes | |
proposalId | path | uuid | yes |
| Status | Description | Body |
|---|---|---|
| 204 | No Content | — |
GetReviewSummary
http
GET /api/v1/workspaces/{workspaceId}/proposals/summaryHow many proposals wait for review (nav badge).
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
workspaceId | path | uuid | yes |
| Status | Description | Body |
|---|---|---|
| 200 | OK | ReviewSummaryDto |
Response 200: ReviewSummaryDto
| Field | Type | Notes |
|---|---|---|
pending | int32 |
AssertRelationship
http
POST /api/v1/workspaces/{workspaceId}/sources/{sourceId}/relationshipsDeclare a join Keel did not find (user-defined, accepted).
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
workspaceId | path | uuid | yes | |
sourceId | path | uuid | yes |
Request body (application/json): AssertRelationshipRequest
| Field | Type | Notes |
|---|---|---|
cardinality | Cardinality | One of ManyToOne, OneToOne, ManyToMany |
fromColumns | string[] | |
fromSchema | string | |
fromTable | string | |
toColumns | string[] | |
toSchema | string | |
toTable | string |
| Status | Description | Body |
|---|---|---|
| 201 | Created | CreatedResponse |
Response 201: CreatedResponse
| Field | Type | Notes |
|---|---|---|
id | uuid |