SettleMint
Feeds

Price feeds

Read the on-chain price-feed registry through DALP. List registered feeds, read one feed, resolve a feed for a subject and topic, and inspect latest value, historical rounds, and staleness.

A bank that values tokenized assets needs to know which price feed backs each asset, what the feed last reported, and whether that value is fresh enough to act on. The price-feed registry answers those questions. It tracks every feed registered for the system, the subject and topic each feed prices, and the latest signed value the feed produced.

The read endpoints under /api/v2/system/feeds return DALP response envelopes and use the shared collection query format for lists. Feed registration, replacement, and value submission are governance operations outside the scope of this reference.

For fiat currency pair rates such as EUR / USD, use the exchange rates API, which resolves one rate per pair on top of these feeds.

Endpoints

JobMethod and pathUse it forResponse shape
List feedsGET /api/v2/system/feedsDiscover registered feeds with their subject, topic, decimals, scope, and latest value.Collection envelope with data, meta, and links.
Read one feedGET /api/v2/system/feeds/{feedAddress}Read full details for one feed by its contract address.Single-resource envelope with data and links.self.
Read feed configurationGET /api/v2/system/feeds/{feedAddress}/configRead the immutable settings an issuer-signed feed enforces on every update.Single-resource envelope with data and links.self.
Resolve a feedGET /api/v2/system/feeds/resolveFind the feed registered for a subject and topic pair.Single-resource envelope with data and links.self.
Read feed capabilitiesGET /api/v2/system/feeds/capabilitiesCheck whether the feed directory, factories, and adapters are installed.Single-resource envelope with data and links.self.
Read the latest valueGET /api/v2/system/feeds/{feedAddress}/latestRead the most recent round directly from a feed contract.Single-resource envelope with data and links.self.
Read a historical roundGET /api/v2/system/feeds/{feedAddress}/round/{roundId}Read one earlier round by its round identifier.Single-resource envelope with data and links.self.
Evaluate stalenessGET /api/v2/system/feeds/{feedAddress}/stalenessDecide whether a feed value is too old to use against an age threshold.Single-resource envelope with data and links.self.
List issuer-signed feedsGET /api/v2/system/feeds/issuer-signedList feeds the platform created and signs values for in this system.Collection envelope with data, meta, and links.
List adapter-backed feedsGET /api/v2/system/feeds/adaptersList feeds that publish through a stable adapter address.Collection envelope with data, meta, and links.

A feed prices a subject for a topic. The subject is the address the feed describes, such as a token. The topic identifies what the value means, such as a price in a given currency. A description follows the <BASE> / <QUOTE> convention, so a token price feed reads as USDT / USD and a global currency feed reads as EUR / USD.

List registered feeds

The list endpoint returns the feeds registered in the system, most recently registered first. Each record carries the feed's identity, its latest indexed value, and whether it is active.

curl --globoff "https://your-platform.example.com/api/v2/system/feeds?filter[isActive]=true&filter[scope]=asset&page[limit]=50&sort=-registeredAt" \
  -H "X-Api-Key: sm_dalp_xxxxxxxxxxxxxxxx"

The response uses the collection envelope:

{
  "data": [
    {
      "id": "0x1111111111111111111111111111111111111111",
      "feedAddress": "0x1111111111111111111111111111111111111111",
      "subject": "0x2222222222222222222222222222222222222222",
      "topicId": "1",
      "kind": "SCALAR",
      "schemaHash": "0x3333333333333333333333333333333333333333333333333333333333333333",
      "decimals": 8,
      "scope": "asset",
      "factory": { "id": "0x4444444444444444444444444444444444444444", "typeId": "issuer-signed-scalar-feed" },
      "creator": { "id": "0x5555555555555555555555555555555555555555" },
      "adapterAddress": null,
      "isActive": true,
      "registeredAt": "2026-03-22T10:30:00.000Z",
      "latestValue": {
        "roundId": 12,
        "answer": "100000000",
        "observedAt": "2026-03-22T10:30:00.000Z",
        "updatedAt": "2026-03-22T10:30:00.000Z",
        "issuer": "0x6666666666666666666666666666666666666666",
        "signer": "0x7777777777777777777777777777777777777777"
      },
      "description": "USDT / USD"
    }
  ],
  "meta": {
    "total": 1,
    "facets": {
      "kind": [{ "value": "SCALAR", "count": 1 }],
      "scope": [{ "value": "asset", "count": 1 }],
      "isActive": [{ "value": "true", "count": 1 }]
    }
  },
  "links": {
    "self": "/v2/system/feeds?filter[isActive]=true&filter[scope]=asset&page[limit]=50&page[offset]=0&sort=-registeredAt",
    "first": "/v2/system/feeds?filter[isActive]=true&filter[scope]=asset&page[limit]=50&page[offset]=0&sort=-registeredAt",
    "next": null,
    "prev": null,
    "last": "/v2/system/feeds?filter[isActive]=true&filter[scope]=asset&page[limit]=50&page[offset]=0&sort=-registeredAt"
  }
}

latestValue is null until the feed produces its first round. Read it to learn the feed's most recent answer without a second call. The answer is an integer string in feed units: divide it by 10 to the power of decimals to get the human value, and use decimal arithmetic rather than binary floating-point in financial workflows.

The kind, scope, and isActive fields are facetable. The meta.facets block counts the matching feeds per value, which lets a picker show how many feeds sit behind each option without a separate count query.

Read one feed

Call the single-feed read when you already hold the feed contract address. It returns the same record shape as a list row.

curl "https://your-platform.example.com/api/v2/system/feeds/0x1111111111111111111111111111111111111111" \
  -H "X-Api-Key: sm_dalp_xxxxxxxxxxxxxxxx"
{
  "data": {
    "id": "0x1111111111111111111111111111111111111111",
    "feedAddress": "0x1111111111111111111111111111111111111111",
    "subject": "0x2222222222222222222222222222222222222222",
    "topicId": "1",
    "kind": "SCALAR",
    "decimals": 8,
    "scope": "asset",
    "isActive": true,
    "registeredAt": "2026-03-22T10:30:00.000Z",
    "latestValue": {
      "roundId": 12,
      "answer": "100000000",
      "observedAt": "2026-03-22T10:30:00.000Z",
      "issuer": "0x6666666666666666666666666666666666666666",
      "signer": "0x7777777777777777777777777777777777777777"
    },
    "description": "USDT / USD"
  },
  "links": {
    "self": "/v2/system/feeds/0x1111111111111111111111111111111111111111"
  }
}

Read immutable feed configuration

An issuer-signed feed fixes its trust and validation rules at creation, and the contract enforces them on every signed update. Read its configuration before you accept a feed's value into a valuation or settlement workflow. The response confirms what the feed actually guarantees:

  • which subject and topic it prices,
  • the schema hash its values must match,
  • whether it rejects non-positive answers,
  • how far ahead of block time a value's timestamp may sit,
  • and which trusted-issuer and topic-scheme registries it checks signatures against.

These settings cannot change after deployment, so this read is the source for an auditor or risk reviewer verifying a feed's controls.

curl "https://your-platform.example.com/api/v2/system/feeds/0x1111111111111111111111111111111111111111/config" \
  -H "X-Api-Key: sm_dalp_xxxxxxxxxxxxxxxx"
{
  "data": {
    "feedAddress": "0x1111111111111111111111111111111111111111",
    "subject": "0x2222222222222222222222222222222222222222",
    "topicId": "1",
    "expectedSchemaHash": "0x3333333333333333333333333333333333333333333333333333333333333333",
    "decimals": 8,
    "description": "USDT / USD",
    "historyMode": "FULL",
    "historySize": 0,
    "requirePositive": true,
    "driftAllowance": 0,
    "domainSeparator": "0x8888888888888888888888888888888888888888888888888888888888888888",
    "trustedIssuersRegistry": "0x9999999999999999999999999999999999999999",
    "topicSchemeRegistry": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
  },
  "links": { "self": "/v2/system/feeds/0x1111111111111111111111111111111111111111/config" }
}

requirePositive set to true means the feed rejects zero and negative answers. driftAllowance is the maximum number of seconds an update's observedAt timestamp may sit ahead of the chain's block time, which tolerates small signer clock skew; 0 requires the timestamp to be at or before block time. historyMode and historySize describe how many past rounds the feed retains: LATEST_ONLY keeps only the current round, BOUNDED keeps up to historySize rounds, and FULL keeps the complete history. The feed validates each update signature against trustedIssuersRegistry. At feed creation the factory derives the schema hash from topicSchemeRegistry and pins it as expectedSchemaHash; per-update enforcement compares the update schema hash to that pinned value, not to the live registry. Those addresses tell you which authorities the feed trusts. This endpoint serves issuer-signed scalar feeds; a feed address that does not resolve to one returns a not-found error.

Resolve a feed for a subject and topic

When you know what you want to price but not which feed serves it, resolve the feed by its subject and topic. Pass subject with either topicName or topicId (or both).

curl --globoff "https://your-platform.example.com/api/v2/system/feeds/resolve?subject=0x2222222222222222222222222222222222222222&topicId=1" \
  -H "X-Api-Key: sm_dalp_xxxxxxxxxxxxxxxx"
{
  "data": {
    "exists": true,
    "feedAddress": "0x1111111111111111111111111111111111111111",
    "kind": "SCALAR",
    "schemaHash": "0x3333333333333333333333333333333333333333333333333333333333333333",
    "adapterAddress": null,
    "indexed": {
      "decimals": 8,
      "registeredAt": "2026-03-22T10:30:00.000Z",
      "latestValue": {
        "roundId": 12,
        "answer": "100000000",
        "observedAt": "2026-03-22T10:30:00.000Z",
        "issuer": "0x6666666666666666666666666666666666666666",
        "signer": "0x7777777777777777777777777777777777777777"
      }
    }
  },
  "links": {
    "self": "/v2/system/feeds/resolve?subject=0x2222222222222222222222222222222222222222&topicId=1"
  }
}

When no feed is registered for the pair, exists is false and feedAddress, kind, schemaHash, adapterAddress, and indexed are null. The indexed block is also null for a registered feed the index has not yet enriched. Read exists before you trust the rest of the record.

Read the latest value and historical rounds

The latest and round endpoints read directly from the feed contract, so they return on-chain data exactly as the contract reports it. The latest endpoint returns the most recent round with a formattedAnswer already converted into human units.

curl "https://your-platform.example.com/api/v2/system/feeds/0x1111111111111111111111111111111111111111/latest" \
  -H "X-Api-Key: sm_dalp_xxxxxxxxxxxxxxxx"
{
  "data": {
    "feedAddress": "0x1111111111111111111111111111111111111111",
    "roundId": "12",
    "answer": "100000000",
    "decimals": 8,
    "formattedAnswer": "1.00000000",
    "startedAt": "2026-03-22T10:29:50.000Z",
    "updatedAt": "2026-03-22T10:30:00.000Z",
    "answeredInRound": "12",
    "description": "USDT / USD",
    "version": "1"
  },
  "links": { "self": "/v2/system/feeds/0x1111111111111111111111111111111111111111/latest" }
}

Pass a round identifier to read one earlier round. The roundId path parameter is a non-negative integer string.

curl "https://your-platform.example.com/api/v2/system/feeds/0x1111111111111111111111111111111111111111/round/11" \
  -H "X-Api-Key: sm_dalp_xxxxxxxxxxxxxxxx"
{
  "data": {
    "roundId": "11",
    "answer": "99950000",
    "startedAt": "2026-03-22T09:29:50.000Z",
    "updatedAt": "2026-03-22T09:30:00.000Z",
    "answeredInRound": "11"
  },
  "links": { "self": "/v2/system/feeds/0x1111111111111111111111111111111111111111/round/11" }
}

Evaluate staleness

A valuation workflow should reject a price that is too old. Pass maxAgeSeconds, the longest age you will accept, and the endpoint compares the latest round timestamp against the current platform time.

curl --globoff "https://your-platform.example.com/api/v2/system/feeds/0x1111111111111111111111111111111111111111/staleness?maxAgeSeconds=3600" \
  -H "X-Api-Key: sm_dalp_xxxxxxxxxxxxxxxx"
{
  "data": {
    "feedAddress": "0x1111111111111111111111111111111111111111",
    "latestUpdatedAt": "2026-03-22T10:30:00.000Z",
    "currentTimestamp": "2026-03-22T10:45:00.000Z",
    "ageSeconds": 900,
    "maxAgeSeconds": 3600,
    "isStale": false,
    "roundId": "12",
    "answer": "100000000"
  },
  "links": { "self": "/v2/system/feeds/0x1111111111111111111111111111111111111111/staleness?maxAgeSeconds=3600" }
}

isStale is true when ageSeconds is greater than maxAgeSeconds. Read isStale as the decision and ageSeconds as the supporting evidence.

List by creation path

Two narrower list endpoints split feeds by how they publish values. Both use the same collection envelope as the main list endpoint.

  • GET /api/v2/system/feeds/issuer-signed returns feeds the platform created through its factory and signs values for. Each record carries feedAddress, subject, topicId, and creator.
  • GET /api/v2/system/feeds/adapters returns feeds that publish through a stable adapter address, which keeps a fixed consumer address while the underlying source changes. Each record carries adapterAddress, subject, and topicId.

Use the main list endpoint when you want the full feed record with the latest value; use these two when you only need to enumerate feeds by their publishing mechanism.

Read feed capabilities

The capabilities endpoint reports whether the feed directory, factories, and adapter factory are installed for the system. Read it before you assume the feed endpoints will return data, since an organization can run without the feed modules installed.

curl "https://your-platform.example.com/api/v2/system/feeds/capabilities" \
  -H "X-Api-Key: sm_dalp_xxxxxxxxxxxxxxxx"

Parameters and fields

FieldLocationTypeNotes
feedAddressPath or filterEVM addressFeed contract address. The list endpoint supports filter[feedAddress].
roundIdPathinteger stringRound identifier on the historical round read.
maxAgeSecondsQuerypositive integerLongest acceptable value age on the staleness read.
subjectQuery or fieldEVM addressAddress the feed prices, such as a token. Required on resolve and supported as a list filter.
topicIdQuery or fieldnumeric stringTopic identifier for the priced value. Supply topicId or topicName on resolve.
topicNameQuerystringTopic name alternative to topicId on resolve.
kindFilter or fieldSCALARFeed value kind. Facetable on the list endpoint.
scopeFilter or fieldglobal, identity, asset, otherWhat the feed prices. Facetable on the list endpoint.
isActiveFilter or fieldbooleanWhether the feed is currently active. Facetable on the list endpoint.
decimalsFilter or fieldintegerDecimal places for answer. Divide answer by 10 to the power of decimals.
descriptionFieldstring or null<BASE> / <QUOTE> label such as USDT / USD.
latestValueFieldobject or nullMost recent indexed round: roundId, answer, observedAt, issuer, signer. null before the first round.
answerFieldinteger stringReported value in feed units. Apply decimals to read the human value.
formattedAnswerFielddecimal stringLatest value already converted into human units on the latest read.
isStaleFieldbooleanStaleness decision: true when ageSeconds exceeds maxAgeSeconds.
requirePositiveFieldbooleanWhether the feed rejects zero and negative answers. Returned by the config read.
driftAllowanceFieldintegerSeconds an update timestamp may lead block time. 0 requires it at or before block time. Returned by config.
historyModeFieldLATEST_ONLY, BOUNDED, FULLNumber of past rounds the feed retains. Returned by the config read.
existsFieldbooleanWhether resolve found a registered feed for the subject and topic.
filter[q]QuerystringFree-text search across feed address, subject, topic, and description on the list endpoint.
page[limit]QueryintegerPage size for collection responses.
page[offset]QueryintegerOffset for collection responses.
sortQuerystringSort field. Prefix with - for descending order, such as sort=-registeredAt.

On this page