> ## Documentation Index
> Fetch the complete documentation index at: https://docs.taberna.io/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Taberna is a crypto payments API. Amounts are priced in fiat (USD or EUR) and paid in crypto.
> Fiat amounts are ALWAYS decimal strings ("9.99"), never numbers. Crypto amounts are integer strings in the asset's smallest unit.
> Authenticate merchant endpoints with `Authorization: Bearer tbrn_live_...`. Every key is bound to one store and carries an explicit scope set, so never pass a store id to a /v1 endpoint.
> A 401 means the credential is bad; a 403 means the key lacks a scope. Never retry or re-authenticate on a 403 — surface it as a configuration error.
> The /v1/checkouts endpoints are deliberately unauthenticated and run in the buyer's browser. Never send an API key to a browser.
> Verify webhook signatures over the RAW request body before parsing JSON, and treat delivery as at-least-once: handlers must be idempotent.
> Never grant value based on a browser redirect to successUrl. Fulfil on a signature-verified webhook, or on a server-side read of GET /v1/orders/{id} or GET /v1/invoices/{id}.
> There is no test mode: every payment method is a live chain moving real funds.
> A merchant can run an entire shop with no code: the dashboard creates products and invoices, and every store can host a storefront at {slug}.taberna.io with its own theme, sections, branding and optional custom domain. Never assume the reader has an API integration.
> Taberna issues no refunds and performs no KYC. A refund is something the merchant sends from their own payout wallet, off-platform.

# Retrieve the current store

> "Whoami" for an API key: the store the key belongs to and the scopes it was granted. Any valid key may call this, whatever it was granted — `scopes` is the calling key's own, so an integration can check what it may do without provoking a 403 to find out.

`storefrontUrl` is the canonical public origin (an active custom domain wins over the slug subdomain), and null while the storefront is unclaimed or switched off.



## OpenAPI

````yaml /api-reference/openapi.json get /v1/store
openapi: 3.1.0
info:
  title: Taberna API
  description: >-
    Accept crypto payments for digital goods. Create orders and invoices, hand
    the buyer a hosted checkout link, and let webhooks tell you when the money
    lands.


    Authenticate merchant endpoints with a store API key as a bearer token
    (`Authorization: Bearer tbrn_live_…`). Every key is bound to one store and
    carries an explicit set of scopes; the scope a route requires is stated in
    its description and in the `x-required-scope` extension. A key without the
    scope gets a 403 — mint one with the scope rather than retrying.


    The Checkout endpoints are the exception: they are unauthenticated and meant
    to be called from the buyer's browser. Possession of the checkout id is the
    credential there, so never ship an API key to a page.


    Conventions: ids in links are short ids; fiat amounts are decimal strings
    ("9.99"); crypto amounts are integer strings in the asset's smallest unit;
    timestamps are ISO-8601 UTC. Errors carry `{ "error": "…" }` unless
    documented otherwise.
  version: 1.0.0
servers:
  - url: https://api.taberna.io
    description: Taberna API
security: []
tags:
  - name: Orders
    description: Carts of products, paid through a hosted checkout.
  - name: Invoices
    description: Merchant-issued bills with their own payment page.
  - name: Invoice Templates
    description: Saved invoice presets, referenced by `templateId` when creating one.
  - name: Products
    description: Catalogue reads and delivery stock top-ups.
  - name: Store
    description: What the calling API key is and what it may do.
  - name: Webhook Deliveries
    description: Delivery history for the store webhook, and replay.
  - name: Checkout
    description: >-
      Buyer-facing hosted-page endpoints. Unauthenticated by design — never send
      an API key.
paths:
  /v1/store:
    get:
      tags:
        - Store
      summary: Retrieve the current store
      description: >-
        "Whoami" for an API key: the store the key belongs to and the scopes it
        was granted. Any valid key may call this, whatever it was granted —
        `scopes` is the calling key's own, so an integration can check what it
        may do without provoking a 403 to find out.


        `storefrontUrl` is the canonical public origin (an active custom domain
        wins over the slug subdomain), and null while the storefront is
        unclaimed or switched off.
      operationId: getV1Store
      responses:
        '200':
          description: The store behind the API key.
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: string
                    format: uuid
                    description: >-
                      The store's id. Formatted as a UUID, e.g.
                      `3f1a9c2e-7b04-4d8e-9a6f-2c5b1e0d7a83`.
                    example: 3f1a9c2e-7b04-4d8e-9a6f-2c5b1e0d7a83
                  name:
                    type: string
                    description: Store name, as shown to buyers.
                    example: Acme Digital
                  image:
                    anyOf:
                      - type: string
                      - type: 'null'
                    description: Absolute URL of the store logo, or null when it has none.
                    example: https://cdn.taberna.io/stores/acme.png
                  enabledPaymentMethods:
                    type: array
                    items:
                      type: string
                      enum:
                        - sol
                        - usdc_solana
                        - eth_base
                        - usdc_base
                        - usdt_base
                        - eth
                        - usdc_ethereum
                        - usdt_ethereum
                        - matic
                        - usdc_polygon
                        - usdt_polygon
                        - bnb
                        - usdt_bnb
                    description: >-
                      Tokens this store accepts; a checkout may only start an
                      attempt on one of these. The token and chain the buyer
                      pays with, named `<asset>_<chain>`; a bare `sol`, `eth`,
                      `matic` or `bnb` is that chain's native coin. So
                      `usdc_base` is USDC on Base and `eth` is ether on Ethereum
                      mainnet. The `matic` key is Polygon's native coin, now
                      called POL — the key keeps its original name and does not
                      change.
                    example:
                      - sol
                      - usdc_solana
                      - usdc_base
                  requireCustomerEmail:
                    type: boolean
                    description: >-
                      Whether the hosted checkout makes the buyer enter an email
                      before paying.
                    example: true
                  createdAt:
                    type: string
                    format: date-time
                    description: >-
                      When the store was created. UTC timestamp in ISO 8601,
                      e.g. `2026-07-29T14:30:00.000Z`.
                    example: '2026-07-29T14:30:00.000Z'
                  slug:
                    anyOf:
                      - type: string
                      - type: 'null'
                    description: >-
                      The store's storefront handle, used as the subdomain. Null
                      while the storefront is unclaimed.
                    example: acme
                  storefrontEnabled:
                    type: boolean
                    description: Whether the public storefront is switched on.
                    example: true
                  scopes:
                    type: array
                    items:
                      type: string
                      enum:
                        - orders:read
                        - orders:write
                        - invoices:read
                        - invoices:write
                        - products:read
                        - products:write
                        - webhooks:read
                        - webhooks:write
                    description: >-
                      The scopes granted to the API key making this call — not
                      everything the store could grant. Permissions on a store
                      API key. Each `:read` scope allows the matching
                      list/retrieve routes and each `:write` the mutating ones;
                      `webhooks:write` covers resending a delivery only, never
                      repointing where events are sent.
                    example:
                      - orders:read
                      - orders:write
                  storefrontUrl:
                    anyOf:
                      - type: string
                      - type: 'null'
                    description: >-
                      The canonical public storefront origin; an active custom
                      domain wins over the slug subdomain. Null while the
                      storefront is unclaimed or switched off, because the host
                      would not resolve.
                    example: https://acme.taberna.io
                required:
                  - id
                  - name
                  - image
                  - enabledPaymentMethods
                  - requireCustomerEmail
                  - createdAt
                  - slug
                  - storefrontEnabled
                  - scopes
                  - storefrontUrl
                description: >-
                  The store behind the calling API key, and what that key may
                  do.
        '401':
          description: >-
            Missing, malformed, revoked or expired API key. The
            `WWW-Authenticate` header names the challenge that failed.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: >-
                      Human-readable explanation of what went wrong. Meant for
                      logs and developers, not for branching — switch on the
                      HTTP status instead.
                    example: Order not found
                required:
                  - error
                description: The standard error body, returned by every failing endpoint.
                example:
                  error: Order not found
        '404':
          description: The key's store no longer exists.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: >-
                      Human-readable explanation of what went wrong. Meant for
                      logs and developers, not for branching — switch on the
                      HTTP status instead.
                    example: Order not found
                required:
                  - error
                description: The standard error body, returned by every failing endpoint.
                example:
                  error: Order not found
      security:
        - bearerAuth: []
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        A store API key, sent as `Authorization: Bearer <key>`.


        A key looks like `tbrn_live_` followed by 48 hex characters, e.g.
        `tbrn_live_4f2a...c91b`. Mint one in the Taberna dashboard under
        Developers → API Keys, tick the scopes the integration needs, and copy
        it there and then — the full value is shown once and only its hash is
        stored, so a lost key is replaced rather than recovered.


        One key belongs to one store and carries a fixed scope set. Send it from
        a server, never from a browser: it can create orders and invoices and
        read every order the store has.

````