{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://docs.externa.example/client-types/schema.json",
  "title": "Externa Public CMS API — item & file write payloads",
  "description": "JSON Schema for create/update item bodies and file metadata updates. Field values inside item `data` are collection-specific (additionalProperties).",
  "$defs": {
    "M2mJunctionValue": {
      "type": "object",
      "required": ["related_item_id"],
      "additionalProperties": false,
      "properties": {
        "related_item_id": { "type": "integer" },
        "meta": {
          "type": "object",
          "additionalProperties": true
        }
      }
    },
    "ItemData": {
      "type": "object",
      "description": "Keys must be known field names for the target collection. Values depend on field type (text, select, file id, M2M junction objects, blocks, …).",
      "additionalProperties": true
    },
    "CreateCollectionItemRequest": {
      "type": "object",
      "required": ["data"],
      "additionalProperties": false,
      "properties": {
        "data": { "$ref": "#/$defs/ItemData" }
      }
    },
    "UpdateCollectionItemRequest": {
      "type": "object",
      "required": ["data"],
      "additionalProperties": false,
      "properties": {
        "data": { "$ref": "#/$defs/ItemData" }
      }
    },
    "UpdateFileRequest": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "title": { "type": ["string", "null"], "maxLength": 255 },
        "description": { "type": ["string", "null"], "maxLength": 5000 },
        "location": { "type": ["string", "null"], "maxLength": 255 },
        "download_name": { "type": ["string", "null"], "maxLength": 255 },
        "focal_point_x": {
          "type": ["number", "null"],
          "minimum": 0,
          "maximum": 1
        },
        "focal_point_y": {
          "type": ["number", "null"],
          "minimum": 0,
          "maximum": 1
        },
        "name": { "type": "string", "maxLength": 255 }
      }
    },
    "PaginationMeta": {
      "type": "object",
      "required": ["current_page", "last_page", "per_page", "total"],
      "additionalProperties": false,
      "properties": {
        "current_page": { "type": "integer" },
        "last_page": { "type": "integer" },
        "per_page": { "type": "integer" },
        "total": { "type": "integer" }
      }
    },
    "MiniUser": {
      "type": "object",
      "required": ["id", "name", "email"],
      "additionalProperties": false,
      "properties": {
        "id": { "type": "integer" },
        "name": { "type": "string" },
        "email": { "type": ["string", "null"] }
      }
    },
    "CollectionItemResource": {
      "type": "object",
      "required": [
        "id",
        "collection_id",
        "data",
        "created_at",
        "updated_at",
        "user_created_id",
        "user_updated_id",
        "user_created",
        "user_updated"
      ],
      "additionalProperties": false,
      "properties": {
        "id": { "type": "integer" },
        "collection_id": { "type": "integer" },
        "data": { "$ref": "#/$defs/ItemData" },
        "created_at": { "type": ["string", "null"], "format": "date-time" },
        "updated_at": { "type": ["string", "null"], "format": "date-time" },
        "user_created_id": { "type": ["integer", "null"] },
        "user_updated_id": { "type": ["integer", "null"] },
        "user_created": {
          "oneOf": [{ "$ref": "#/$defs/MiniUser" }, { "type": "null" }]
        },
        "user_updated": {
          "oneOf": [{ "$ref": "#/$defs/MiniUser" }, { "type": "null" }]
        }
      }
    },
    "FileResource": {
      "type": "object",
      "required": [
        "id",
        "parent_id",
        "type",
        "access",
        "filename",
        "title",
        "description",
        "mime_type",
        "extension",
        "filesize",
        "width",
        "height",
        "focal_point_x",
        "focal_point_y",
        "url",
        "transforms",
        "created_at",
        "updated_at"
      ],
      "additionalProperties": false,
      "properties": {
        "id": { "type": "integer" },
        "parent_id": { "type": ["integer", "null"] },
        "type": { "type": "string", "enum": ["file", "folder"] },
        "access": { "type": "string", "enum": ["public", "private"] },
        "filename": { "type": "string" },
        "title": { "type": ["string", "null"] },
        "description": { "type": ["string", "null"] },
        "mime_type": { "type": ["string", "null"] },
        "extension": { "type": ["string", "null"] },
        "filesize": { "type": ["integer", "null"] },
        "width": { "type": ["integer", "null"] },
        "height": { "type": ["integer", "null"] },
        "focal_point_x": { "type": ["number", "null"] },
        "focal_point_y": { "type": ["number", "null"] },
        "url": { "type": ["string", "null"] },
        "transforms": {
          "type": "object",
          "additionalProperties": { "type": "string" }
        },
        "created_at": { "type": ["string", "null"], "format": "date-time" },
        "updated_at": { "type": ["string", "null"], "format": "date-time" }
      }
    },
    "ApiErrorEnvelope": {
      "type": "object",
      "required": ["message"],
      "additionalProperties": false,
      "properties": {
        "message": { "type": "string" },
        "errors": {
          "type": "object",
          "additionalProperties": {
            "type": "array",
            "items": { "type": "string" }
          }
        }
      }
    }
  },
  "oneOf": [
    { "$ref": "#/$defs/CreateCollectionItemRequest" },
    { "$ref": "#/$defs/UpdateCollectionItemRequest" },
    { "$ref": "#/$defs/UpdateFileRequest" }
  ]
}
