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.

Response models

Types below come from packages/normalizer and API route serializers. Do not assume fields are always non-null unless noted.

Envelope

Successful responses wrap payloads:

json
{ "data": { /* ... */ } }

Paginated list responses:

json
{ "data": [ /* ... */ ], "pagination": { "nextCursor": "...", "limit": 50 } }

NormalizedAsset

Full object returned by GET /v1/assets/:mint.

FieldTypeNotes
idstringMint address
assetTypeenumnft, programmable_nft, compressed_nft, fungible, semi_fungible, mpl_core, unknown
standardenummetaplex, token_2022, bubblegum, spl_token, mpl_core, unknown
namestring \null
symbolstring \null
descriptionstring \null
mediaobjectSee Media
attributesobject{ items: Attribute[], status }
collectionobjectEmbedded collection ref on the asset — see Collection identity
creatorsarray{ address, share, verified }
royaltiesobject{ basisPoints }
ownershipobject{ owner, snsDomains? }
metadataobjectOn-chain URI + off-chain resolution
diagnosticsobjectCompleteness signals
sourceobject{ provider, method? }
tokenProgramobjectInspection — includes mpl_core for Metaplex Core
permissionsobjectControl & permission metadata
extensionsarrayToken-2022 extensions
coreobject \null \omittedAdditive MPL Core plugin / control facts
riskobjectAuthority/configuration flags
healthobject \undefinedMetadata health (optional)

Ownership (`ownership`)

FieldTypeNotes
ownerstring \nullCurrent asset owner wallet address when known
snsDomainsstring[] \omittedWallet SNS domain display names (e.g. arcing.sns). Resolved via Bonfida's public HTTP API during asset enrichment. Empty or omitted when none are registered — never an error.

SNS names use the .sns TLD (formerly .sol). The dashboard also links owners to Magic Eden profile pages using the owner address; those links are UI-only and not part of this object.

Collection identity (`collection`)

Embedded collection reference on a resolved asset. This is **not** marketplace scraping and **not** scam analysis.

FieldTypeNotes
addressstring \nullCollection mint / grouping address when known
namestring \nullHuman-readable collection name when resolvable
verifiedboolean \nullOn-chain / DAS verification flag when known
nameSourcestring \null \omittedProvenance for name when available

**nameSource values** (provider-independent source class):

ValueMeaning
asset_groupingName came with the asset’s collection grouping (e.g. DAS collection metadata)
collection_metadataName from resolving the collection mint’s on-chain / DAS metadata
offchain_metadataName from the collection mint’s off-chain JSON
persisted_collectionName from an already-indexed collection record
unknownName present without a classified source

**Resolution order** when address is known and name is missing:

1. Existing grouping / DAS collection metadata on the asset

2. Persisted / cached collection identity (when available)

3. Nested resolution of the collection mint through the normal resolver stack (bounded depth)

4. Off-chain JSON for the collection mint

Nested collection resolution is **non-fatal** and depth-bounded (default depth 1). If enrichment fails, the asset still returns successfully with collection.address preserved and collection.name left null.

Media (`media`)

FieldTypeValues
imagestring \nullCanonical image URI from metadata
animationstring \nullAnimation URI
statusenumavailable, partial, missing, unknown

Metadata (`metadata`)

FieldTypeValues
uristring \nullOn-chain metadata URI
mutableboolean \nullUpdate authority can change metadata
offchain.statusenumresolved, missing_uri, failed, unsupported
offchain.resolvedUristring \nullFetched URI when resolved

Diagnostics (`diagnostics`)

FieldTypeValues
completenessenumcomplete, partial, minimal
missingFieldsstring[]Field names missing
warningsstring[]Resolver warning codes

Diagnostics describe structural completeness — **not** a scam or safety score.

Health (`health`)

FieldTypeNotes
scorenumber0–100 metadata reliability score
statusenumhealthy (90–100), warning (70–89), degraded (40–69), critical (0–39)
issuesarray{ code, severity, message, field? }
checksobject{ passed, warnings, failed }

Health measures metadata reliability, completeness, and accessibility — **not** fraud detection.

Issue codes include: NAME_MISSING, IMAGE_MISSING, OFFCHAIN_METADATA_FAILED, COLLECTION_UNVERIFIED, METADATA_MUTABLE, IMAGE_RECOVERED, and others defined in HEALTH_ISSUE_CODES.

Inspection

#### tokenProgram

FieldTypeValues
typeenumspl_token, token_2022, mpl_core, unknown
programIdstring \nullProgram public key

mpl_core uses program ID CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d. Classic SPL mint/freeze authorities do **not** apply to MPL Core assets — those permission fields remain null (UI may show “Not applicable”).

#### core (optional, MPL Core)

Additive control facts when the asset is Metaplex Core:

FieldType
updateAuthoritystring \null
collectionAddressstring \null
pluginsarray of { type, authority?, data?, permanent? }
permanentPluginsarray
delegatesarray of { address, role? }

MPL Core is classified (never unknown for program ID CoREENx…) via DAS interfaces (MplCoreAsset / MplCoreCollection / MplCoreGroup), account-owner detection, and available DAS plugin payloads. Helius getAsset requests showCollectionMetadata: true by default so collection names can arrive in grouping[].collection_metadata without a nested fetch; when the name is still missing, collection-identity enrichment may resolve the collection address non-fatally. This is **classification and control-fact awareness**, not a claim of complete on-chain Core plugin decoding beyond DAS.

#### permissions (Authority Intelligence / Control & Permission Metadata)

Technical on-chain control facts. Presence of an authority does **not** by itself mean an asset is unsafe.

FieldTypeTypical source
mintAuthoritystring \nullSPL / Token-2022 mint account
freezeAuthoritystring \nullSPL / Token-2022 mint account
updateAuthoritystring \nullMetaplex metadata / DAS authorities / Token-2022 token metadata
permanentDelegatestring \nullToken-2022 permanent delegate extension

**Null vs absent:** Fields are always present on NormalizedAsset. null means the authority is absent, revoked, or not determinable for this asset class (for example classic mint authorities on compressed NFTs). Empty strings are not used.

Compressed NFTs: classic mint/freeze authorities often do not apply the same way; values remain null when not determinable. Update authority may still be available from Metaplex/DAS metadata.

#### extensions

Array of { type: string, data?: object } for Token-2022 extensions (transfer hook, transfer fee, non-transferable, default account state, mint close authority, permanent delegate, token metadata, and others already decoded).

#### risk.flags

Array of { code, severity, message, field? }.

Flag codes (technical capabilities, not malicious/safe assertions):

  • MINT_AUTHORITY_ACTIVE
  • FREEZE_AUTHORITY_ACTIVE
  • PERMANENT_DELEGATE_ACTIVE
  • TRANSFER_HOOK_ACTIVE
  • TRANSFER_FEE_CONFIGURED
  • NON_TRANSFERABLE
  • DEFAULT_ACCOUNT_STATE_FROZEN
  • MINT_CLOSE_AUTHORITY_ACTIVE
  • UPDATE_AUTHORITY_PRESENT (informational only — normal for many NFTs)

AssetHealthResponse

GET /v1/assets/:mint/health:

json
{ "assetId": "...", "health": { /* MetadataHealth */ } }

AssetInspectionResponse

GET /v1/assets/:mint/inspection:

json
{
  "assetId": "...",
  "tokenProgram": { /* TokenProgram */ },
  "permissions": { /* Permissions */ },
  "extensions": [ /* TokenExtension */ ],
  "risk": { "flags": [ /* RiskFlag */ ] }
}

MediaReliabilityResponse

GET /v1/assets/:mint/media — see [media.md](./media.md).

Snapshot models

**Latest** — { mint, snapshotHash, schemaVersion, createdAt, asset }

**History item** — { snapshotHash, healthScore, healthStatus, createdAt }

CollectionEntity

See [collections.md](./collections.md).

CollectionHealthSummary

Aggregated health with separate standards (metadata) and tokenPrograms (on-chain) distributions.

Monitor & event models

See [monitoring.md](./monitoring.md).

HEALTH vs DIAGNOSTICS vs RISK

LayerQuestion it answers
**Health**How reliable and complete is the metadata?
**Diagnostics**Which fields are missing or warned during normalization?
**Risk / authority flags**Which on-chain controls are active?

These layers are intentionally separate. Good metadata can coexist with active freeze authority or transfer hooks.