---
title: "Shared Shapes"
description: "The shapes several endpoints share: the manifest, the published record, the upload outcome, the slot entry and the progress report."
published: 2026-09-23T10:54:45.902692+00:00
updated: 2026-09-23T10:54:45.902692+00:00
tags: ["api", "parallax", "reference", "rest"]
url: https://xiobjects.com/docs/xio/parallax/rest-api/reference/shapes
source: XI Objects
---

<!-- xion:doctype xion+markdown -->
<!-- xion:metadata
{
  "version": "1.0",
  "content_type": "application/xion\u002Bmarkdown",
  "source_type": "xi-content/doc",
  "generator": "xio-content-publisher/1.0.0",
  "generated": "2026-09-23T10:54:37.8736294\u002B00:00",
  "encoding": "utf-8",
  "render_intent": "markdown",
  "title": "Shared Shapes",
  "slug": "xio/parallax/rest-api/reference/shapes",
  "copyright": "\u00A9 2026 XI Objects Inc"
}
-->

# Shared Shapes

These shapes appear in more than one endpoint of the [REST API Reference](/docs/xio/parallax/rest-api/reference).

### Manifest

Returned wherever manifests come back, which is `/records` and nowhere else.

| Field | Type | Description |
|-------|------|-------------|
| `type` | `string` | The kind exactly as stated on the multipart part name. |
| `form` | `string` | `json` or `jumbf`. |
| `payload` | `object` or `string` | The posted bytes. Inline JSON when `form` is `json`, base64 when `form` is `jumbf`. |
| `hash` | `string?` | BLAKE3-256 over this manifest's STORED bytes, lowercase hex. `null` on a record published before manifest signing. |
| `signature` | `string?` | Base64 Ed25519 signature by the registrant's leaf key over this manifest's canonical bytes. `null` on a record published before manifest signing. |

### Published record

Returned by `GET /records/{originalImageHash}` and inside `POST /records`.

| Field | Type | Description |
|-------|------|-------------|
| `originalImageHash` | `string` | The hash asked for, echoed back. |
| `outcome` | `string` | `published`, `noRecordAnswered`, `takenDown`, `refused` or `retry`. |
| `manifests` | `array` | Manifests as registered, each with the record's own hash and signature over it. Present only when `published`. |
| `verification` | `object` | The material to verify the record. Present only when `published`. |
| `failureReason` | `string` | Why this hash was refused. Present only when `refused` or `retry`. |

The verification object:

| Field | Type | Description |
|-------|------|-------------|
| `contentHash` | `string` | The hash the record's own signature was taken over. |
| `hashAlgorithm` | `string` | The algorithm that produced it. |
| `signedAtUtc` | `datetime` | When the record was signed. |
| `signature` | `string` | Base64 Ed25519 signature by the registrant's leaf key over `contentHash` hex-decoded. |
| `signatureAlgorithm` | `string` | The signature algorithm, for every signature on the record. |
| `publicKey` | `string` | Base64 public key every signature on the record verifies against. |
| `leafCertificate` | `string` | The signing leaf certificate, PEM. |
| `certificateChain` | `array` | The leaf's issuing chain, PEM, in chain order. |
| `leafCertificateThumbprint` | `string` | The leaf certificate's thumbprint. |
| `trustContext` | `string` | The trust context the leaf was issued under. |
| `trustVersion` | `int` | The trust context's version. |
| `canonicalVersion` | `int` | The canonicalisation version the manifest and collection signatures were taken under. |
| `collectionSignature` | `string?` | Base64 Ed25519 signature over the record's ordered manifest set. `null` on a record that declares none. |

A record carries two kinds of attestation, both by the same leaf key and both verified against `publicKey`.

**The image.** Verify `signature` from `contentHash`, `signature` and `publicKey` alone. `trustContext` and `trustVersion` are metadata, not inputs. Verifying it proves that this key attested this image. It does not cover the manifests.

**The manifests.** Each manifest's `signature` is over `canonicalVersion` as one byte, then `contentHash` hex-decoded, then the manifest's `type` as UTF-8, then its `hash` hex-decoded — each of the three with a uint16 big-endian length in front of it. `collectionSignature` is over the version byte, the length-prefixed content hash, a uint16 count, and each manifest's length-prefixed kind and hash in returned order; it proves the set's membership and order. `hash` is a BLAKE3-256 over the manifest's STORED bytes, which are what a `jumbf` payload returns byte for byte and are NOT what a `json` payload returns — a JSON-native kind is projected back from the stored JUMBF, so its hash is not recomputable from the answer. A record published before manifest signing returns `null` for all three and states a lower `canonicalVersion`.

The leaf certificate's subject is the service's own metadata, identical for every registrant's certificate, so it identifies nobody. See [Recover an image's attribution](/docs/xio/parallax/rest-api/records) for how to check each one.

### Upload outcome

One per image part, in request order. Answered by `POST /slots/{slotId}/uploads` and `POST /lookup/slots/{lookupSlotId}/queries`.

| Field | Type | Description |
|-------|------|-------------|
| `partIndex` | `int` | 1-based position among the image parts in the request. |
| `fileName` | `string?` | The filename declared on the part, if any. |
| `accepted` | `bool` | Whether the slot now holds this image. |
| `imageHash` | `string?` | SHA-256 of the accepted bytes, lowercase hex. Always `null` on a rejection. |
| `rejectionReason` | `string?` | A fixed sentence. `null` when accepted. |
| `registrationRemaining` | `int?` | Remaining registration grant. Carried only on a quota rejection. |
| `lookupRemaining` | `int?` | Remaining look-up grant. Carried only on a quota rejection. |
| `registrationId` | `uuid?` | The already-registered registration, when it is yours. Never populated on a look-up slot. |

### Slot entry

One per entry. Answered by both manifest report routes and by the manifest replace route.

| Field | Type | Description |
|-------|------|-------------|
| `imageHash` | `string` | SHA-256 of the entry's bytes, lowercase hex. |
| `manifestsHash` | `string?` | Digest of the stored manifest list. `null` when the entry carries none. |
| `byteLength` | `long` | The image's byte length. |
| `contentType` | `string?` | The content type the part declared. |
| `createdAt` | `datetime` | When the entry was first recorded. |
| `state` | `string` | `held`, `registered`, `answered`, `failed`, `errata` or `retry`. |
| `notRegisteredReason` | `string?` | Why an `errata` entry will never be registered. `null` otherwise. |

No manifest body and no image byte is ever returned here.

### Progress

Answered by both progress routes.

| Field | Type | Description |
|-------|------|-------------|
| `slotId` | `string` | The slot's id. |
| `status` | `string` | `open` or `committed`. |
| `counts.total` | `int` | Entries on the slot. |
| `counts.held` | `int` | Entries not yet committed. |
| `counts.registered` | `int` | Entries registered. Registration slots only. |
| `counts.answered` | `int` | Queries that reached a verdict. Look-up slots only. |
| `counts.failed` | `int` | Entries that could not be committed. |
| `counts.errata` | `int` | Entries that will never be registered. Registration slots only. |
| `entries[].imageHash` | `string` | The entry's hash. |
| `entries[].state` | `string` | `held`, `registered`, `answered`, `failed`, `errata` or `retry`. |
| `entries[].registrationId` | `uuid?` | The registration this entry points at, when it has one. |
| `entries[].failureReason` | `string?` | Why the entry failed, or why an errata will not register. |

---
<!-- xion:trust
{
  "v": 1,
  "canon_v": 1,
  "ctx": "xiobjects.com/content",
  "hash_blake3_hex": "bcd58c491fa0320dd4557c576e72d7f7f141b753a6446340f2880694c91fbcc4",
  "hash_sha256_hex": null,
  "sig_alg": "ed25519",
  "sig_b64": "A0vMWfFXRbrLhTig_9R-fSk0jWG1thORMw4fAxWjgEyVMMAV_rchsqQOCfy2d1SyajpCC-ie-3e3oFFXxR0VAA",
  "pubkey_b64": "qvdEfSxeAWQCSmFhYZ6YX5kI935su0PASlrB7Yi2nJ8",
  "x509_chain_pem": [
    "-----BEGIN CERTIFICATE-----\r\nMIIB9TCCAaegAwIBAgIRAMAcad\u002BzF5t\u002B/s4nONSc6aAwBQYDK2VwMC4xLDAqBgNV\r\nBAMMI1hJIE9iamVjdHMgSW5jIENvbnRyb2wgSW50ZXJtZWRpYXRlMB4XDTI2MDky\r\nMzA0MTAzMFoXDTI2MTAyMzA0MTAzMFowSzEeMBwGA1UEAwwVeGlvLWNvbnRlbnQt\r\ncHVibGlzaGVyMRcwFQYDVQQKDA5YSSBPYmplY3RzIEluYzEQMA4GA1UECwwHQ29u\r\ndGVudDAqMAUGAytlcAMhAKr3RH0sXgFkAkphYWGemF\u002BZCPd\u002BbLtDwEpawe2Itpyf\r\no4G8MIG5MAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoG\r\nCCsGAQUFBwMkMGUGA1UdIwReMFyAFDspt5hZsP6rNX4Cq7owpMYa05OyoS6kLDAq\r\nMSgwJgYDVQQDDB9JbnN0aXR1dGUgb2YgUHJvdmVuYW5jZSBSb290IENBghRSYDf4\r\nsUJ\u002B9h\u002Bod0\u002BZRK/X/JSUBTAdBgNVHQ4EFgQUg7Gut2vWupuiLVcKgZt1GwdYmggw\r\nBQYDK2VwA0EA1cI0DTLhDQyTflrGrMlnMT/3Iw2c1OXVYphjr0uXnCmX1Dt5sNYT\r\niTgydyG3BPQqqiZ253V1ltTxT68ZA2gNAg==\r\n-----END CERTIFICATE-----\r\n",
    "-----BEGIN CERTIFICATE-----\r\nMIIByDCCAXqgAwIBAgIUUmA3\u002BLFCfvYfqHdPmUSv1/yUlAUwBQYDK2VwMCoxKDAm\r\nBgNVBAMMH0luc3RpdHV0ZSBvZiBQcm92ZW5hbmNlIFJvb3QgQ0EwHhcNMjUxMTAy\r\nMDMxNzEyWhcNMzAxMTAxMDMxNzEyWjAuMSwwKgYDVQQDDCNYSSBPYmplY3RzIElu\r\nYyBDb250cm9sIEludGVybWVkaWF0ZTAqMAUGAytlcAMhAFSS/pggSRmTcAMko7uc\r\nATH8OHgxVymd5mBFlPXbJkgio4GtMIGqMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYD\r\nVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQ7KbeYWbD\u002BqzV\u002BAqu6MKTGGtOTsjBlBgNV\r\nHSMEXjBcgBQAZRTDswSVORu\u002BkUOKX6WvrOvmQKEupCwwKjEoMCYGA1UEAwwfSW5z\r\ndGl0dXRlIG9mIFByb3ZlbmFuY2UgUm9vdCBDQYIUJqoJlpiSFg\u002B7W5IJLMrLttgR\r\nQp4wBQYDK2VwA0EA5FOht7YOsVRPp/FOKMQ\u002B3Mo9JxrvGR3ylKWAWNm6OUV7N3DB\r\nI9cD62wU5I0d0EKDBy0CX9DnoqUyxv5yguraAA==\r\n-----END CERTIFICATE-----\r\n",
    "-----BEGIN CERTIFICATE-----\r\nMIIBaTCCARugAwIBAgIUJqoJlpiSFg\u002B7W5IJLMrLttgRQp4wBQYDK2VwMCoxKDAm\r\nBgNVBAMMH0luc3RpdHV0ZSBvZiBQcm92ZW5hbmNlIFJvb3QgQ0EwHhcNMjUxMTAy\r\nMDMwNTEyWhcNMzUxMDMxMDMwNTEyWjAqMSgwJgYDVQQDDB9JbnN0aXR1dGUgb2Yg\r\nUHJvdmVuYW5jZSBSb290IENBMCowBQYDK2VwAyEAEWNZl\u002Br3IC7\u002BgBh90Yo1kWk1\r\npZCVzVuFdFT7qBBU8W2jUzBRMB0GA1UdDgQWBBQAZRTDswSVORu\u002BkUOKX6WvrOvm\r\nQDAfBgNVHSMEGDAWgBQAZRTDswSVORu\u002BkUOKX6WvrOvmQDAPBgNVHRMBAf8EBTAD\r\nAQH/MAUGAytlcANBAO6QeydOFNrN75qNyftggYudsxMyl4w9qWkSdZ6hlhrRcbSr\r\niG9Si0kbrIJOwYB/LTBU0RM4Rl\u002Bo9PM3Qp0mPwo=\r\n-----END CERTIFICATE-----\r\n"
  ],
  "key_id": "i1xUjBgnfprOkR49BjDnH_u3g5aYtfteENcAGMjJGlA",
  "created_at": "2026-09-23T10:54:37Z"
}
-->