MyStars FaaS Pricing API

Quote a price; list supported payment currencies and products.

Operations 4

GET /v1/pricing Quote a price #
GET /v1/pricing/batch Quote many Stars quantities in one request #
GET /v1/currencies List payment currencies #
GET /v1/products List available products #

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/mystars-pricing-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no email required.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

mystars-pricing-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: MyStars FaaS — Fulfilment Pricing API
  version: 1.12.0
  summary: Buy Telegram Stars & Premium for any @username, paid in GRAM (ex TON) or USDT (TON).
  description: 'MyStars FaaS is a public B2B API for buying and reselling **Telegram Stars** and **Telegram Premium**, delivered to any Telegram `@username` and paid in **GRAM (ex TON)** or **USDT (TON)**.


    Quote a price, check the recipient, create an order, then pay the returned on-chain address. MyStars holds the payment, fulfils delivery through Fragment, and notifies you with a signed webhook when the order is delivered or reversed.


    ## Getting an API key


    Keys are issued inside our Telegram bot — no dashboard, no signup form. Open [@my_stars_tg_bot](https://t.me/my_stars_tg_bot), tap **API access**, and copy your secret. Send it in the `X-Api-Key` header on every request.


    ## Typed SDKs


    Skip raw HTTP with an official client: `npm install @mystars-tg/faas-sdk` (TypeScript) or `pip install mystars-faas` (Python). Each wraps every call with retries, idempotency, typed errors, and on-chain payment builders.


    ## Documentation


    Full guides — quick start, rate limits, idempotency, webhooks, and reversal rules — live at the [developer portal](https://mystars.tg/docs).

    '
  contact:
    name: MyStars API support
    url: https://t.me/Mystars_support_bot
  license:
    name: Proprietary
    url: https://mystars.tg/terms
servers:
- url: https://api.mystars.tg
  description: Production
security:
- ApiKeyAuth: []
tags:
- name: Pricing
  description: Quote a price; list supported payment currencies and products.
paths:
  /v1/pricing:
    get:
      tags:
      - Pricing
      operationId: getPricing
      summary: Quote a price
      description: 'Get a quote for an item in a payment currency. The `amount` is the full,

        all-in total you''ll send on-chain (in `currency`) — there''s nothing else to

        add.


        The quote echoes back **what it priced** — `type` plus `quantity` (for

        Stars) or `months` (for Premium); the field that doesn''t apply is `null` —

        so the `amount` is self-describing and you never have to correlate it to your

        request.


        The response also carries `quoted_at` + `valid_until` (a re-quote hint —

        the price tracks the market and is recomputed about every minute; it is

        locked only when you create an order) and `usdt_per_ton` (the current

        public GRAM↔USDT rate, for your own conversion; `null` if

        momentarily unavailable).


        **Rate limit:** this endpoint carries a tighter per-tenant cap of 60

        requests/min (in addition to the standard per-tenant budget). If you

        exceed this, you receive a `429` and should back off for the remainder of

        the minute.

        '
      parameters:
      - name: type
        in: query
        required: true
        schema:
          type: string
          enum:
          - stars
          - premium
      - name: quantity
        in: query
        required: false
        description: Required when `type=stars` — the number of Stars (50–1000000).
        schema:
          type: integer
          minimum: 50
          maximum: 1000000
      - name: months
        in: query
        required: false
        description: Required when `type=premium` — the subscription length in months (3, 6, or 12).
        schema:
          type: integer
          enum:
          - 3
          - 6
          - 12
      - name: payment_currency
        in: query
        required: false
        schema:
          $ref: '#/components/schemas/PaymentCurrency'
      x-codeSamples:
      - lang: shell
        label: cURL
        source: "curl \"https://api.mystars.tg/v1/pricing?type=stars&quantity=500&payment_currency=ton\" \\\n  -H \"X-Api-Key: $MYSTARS_API_KEY\"\n"
      - lang: typescript
        label: TypeScript SDK
        source: "import { MyStarsClient } from \"@mystars-tg/faas-sdk\";\n\nconst client = MyStarsClient.production(process.env.MYSTARS_API_KEY!);\n\nconst quote = await client.getPricing({\n  type: \"stars\",\n  quantity: 500,\n  payment_currency: \"ton\",\n});\nconsole.log(`pay ${quote.amount} ${quote.currency}`);\n"
      - lang: python
        label: Python SDK
        source: 'import os


          from mystars_faas import MyStarsClient


          client = MyStarsClient.production(os.environ["MYSTARS_API_KEY"])


          quote = client.get_pricing(type="stars", quantity=500, payment_currency="ton")

          print(quote.amount, quote.currency)

          '
      - lang: python
        label: Python (HTTP)
        source: "import requests\n\nresp = requests.get(\n    \"https://api.mystars.tg/v1/pricing\",\n    headers={\"X-Api-Key\": MYSTARS_API_KEY},\n    params={\"type\": \"stars\", \"quantity\": 500, \"payment_currency\": \"ton\"},\n)\nresp.raise_for_status()\nprint(resp.json())\n"
      responses:
        '200':
          description: A price quote.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Quote'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/RateLimited'
        '503':
          $ref: '#/components/responses/Unavailable'
  /v1/pricing/batch:
    get:
      tags:
      - Pricing
      operationId: getPricingBatch
      summary: Quote many Stars quantities in one request
      description: 'Quote a whole LIST of Stars quantities in a single request — built for

        storefronts that refresh preview prices for an entire pack catalog. One

        batch call consumes ONE unit of your request budget (and one probe

        unit), instead of one per pack.


        Stars-only (`type=stars`). The quantity list is deduped and returned

        sorted ascending, up to **200 values** per call. Each entry carries the

        same `amount` + `fee` itemisation as `GET /v1/pricing` for that

        quantity — the two endpoints agree cent-for-cent. Shared response

        fields (`usdt_per_ton`, `quoted_at`, `valid_until`) are hoisted to the

        top level.


        **Rate limit:** same tighter 60 req/min per-tenant probe cap as

        `GET /v1/pricing` — but since a single call covers your whole catalog,

        one call per refresh window is all you need.

        '
      parameters:
      - name: type
        in: query
        required: true
        schema:
          type: string
          enum:
          - stars
      - name: quantities
        in: query
        required: true
        description: Comma-separated Stars quantities (each 50–1000000, max 200 values).
        schema:
          type: string
        example: 50,100,500,1000
      - name: payment_currency
        in: query
        required: false
        schema:
          $ref: '#/components/schemas/PaymentCurrency'
      x-codeSamples:
      - lang: shell
        label: cURL
        source: "curl \"https://api.mystars.tg/v1/pricing/batch?type=stars&quantities=50,100,500&payment_currency=usdt_ton\" \\\n  -H \"X-Api-Key: $MYSTARS_API_KEY\"\n"
      - lang: typescript
        label: TypeScript SDK
        source: "import { MyStarsClient } from \"@mystars-tg/faas-sdk\";\n\nconst client = MyStarsClient.production(process.env.MYSTARS_API_KEY!);\n\nconst batch = await client.getPricingBatch({\n  quantities: [50, 100, 500],\n  payment_currency: \"usdt_ton\",\n});\nfor (const q of batch.quotes) console.log(q.quantity, q.amount);\n"
      - lang: python
        label: Python SDK
        source: "import os\n\nfrom mystars_faas import MyStarsClient\n\nclient = MyStarsClient.production(os.environ[\"MYSTARS_API_KEY\"])\n\nbatch = client.get_pricing_batch(quantities=[50, 100, 500], payment_currency=\"usdt_ton\")\nfor q in batch.quotes:\n    print(q.quantity, q.amount)\n"
      - lang: python
        label: Python (HTTP)
        source: "import requests\n\nresp = requests.get(\n    \"https://api.mystars.tg/v1/pricing/batch\",\n    headers={\"X-Api-Key\": MYSTARS_API_KEY},\n    params={\"type\": \"stars\", \"quantities\": \"50,100,500\", \"payment_currency\": \"usdt_ton\"},\n)\nresp.raise_for_status()\nfor q in resp.json()[\"quotes\"]:\n    print(q[\"quantity\"], q[\"amount\"])\n"
      responses:
        '200':
          description: One quote per requested quantity (deduped, ascending).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/QuoteBatch'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/RateLimited'
        '503':
          $ref: '#/components/responses/Unavailable'
  /v1/currencies:
    get:
      tags:
      - Pricing
      operationId: listCurrencies
      summary: List payment currencies
      description: The two on-chain currencies you can pay in.
      x-codeSamples:
      - lang: shell
        label: cURL
        source: "curl https://api.mystars.tg/v1/currencies \\\n  -H \"X-Api-Key: $MYSTARS_API_KEY\"\n"
      - lang: typescript
        label: TypeScript SDK
        source: 'import { MyStarsClient } from "@mystars-tg/faas-sdk";


          const client = MyStarsClient.production(process.env.MYSTARS_API_KEY!);


          const currencies = await client.listCurrencies();

          console.log(currencies);

          '
      - lang: python
        label: Python SDK
        source: 'import os


          from mystars_faas import MyStarsClient


          client = MyStarsClient.production(os.environ["MYSTARS_API_KEY"])


          currencies = client.list_currencies()

          print(currencies)

          '
      - lang: python
        label: Python (HTTP)
        source: "import requests\n\nresp = requests.get(\n    \"https://api.mystars.tg/v1/currencies\",\n    headers={\"X-Api-Key\": MYSTARS_API_KEY},\n)\nresp.raise_for_status()\nprint(resp.json())\n"
      responses:
        '200':
          description: Supported payment currencies.
          content:
            application/json:
              schema:
                type: object
                required:
                - currencies
                properties:
                  currencies:
                    type: array
                    items:
                      type: object
                      required:
                      - code
                      - chain
                      - name
                      properties:
                        code:
                          $ref: '#/components/schemas/PaymentCurrency'
                        chain:
                          type: string
                          example: ton
                        name:
                          type: string
                          example: GRAM
        '401':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/RateLimited'
  /v1/products:
    get:
      tags:
      - Pricing
      operationId: listProducts
      summary: List available products
      description: 'The product catalog — the two product **types** you can sell and the

        buyable shape of each. Static, price-free metadata (call `GET /v1/pricing`

        for a price): use it to build your own catalog/UI and to learn the bounds

        the order endpoints enforce.


        Each entry''s `parameter` names the request field to send to `/v1/pricing`

        and `/v1/orders` (`quantity` for stars, `months` for premium). A `null`

        `values` means a continuous integer range `[min, max]` (stars — any

        quantity in range, no fixed denominations); a non-null `values` is the

        exact allowed set (premium — `[3, 6, 12]`).

        '
      x-codeSamples:
      - lang: shell
        label: cURL
        source: "curl https://api.mystars.tg/v1/products \\\n  -H \"X-Api-Key: $MYSTARS_API_KEY\"\n"
      - lang: typescript
        label: TypeScript SDK
        source: 'import { MyStarsClient } from "@mystars-tg/faas-sdk";


          const client = MyStarsClient.production(process.env.MYSTARS_API_KEY!);


          const products = await client.listProducts();

          console.log(products);

          '
      - lang: python
        label: Python SDK
        source: 'import os


          from mystars_faas import MyStarsClient


          client = MyStarsClient.production(os.environ["MYSTARS_API_KEY"])


          products = client.list_products()

          print(products)

          '
      - lang: python
        label: Python (HTTP)
        source: "import requests\n\nresp = requests.get(\n    \"https://api.mystars.tg/v1/products\",\n    headers={\"X-Api-Key\": MYSTARS_API_KEY},\n)\nresp.raise_for_status()\nprint(resp.json())\n"
      responses:
        '200':
          description: The product catalog.
          content:
            application/json:
              schema:
                type: object
                required:
                - products
                properties:
                  products:
                    type: array
                    items:
                      $ref: '#/components/schemas/Product'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/RateLimited'
components:
  responses:
    BadRequest:
      description: Malformed request.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Unavailable:
      description: 'A required source was temporarily unavailable — either the price source,

        or recipient eligibility could not be verified right now. **Retryable**:

        reuse the same `Idempotency-Key` and try again shortly. No order is created

        and you are not charged.

        '
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    RateLimited:
      description: 'A rate limit was reached — the per-minute request budget, the tighter

        pricing/recipient-check probe cap (60 req/min), the daily order cap, or the

        per-recipient flood guard. See **Rate limits** in the overview. The

        per-minute-budget responses also carry `RateLimit-*` + `Retry-After` headers.

        '
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: rate_limited
              message: rate limit exceeded
    Unauthorized:
      description: Missing or invalid `X-Api-Key`.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  schemas:
    Product:
      type: object
      required:
      - type
      - name
      - parameter
      - min
      - max
      - values
      properties:
        type:
          type: string
          description: The product type — pass this as `type` to `/v1/pricing` and `/v1/orders`.
          enum:
          - stars
          - premium
        name:
          type: string
          description: Human-readable product name.
          example: Telegram Stars
        parameter:
          type: string
          description: 'The request field that carries the amount for this product — `quantity` for stars, `months` for premium.

            '
          enum:
          - quantity
          - months
        min:
          type: integer
          description: Smallest buyable value (inclusive).
          example: 50
        max:
          type: integer
          description: Largest buyable value (inclusive).
          example: 1000000
        values:
          type:
          - array
          - 'null'
          items:
            type: integer
          description: 'The exact allowed values when the product is a fixed set (premium → `[3, 6, 12]`); `null` when any integer in `[min, max]` is valid (stars).

            '
          example: null
    QuoteBatch:
      type: object
      required:
      - type
      - currency
      - quotes
      - usdt_per_ton
      - quoted_at
      - valid_until
      properties:
        type:
          type: string
          enum:
          - stars
          description: Batch pricing is Stars-only.
        currency:
          $ref: '#/components/schemas/PaymentCurrency'
        quotes:
          type: array
          description: One entry per requested quantity (deduped, ascending).
          items:
            type: object
            required:
            - quantity
            - amount
            - fee
            properties:
              quantity:
                type: integer
                description: The number of Stars this entry priced.
                example: 500
              amount:
                type: string
                description: 'The full, all-in total to pay for this quantity, as a decimal string in the top-level `currency` — identical to what `GET /v1/pricing` returns for the same quantity.

                  '
                example: '5.757'
              fee:
                description: 'For `usdt_ton` only: the same processing-fee itemisation as `GET /v1/pricing` (already included in `amount`). `null` for `ton`.'
                oneOf:
                - $ref: '#/components/schemas/FeeBreakdown'
                - type: 'null'
        usdt_per_ton:
          type: string
          nullable: true
          description: Indicative USDT per 1 GRAM (informational; the field name `usdt_per_ton` is frozen for wire compatibility; `null` if unavailable).
          example: '2.85'
        quoted_at:
          type: string
          format: date-time
        valid_until:
          type: string
          format: date-time
          description: Re-quote hint — prices are locked only at order creation.
    FeeBreakdown:
      type: object
      description: Itemisation of the `usdt_ton` processing fee that is ALREADY part of the all-in amount. `subtotal + processing_fee == total == amount`. Pass-through swap cost only — it does not reveal our cost basis or markup. Only `total` (= `amount`) is binding — the `subtotal`/`processing_fee` split is informational and may shift by a cent with the live FX rate.
      required:
      - subtotal
      - processing_fee
      - total
      - description
      - currency
      properties:
        subtotal:
          type: string
          description: The item price before the processing fee, as a decimal string (USDT).
          example: '13.18'
        processing_fee:
          type: string
          description: The 1% DEX swap fee + 0.5 GRAM swap gas, combined and rounded up to the cent, as a decimal string (USDT).
          example: '0.92'
        total:
          type: string
          description: subtotal + processing_fee — equals `amount`. Decimal string (USDT).
          example: '14.1'
        description:
          type: string
          description: Human-readable label for the fee components.
          example: 1% swap + 0.5 GRAM gas
        currency:
          type: string
          enum:
          - usdt
          description: The unit of the fee amounts (always `usdt`).
    PaymentCurrency:
      type: string
      enum:
      - ton
      - usdt_ton
      default: ton
      description: '`ton` = GRAM (ex TON), `usdt_ton` = USDT (TON).'
    Quote:
      type: object
      required:
      - type
      - quantity
      - months
      - amount
      - currency
      - fee
      - usdt_per_ton
      - quoted_at
      - valid_until
      properties:
        type:
          type: string
          description: The product this quote priced — echoed back from your request.
          enum:
          - stars
          - premium
        quantity:
          type:
          - integer
          - 'null'
          description: 'The number of Stars priced (when `type=stars`); `null` for Premium.

            '
          example: 500
        months:
          type:
          - integer
          - 'null'
          description: 'The Premium subscription length in months priced (when `type=premium`); `null` for Stars.

            '
          example: null
        amount:
          type: string
          description: 'The full, all-in total to pay, as a decimal string in `currency`. Nothing else to add — send exactly this amount on-chain.

            '
          example: '5.757'
        currency:
          $ref: '#/components/schemas/PaymentCurrency'
        fee:
          description: 'For `usdt_ton` only: an itemisation of the processing fee already INCLUDED in `amount` (1% DEX swap fee + 0.5 GRAM swap gas). `null` for `ton`. It does NOT add to `amount` — `fee.total` equals `amount`.'
          oneOf:
          - $ref: '#/components/schemas/FeeBreakdown'
          - type: 'null'
        usdt_per_ton:
          type: string
          nullable: true
          description: 'The current indicative USDT per 1 GRAM (the field name `usdt_per_ton` is frozen for wire compatibility) — public market data you can use to convert GRAM↔USDT in your own interface. `null` if the rate is momentarily unavailable. This is NOT the amount you pay (that is `amount`); it is informational only.

            '
          example: '2.85'
        quoted_at:
          type: string
          format: date-time
          description: Server timestamp (ISO 8601) when this quote was computed.
          example: '2026-06-21T14:03:12.000Z'
        valid_until:
          type: string
          format: date-time
          description: 'A RE-QUOTE HINT (ISO 8601): the price tracks the market and is recomputed about every minute, so re-fetch after this time. It is **not** a price lock — the price is locked only when you create an order (`POST /v1/orders`), which fixes the amount for the order''s payment window. Read `expires_at` on the order for that deadline — it is authoritative; do not assume a fixed duration.

            '
          example: '2026-06-21T14:04:12.000Z'
    Error:
      type: object
      required:
      - error
      properties:
        error:
          type: object
          required:
          - code
          - message
          properties:
            code:
              type: string
              description: Stable machine error code to branch on.
              enum:
              - bad_request
              - unauthorized
              - forbidden
              - not_found
              - conflict
              - recipient_ineligible
              - rate_limited
              - unavailable
              - internal
            message:
              type: string
              description: Human-readable description.
            telegram_message:
              type: string
              description: A verbatim user-facing message from Fragment, when present.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-Api-Key
      description: 'Your secret API key. Get one from [@my_stars_tg_bot](https://t.me/my_stars_tg_bot) → **API access**, then send it in the `X-Api-Key` header on every request. Treat it like a password — anyone with the key can create orders on your tenant, read your order history, and cancel unpaid orders. Each order is settled by its own on-chain payment, so the key by itself cannot move funds. Rotate it any time with `/api_rotate` in the bot.

        '
externalDocs:
  description: MyStars FaaS API documentation
  url: https://mystars.tg/docs