---
title: "Published Records"
description: "GET /records/{originalImageHash} and POST /records: recover an image's manifests and its verification material, singly or for a list of hashes."
published: 2026-09-23T10:54:54.953415+00:00
updated: 2026-09-23T10:54:54.953415+00:00
tags: ["api", "parallax", "reference", "rest"]
url: https://xiobjects.com/docs/xio/parallax/rest-api/reference/records
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.5755083\u002B00:00",
  "encoding": "utf-8",
  "render_intent": "markdown",
  "title": "Published Records",
  "slug": "xio/parallax/rest-api/reference/records",
  "copyright": "\u00A9 2026 XI Objects Inc"
}
-->

# Published Records

## GET /records/{originalImageHash}

Recovers one image's published record: the manifests it was registered with, and the material to verify that record.

**Any token holder may call this for any original image hash, whoever registered the image.** No match is needed and no ownership is checked. The answer names no account and no registration.

`{originalImageHash}` is a 64-character lowercase hex hash, as `matchedOriginalImageHashes` on a look-up gives it, or as `originalImageHash` on your own registration response gives it.

```bash
curl -sS "$BASE/records/$HASH" -H "Authorization: Bearer $TOKEN"
```

**Response: 200 OK**

The [published record](#published-record) shape, for the one hash asked for.

```json
{
  "originalImageHash": "9f2c7a41e6b8d0532c1f4a9b7e0d8c6a53f1b2e4d7c0a9f8b6e3d1c4a7f0b2e5",
  "outcome": "published",
  "manifests": [
    { "type": "xi-manifest", "form": "json", "payload": { "creator": "Ada Lovelace", "licence": "CC-BY-4.0" }, "hash": "7c91...4e2a", "signature": "3Fq1..." },
    { "type": "c2pa", "form": "jumbf", "payload": "AAAAIWp1bWIAAAAZanVtZGMycGEAEQAQgAAAqgA4m3EA", "hash": "2a00...4580", "signature": "9Kd7..." }
  ],
  "verification": {
    "contentHash": "3b1f...",
    "hashAlgorithm": "BLAKE3-256",
    "signedAtUtc": "2026-09-22T09:14:03.771Z",
    "signature": "MEUCIQ...",
    "signatureAlgorithm": "Ed25519",
    "publicKey": "MCowBQ...",
    "leafCertificate": "-----BEGIN CERTIFICATE-----\n...",
    "certificateChain": ["-----BEGIN CERTIFICATE-----\n..."],
    "leafCertificateThumbprint": "A1B2C3...",
    "trustContext": "xio",
    "trustVersion": 1,
    "canonicalVersion": 2,
    "collectionSignature": "Wp3x..."
  }
}
```

`noRecordAnswered` and `takenDown` are `200`s too, carrying the outcome with `manifests` and `verification` both `null`. `noRecordAnswered` means either that nothing was ever published for that hash or that the record store would not answer for it, and the two are not distinguishable. There is no `404` on this route.

Costs one look-up when the outcome is `published` or `takenDown`. Costs nothing otherwise.

**Statuses:**

| Status | Title | Meaning |
|--------|-------|---------|
| 400 | `Invalid declared hash` | The path hash is not 64 lowercase hex characters. Nothing read, nothing charged |
| 422 | `Image could not be checked` | The engine refused this hash. Nothing charged |
| 429 | `Quota exceeded` | Carries both remaining counts. No engine call was made |
| 503 | `Image could not be checked yet` | The engine could not answer for this hash yet. Nothing charged. `Retry-After` names the seconds to wait |
| 503 | `Engine not configured` | No engine is wired |

See [Recover an image's attribution](/docs/xio/parallax/rest-api/records).

---

## POST /records

Recovers the published records for a list of original image hashes. One result per hash, in the order asked.

**Request body:**

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `originalImageHashes` | `array` | Yes | The hashes to read. At least one, and no more than the deployment's cap. |

```bash
curl -sS -X POST "$BASE/records" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"originalImageHashes":["9f2c7a...b2e5","0000...beef"]}'
```

**Response: 200 OK**

| Field | Type | Description |
|-------|------|-------------|
| `records` | `array` | One [published record](#published-record) per hash asked, in the order asked. |

```json
{
  "records": [
    {
      "originalImageHash": "9f2c7a...b2e5",
      "outcome": "published",
      "manifests": [
        { "type": "xi-manifest", "form": "json", "payload": { "creator": "Ada Lovelace" } }
      ],
      "verification": { "contentHash": "3b1f...", "signatureAlgorithm": "Ed25519" },
      "failureReason": null
    },
    {
      "originalImageHash": "0000...beef",
      "outcome": "noRecordAnswered",
      "manifests": null,
      "verification": null,
      "failureReason": null
    }
  ]
}
```

A hash that is not 64 lowercase hex characters is answered `refused` in its own position and is never sent to the engine. A hash the engine refused is answered `refused` or `retry` with a `failureReason`. One hash's refusal never costs its siblings their answers.

Reserves one look-up for every hash it will send, all or nothing, before any engine call. Charges only the hashes answered `published` or `takenDown`.

**Statuses:**

| Status | Title | Meaning |
|--------|-------|---------|
| 400 | `Malformed request` | The body names no hash at all |
| 400 | `Too many declared hashes` | The list is longer than the configured cap. Nothing read, nothing charged |
| 429 | `Quota exceeded` | Your grant does not cover every hash asked. Carries both remaining counts. No engine call was made |
| 503 | `Engine not configured` | No engine is wired |

See [Recover an image's attribution](/docs/xio/parallax/rest-api/records).

---
<!-- xion:trust
{
  "v": 1,
  "canon_v": 1,
  "ctx": "xiobjects.com/content",
  "hash_blake3_hex": "015ac978d8c386e2c4866d4b286bc75555f404d79a7b86d6f00195c5201cb214",
  "hash_sha256_hex": null,
  "sig_alg": "ed25519",
  "sig_b64": "Exz65UsYsQ5WA52GyD0TcZu7ak_27BAGWxMRYk7gU2aeyKqWkMjirE0z83kPnbWlBXVRSw9YUr8TWNhj4PO4Ag",
  "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"
}
-->