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
| Method | Path | Rate tier | Auth | Description |
|---|---|---|---|---|
GET | /v1/assets/:mint | expensive | none | Full normalized asset |
GET | /v1/assets/:mint/health | expensive | none | { assetId, health } only |
GET | /v1/assets/:mint/inspection | expensive | none | Token program, permissions, extensions, risk flags |
GET | /v1/assets/:mint/media | expensive | none | Media reliability / recovery state |
POST | /v1/assets/:mint/media/recover | expensive | none | Force media recovery |
GET | /v1/assets/:mint/snapshot | lightweight | none | Latest persisted snapshot (requires DB) |
GET | /v1/assets/:mint/snapshots | lightweight | none | Snapshot history list (requires DB) |
Query parameters
| Route | Parameter | Description |
|---|---|---|
| Asset resolution routes | refresh=true | Bypass cache and re-resolve |
/v1/assets/:mint/media | force=true | Bypass media cache and re-run recovery |
/v1/assets/:mint/snapshots | limit | Positive integer, capped at 100 (default from server) |
Success shapes
`GET /v1/assets/:mint`
{ "data": { /* NormalizedAsset — see response-models.md */ } }`GET /v1/assets/:mint/health`
{
"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`
{
"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):
{
"data": {
"mint": "...",
"snapshotHash": "...",
"schemaVersion": 1,
"createdAt": "2026-08-26T00:00:00.000Z",
"asset": { /* NormalizedAsset at snapshot time */ }
}
}**History** (GET /v1/assets/:mint/snapshots):
{
"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:
| Group | Fields | Purpose |
|---|---|---|
| Identity | id, assetType, standard, name, symbol, description | What the token represents |
| Collection | collection.address, collection.name, collection.verified, collection.nameSource? | Collection identity + provenance |
| Media | media.image, media.animation, media.status | Canonical metadata URIs |
| Metadata | metadata.uri, metadata.mutable, metadata.offchain | On-chain pointer + off-chain fetch status |
| Diagnostics | diagnostics.completeness, missingFields, warnings | Structural completeness (not a scam score) |
| Health | health.score, health.status, health.issues | Metadata reliability / completeness |
| Inspection | tokenProgram, permissions, extensions, risk.flags | Authority 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, optionalcollection.nameSource - **Control & permission metadata** —
permissions.*and relatedrisk.flags/ Token-2022extensions
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
| Status | Code | When |
|---|---|---|
| 400 | INVALID_ASSET_ID | Mint is not a valid base58 public key |
| 404 | ASSET_NOT_FOUND | Asset could not be resolved |
| 502 | UPSTREAM_ERROR | Provider failure |
| 504 | UPSTREAM_TIMEOUT | Provider timeout |
| 429 | RATE_LIMITED | Rate limit exceeded |
See [errors-and-rate-limits.md](./errors-and-rate-limits.md) for the full error catalog.