---
title: "Publish (or refresh) the governed read contract"
method: POST
path: "/v1/data-products/{id}/read-contract/publish"
tags: ["Data Products"]
---

# Publish (or refresh) the governed read contract

`POST /v1/data-products/{id}/read-contract/publish`

## Request

- Base URL: `https://api.talonic.com`
- URL: `https://api.talonic.com/v1/data-products/{id}/read-contract/publish`
- Auth: HTTP bearer

Freezes the product's currently served shape into the versioned read contract consumers read through — this is what makes a freshly built product consumable by Apps without a human relay. Requires the `write` scope. Every body property is optional: a schema whose fields carry a `record_key`, `business_key`, or `unique` tag publishes with no body at all. When the identity cannot be derived, declare EITHER `record_key_fields` OR `record_key_anchored: true` — never both.

## Path parameters

- `id` string, uuid, required

## Request body

- object
  - `record_key_fields` string[]: Served, non-restricted field names that identify a record. Mutually exclusive with `record_key_anchored`.
  - `record_key_anchored` boolean: Identify records by the record anchor instead of by served fields — the only option for a per-document product, where no field is unique per row. Mutually exclusive with `record_key_fields`.

## Response `200`

The published (or already-active) contract — same shape as the GET

## Other responses

- `400`: Both `record_key_fields` and `record_key_anchored` were declared — a contract has one record identity.
- `404`: Data product not found
- `422`: The product cannot be frozen into a contract (e.g. no derivable record identity); the body carries `message` and a machine `code`.
- `503`: Read contracts are not available in this deployment

---

[API](https://skmtc.dev/talonic/apis/talonic-api.md) · [All operations](https://skmtc.dev/talonic/apis/talonic-api/llms.txt) · [OpenAPI document](https://skmtc.dev/talonic/apis/talonic-api/revisions/678fe5f8c9c3?raw)
