Skip to main content
POST
https://sandbox.getcollate.io/api
/
v1
/
topics
POST /v1/topics
from metadata.sdk import configure
from metadata.sdk.entities import Topics
from metadata.generated.schema.api.data.createTopic import CreateTopicRequest

configure(
    host="https://your-company.getcollate.io/api",
    jwt_token="your-jwt-token"
)

request = CreateTopicRequest(
    name="address_book",
    displayName="Address Book",
    service="sample_kafka",
    description="All Protobuf record related events gets captured in this topic",
    messageSchema={
        "schemaType": "Protobuf",
        "schemaText": "syntax = \"proto2\";\npackage tutorial;\nmessage Person { ... }"
    },
    partitions=1,
    cleanupPolicies=["delete"],
    replicationFactor=1,
    maximumMessageSize=1,
    retentionSize=-1
)

topic = Topics.create(request)
print(f"Created: {topic.fullyQualifiedName}")
{
  "id": "0a021819-982e-4ee4-a5a2-4af30eaa3016",
  "name": "address_book",
  "fullyQualifiedName": "sample_kafka.address_book",
  "description": "All Protobuf record related events gets captured in this topic",
  "version": 0.1,
  "updatedAt": 1769982663546,
  "updatedBy": "admin",
  "service": {
    "id": "469ef25e-9bdf-4d5f-8553-eb0ce8581f30",
    "type": "messagingService",
    "name": "sample_kafka",
    "fullyQualifiedName": "sample_kafka",
    "displayName": "sample_kafka",
    "deleted": false
  },
  "serviceType": "Kafka",
  "messageSchema": {
    "schemaText": "syntax = \"proto2\";\npackage tutorial;\nmessage Person { ... }",
    "schemaType": "Protobuf",
    "schemaFields": [
      {
        "name": "AddressBook",
        "dataType": "RECORD",
        "fullyQualifiedName": "sample_kafka.address_book.AddressBook",
        "children": []
      }
    ]
  },
  "partitions": 1,
  "cleanupPolicies": ["delete"],
  "replicationFactor": 1,
  "maximumMessageSize": 1,
  "retentionSize": -1,
  "href": "http://localhost:8585/api/v1/topics/0a021819-982e-4ee4-a5a2-4af30eaa3016",
  "deleted": false,
  "owners": [],
  "tags": [],
  "followers": [],
  "votes": {
    "upVotes": 0,
    "downVotes": 0,
    "upVoters": [],
    "downVoters": []
  },
  "domains": []
}

Create a Topic

Create a new topic within a messaging service.

Body Parameters

name
string
required
Name of the topic. Must be unique within the parent messaging service.
service
string
required
Fully qualified name of the parent MessagingService (e.g., sample_kafka).
messageSchema
object
Schema definition for messages in the topic.
partitions
integer
Number of partitions for the topic.
cleanupPolicies
array
Array of cleanup policies for the topic (e.g., delete, compact).
replicationFactor
integer
Replication factor for the topic.
maximumMessageSize
integer
Maximum message size in bytes.
retentionSize
integer
Retention size in bytes. Use -1 for unlimited.
displayName
string
Human-readable display name for the topic.
description
string
Description of the topic in Markdown format.
owners
array
Array of owner references (users or teams) to assign to the topic.
domain
string
Fully qualified name of the domain to assign for governance purposes.
tags
array
Array of classification tags to apply to the topic.
extension
object
Custom property values defined by your organization’s metadata schema.
POST /v1/topics
from metadata.sdk import configure
from metadata.sdk.entities import Topics
from metadata.generated.schema.api.data.createTopic import CreateTopicRequest

configure(
    host="https://your-company.getcollate.io/api",
    jwt_token="your-jwt-token"
)

request = CreateTopicRequest(
    name="address_book",
    displayName="Address Book",
    service="sample_kafka",
    description="All Protobuf record related events gets captured in this topic",
    messageSchema={
        "schemaType": "Protobuf",
        "schemaText": "syntax = \"proto2\";\npackage tutorial;\nmessage Person { ... }"
    },
    partitions=1,
    cleanupPolicies=["delete"],
    replicationFactor=1,
    maximumMessageSize=1,
    retentionSize=-1
)

topic = Topics.create(request)
print(f"Created: {topic.fullyQualifiedName}")
{
  "id": "0a021819-982e-4ee4-a5a2-4af30eaa3016",
  "name": "address_book",
  "fullyQualifiedName": "sample_kafka.address_book",
  "description": "All Protobuf record related events gets captured in this topic",
  "version": 0.1,
  "updatedAt": 1769982663546,
  "updatedBy": "admin",
  "service": {
    "id": "469ef25e-9bdf-4d5f-8553-eb0ce8581f30",
    "type": "messagingService",
    "name": "sample_kafka",
    "fullyQualifiedName": "sample_kafka",
    "displayName": "sample_kafka",
    "deleted": false
  },
  "serviceType": "Kafka",
  "messageSchema": {
    "schemaText": "syntax = \"proto2\";\npackage tutorial;\nmessage Person { ... }",
    "schemaType": "Protobuf",
    "schemaFields": [
      {
        "name": "AddressBook",
        "dataType": "RECORD",
        "fullyQualifiedName": "sample_kafka.address_book.AddressBook",
        "children": []
      }
    ]
  },
  "partitions": 1,
  "cleanupPolicies": ["delete"],
  "replicationFactor": 1,
  "maximumMessageSize": 1,
  "retentionSize": -1,
  "href": "http://localhost:8585/api/v1/topics/0a021819-982e-4ee4-a5a2-4af30eaa3016",
  "deleted": false,
  "owners": [],
  "tags": [],
  "followers": [],
  "votes": {
    "upVotes": 0,
    "downVotes": 0,
    "upVoters": [],
    "downVoters": []
  },
  "domains": []
}

Returns

Returns the created topic object with all specified properties and system-generated fields.

Response

id
string
Unique identifier for the topic (UUID format).
name
string
Topic name.
fullyQualifiedName
string
Fully qualified name in format service.topicName.
displayName
string
Human-readable display name.
description
string
Description of the topic in Markdown format.
service
object
Reference to the parent messaging service.
messageSchema
object
Schema definition for messages in the topic.
partitions
integer
Number of partitions for the topic.
cleanupPolicies
array
Cleanup policies for the topic.
replicationFactor
integer
Replication factor for the topic.
maximumMessageSize
integer
Maximum message size in bytes.
retentionSize
integer
Retention size in bytes.
serviceType
string
Type of messaging service (e.g., Kafka, Redpanda, Kinesis).
owners
array
List of owners assigned to the topic.
domains
array
Domain assignments for governance.
tags
array
Classification tags applied to the topic.
extension
object
Custom property values defined by your organization’s metadata schema.
version
number
Version number for the entity (starts at 0.1).

Create or Update (PUT)

Use PUT /v1/topics instead of POST to perform an upsert. If a topic with the same fullyQualifiedName already exists, it will be updated; otherwise, a new topic is created. The request body is the same as POST.
curl -X PUT "{base_url}/api/v1/topics" \
  -H "Authorization: Bearer {access_token}" \
  -H "Content-Type: application/json" \
  -d '{ ... same body as POST ... }'
PUT will not return a 409 conflict error if the entity already exists — it will update the existing entity instead.

Bulk Create or Update (PUT)

Use PUT /v1/topics/bulk to create or update multiple topics in a single request. The request body is an array of create request objects.
curl -X PUT "{base_url}/api/v1/topics/bulk" \
  -H "Authorization: Bearer {access_token}" \
  -H "Content-Type: application/json" \
  -d '[
    { "name": "topic_one", "service": "sample_kafka" },
    { "name": "topic_two", "service": "sample_kafka" }
  ]'

Error Handling

CodeError TypeDescription
400BAD_REQUESTInvalid request body or missing required fields
401UNAUTHORIZEDInvalid or missing authentication token
403FORBIDDENUser lacks permission to create topics
409ENTITY_ALREADY_EXISTSTopic with same name already exists in service (POST only)