Schema Registry for Apache Kafka - covers schema management (Avro, Protobuf, JSON Schema), compatibility modes, schema evolution, REST API, serializer/deserializer configuration, Kafka Connect converters, Flink SQL integration, and Confluent Cloud.
100
Does it follow best practices?
Validation for skill structure
Base URL: http://localhost:8081 (default)
Content Type: application/vnd.schemaregistry.v1+json
Authentication (Confluent Cloud):
curl -u <API_KEY>:<API_SECRET> https://<SR_ENDPOINT>Error Response Format:
{
"error_code": 42201,
"message": "Schema being registered is incompatible with an earlier schema"
}Common error codes:
40401 — Subject not found40402 — Version not found40403 — Schema not found42201 — Invalid schema42202 — Invalid version409 — Incompatible schemaGET /schemas/ids/{id}
curl http://localhost:8081/schemas/ids/1
# Response
{
"schema": "{\"type\":\"record\",\"name\":\"User\",\"fields\":[...]}"
}GET /schemas/ids/{id}?format=serializedGET /schemas/types
curl http://localhost:8081/schemas/types
# Response
["AVRO", "PROTOBUF", "JSON"]GET /schemas/ids/{id}/versions
# Response — lists subjects and versions using this schema
[
{"subject": "my-topic-value", "version": 1}
]GET /subjects
curl http://localhost:8081/subjects
# Response
["my-topic-key", "my-topic-value", "orders-value"]GET /subjects/{subject}/versions
curl http://localhost:8081/subjects/my-topic-value/versions
# Response
[1, 2, 3]GET /subjects/{subject}/versions/{version}
# {version} can be an integer or "latest"
curl http://localhost:8081/subjects/my-topic-value/versions/latest
# Response
{
"subject": "my-topic-value",
"id": 1,
"version": 1,
"schemaType": "AVRO",
"schema": "{\"type\":\"record\",\"name\":\"User\",\"fields\":[...]}"
}POST /subjects/{subject}/versions
curl -X POST -H "Content-Type: application/vnd.schemaregistry.v1+json" \
--data '{
"schema": "{\"type\":\"record\",\"name\":\"User\",\"namespace\":\"com.example\",\"fields\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"}]}"
}' \
http://localhost:8081/subjects/my-topic-value/versions
# Response
{"id": 1}For Protobuf:
curl -X POST -H "Content-Type: application/vnd.schemaregistry.v1+json" \
--data '{
"schemaType": "PROTOBUF",
"schema": "syntax = \"proto3\"; message User { int32 id = 1; string name = 2; }"
}' \
http://localhost:8081/subjects/my-topic-value/versionsFor JSON Schema:
curl -X POST -H "Content-Type: application/vnd.schemaregistry.v1+json" \
--data '{
"schemaType": "JSON",
"schema": "{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"integer\"},\"name\":{\"type\":\"string\"}},\"required\":[\"id\",\"name\"]}"
}' \
http://localhost:8081/subjects/my-topic-value/versionsWith Schema References:
curl -X POST -H "Content-Type: application/vnd.schemaregistry.v1+json" \
--data '{
"schema": "...",
"schemaType": "AVRO",
"references": [
{
"name": "com.example.Address",
"subject": "address-value",
"version": 1
}
]
}' \
http://localhost:8081/subjects/my-topic-value/versionsPOST /subjects/{subject}
curl -X POST -H "Content-Type: application/vnd.schemaregistry.v1+json" \
--data '{"schema": "..."}' \
http://localhost:8081/subjects/my-topic-value
# Response (if registered)
{
"subject": "my-topic-value",
"id": 1,
"version": 1,
"schema": "..."
}DELETE /subjects/{subject}
curl -X DELETE http://localhost:8081/subjects/my-topic-value
# Response — list of deleted versions
[1, 2, 3]DELETE /subjects/{subject}/versions/{version}
curl -X DELETE http://localhost:8081/subjects/my-topic-value/versions/1
# Response
1# First soft-delete, then hard-delete with ?permanent=true
DELETE /subjects/{subject}?permanent=true
DELETE /subjects/{subject}/versions/{version}?permanent=truePOST /compatibility/subjects/{subject}/versions/{version}
curl -X POST -H "Content-Type: application/vnd.schemaregistry.v1+json" \
--data '{"schema": "..."}' \
http://localhost:8081/compatibility/subjects/my-topic-value/versions/latest
# Response
{"is_compatible": true}
# With verbose mode for details on failures
curl -X POST -H "Content-Type: application/vnd.schemaregistry.v1+json" \
--data '{"schema": "..."}' \
"http://localhost:8081/compatibility/subjects/my-topic-value/versions/latest?verbose=true"
# Response (incompatible)
{
"is_compatible": false,
"messages": [
"Incompatibility{type:READER_FIELD_MISSING_DEFAULT_VALUE, ...}"
]
}POST /compatibility/subjects/{subject}/versions
# Same request format, tests against all versions based on configured compatibilityQuery Parameters:
verbose=true — Returns detailed incompatibility messagesnormalize=true — Normalizes schema before checkingGET /config
curl http://localhost:8081/config
# Response
{"compatibilityLevel": "BACKWARD"}PUT /config
curl -X PUT -H "Content-Type: application/vnd.schemaregistry.v1+json" \
--data '{"compatibility": "FULL"}' \
http://localhost:8081/config
# Response
{"compatibility": "FULL"}GET /config/{subject}
curl http://localhost:8081/config/my-topic-value
# With fallback to global if not set
curl "http://localhost:8081/config/my-topic-value?defaultToGlobal=true"PUT /config/{subject}
curl -X PUT -H "Content-Type: application/vnd.schemaregistry.v1+json" \
--data '{"compatibility": "NONE"}' \
http://localhost:8081/config/my-topic-valueDELETE /config/{subject}GET /mode
# Response
{"mode": "READWRITE"}Modes: READWRITE (default), READONLY, READONLY_OVERRIDE, IMPORT
PUT /mode
curl -X PUT -H "Content-Type: application/vnd.schemaregistry.v1+json" \
--data '{"mode": "READONLY"}' \
http://localhost:8081/modeGET /mode/{subject}
PUT /mode/{subject}Install with Tessl CLI
npx tessl i gamussa/schema-registry@0.2.0