Listing Spec
Everything a chain needs to expose to be listed on Blocktivity — the required JSON shape, audit endpoints, transaction-definition rules, history coverage and verification.
How it works
Blocktivity is designed to be self-sustaining. We ask each chain to own its data — to provide a stable API endpoint that counts its own transactions — rather than requiring Blocktivity to run chain-specific indexers. This means:
- A chain can be listed with a single required endpoint (daily transaction count).
- The chain controls its data accuracy and uptime.
- Blocktivity publishes honest data-status labels rather than pretending to independently verify everything.
The more endpoints a chain provides, the higher the data-status it can achieve. But the minimum ask is intentionally low so that any chain can participate.
Required fields
A chain cannot be listed without all of these. Submit them via the Add Your Chain form.
| Field | Type | Notes |
|---|---|---|
| name | string | Chain display name. Drives the coin URL slug (e.g. Bitcoin Cash → /coin/bitcoin-cash). |
| symbol | string | Ticker symbol. Uppercased on store. Only a fallback for the chain slug, when the name yields none. |
| website | string | Official chain website (https required) |
| contactEmail | string | Contact email for listing correspondence. |
| txEndpoint | string | URL returning the chain's daily transaction count in the tx-endpoint.schema.json shape (https required). This is the minimum required endpoint. |
The tx-endpoint shape
The URL you provide in txEndpoint must return a JSON object. Required fields:
// Required { "transactions": 1204887, // integer ≥ 0 "period_start": "2026-06-27T00:00:00Z", // ISO 8601 UTC "period_end": "2026-06-27T23:59:59Z", // ISO 8601 UTC "updated_at": "2026-06-27T14:15:00Z" // must be within 24h of fetch time } // Optional but strongly recommended { "chain": "Solana", "chain_id": "mainnet", "period": "24h", "from_block": 290000000, "to_block": 290100000, "transaction_definition": "successful user-submitted", "failed_transactions_included": false, "system_transactions_included": false }
Required
| Field | Type | Notes |
|---|---|---|
| transactions | integer | Transaction count for the reported period, per the chain's disclosed txDefinition (required) |
| period_start | string | ISO 8601 UTC timestamp for the start of the counted period (required) |
| period_end | string | ISO 8601 UTC timestamp for the end of the counted period (required) |
| updated_at | string | ISO 8601 UTC timestamp when this response was last calculated. Blocktivity uses this for freshness checks. Must be within 24 hours of fetch time to avoid a stale status. (required) |
Optional but strongly recommended
| Field | Type | Notes |
|---|---|---|
| chain | string | Human-readable chain name (optional) |
| chain_id | string | Chain network identifier, e.g. mainnet (optional) |
| period | "24h" | Reporting period. Must be 24h — daily is the only supported period. |
| from_block | integer | First block included in the count (optional, aids auditability) |
| to_block | integer | Last block included in the count (optional, aids auditability) |
| transaction_definition | string | Human-readable description of what is counted, e.g. successful user transactions only (optional) |
| failed_transactions_included | boolean | Whether failed transactions are included in the count (optional) |
| system_transactions_included | boolean | Whether system/protocol-internal transactions are included in the count (optional) |
- Blocktivity fetches this endpoint hourly. Ensure it is stable and returns within 10 seconds.
- If
updated_atis more than 24 hours old, the chain will be marked stale. - Additional fields in the response are ignored —
additionalPropertiesis allowed.
Recommended fields & endpoint tiers
These fields are optional at submission time — but each one unlocks a higher data-status badge and strengthens trust on the site.
| Tier | Endpoints provided | Data-status achieved |
|---|---|---|
| Minimum only | txEndpoint | Self-Reported |
| + freshness | txEndpoint + latestBlockEndpoint | Self-Reported(with freshness tracking) |
| + auditability | txEndpoint + latestBlockEndpoint + blockDetailEndpoint + rangeCountEndpoint | Auditable API |
| Official submission | — | Official API(any of the above + verified authenticity) |
| Sourced by Blocktivity | — | Public Source(no submission required) |
Audit endpoints
| Field | Type | Notes |
|---|---|---|
| latestBlockEndpoint | string | enables automated freshness and cross-source checks; required for auditable-api status. |
| blockDetailEndpoint | string | URI template containing the literal placeholder {block} (e.g. https://api.example.com/block/{block}). Enables random-block sampling. Required for auditable-api status alongside rangeCountEndpoint. |
| rangeCountEndpoint | string | URI template containing {from} and {to} placeholders. Strongest automated-verification signal; required for full auditable-api status. |
Display details
| Field | Type | Notes |
|---|---|---|
| logoUrl | string | if absent Blocktivity falls back to CoinGecko/CoinMarketCap logo. May be a relative path if pre-uploaded via /api/upload/chain-logo. |
| explorerUrls | string[] | enables cross-source block-number freshness checks. |
| socialUrls | string[] | displayed on the chain page. |
| protocol | string | e.g. PoS, DPoS, PoW, PoH. Displayed on the chain page. |
| protocolName | string | human-readable protocol label, e.g. Delegated Proof of Stake. |
| blockIntervalMs | integer | average block time in milliseconds. Enables block-range timestamp consistency checks. |
| idCg | string | CoinGecko coin id (e.g. solana). Used for market data and logo fallback. |
| idCmc | integer | CoinMarketCap id (e.g. 5426). Used for market data fallback. |
| publicNote | string | Optional. Anything else people should know about how this number is counted — exclusions, quirks, what a 'transaction' means on this chain. Shown publicly on the chain's page, attributed to you as the submitter. Plain language, one paragraph. |
Transaction-definition disclosure
All 7 fields of txDefinition are required. They are displayed on your coin page so visitors understand exactly what your number means. See Methodology → Transaction definition for the full field reference.
| Field | Type | Notes |
|---|---|---|
| successful | "included" | "excluded" | Are successful transactions counted? included — Included in the count excluded — Excluded from the count |
| failed | "included" | "excluded" | Are failed transactions counted? included — Included in the count excluded — Excluded from the count |
| system | "included" | "excluded" | Are system/protocol-internal transactions counted? included — Included in the count excluded — Excluded from the count |
| internal | "included" | "excluded" | "n-a" | Are internal (sub-call) transactions counted? Use n-a if the concept does not apply to this chain. included — Included in the count excluded — Excluded from the count n-a — Not applicable to this chain |
| batched | "as-batch" | "individually" | Are batched transactions counted once (as-batch) or once per inner transaction (individually)? as-batch — The batch counts as one transaction individually — Each transaction in the batch counts |
| rollup | "l2-user-tx" | "l1-settlement" | "both" | "n-a" | For rollup chains: which layer is counted? Use n-a for non-rollup chains. l2-user-tx — L2 user transactions l1-settlement — L1 settlement transactions both — Both L2 user and L1 settlement n-a — Not applicable to this chain |
| window | "utc-day" | "rolling-24h" | Counting window: UTC calendar day (00:00–24:00 UTC) or rolling last 24 hours. utc-day — UTC calendar day (00:00-24:00 UTC) rolling-24h — Rolling last 24 hours |
{
"txDefinition": {
"successful": "included",
"failed": "excluded",
"system": "excluded",
"internal": "n-a",
"batched": "individually",
"rollup": "n-a",
"window": "rolling-24h"
}
}Date-range endpoint — earns the Full history badge
Optional, and set up once your chain is listed. What we ask for: one endpoint that accepts a start and end date and returns per-day activity for that window.
Worked example:
GET /v1/activity?from=2021-01-01&to=2021-03-31
{ "data": [ { "date": "2021-01-01", "tx": 412903 },
{ "date": "2021-01-02", "tx": 398117 } ] }What we promise about load
One call per hour for the current reading. When we first list you we will walk your history backwards in windows of up to 90 days, one window per hour, until we reach your genesis — then we stop. If we ever miss an hour, we re-request that day once. We never issue more than one range request per hour for your chain, and we never run them in parallel.
A window cap is fine — if 90 days is too much, tell us and we'll use whatever you allow.
With it, your chain shows Full history. Without it, Tracked since <date> — still listed, still ranked identically. Nobody is excluded.
Already listed? Add a range endpoint any time — we backfill from it and the badge appears retroactively.
Authenticity verification
Authenticity verification proves that the submission came from a legitimate party. It does not verify the truth of the transaction numbers. Five methods are accepted:
| Method | Also send | Details |
|---|---|---|
| dns-txt | domain | Domain to which a TXT record blocktivity-verify=<token> has been added |
| well-known-file | url | URL of the uploaded /.well-known/blocktivity.json verification file |
| github | repoUrl | Official GitHub repository or organisation URL from which verification was completed |
| social | postUrl | URL of the public post from the official social account containing the verification code |
| explorer | domain | Domain of the official explorer whose operator verified the endpoint |
Authenticity verification is optional at submission time and can be completed asynchronously via the claim flow. Unverified submissions receive provisional status; verified submissions from official teams qualify for official-api status.
Test your endpoint
Paste your txEndpoint URL to check it against the required JSON shape before submitting.
Common errors
| HTTP | Name | Cause |
|---|---|---|
| 400 | Validation error | Missing required fields, invalid types, or a txDefinition field is missing. |
| 400 | Honeypot triggered | The _confirm field in the payload was non-empty (bot protection). |
| 429 | Rate limited | Too many submission attempts from the same IP. |
| 500 | Internal error | Server error — try again; if persistent, contact us via the contact form. |
Important
To appear accurately on Blocktivity, your chain must provide a stable transaction-activity endpoint. If your endpoint fails, your chain may be marked stale or removed from the active leaderboard until the issue is fixed.
Questions? Contact us or check the Methodology for data-status definitions.