Successful mints on a contract by NimbusMint users from your app
curl -G "https://api.nimbusmint.bot/partner/v1/hits" \ -H "Authorization: Bearer $NIMBUS_PRIVATE_KEY" \ --data-urlencode "contract=0x000000000000000000000000000000000000dead" \ --data-urlencode "since=2026-10-08T15:00:00Z"// Node 18+ (built-in fetch). Keep the key on your server.const url = new URL('https://api.nimbusmint.bot/partner/v1/hits');url.search = new URLSearchParams({ contract: '0x000000000000000000000000000000000000dead', since: '2026-10-08T15:00:00Z',});const res = await fetch(url, { headers: { Authorization: `Bearer ${process.env.NIMBUS_PRIVATE_KEY}` },});console.log(res.status, await res.json());import osimport requests
res = requests.get( "https://api.nimbusmint.bot/partner/v1/hits", headers={"Authorization": f"Bearer {os.environ['NIMBUS_PRIVATE_KEY']}"}, params={ "contract": "0x000000000000000000000000000000000000dead", "since": "2026-10-08T15:00:00Z", }, timeout=10,)print(res.status_code, res.json())Counts hits on one contract in a window. A hit is one mint task that completed successfully (receipt confirmed, not reverted) and that was booked through your app, timed by when it completed. It is not a token count: a task that minted three tokens is one hit. Failed, reverted and cancelled tasks never count, and nor do tasks booked before your app’s attribution went live.
Users are distinct NimbusMint accounts. Each listed user carries
their full identity: user_id, discord_id, discord_username and
the wallets their hits in the window minted from. These are your
users’ personal data: mask them yourself before showing them to
anyone else. handle is a ready-masked form (the first character of
their name and seven *). users is ranked by hits, then by most
recent hit; others sums everyone beyond top, so total = users
others. For every individual hit, use/mints.
gas is the user’s settings on their most recent hit in the window:
manual with the max fee and priority fee in gwei, or auto (fees
chosen by the network at send time) with nulls.
Answers are cached for cache_ttl_s seconds; since and until are
floored to the minute.
Requires scope read:hits.
Errors
| Status | code |
Meaning |
|---|---|---|
| 400 | window_too_large |
The query is invalid (invalid_request) or the window is longer than allowed (window_too_large). |
| 400 | invalid_request |
The query is invalid (invalid_request) or the window is longer than allowed (window_too_large). |
| 401 | invalid_key |
The key is missing, malformed, unknown, expired or revoked, or its partner is disabled. Always invalid_key. |
| 403 | ip_not_allowed |
The calling address is not on the key’s allowlist (ip_not_allowed), or the key lacks the route’s scope (scope_missing). |
| 403 | scope_missing |
The calling address is not on the key’s allowlist (ip_not_allowed), or the key lacks the route’s scope (scope_missing). |
| 429 | rate_limited |
The key’s rate limit, or the API’s overall limit, is exceeded (rate_limited). |
| 503 | tenant_api_disabled |
The API is switched off (tenant_api_disabled), not configured (ip_trust_unconfigured) or temporarily unable to answer (internal). Retry later; Retry-After is sent when a retry is expected to succeed soon. |
| 503 | ip_trust_unconfigured |
The API is switched off (tenant_api_disabled), not configured (ip_trust_unconfigured) or temporarily unable to answer (internal). Retry later; Retry-After is sent when a retry is expected to succeed soon. |
| 503 | internal |
The API is switched off (tenant_api_disabled), not configured (ip_trust_unconfigured) or temporarily unable to answer (internal). Retry later; Retry-After is sent when a retry is expected to succeed soon. |
What to do about each: Errors.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”Contract address, 0x-prefixed, any case.
Example
0x000000000000000000000000000000000000deadWindow start (inclusive), RFC 3339.
Example
2026-10-08T15:00:00ZWindow end (exclusive), RFC 3339. Defaults to now; a future time is clamped to now. The window may span at most 31 days unless your agreement sets another limit (window_too_large).
Only this chain. Omitted, every chain is counted and chain_ids lists those that matched.
Example
33139How many users to list individually.
Responses
Section titled “Responses”Hits in the window.
object
The contract, lowercased.
Chains with at least one hit, ascending.
object
Distinct NimbusMint accounts.
object
First character of the user’s name and seven *. Not unique.
The NimbusMint account id. Stable; today it equals the Discord id.
The user’s Discord id; empty if the account record is missing.
The user’s Discord username as last seen at login; empty if unknown.
Distinct wallet addresses (lowercase, ascending) the user’s hits in the window minted from.
object
Max fee per gas in gwei, decimal string; null when auto.
Priority fee per gas in gwei, decimal string; null when auto or not set.
object
Seconds this answer is cached for.
Examples
A collection with one auto-gas user and a tail
{ "contract": "0x000000000000000000000000000000000000dead", "chain_ids": [ 33139 ], "since": "2026-10-08T15:00:00Z", "until": "2026-10-08T18:42:00Z", "total": { "hits": 36, "users": 11 }, "users": [ { "handle": "a*******", "user_id": "100000000000000001", "discord_id": "100000000000000001", "discord_username": "alice", "wallets": [ "0x1111111111111111111111111111111111111111" ], "hits": 9, "gas": { "mode": "manual", "max_fee_gwei": "3", "priority_gwei": "0.5" } }, { "handle": "b*******", "user_id": "100000000000000002", "discord_id": "100000000000000002", "discord_username": "bob", "wallets": [ "0x2222222222222222222222222222222222222222", "0x3333333333333333333333333333333333333333" ], "hits": 7, "gas": { "mode": "auto", "max_fee_gwei": null, "priority_gwei": null } } ], "others": { "users": 9, "hits": 20 }, "generated_at": "2026-10-08T18:42:07Z", "cache_ttl_s": 30}The query is invalid (invalid_request) or the window is longer than allowed (window_too_large).
object
Examples
{ "code": "window_too_large", "message": "the window may span at most 31 days"}The key is missing, malformed, unknown, expired or revoked, or its partner is disabled. Always invalid_key.
object
Examples
{ "code": "invalid_key", "message": "missing, invalid, expired or revoked key"}The calling address is not on the key’s allowlist (ip_not_allowed), or the key lacks the route’s scope (scope_missing).
object
Examples
{ "code": "ip_not_allowed", "message": "this address may not use this key"}The key’s rate limit, or the API’s overall limit, is exceeded (rate_limited).
object
Examples
{ "code": "rate_limited", "message": "rate limit exceeded"}Headers
Section titled “Headers”Seconds to wait before retrying.
The API is switched off (tenant_api_disabled), not configured (ip_trust_unconfigured) or temporarily unable to answer (internal). Retry later; Retry-After is sent when a retry is expected to succeed soon.
object
Examples
{ "code": "tenant_api_disabled", "message": "the partner API is disabled"}Headers
Section titled “Headers”Seconds to wait before retrying.
