Envelop Kiosk API

The Kiosk API from Envelop — 6 operation(s) for kiosk.

GitHub OpenAPI

Operations 8

GET /kiosk/display/{chain_id}/{contract_address}/{display_hash} Kiosk #
POST /kiosk/display/{chain_id}/{contract_address}/{display_hash} Kiosk #
GET /kiosk/display_params/{chain_id}/{contract_address}/{display_hash} Kiosk #
POST /kiosk/display_params/{chain_id}/{contract_address}/{display_hash} Kiosk #
GET /kiosk/user/{chain_id}/{user_address} Kiosk #
GET /kiosk/tokens/{chain_id}/{contract_address}/{display_hash} Kiosk #
GET /kiosk/item_history/{chain_id}/{contract_address}/{token_id} Kiosk Item History #
GET /kiosk/item_sales/{chain_id}/{contract_address}/{token_id} Kiosk Item Sales #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • 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.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/envelop-is:envelop-is-kiosk-api"
All apis
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.

Get an API 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 Specification

envelop-is-kiosk-api-openapi.yml Raw ↑
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