Envelop Kiosk API
The Kiosk API from Envelop — 6 operation(s) for kiosk.
The Kiosk API from Envelop — 6 operation(s) for kiosk.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/envelop-is:envelop-is-kiosk-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Fast Kiosk API
version: 0.1.0
tags:
- name: Kiosk
paths:
/kiosk/display/{chain_id}/{contract_address}/{display_hash}:
get:
summary: Kiosk
description: 'Get a single kiosk showcase (launchpad display) by its name hash.
Returns the display record — title, description, owner, beneficiary,
default prices and discounts — plus `tokens_count` (items ever listed on
this showcase) and a `statistics` object breaking those items down by
status, e.g. `{"on_sale": 1, "sold": 1}`. Requires an API key. Responds 404
if the showcase does not exist.
Data sources (via `dbconnector.get_kiosk_display`, filtered by
`chain_id` = kd.CHAIN_ID, `contract_address` = kd.CONTRACT_ADDRESS,
`display_hash` = kd.name_hash):
- The showcase row itself, incl. `owner`, `beneficiary`, `title`,
`description`, `show_widget`, `discounts`, `name_hash`, `blocknumber`:
table `public.kiosk_displays` (written by the grabber from on-chain
display-creation events).
- `tokens_count`: SQL function `public.get_display_item_count(kd.id)`
(counts ALL of the display''s `public.kiosk_items`, sold ones included).
- `statistics`: SQL function
`public.get_kiosk_showcase_stat(chain_id, display_id)` — a `{status:
count}` map over the same `public.kiosk_items` rows. Only statuses
actually present appear as keys; a showcase with no items yields `{}`.
The grabber writes two statuses today, `on_sale` and `sold` (removal from
a showcase is not tracked). The values sum to `tokens_count`.
Lazy-mint sales are NOT counted anywhere in this response: a lazy
purchase mints a fresh buyer-owned copy, leaves the template `on_sale`,
and emits no kiosk event, so the DB holds no record of it.
- `discounts` (reshaped here into `{discount:{dsctType,dsctPercent},
untilDate}`): the `discounts` JSON column on `public.kiosk_displays`.'
operationId: kiosk_kiosk_display__chain_id___contract_address___display_hash__get
security:
- APIKeyHeader: []
- JwtAccessBearer: []
parameters:
- name: chain_id
in: path
required: true
schema:
type: integer
title: Chain Id
- name: contract_address
in: path
required: true
schema:
type: string
title: Contract Address
- name: display_hash
in: path
required: true
schema:
type: string
title: Display Hash
responses:
'200':
description: Successful Response
content:
application/json:
schema: {}
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
tags:
- Kiosk
post:
summary: Kiosk
description: 'Update a showcase''s editable metadata (title, description, show_widget).
Requires an API key **and** an owner signature: the body field `sign`
must be an EIP-191 signature of the message `Showcase: {name_hash}` made
by the showcase `owner`; otherwise responds 403.
Body: `{ title?, description?, show_widget?, sign }`.
Data sources / effects:
- The existing showcase (used to read `name_hash` for the signed message
and `owner` for the authorization check) is loaded from
`public.kiosk_displays` via `dbconnector.get_kiosk_display` (same
chain_id/contract_address/name_hash filter as GET). 404 if absent.
- The signer is recovered from `sign` over `Showcase: {name_hash}` and
compared against `kiosk_displays.owner`; 403 on mismatch.
- Persists only `title`, `description`, `show_widget` back to
`public.kiosk_displays` (`dbconnector.update_kiosk_display`), then
returns the refreshed row (incl. `tokens_count` and reshaped
`discounts`) re-read from `public.kiosk_displays`. On-chain fields such
as `owner`/`beneficiary`/`discounts` are NOT editable here — they come
from the grabber-indexed chain events.'
operationId: kiosk_kiosk_display__chain_id___contract_address___display_hash__post
security:
- APIKeyHeader: []
- JwtAccessBearer: []
parameters:
- name: chain_id
in: path
required: true
schema:
type: integer
title: Chain Id
- name: contract_address
in: path
required: true
schema:
type: string
title: Contract Address
- name: display_hash
in: path
required: true
schema:
type: string
title: Display Hash
requestBody:
content:
application/json:
schema:
title: Data
responses:
'200':
description: Successful Response
content:
application/json:
schema: {}
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
tags:
- Kiosk
/kiosk/display_params/{chain_id}/{contract_address}/{display_hash}:
get:
summary: Kiosk
description: 'Get a showcase''s display parameters (key/value content for the UI).
Returns the `kiosk_display_data` rows — basic / project / links / socials /
progress / style / popup keys — used to render the launchpad page.
Requires an API key.
Data source (`dbconnector.get_display_params`, widget=False):
- Rows come from `public.kiosk_display_data kdd` joined to
`public.kiosk_displays kd` on `kd.id = kdd.display_id`, filtered by
`kd.chain_id` / `kd.contract_address` / `kd.name_hash` (= display_hash).
- Each row is the raw `kdd.*`: `display_id`, `key_name`, `key_type`,
`key_value`. These are off-chain, UI-authored values written through the
POST endpoint below — NOT indexed from chain. (The public widget page
uses the same query with the extra `kd.show_widget = true` guard.)'
operationId: kiosk_kiosk_display_params__chain_id___contract_address___display_hash__get
security:
- APIKeyHeader: []
- JwtAccessBearer: []
parameters:
- name: chain_id
in: path
required: true
schema:
type: integer
title: Chain Id
- name: contract_address
in: path
required: true
schema:
type: string
title: Contract Address
- name: display_hash
in: path
required: true
schema:
type: string
title: Display Hash
responses:
'200':
description: Successful Response
content:
application/json:
schema: {}
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
tags:
- Kiosk
post:
summary: Kiosk
description: 'Replace a showcase''s display parameters.
Requires an API key and an owner signature (`sign` over
`Showcase: {name_hash}`). Deletes the showcase''s existing
`kiosk_display_data` and inserts the provided set.
Body: `{ params: [{ key_name, key_type, key_value }], sign }`.
Data sources / effects:
- The showcase (for `name_hash` + `owner`) is loaded from
`public.kiosk_displays` via `dbconnector.get_kiosk_display`. 404 if
absent, 403 if the recovered signer ≠ `kiosk_displays.owner`.
- Full-replace on `public.kiosk_display_data`
(`dbconnector.update_kiosk_display_params`): first
`DELETE ... WHERE display_id = kd.id`, then bulk-`INSERT` the supplied
`params` (`display_id, key_name, key_type, key_value`).
- Returns the freshly-inserted rows re-read from `public.kiosk_display_data`
joined to `public.kiosk_displays` (`get_display_params_by_id`).'
operationId: kiosk_kiosk_display_params__chain_id___contract_address___display_hash__post
security:
- APIKeyHeader: []
- JwtAccessBearer: []
parameters:
- name: chain_id
in: path
required: true
schema:
type: integer
title: Chain Id
- name: contract_address
in: path
required: true
schema:
type: string
title: Contract Address
- name: display_hash
in: path
required: true
schema:
type: string
title: Display Hash
requestBody:
content:
application/json:
schema:
title: Data
responses:
'200':
description: Successful Response
content:
application/json:
schema: {}
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
tags:
- Kiosk
/kiosk/user/{chain_id}/{user_address}:
get:
summary: Kiosk
description: 'List kiosk showcases owned by a user on a chain (paginated).
Query: `page` (default 1), `size` (default 10). Each item includes
`tokens_count` and `statistics`. Requires an API key.
Data source (`dbconnector.get_kiosk_display`, filtered by
`chain_id` = kd.CHAIN_ID and `owner` = kd.owner):
- Showcase rows from `public.kiosk_displays` where `owner = user_address`
(matched exactly; the grabber stores `owner` as indexed on-chain),
ordered by `blocknumber DESC`, paginated with OFFSET/LIMIT.
- Each row carries the same enrichment as GET /kiosk/display:
`tokens_count` via `public.get_display_item_count(kd.id)` and
`statistics` — the `{status: count}` map from
`public.get_kiosk_showcase_stat(chain_id, display_id)`. Note this
response is otherwise returned as-is: discounts are not reshaped here,
unlike the single-showcase GET.'
operationId: kiosk_kiosk_user__chain_id___user_address__get
security:
- APIKeyHeader: []
- JwtAccessBearer: []
parameters:
- name: chain_id
in: path
required: true
schema:
type: integer
title: Chain Id
- name: user_address
in: path
required: true
schema:
type: string
title: User Address
- name: page
in: query
required: false
schema:
type: integer
default: 1
title: Page
- name: size
in: query
required: false
schema:
type: integer
default: 10
title: Size
responses:
'200':
description: Successful Response
content:
application/json:
schema: {}
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
tags:
- Kiosk
/kiosk/tokens/{chain_id}/{contract_address}/{display_hash}:
get:
summary: Kiosk
description: 'List the tokens (NFTs) in a showcase (paginated).
By default only items still on sale are returned; pass `include_sold=true`
to also include sold items (each item carries a `status` field). Each item
is returned with parsed `prices` and `discounts`, plus wNFT `collateral`,
`locks` and `asset_type`. Query: `page`, `size`, `include_sold`.
Requires an API key.
Data sources (`dbconnector.get_display_tokens`, filtered by
`chain_id`/`contract_address`/`display_hash` = kd.name_hash; adds
`ki.status <> ''sold''` unless include_sold):
- The listed items (`ki.*`: `token_id`, `status`, `prices`, `discounts`,
`item_type`, `sell_tx_hash`, `blocknumber`, …): table
`public.kiosk_items ki` (grabber-indexed listing events).
- `token_uri`, plus display `name_hash`/`name`: joined from the view
`public.v_kiosk_items_721_full vki` and `public.kiosk_displays kd`.
- Whether an item sold is `ki.status` (`on_sale` / `sold`). There is no
lazy-sale count: a lazy purchase mints a fresh buyer-owned copy, leaves
the template `on_sale`, and emits no kiosk event, so the DB holds no
record of it.
- `collateral` (reshaped from `get_wnft_vault`): SQL function
`public.get_wnft_vault(chain_id, contract_address, token_id)` — the
assets locked inside the wNFT (collateral_type/address/token_id/balance).
- `locks` (from `get_wnft_locks`): SQL function
`public.get_wnft_locks(chain_id, contract_address, token_id)`.
- `prices`/`discounts` are the raw `ki.prices`/`ki.discounts` tuples,
reshaped here into `{payWith,amount}` / `{dsctType,dsctPercent}`;
`asset_type` is `ki.item_type` (721/1155).'
operationId: kiosk_kiosk_tokens__chain_id___contract_address___display_hash__get
security:
- APIKeyHeader: []
- JwtAccessBearer: []
parameters:
- name: chain_id
in: path
required: true
schema:
type: integer
title: Chain Id
- name: contract_address
in: path
required: true
schema:
type: string
title: Contract Address
- name: display_hash
in: path
required: true
schema:
type: string
title: Display Hash
- name: page
in: query
required: false
schema:
type: integer
default: 1
title: Page
- name: size
in: query
required: false
schema:
type: integer
default: 10
title: Size
- name: include_sold
in: query
required: false
schema:
type: boolean
default: false
title: Include Sold
responses:
'200':
description: Successful Response
content:
application/json:
schema: {}
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
tags:
- Kiosk
/kiosk/item_history/{chain_id}/{contract_address}/{token_id}:
get:
summary: Kiosk Item History
description: 'Event history of a single kiosk item (NFT) on showcases (paginated).
Identified by `chain_id` + `contract_address` + `token_id`. Returns the
on-chain kiosk events that reference this token, newest first: `Listed`
(added to a showcase) and `Sold` (purchased). Each entry carries `action`,
`blocknumber`, `logindex`, `txhash` and the `display_hash` of the showcase.
Query: `page`, `size`. Requires an API key.
Data source (`dbconnector.get_kiosk_item_history`):
- Raw event logs from `public.raw_kiosk rk` (grabber-indexed kiosk event
log table), filtered by `rk.chainid` and `rk.zerotopic IN
(KIOSK_ITEM_EVENTS)` — the event-signature hashes for `ItemAddedToDisplay`
(→ `Listed`) and `EnvelopPurchase`/`EnvelopPurchace` (→ `Sold`).
- This token is matched via the indexed topics: `topic2` holds the NFT
contract (`''0x''||RIGHT(topic2,40) = contract_address`) and `topic3` holds
the token_id (`hex_to_int(RIGHT(topic3,64)) = token_id`).
- Returned columns: `blocknumber`, `logindex`, `txhash`, `zerotopic`,
`display_hash` (= `rk.topic1`) and `action` (mapped from `zerotopic`),
ordered `blocknumber DESC, logindex DESC`. Unsupported `chain_id` → error.'
operationId: kiosk_item_history_kiosk_item_history__chain_id___contract_address___token_id__get
security:
- APIKeyHeader: []
- JwtAccessBearer: []
parameters:
- name: chain_id
in: path
required: true
schema:
type: integer
title: Chain Id
- name: contract_address
in: path
required: true
schema:
type: string
title: Contract Address
- name: token_id
in: path
required: true
schema:
type: string
title: Token Id
- name: page
in: query
required: false
schema:
type: integer
default: 1
title: Page
- name: size
in: query
required: false
schema:
type: integer
default: 10
title: Size
responses:
'200':
description: Successful Response
content:
application/json:
schema: {}
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
tags:
- Kiosk
/kiosk/item_sales/{chain_id}/{contract_address}/{token_id}:
get:
summary: Kiosk Item Sales
description: 'Sale history of a single kiosk item (NFT), paginated, newest first.
Like `/kiosk/item_history` but limited to sale events. Identified by
`chain_id` + `contract_address` + `token_id`. Each entry carries
`action` (`Sold`), `txhash` (the sale transaction), `blocknumber`,
`logindex`, the `display_hash` and `display_name` of the showcase,
`sold_at` (the transaction date derived from the block number),
`prices` (the listed sale price(s) as `{payWith, amount}`) and `paid` —
the amounts actually transferred in the sale transaction, read on-chain
from the receipt: every ERC-20 `Transfer` plus the native transfer if any,
as `{token, from, to, amount, symbol, decimals}`. `paid` reflects applied
discounts and is `[]` if the node is unavailable.
Query: `page`, `size`. Requires an API key.
Data sources (mixed DB + on-chain):
- Base rows (`dbconnector.get_kiosk_item_sales`): `public.kiosk_items ki`
joined to `public.kiosk_displays kd` on `kd.id = ki.display_id`, filtered
by `kd.chain_id`, `LOWER(ki.contract_address)`, `ki.token_id` and
`ki.status = ''sold''` (only regular sold rows; lazy-mint copies, which
never flip the template to ''sold'', are NOT listed here). Ordered by
`blocknumber DESC, logindex DESC`.
- From those tables: `blocknumber`, `logindex`, `txhash` (= `ki.sell_tx_hash`),
`display_hash` (= `kd.name_hash`), `display_name` (= `kd.name`),
`prices` (= `ki.prices`, reshaped to `{payWith,amount}`), `status`.
- `sold_at`: SQL function
`public.get_estimate_date_for_block(ki.chain_id, ki.blocknumber)`.
- `paid`: computed live from the tx receipt via `_get_paid(web3_adapter,
chain_id, txhash)` (RPC selected by `WEB3_PROVIDER_{chain_id}`), NOT from
the DB; `[]` if the enrichment fails. Unsupported `chain_id` → error.'
operationId: kiosk_item_sales_kiosk_item_sales__chain_id___contract_address___token_id__get
security:
- APIKeyHeader: []
- JwtAccessBearer: []
parameters:
- name: chain_id
in: path
required: true
schema:
type: integer
title: Chain Id
- name: contract_address
in: path
required: true
schema:
type: string
title: Contract Address
- name: token_id
in: path
required: true
schema:
type: string
title: Token Id
- name: page
in: query
required: false
schema:
type: integer
default: 1
title: Page
- name: size
in: query
required: false
schema:
type: integer
default: 10
title: Size
responses:
'200':
description: Successful Response
content:
application/json:
schema: {}
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
tags:
- Kiosk
components:
schemas:
HTTPValidationError:
properties:
detail:
items:
$ref: '#/components/schemas/ValidationError'
type: array
title: Detail
type: object
title: HTTPValidationError
ValidationError:
properties:
loc:
items:
anyOf:
- type: string
- type: integer
type: array
title: Location
msg:
type: string
title: Message
type:
type: string
title: Error Type
type: object
required:
- loc
- msg
- type
title: ValidationError
securitySchemes:
APIKeyHeader:
type: apiKey
in: header
name: Authorization
JwtAccessBearer:
type: http
scheme: bearer
HTTPBasic:
type: http
scheme: basic