POST /v1/dataContracts
from metadata.sdk import configure
from metadata.sdk.entities import DataContracts
from metadata.generated.schema.api.data.createDataContract import (
CreateDataContractRequest,
)
configure(
host="https://your-company.open-metadata.org/api",
jwt_token="your-jwt-token"
)
request = CreateDataContractRequest.model_validate({
"name": "sales-orders-contract",
"entity": {"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "type": "table"},
"description": "Data contract for the sales orders table",
"entityStatus": "Approved",
"schema": [
{"name": "order_id", "dataType": "INT", "constraint": "PRIMARY_KEY"},
{"name": "order_date", "dataType": "TIMESTAMP", "constraint": "NOT_NULL"},
],
"semantics": [
{
"name": "Owners is set",
"description": "The table must have an owner.",
"rule": '{"and":[{"some":[{"var":"owners"},{"!=":[{"var":"fullyQualifiedName"},null]}]}]}',
"enabled": True,
}
],
"sla": {"refreshFrequency": {"interval": 1, "unit": "day"}},
})
contract = DataContracts.create(request)
print(f"Created contract: {contract.fullyQualifiedName.root}")
import static org.openmetadata.sdk.fluent.DataContracts.*;
DataContract contract = create()
.name("sales-orders-contract")
.forEntity(new EntityReference()
.withId(tableId)
.withType("table"))
.withDescription("Data contract for the sales orders table")
.withStatus(EntityStatus.APPROVED)
.withSchema(List.of(
new Column().withName("order_id").withDataType(ColumnDataType.INT),
new Column().withName("order_date").withDataType(ColumnDataType.TIMESTAMP)
))
.withSemanticRule(new SemanticsRule()
.withName("Owners is set")
.withDescription("The table must have an owner.")
.withRule("{\"and\":[{\"some\":[{\"var\":\"owners\"},{\"!=\":[{\"var\":\"fullyQualifiedName\"},null]}]}]}"))
.withSla(new ContractSLA()
.withRefreshFrequency(new RefreshFrequency()
.withInterval(1)
.withUnit(RefreshFrequency.Unit.DAY)))
.execute();
curl -X POST "{base_url}/api/v1/dataContracts" \
-H "Authorization: Bearer {access_token}" \
-H "Content-Type: application/json" \
-d '{
"name": "sales-orders-contract",
"entity": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"type": "table"
},
"description": "Data contract for the sales orders table",
"entityStatus": "Approved",
"schema": [
{"name": "order_id", "dataType": "INT", "constraint": "PRIMARY_KEY"},
{"name": "customer_id", "dataType": "INT", "constraint": "NOT_NULL"},
{"name": "order_date", "dataType": "TIMESTAMP", "constraint": "NOT_NULL"},
{"name": "total_amount", "dataType": "DECIMAL"}
],
"semantics": [
{
"name": "Owners is set",
"description": "The table must have an owner.",
"rule": "{\"and\":[{\"some\":[{\"var\":\"owners\"},{\"!=\":[{\"var\":\"fullyQualifiedName\"},null]}]}]}",
"enabled": true
}
],
"sla": {
"refreshFrequency": {"interval": 1, "unit": "day"}
}
}'
{
"id": "f7a1b2c3-d4e5-6789-0abc-def123456789",
"name": "sales-orders-contract",
"fullyQualifiedName": "sample_data.ecommerce_db.shopify.sales_orders.dataContract_sales-orders-contract",
"displayName": "sales-orders-contract",
"description": "Data contract for the sales orders table",
"entityStatus": "Approved",
"entity": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"type": "table",
"name": "sales_orders",
"fullyQualifiedName": "sample_data.ecommerce_db.shopify.sales_orders"
},
"schema": [
{"name": "order_id", "dataType": "INT", "constraint": "PRIMARY_KEY"},
{"name": "customer_id", "dataType": "INT", "constraint": "NOT_NULL"},
{"name": "order_date", "dataType": "TIMESTAMP", "constraint": "NOT_NULL"},
{"name": "total_amount", "dataType": "DECIMAL"}
],
"semantics": [
{
"name": "Owners is set",
"description": "The table must have an owner.",
"rule": "{\"and\":[{\"some\":[{\"var\":\"owners\"},{\"!=\":[{\"var\":\"fullyQualifiedName\"},null]}]}]}",
"enabled": true
}
],
"sla": {
"refreshFrequency": {"interval": 1, "unit": "day"}
},
"version": 0.1,
"updatedAt": 1769982800000,
"updatedBy": "admin"
}
Create a Data Contract
Create a new data contract for a data asset
POST
/
v1
/
dataContracts
POST /v1/dataContracts
from metadata.sdk import configure
from metadata.sdk.entities import DataContracts
from metadata.generated.schema.api.data.createDataContract import (
CreateDataContractRequest,
)
configure(
host="https://your-company.open-metadata.org/api",
jwt_token="your-jwt-token"
)
request = CreateDataContractRequest.model_validate({
"name": "sales-orders-contract",
"entity": {"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "type": "table"},
"description": "Data contract for the sales orders table",
"entityStatus": "Approved",
"schema": [
{"name": "order_id", "dataType": "INT", "constraint": "PRIMARY_KEY"},
{"name": "order_date", "dataType": "TIMESTAMP", "constraint": "NOT_NULL"},
],
"semantics": [
{
"name": "Owners is set",
"description": "The table must have an owner.",
"rule": '{"and":[{"some":[{"var":"owners"},{"!=":[{"var":"fullyQualifiedName"},null]}]}]}',
"enabled": True,
}
],
"sla": {"refreshFrequency": {"interval": 1, "unit": "day"}},
})
contract = DataContracts.create(request)
print(f"Created contract: {contract.fullyQualifiedName.root}")
import static org.openmetadata.sdk.fluent.DataContracts.*;
DataContract contract = create()
.name("sales-orders-contract")
.forEntity(new EntityReference()
.withId(tableId)
.withType("table"))
.withDescription("Data contract for the sales orders table")
.withStatus(EntityStatus.APPROVED)
.withSchema(List.of(
new Column().withName("order_id").withDataType(ColumnDataType.INT),
new Column().withName("order_date").withDataType(ColumnDataType.TIMESTAMP)
))
.withSemanticRule(new SemanticsRule()
.withName("Owners is set")
.withDescription("The table must have an owner.")
.withRule("{\"and\":[{\"some\":[{\"var\":\"owners\"},{\"!=\":[{\"var\":\"fullyQualifiedName\"},null]}]}]}"))
.withSla(new ContractSLA()
.withRefreshFrequency(new RefreshFrequency()
.withInterval(1)
.withUnit(RefreshFrequency.Unit.DAY)))
.execute();
curl -X POST "{base_url}/api/v1/dataContracts" \
-H "Authorization: Bearer {access_token}" \
-H "Content-Type: application/json" \
-d '{
"name": "sales-orders-contract",
"entity": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"type": "table"
},
"description": "Data contract for the sales orders table",
"entityStatus": "Approved",
"schema": [
{"name": "order_id", "dataType": "INT", "constraint": "PRIMARY_KEY"},
{"name": "customer_id", "dataType": "INT", "constraint": "NOT_NULL"},
{"name": "order_date", "dataType": "TIMESTAMP", "constraint": "NOT_NULL"},
{"name": "total_amount", "dataType": "DECIMAL"}
],
"semantics": [
{
"name": "Owners is set",
"description": "The table must have an owner.",
"rule": "{\"and\":[{\"some\":[{\"var\":\"owners\"},{\"!=\":[{\"var\":\"fullyQualifiedName\"},null]}]}]}",
"enabled": true
}
],
"sla": {
"refreshFrequency": {"interval": 1, "unit": "day"}
}
}'
{
"id": "f7a1b2c3-d4e5-6789-0abc-def123456789",
"name": "sales-orders-contract",
"fullyQualifiedName": "sample_data.ecommerce_db.shopify.sales_orders.dataContract_sales-orders-contract",
"displayName": "sales-orders-contract",
"description": "Data contract for the sales orders table",
"entityStatus": "Approved",
"entity": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"type": "table",
"name": "sales_orders",
"fullyQualifiedName": "sample_data.ecommerce_db.shopify.sales_orders"
},
"schema": [
{"name": "order_id", "dataType": "INT", "constraint": "PRIMARY_KEY"},
{"name": "customer_id", "dataType": "INT", "constraint": "NOT_NULL"},
{"name": "order_date", "dataType": "TIMESTAMP", "constraint": "NOT_NULL"},
{"name": "total_amount", "dataType": "DECIMAL"}
],
"semantics": [
{
"name": "Owners is set",
"description": "The table must have an owner.",
"rule": "{\"and\":[{\"some\":[{\"var\":\"owners\"},{\"!=\":[{\"var\":\"fullyQualifiedName\"},null]}]}]}",
"enabled": true
}
],
"sla": {
"refreshFrequency": {"interval": 1, "unit": "day"}
},
"version": 0.1,
"updatedAt": 1769982800000,
"updatedBy": "admin"
}
Create a Data Contract
Create a new data contract and attach it to a data asset. Only thename and entity reference are required — all other sections (schema, semantics, quality, SLA, security, terms of use) are optional.
Body Parameters
string
required
Name of the data contract. Must be unique.
object
required
Reference to the data asset this contract applies to.
string
Human-readable display name.
string
Description in Markdown format.
string
default:"Draft"
Contract status:
Draft, In Review, Approved, Rejected, Deprecated, or Archived.array
array
Semantics rules evaluated against the entity’s metadata when the contract is validated.
Show properties
Show properties
string
required
Rule name.
string
required
Rule description. Reported as the failure reason when the rule fails.
string
required
JSON Logic expression. The rule passes when it returns
true.boolean
default:"true"
Whether the rule is evaluated.
string
Apply the rule only to this entity type.
array
Entity types the rule skips.
array
object
Service level agreement expectations. Stored and shown on the contract.
Show properties
Show properties
object
interval (integer) and unit: hour, day, week, month, or year.object
value (integer) and unit: minute, hour, or day.string
Time of day the data should be available, for example
09:00.string
default:"GMT+00:00 (Europe/London)"
Timezone for
availabilityTime, in the form GMT+05:30 (Asia/Kolkata).object
period (integer) and unit: day, week, month, or year.string
Column that holds the data’s refresh time.
string
Terms of use in Markdown format. Describes allowed/disallowed use cases and compliance requirements.
object
array
Owner references (users or teams).
array
Reviewer user references.
string
ISO 8601 date from which this contract is effective.
string
ISO 8601 date until which this contract is effective.
POST /v1/dataContracts
from metadata.sdk import configure
from metadata.sdk.entities import DataContracts
from metadata.generated.schema.api.data.createDataContract import (
CreateDataContractRequest,
)
configure(
host="https://your-company.open-metadata.org/api",
jwt_token="your-jwt-token"
)
request = CreateDataContractRequest.model_validate({
"name": "sales-orders-contract",
"entity": {"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "type": "table"},
"description": "Data contract for the sales orders table",
"entityStatus": "Approved",
"schema": [
{"name": "order_id", "dataType": "INT", "constraint": "PRIMARY_KEY"},
{"name": "order_date", "dataType": "TIMESTAMP", "constraint": "NOT_NULL"},
],
"semantics": [
{
"name": "Owners is set",
"description": "The table must have an owner.",
"rule": '{"and":[{"some":[{"var":"owners"},{"!=":[{"var":"fullyQualifiedName"},null]}]}]}',
"enabled": True,
}
],
"sla": {"refreshFrequency": {"interval": 1, "unit": "day"}},
})
contract = DataContracts.create(request)
print(f"Created contract: {contract.fullyQualifiedName.root}")
import static org.openmetadata.sdk.fluent.DataContracts.*;
DataContract contract = create()
.name("sales-orders-contract")
.forEntity(new EntityReference()
.withId(tableId)
.withType("table"))
.withDescription("Data contract for the sales orders table")
.withStatus(EntityStatus.APPROVED)
.withSchema(List.of(
new Column().withName("order_id").withDataType(ColumnDataType.INT),
new Column().withName("order_date").withDataType(ColumnDataType.TIMESTAMP)
))
.withSemanticRule(new SemanticsRule()
.withName("Owners is set")
.withDescription("The table must have an owner.")
.withRule("{\"and\":[{\"some\":[{\"var\":\"owners\"},{\"!=\":[{\"var\":\"fullyQualifiedName\"},null]}]}]}"))
.withSla(new ContractSLA()
.withRefreshFrequency(new RefreshFrequency()
.withInterval(1)
.withUnit(RefreshFrequency.Unit.DAY)))
.execute();
curl -X POST "{base_url}/api/v1/dataContracts" \
-H "Authorization: Bearer {access_token}" \
-H "Content-Type: application/json" \
-d '{
"name": "sales-orders-contract",
"entity": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"type": "table"
},
"description": "Data contract for the sales orders table",
"entityStatus": "Approved",
"schema": [
{"name": "order_id", "dataType": "INT", "constraint": "PRIMARY_KEY"},
{"name": "customer_id", "dataType": "INT", "constraint": "NOT_NULL"},
{"name": "order_date", "dataType": "TIMESTAMP", "constraint": "NOT_NULL"},
{"name": "total_amount", "dataType": "DECIMAL"}
],
"semantics": [
{
"name": "Owners is set",
"description": "The table must have an owner.",
"rule": "{\"and\":[{\"some\":[{\"var\":\"owners\"},{\"!=\":[{\"var\":\"fullyQualifiedName\"},null]}]}]}",
"enabled": true
}
],
"sla": {
"refreshFrequency": {"interval": 1, "unit": "day"}
}
}'
{
"id": "f7a1b2c3-d4e5-6789-0abc-def123456789",
"name": "sales-orders-contract",
"fullyQualifiedName": "sample_data.ecommerce_db.shopify.sales_orders.dataContract_sales-orders-contract",
"displayName": "sales-orders-contract",
"description": "Data contract for the sales orders table",
"entityStatus": "Approved",
"entity": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"type": "table",
"name": "sales_orders",
"fullyQualifiedName": "sample_data.ecommerce_db.shopify.sales_orders"
},
"schema": [
{"name": "order_id", "dataType": "INT", "constraint": "PRIMARY_KEY"},
{"name": "customer_id", "dataType": "INT", "constraint": "NOT_NULL"},
{"name": "order_date", "dataType": "TIMESTAMP", "constraint": "NOT_NULL"},
{"name": "total_amount", "dataType": "DECIMAL"}
],
"semantics": [
{
"name": "Owners is set",
"description": "The table must have an owner.",
"rule": "{\"and\":[{\"some\":[{\"var\":\"owners\"},{\"!=\":[{\"var\":\"fullyQualifiedName\"},null]}]}]}",
"enabled": true
}
],
"sla": {
"refreshFrequency": {"interval": 1, "unit": "day"}
},
"version": 0.1,
"updatedAt": 1769982800000,
"updatedBy": "admin"
}
Upsert (Create or Update)
UsePUT /v1/dataContracts with the same body to create a new contract or update an existing one.
Error Handling
| Code | Error Type | Description |
|---|---|---|
400 | BAD_REQUEST | Invalid request body or missing required fields |
401 | UNAUTHORIZED | Invalid or missing authentication token |
403 | FORBIDDEN | User lacks permission to create data contracts |
409 | CONFLICT | A contract with the same name already exists |
Was this page helpful?