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

# Schema and limits

> The allowlisted field types, every protocol bound, and how schema drift is detected and handled.

Everything in the Custom Publishing API protocol is allowlisted and bounded. A manifest that exceeds any limit is rejected at discovery time with a clear validation error — nothing is partially accepted. Text beyond its bound, an unreadable option, a status word outside its alphabet and a flag that is not `true` or `false` are limit violations too.

## Allowed field types

| Type | Value shape |
| - | - |
| `string` | Short single-line text |
| `text` | Long-form text |
| `html` | Sanitized semantic HTML fragment |
| `number` | Numeric value |
| `boolean` | `true` or `false` |
| `date` | Calendar date |
| `url` | Absolute URL |
| `array<string>` | List of strings |

Any other `type` value fails validation.

## Limits a field can declare

A field may declare `constraints` that Weelkit enforces before it sends a value. The allowed limits depend on the type:

| Type | Limits |
| - | - |
| `string`, `text`, `url` | `minLength`, `maxLength` |
| `number` | `minimum`, `maximum` |
| `array<string>` | `minItems`, `maxItems` |
| `html`, `boolean`, `date` | none |

Declaring a limit the type does not support, or a lower limit above its upper limit, rejects the manifest.

## Limits

| Bound | Limit |
| - | - |
| Manifest size | 256 KB |
| JSON nesting depth | 8 levels |
| Content types | 20 per manifest |
| Fields | 100 per content type |
| Field path | Dot-separated identifiers, at most 3 segments, at most 200 characters total |
| Label | 120 characters |
| Description | 500 characters (control characters stripped) |
| Options | 50 per field; each label and value at most 200 characters; no repeated value |
| Declared limits | Lengths and item counts are whole numbers up to 10,000,000 |
| Status words (`statuses`) | 1 to 32 letters, digits, `-`, `_` or `.`; the draft and published words must differ |
| Item ids (`remoteId`) | At most 256 characters from letters, digits, `-`, `_`, `.` and `:` |
| Identifiers (destination id, content type id, option-bearing ids) | 128 characters |
| Endpoint paths | 512 characters |
| Response bodies | Bounded; 2 MB transport cap on any response Weelkit reads |

## Network boundaries

* **Redirects are never followed** — not during discovery, publishing, or readback.
* **Private, loopback, link-local, and cloud-metadata hosts are rejected** at connect time. A Custom API destination must resolve to a publicly routable address.
* **The base URL uses HTTPS on the standard port 443**, with no credentials, query string or fragment.
* Weelkit applies a **DNS-rebinding defense at connect time**, so a hostname cannot pass validation with a public address and later resolve to a private one for the actual requests.

## Schema fingerprint and drift

At discovery, Weelkit computes a schema fingerprint of the form `custom-api.v2.<32 hex>` (for example `custom-api.v2.0123456789abcdef0123456789abcdef`) over the manifest's **normalized structure**. Field labels and descriptions are excluded: renaming a field label never counts as a schema change, while adding, removing, or retyping a field, or changing a declared limit, always does.

Weelkit reads your manifest whenever it talks to your API, including the background status checks. A schema change takes effect in the mapping only when an administrator chooses **Refresh destination fields**.

When a refresh produces a changed fingerprint, that is **schema drift**:

**1. Publishing pauses**

New dispatches to the destination stop until the drift is resolved.

**2. Mapping review required**

An administrator reviews the saved mapping against the new schema and saves it again, then chooses **Verify test draft**. Publishing resumes after verification succeeds.

> [!NOTE]
>
> In-progress generations and persisted contracts **never silently change**. An article being generated when drift is detected finishes against the contract it started with, and already-persisted article versions keep the contract they were generated under.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.