> ## Documentation Index
> Fetch the complete documentation index at: https://docs.streamnative.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Kafka Schema Registry FAQ

> Common questions about the Kafka Schema Registry on StreamNative Cloud, including migration from Confluent.

## General

### Is it compatible with Confluent Schema Registry?

For the supported operations, yes—standard Confluent serializers, deserializers, and REST clients
work unchanged. Several Confluent features aren't implemented, and a few endpoints behave
differently. Read
[Confluent API compatibility](/kafka/governance/sr/reference/confluent-compatibility) before
migrating.

### Which schema formats are supported?

Avro, JSON Schema, and Protobuf. `GET /schemas/types` returns exactly
`["AVRO","JSON","PROTOBUF"]`.

### What's the minimum permission a client needs?

A producer that registers schemas needs
[`schema-writer`](/cloud/security/access/rbac/manage-rbac-roles#schema-writer). A consumer that only
resolves them needs [`schema-reader`](/cloud/security/access/rbac/manage-rbac-roles#schema-reader).
Both are scoped per subject.

### How do I find my Schema Registry endpoint?

On a **Kafka cluster** it's the cluster's HTTP service URL. On a **Pulsar cluster** it's that URL
with `/kafka` appended. See
[Get the Schema Registry URL](/kafka/governance/sr/connect#get-the-schema-registry-url).

### Can I use OAuth instead of an API key?

Yes, with the Kafka Java client and the `oauth-client` dependency. See
[OAuth2](/kafka/governance/sr/connect#oauth2).

## Schemas and subjects

### What's the difference between a schema ID and a version?

A schema ID identifies a schema **globally**—register the same definition under two subjects and
you get one ID. A version is the position of a schema **within a subject**. The same schema ID can be
version 1 of one subject and version 3 of another. See
[Key concepts](/kafka/governance/sr/fundamentals/key-concepts).

### How many schemas can I store?

There's no maximum number of subjects, no maximum number of versions per subject, and no storage
quota. The one hard limit is a **5 MB request body**, which caps the size of a single schema.

### How do I find which subjects use a schema ID?

```shell theme={null}
curl -u "any-user:$API_KEY" "$SR_URL/schemas/ids/1/subjects"
```

### Can I recover a deleted schema?

No. A soft delete keeps the schema readable through `?deleted=true`, but nothing restores it, and
re-registering the same schema creates a **new version**. Hard-deleted data is gone. See
[Delete schemas](/kafka/governance/sr/manage/delete-schemas).

### Why can't I delete this schema?

Another schema references it—error code 42206. Find them with
`GET /subjects/{subject}/versions/{version}/referencedby` and delete those first.

### Can I change a subject's format from Avro to JSON?

No. That's rejected with HTTP 409 in every compatibility mode, including `NONE`. Use a new subject.

## Compatibility

### What's the default compatibility mode?

`BACKWARD`, for every format.

### Why does `GET /config` say NONE?

The global `GET /config` returns a fixed `{"compatibilityLevel":"NONE"}` regardless of what's in
force. It's not reporting a real value. Read `GET /config/{subject}` instead. See
[Behavior differences](/kafka/governance/sr/reference/confluent-compatibility#get-config-always-reports-none).

### How do I change the global default compatibility mode?

You can't—there's no `PUT /config`. Set the mode on each subject with `PUT /config/{subject}`.

### Should I upgrade producers or consumers first?

It depends on the mode. Under `BACKWARD` (the default), **consumers first**. Under `FORWARD`,
**producers first**. Under `FULL`, either. See
[Order of upgrading clients](/kafka/governance/sr/fundamentals/schema-evolution#order-of-upgrading-clients).

### Can I test a schema change without registering it?

Yes, and you should—put it in CI:

```shell theme={null}
curl -u "any-user:$API_KEY" -X POST \
  -H "Content-Type: application/vnd.schemaregistry.v1+json" \
  --data '{"schema":"..."}' \
  "$SR_URL/compatibility/subjects/orders-value/versions/latest?verbose=true"
```

Note this is a **POST**, not a GET.

### What is ALWAYS\_INCOMPATIBLE?

A StreamNative extension with no Confluent equivalent. It rejects every schema change once a subject
has at least one version—useful for freezing a subject. Confluent client libraries may not accept
the value, in which case set it through the REST API.

## Migrating from Confluent

### Do Data Contracts work?

No, and the failure is silent. A registration carrying `metadata` or `ruleSet` **succeeds**—the
fields are discarded and the schema is stored without them, with no error. If you rely on schema
rules, CEL validation, or migration rules, they stop being enforced the moment you switch.

### Is Schema Linking supported?

No. `/exporters/*` returns 404. Use
[Universal Linking](/cookbook/kafka-schema-registry-geo-replication) to replicate schemas between
clusters instead.

### Are schema contexts supported?

No. `GET /contexts` returns 404, and qualified subject names aren't recognized.

### Is client-side field level encryption supported?

No. There's no DEK/KEK registry and no `encrypt` rule executor.

### Why did my RecordNameStrategy subjects change meaning?

Subject names are parsed into Pulsar tenant, namespace, and topic components. A
`RecordNameStrategy` subject like `com.acme.MyRecord` becomes tenant `com`, namespace `acme`, topic
`MyRecord`. Confirm those exist and that your credentials cover them. See
[Subject names and Pulsar coordinates](/kafka/governance/sr/fundamentals/key-concepts#subject-names-and-pulsar-coordinates).

### Does `?normalize=true` work?

For Avro and Protobuf, yes. For **JSON Schema it's a no-op**, so schemas differing only in property
ordering register as separate versions. On the `/compatibility/*` endpoints it's ignored for every
format.

### Does the Confluent Maven plugin work?

It talks to the registry over the standard REST API, so the goals that use supported endpoints should
work. It isn't tested against StreamNative Cloud, so verify against a non-production cluster before
relying on it in a pipeline.

## Operations

### Is the Schema Registry a separate service I connect to?

No. It's served at your cluster's own endpoint on port 443 over HTTPS, so it inherits the cluster's
network configuration—including private networking.

### Why is my subject list empty?

`GET /subjects` filters to subjects your credentials can read rather than returning a permission
error. An empty array means either the registry is empty or your role covers none of the existing
subjects.

### How do I replicate schemas to another region?

[Universal Linking](/cookbook/kafka-schema-registry-geo-replication) replicates from an active
cluster to one or more standby clusters. Standbys run in import mode: they accept replicated schemas
and reject new registrations from producers. Replication is one-directional, and deletions aren't
replicated.

### Can I make the broker reject records without a schema?

Yes—enable [schema ID validation](/kafka/governance/sr/manage/schema-id-validation) per topic. Note
it uses `kop.kafka.*` properties rather than Confluent's `confluent.*` ones, and tombstones always
pass.

## Next steps

<CardGroup cols={2}>
  <Card title="Confluent compatibility" icon="list-check" href="/kafka/governance/sr/reference/confluent-compatibility">
    The complete support and behavior reference.
  </Card>

  <Card title="Troubleshooting" icon="wrench" href="/kafka/governance/sr/reference/troubleshooting">
    Error codes and common symptoms.
  </Card>
</CardGroup>
