Owlviz · API docs

Reliable asset data for Solana.

Base URL: https://solana-metadata-platform-production.up.railway.app

Try example mint or start with quick start.

Assets

Asset endpoints resolve a Solana mint (or Metaplex Core asset id) into a normalized model with metadata health, on-chain inspection, optional media reliability, and persisted snapshots.

Supported classification includes classic Metaplex NFTs, Token-2022, compressed NFTs, and **Metaplex Core (mpl_core)** when DAS/account ownership identifies program CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d. Core is not treated as SPL Token or Token-2022; classic mint/freeze authorities stay null (UI: “Not applicable”). See response-models.md for the additive core field and support boundaries.

Base URL: https://solana-metadata-platform-production.up.railway.app

All asset routes are **public** (no API key). Invalid mint addresses return **400** INVALID_ASSET_ID.

Endpoints

MethodPathRate tierAuthDescription
GET/v1/assets/:mintexpensivenoneFull normalized asset
GET/v1/assets/:mint/healthexpensivenone{ assetId, health } only
GET/v1/assets/:mint/inspectionexpensivenoneToken program, permissions, extensions, risk flags
GET/v1/assets/:mint/mediaexpensivenoneMedia reliability / recovery state
POST/v1/assets/:mint/media/recoverexpensivenoneForce media recovery
GET/v1/assets/:mint/snapshotlightweightnoneLatest persisted snapshot (requires DB)
GET/v1/assets/:mint/snapshotslightweightnoneSnapshot history list (requires DB)

Query parameters

RouteParameterDescription
Asset resolution routesrefresh=trueBypass cache and re-resolve
/v1/assets/:mint/mediaforce=trueBypass media cache and re-run recovery
/v1/assets/:mint/snapshotslimitPositive integer, capped at 100 (default from server)

Success shapes

`GET /v1/assets/:mint`

json
{ "data": { /* NormalizedAsset — see response-models.md */ } }

`GET /v1/assets/:mint/health`

json
{
  "data": {
    "assetId": "<mint>",
    "health": {
      "score": 74,
      "status": "warning",
      "issues": [],
      "checks": { "passed": 0, "warnings": 0, "failed": 0 }
    }
  }
}

health may be absent on partial resolution paths; treat missing health as unknown rather than healthy.

`GET /v1/assets/:mint/inspection`

json
{
  "data": {
    "assetId": "<mint>",
    "tokenProgram": { "type": "spl_token", "programId": "..." },
    "permissions": {
      "mintAuthority": null,
      "freezeAuthority": null,
      "updateAuthority": "...",
      "permanentDelegate": null
    },
    "extensions": [],
    "risk": { "flags": [] }
  }
}

Snapshots

**Latest snapshot** (GET /v1/assets/:mint/snapshot):

json
{
  "data": {
    "mint": "...",
    "snapshotHash": "...",
    "schemaVersion": 1,
    "createdAt": "2026-08-26T00:00:00.000Z",
    "asset": { /* NormalizedAsset at snapshot time */ }
  }
}

**History** (GET /v1/assets/:mint/snapshots):

json
{
  "data": [
    {
      "snapshotHash": "...",
      "healthScore": 74,
      "healthStatus": "warning",
      "createdAt": "2026-08-26T00:00:00.000Z"
    }
  ]
}

Snapshot routes require persistence (DATABASE_URL). When unavailable: **503** PERSISTENCE_UNAVAILABLE. When no snapshot exists: **404** SNAPSHOT_NOT_FOUND.

Normalized asset model (summary)

See [response-models.md](./response-models.md) for every field. Key groupings:

GroupFieldsPurpose
Identityid, assetType, standard, name, symbol, descriptionWhat the token represents
Collectioncollection.address, collection.name, collection.verified, collection.nameSource?Collection identity + provenance
Mediamedia.image, media.animation, media.statusCanonical metadata URIs
Metadatametadata.uri, metadata.mutable, metadata.offchainOn-chain pointer + off-chain fetch status
Diagnosticsdiagnostics.completeness, missingFields, warningsStructural completeness (not a scam score)
Healthhealth.score, health.status, health.issuesMetadata reliability / completeness
InspectiontokenProgram, permissions, extensions, risk.flagsAuthority Intelligence / control metadata

Completeness and media status

From source enums:

  • **Completeness**: complete, partial, minimal
  • **Media status**: available, partial, missing, unknown
  • **Off-chain status**: resolved, missing_uri, failed, unsupported

Health vs diagnostics vs risk

  • **Health** measures metadata reliability, completeness, and accessibility — not fraud or investment safety.
  • **Diagnostics** describe missing fields and resolver warnings during normalization.
  • **Risk flags** describe active on-chain capabilities (mint authority, freeze authority, transfer hooks, etc.). They do **not** assert malicious or safe intent.

Collection identity & Authority Intelligence

GET /v1/assets/:mint embeds:

  • **Collection identity** — collection.address, collection.name, collection.verified, optional collection.nameSource
  • **Control & permission metadata** — permissions.* and related risk.flags / Token-2022 extensions

Collection names are resolved from supported on-chain and canonical metadata sources (grouping metadata, collection mint metadata, off-chain JSON, or indexed collection records). Marketplace explorers are not runtime dependencies.

Authority fields report discoverable technical facts only. DAS scopes: ["full"] maps to update/control authority for Metaplex NFT / MPL Core / compressed assets — it does **not** invent classic SPL mint/freeze/permanent-delegate values. Those come from mint account inspection or Token-2022 extensions. MPL Core assets use tokenProgram.type = mpl_core with program id CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d; classic mint/freeze fields are not applicable.

Enrichment is selective: complete program/authority/collection fields skip redundant upstream calls. See [response-models.md](./response-models.md) for field semantics, null handling, and Token-2022 differences.

Media reliability

Canonical metadata image URIs are never rewritten. When the canonical URI is unhealthy or awkward for browsers (for example some Irys gateway paths), media recovery may try:

1. Canonical URI

2. Alternate gateways (IPFS / Arweave / Irys uploader)

3. DAS-supplied alternate URIs (files[].cdn_uri) captured as media.alternateUris

4. Helius CDN image proxy for absolute http(s) sources

5. Fingerprint + preserve successful bytes to R2

bestAvailableUri / preserved R2 URLs are display/reliability aids. Provenance of the original URI remains in canonicalUri / media.image.

Common errors

StatusCodeWhen
400INVALID_ASSET_IDMint is not a valid base58 public key
404ASSET_NOT_FOUNDAsset could not be resolved
502UPSTREAM_ERRORProvider failure
504UPSTREAM_TIMEOUTProvider timeout
429RATE_LIMITEDRate limit exceeded

See [errors-and-rate-limits.md](./errors-and-rate-limits.md) for the full error catalog.