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

# GET /api/mpt/:mptId/resolve — Pointer Resolution Audit

> Walks the pointer chain from an MPT issuance ID to a unit valuation, reporting every step including failures, to audit whether collateral is transparent.

Use this endpoint to verify that a stranger holding nothing but an MPT issuance ID can independently reach a valuation. This route runs the complete resolution chain — read the `MPTokenIssuance`, decode its metadata, check XLS-89 conformance, locate the NAV pointer, substitute the token's own ID, and follow the URL — and reports every step, including failures. "This collateral is opaque" is a legitimate and useful answer to give a lender, and this route makes it explicit rather than throwing an exception.

## Parameters

<ParamField path="mptId" type="string" required>
  48-character hex MPT issuance ID. Case insensitive.
</ParamField>

<ParamField query="resolve" type="boolean">
  Whether to follow the pointer after finding it. Defaults to `true`. Pass `false` to inspect the metadata without making an outbound HTTP request.
</ParamField>

<ParamField query="units" type="string">
  Number of share units to value as a pledge (a count of token units, as a decimal string). When present and the pointer resolves successfully, the response includes a `pledge` block.
</ParamField>

This route sends `Cache-Control: public, max-age=4` and `Access-Control-Allow-Origin: *`.

## Request

```bash theme={null}
curl -s http://localhost:8787/api/mpt/000000014D667775372D5B78E07FFF294678C7F9CE82AFBC/resolve
```

## Response

```json theme={null}
{
  "serverTime": "2026-09-12T22:20:22Z",
  "ledgerIndex": 5263343,
  "issuanceId": "000000014D667775372D5B78E07FFF294678C7F9CE82AFBC",
  "issuer": "r3hE8HanpccSZdgmeHCfYFEkwxFjdDmmvt",
  "unitsOutstanding": "51000000",
  "resolved": true,
  "navUrl": "http://localhost:8787/api/mpt/000000014D667775372D5B78E07FFF294678C7F9CE82AFBC/nav",
  "steps": [
    {
      "step": "read MPTokenIssuance",
      "ok": true,
      "detail": "issuer r3hE8HanpccSZdgmeHCfYFEkwxFjdDmmvt, 51000000 units outstanding"
    },
    {
      "step": "decode metadata",
      "ok": true,
      "detail": "valid JSON"
    },
    {
      "step": "XLS-89 conformance",
      "ok": true,
      "detail": "asset_class rwa"
    },
    {
      "step": "find valuation pointer",
      "ok": true,
      "detail": "http://localhost:8787/api/mpt/000000014D667775372D5B78E07FFF294678C7F9CE82AFBC/nav"
    },
    {
      "step": "follow pointer",
      "ok": true,
      "detail": "unit value 0.803922"
    }
  ],
  "metadata": {
    "present": true,
    "meta": {
      "ticker": "ORMA-CSC3",
      "name": "Calder Structured Credit III",
      "asset_class": "rwa",
      "issuer_name": "Orma",
      "desc": "Redeemable claim on a closed-ended private credit facility. Valuation is net of recognised loss.",
      "orma": {
        "v": 1,
        "instrument": "vault-share",
        "nav_url": "http://localhost:8787/api/mpt/{mpt_issuance_id}/nav",
        "nav_url_param": "{mpt_issuance_id}",
        "nav_basis": "assets net of recognised loss, divided by units outstanding",
        "doc": "https://orma.credit/nav"
      }
    },
    "conformance": {
      "conformant": true,
      "missing": [],
      "assetClassValid": true,
      "assetClass": "rwa",
      "taxonomyNote": "No XLS-89 asset_class describes a yield-bearing pooled claim; rwa is the closest. See orma.instrument."
    }
  },
  "nav": { /* the full orma.nav/1 document — see GET /api/mpt/:mptId/nav for field reference */ }
}
```

## Response Fields

<ResponseField name="issuanceId" type="string">
  The 48-character hex MPT issuance ID that was resolved.
</ResponseField>

<ResponseField name="issuer" type="string">
  XRPL address of the `MPTokenIssuance` issuer.
</ResponseField>

<ResponseField name="unitsOutstanding" type="string">
  Total share units in circulation at the time of resolution (a count of token units).
</ResponseField>

<ResponseField name="resolved" type="boolean">
  `true` when every step succeeded and a `unitValue` was obtained. `false` when any step failed — the response still contains the steps that did run, and `nav` is `null`.
</ResponseField>

<ResponseField name="navUrl" type="string | null">
  The fully substituted URL that was or would be followed. `null` if the pointer was not found.
</ResponseField>

<ResponseField name="steps" type="array">
  Ordered list of resolution steps, each with its outcome.

  <Expandable title="step fields">
    <ResponseField name="step" type="string">
      Step name: `"read MPTokenIssuance"`, `"decode metadata"`, `"XLS-89 conformance"`, `"find valuation pointer"`, or `"follow pointer"`.
    </ResponseField>

    <ResponseField name="ok" type="boolean">
      Whether this step succeeded.
    </ResponseField>

    <ResponseField name="detail" type="string">
      Human-readable description of what was found or why the step failed.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="metadata" type="object">
  Decoded `MPTokenIssuance` metadata with XLS-89 conformance check.

  <Expandable title="metadata fields">
    <ResponseField name="present" type="boolean">
      Whether metadata was found on the issuance.
    </ResponseField>

    <ResponseField name="meta" type="object">
      The decoded metadata object verbatim. The `orma.nav_url` field is a template — it contains `{mpt_issuance_id}` as a placeholder. The token's own ID is substituted at resolve time, so one metadata blob is correct for every issuance that uses it.
    </ResponseField>

    <ResponseField name="conformance" type="object">
      XLS-89 asset token metadata conformance report.

      <Expandable title="conformance fields">
        <ResponseField name="conformant" type="boolean">
          Whether all required XLS-89 fields are present and valid.
        </ResponseField>

        <ResponseField name="missing" type="array">
          List of required fields that are absent.
        </ResponseField>

        <ResponseField name="assetClassValid" type="boolean">
          Whether the `asset_class` value is a recognised XLS-89 asset class.
        </ResponseField>

        <ResponseField name="assetClass" type="string">
          The `asset_class` value found in the metadata.
        </ResponseField>

        <ResponseField name="taxonomyNote" type="string">
          Note on XLS-89 taxonomy fit. No current asset class precisely describes a yield-bearing pooled claim; `rwa` is the closest available option.
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="nav" type="object | null">
  The full `orma.nav/1` document from the resolved pointer. `null` when `resolved` is `false` or when `resolve=false` was passed. See [`GET /api/mpt/:mptId/nav`](/api/mpt-nav) for the full field reference.
</ResponseField>

<ResponseField name="pledge" type="object | null">
  Present when `units` is supplied and the pointer resolved successfully. Same structure as the `pledge` block on [`GET /api/mpt/:mptId/nav`](/api/mpt-nav). All values are `null` if the document carries no `unitValue`, alongside an `unpriced` explanation.
</ResponseField>

<Tip>
  Two failure modes to know about. A pointer that answers HTTP 200 with a document carrying no `unitValue` is reported as `ok: false` on the `"follow pointer"` step with the detail `"answered, but the document carries no unitValue"` — not as a success. And when a pledge cannot be valued, the `pledge` block is returned with `null` values plus an `unpriced` explanation rather than failing the whole request. Both rules exist because an early version of the route resolved to this diagnostic instead of to the valuation, returned a valid 200 with no `unitValue`, and crashed the caller.
</Tip>

<Note>
  Following the pointer is bounded by a 2 500 ms `AbortController` timeout. It is a URL written by a third party into the `MPTokenIssuance` at creation — it is the only step in the entire API that leaves the ledger and makes an outbound network request. The timeout prevents a slow or unresponsive pointer from blocking the response indefinitely.
</Note>
