---
title: "Publish draft changes"
method: POST
path: "/reference-data/v1/tables/{tableUrn}/draft/publish"
tags: ["Reference data"]
---

# Publish draft changes

`POST /reference-data/v1/tables/{tableUrn}/draft/publish`

## Request

- Base URL: `https://your-environment.ataccama.one/api`
- URL: `https://your-environment.ataccama.one/api/reference-data/v1/tables/{tableUrn}/draft/publish`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/ataccama/apis/ataccama-one-agentic-data-trust-platform-public-api/docs/reference-data/v1/tables/:tableUrn/draft/publish/post.ts> (a function with typed inputs; its response is checked against the schema)

Publish all draft changes to make them available in the published dataset.

Publishing creates a new immutable published dataset.
After publishing, records remain in draft with state `UNCHANGED`, and the published dataset contains the new version.
Records approved in a review are not published automatically; publish them with this operation.

Optionally accepts a filter to publish only specific records.
If no filter is provided, all eligible draft records are published. Send an empty object (`{}`) or no request body at all to publish everything.
Instead of publishing all changes at once, use a filter to publish specific records or changes. This provides better control over what gets published.

Publishing is an asynchronous operation that might take a few seconds.
Implement polling or verification logic to confirm publication before proceeding. If the records do not appear in the published dataset straight away, wait a moment and retry fetching them.

Returns `409 Conflict` when the publish cannot proceed in the current state of the draft. The problem `type` tells why:
- `NO_ELIGIBLE_RECORDS`: the draft contains no changes to publish, or the filter matches none.
- `DQ_BLOCKING_RULES_VIOLATED`: data quality blocking rules fail, on this table or on a referencing table whose records reference the changed records.
- `EFFECTIVE_DATE_RULES_VIOLATED`: records break the effective date rules of the table.

## Path parameters

- `tableUrn` string, uri, required: A URN identifying a table resource in the Reference Data API. Format: urn:ata:{tenant}:reference-data:table:{uuid} Example: urn:ata:acme-corp:reference-data:table:123e4567-e89b-12d3-a456-426614174000.

## Request body

- PublishInput: Input for publishing draft changes.
  - `filter` RecordFilter: Filter for reference data records, supporting complex queries with logical and comparison operators. Filter by attribute values (string, number, date, Boolean), record URN, record state, or when and by whom the record was last changed, and combine conditions with the logical operators `and` (all conditions must match) and `or` (at least one condition must match). Example — multiple conditions: ```json {"filter": {"and": [ {"attribute": { "attributeName": {"equals": "population"}, "number": {"greaterOrEqual": 1000000}}}, {"attribute": { "attributeName": {"equals": "country_name"}, "string": {"contains": "United"}}} ]}} ``` Example — date range: ```json {"filter": {"attribute": { "attributeName": {"equals": "created_date"}, "date": { "onOrAfter": "2024-01-01T00:00:00Z", "before": "2024-12-31T23:59:59Z"}}}} ``` Example — records changed by one user since a point in time: ```json {"filter": {"and": [ {"lastChangedAt": {"onOrAfter": "2026-09-01T00:00:00Z"}}, {"lastChangedByUrn": {"equals": "urn:ata:acme-corp:iam:user:jane.doe@acme-corp.com"}} ]}} ```
    - `and` RecordFilter[]: All nested conditions must match.
    - `or` RecordFilter[]: At least one nested condition must match.
    - `recordUrn` IdFilter
      - `equals` string, uri: A URN identifying a resource in any realm of the Public API. URNs follow RFC 8141. Format: urn:ata:{tenant}:{realm}:{resource-type}:{uuid} Components: - `urn` — fixed scheme - `ata` — Ataccama namespace - `{tenant}` — tenant identifier from the authentication context - `{realm}` — API realm, for example `catalog` or `reference-data` - `{resource-type}` — resource type within the realm, for example `catalog-item` or `table` - `{uuid}` — UUID (v4 or v7) of the resource Example: urn:ata:acme-corp:reference-data:table:123e4567-e89b-12d3-a456-426614174000.
      - `notEquals` string, uri: A URN identifying a resource in any realm of the Public API. URNs follow RFC 8141. Format: urn:ata:{tenant}:{realm}:{resource-type}:{uuid} Components: - `urn` — fixed scheme - `ata` — Ataccama namespace - `{tenant}` — tenant identifier from the authentication context - `{realm}` — API realm, for example `catalog` or `reference-data` - `{resource-type}` — resource type within the realm, for example `catalog-item` or `table` - `{uuid}` — UUID (v4 or v7) of the resource Example: urn:ata:acme-corp:reference-data:table:123e4567-e89b-12d3-a456-426614174000.
      - `in` Urn[]
      - `notIn` Urn[]
    - `state` StateFilter: Filter records by their state, matching any (`in`) or none (`notIn`) of the listed states.
      - `in` RecordState[]
      - `notIn` RecordState[]
    - `attribute` DataAttributeFilter: Filter records by the value of one attribute. Select the attribute with `attributeName` and apply the operator block matching the attribute's data type (`string`, `number`, `date`, or `boolean`).
      - `attributeName` object, required
        - `equals` string: Attribute name to filter on.
      - `string` StringFilter: Filter for string fields. Supported operators: - `contains` / `notContains`: Substring match. - `equals` / `notEquals`: Exact match. - `in` / `notIn`: Match any value in the array. - `isNull` / `isNotNull`: Check whether the field is null.
        - `contains` string
        - `notContains` string
        - `equals` string
        - `notEquals` string
        - `isNull` boolean
        - `isNotNull` boolean
        - `in` string[]
        - `notIn` string[]
      - `number` NumberFilter
        - `equals` number, float
        - `notEquals` number, float
        - `greater` number, float
        - `greaterOrEqual` number, float
        - `less` number, float
        - `lessOrEqual` number, float
        - `isNull` boolean
        - `isNotNull` boolean
        - `in` number[]
        - `notIn` number[]
      - `date` DateFilter: Range-only date-time filter. Bounds combine into half-open or closed ranges (`{onOrAfter: A, before: B}` = [A, B)). Use this where only range predicates are supported; `DateFilter` extends it with equality, set and null operators.
        - `after` string, date-time
        - `onOrAfter` string, date-time
        - `before` string, date-time
        - `onOrBefore` string, date-time
        - `equals` string, date-time
        - `notEquals` string, date-time
        - `isNull` boolean
        - `isNotNull` boolean
        - `in` string[]
        - `notIn` string[]
      - `boolean` BooleanFilter
        - `equals` boolean
        - `notEquals` boolean
        - `isNull` boolean
        - `isNotNull` boolean
      - `referencing` RecordFilter (recursive)
    - `lastChangedAt` DateFilter: Range-only date-time filter. Bounds combine into half-open or closed ranges (`{onOrAfter: A, before: B}` = [A, B)). Use this where only range predicates are supported; `DateFilter` extends it with equality, set and null operators.
      - `after` string, date-time
      - `onOrAfter` string, date-time
      - `before` string, date-time
      - `onOrBefore` string, date-time
      - `equals` string, date-time
      - `notEquals` string, date-time
      - `isNull` boolean
      - `isNotNull` boolean
      - `in` string[]
      - `notIn` string[]
    - `lastChangedByUrn` UserUrnFilter
      - `equals` string, uri: A URN identifying a user in the IAM API. Unlike most URNs, the last segment is the user ID as IAM knows it rather than a UUID. A user ID can be any string, for example, an email address, a UUID, or `service-account-{client ID}` for an API client. Characters that a URN cannot contain, such as spaces, `%`, or `#`, are percent-encoded as UTF-8 with uppercase hex digits; all other characters are kept as they are. Users cannot be listed or retrieved through the public API. To find a user's ID, open the user in the web application (**Global settings > User management > Users**). Format: urn:ata:{tenant}:iam:user:{user ID} Example: urn:ata:acme-corp:iam:user:jane.doe@acme-corp.com.
      - `notEquals` string, uri: A URN identifying a user in the IAM API. Unlike most URNs, the last segment is the user ID as IAM knows it rather than a UUID. A user ID can be any string, for example, an email address, a UUID, or `service-account-{client ID}` for an API client. Characters that a URN cannot contain, such as spaces, `%`, or `#`, are percent-encoded as UTF-8 with uppercase hex digits; all other characters are kept as they are. Users cannot be listed or retrieved through the public API. To find a user's ID, open the user in the web application (**Global settings > User management > Users**). Format: urn:ata:{tenant}:iam:user:{user ID} Example: urn:ata:acme-corp:iam:user:jane.doe@acme-corp.com.
      - `in` UserUrn[]
      - `notIn` UserUrn[]

## Response `200`

Changes published successfully.

- PublishResult
  - `publishedDatasetUrn` string, uri, required: A URN identifying a published dataset resource in the Reference Data API. Format: urn:ata:{tenant}:reference-data:published:{uuid} Example: urn:ata:acme-corp:reference-data:published:323e4567-e89b-12d3-a456-426614174002.
  - `publishedAt` string, date-time, required: Timestamp when the dataset was published.

## Other responses

- `400`: Bad request. The request parameters or body are invalid.
- `403`: Forbidden. You do not have permission to access the requested resource.
- `404`: Not found. The requested resource does not exist.
- `409`: The publish cannot proceed in the current state of the draft.

---

[API](https://skmtc.dev/ataccama/apis/ataccama-one-agentic-data-trust-platform-public-api.md) - [All operations](https://skmtc.dev/ataccama/apis/ataccama-one-agentic-data-trust-platform-public-api/llms.txt) - [OpenAPI document](https://skmtc.dev/ataccama/apis/ataccama-one-agentic-data-trust-platform-public-api/revisions/46f16e0487f8?raw)
