Skip to main content
Use const to pin a field to a single allowed value.

Basic usage

{
  "type": "object",
  "properties": {
    "version": { "const": "v1" }
  },
  "required": ["version"],
  "additionalProperties": false
}
from typing import Literal
from pydantic import BaseModel, ConfigDict

class Payload(BaseModel):
    model_config = ConfigDict(extra="forbid")

    version: Literal["v1"]
import { z } from "zod";

const payloadSchema = z
  .object({
    version: z.literal("v1"),
  })
  .strict();

Discriminator pattern

const is commonly used to tag branches in oneOf/anyOf schemas.
{
  "oneOf": [
    {
      "type": "object",
      "properties": {
        "action": { "const": "search" },
        "query": { "type": "string" }
      },
      "required": ["action", "query"],
      "additionalProperties": false
    },
    {
      "type": "object",
      "properties": {
        "action": { "const": "lookup" },
        "id": { "type": "integer" }
      },
      "required": ["action", "id"],
      "additionalProperties": false
    }
  ]
}
from typing import Annotated, Literal
from pydantic import BaseModel, ConfigDict, Field

class SearchAction(BaseModel):
    model_config = ConfigDict(extra="forbid")

    action: Literal["search"]
    query: str

class LookupAction(BaseModel):
    model_config = ConfigDict(extra="forbid")

    action: Literal["lookup"]
    id: int

Action = Annotated[SearchAction | LookupAction, Field(discriminator="action")]
import { z } from "zod";

const actionSchema = z.discriminatedUnion("action", [
  z
    .object({
      action: z.literal("search"),
      query: z.string(),
    })
    .strict(),
  z
    .object({
      action: z.literal("lookup"),
      id: z.number().int(),
    })
    .strict(),
]);