# Product details

`GET https://api.tentary.com/v1/products/{product_id}`

Source: https://tentary.com/en/help/api/get-product/
Area: Products and files
MCP tool: `get_product`. Reads only. Changes nothing in the account.

---

One product in full:

- sales page texts (HTML), prices and installment plans, limited offer, variants and images
- content blocks: texts, images, videos, audio, files (with `file_id` and name, but no download links), video links and buttons
- linked course, bundle contents, checkout fields, stock and availability
- sales page URL, checkout URL (live products only) and admin link

A buyer of a variant gets the files of that variant. The files of the product itself then only reach buyers from before the variants existed.

Times are UTC. `link_url` and `access_text_html` are not shown. The fields have the same names and formats as in [`PATCH /v1/products/{product_id}`](https://tentary.com/en/help/api/update-product/).

## Authorization

`Authorization: Bearer <API key>`

A personal API key (tnt_...). Create it in the Tentary app on the page AI & API.

## Path parameters

- `product_id` (integer, required, path): The id from list_products. Limits: min 1.

## Response

- `id` (integer): The ID.
- `name` (string): Product name.
- `type` (string): The type. Allowed values: `download`, `link`, `newsletter`, `booking`, `course`, `bundle`, `external`.
- `status` (string): archived = deleted. Allowed values: `live`, `draft`, `archived`.
- `price` (string): Decimal string, like "19.90". Normal price.
- `current_price` (string): Decimal string, like "19.90". What buyers pay now: a running limited offer replaces the price.
- `price_is_from` (boolean): true = the product has variants and price is the lowest variant price.
- `billing` (string): How the buyer pays: one_time, subscription or installments. Allowed values: `one_time`, `subscription`.
- `billing_interval_months` (integer, can be null): Subscription: months between payments.
- `hide_in_shop` (boolean): true = not shown on the shop page.
- `sales` (integer): Paid orders and orders in payment of all time, refunded and free orders included.
- `paid_sales` (integer): Orders with an amount above 0.
- `url` (string<uri>): Sales page.
- `checkout_url` (string<uri>, can be null): Checkout page. Only for live products.
- `admin_url` (string<uri>): The product in the Tentary app.
- `description_html` (string): Sales page text.
- `checkout_description_html` (string): Extra text on the checkout page.
- `checkout_banner_url` (string, can be null): Banner image on the checkout page.
- `buy_button_text` (string): Empty = default text.
- `images` (array of string): The first is the cover.
- `currency` (string): Currency code, like EUR.
- `compare_at_price` (string, can be null): Decimal string, like "19.90". Crossed-out old price.
- `intro_price` (string, can be null): Decimal string, like "19.90". Subscription: price of the first period.
- `installment_plans` (array of object): Payment plans that buyers can choose.
  - `count` (integer): Number of payments.
  - `amount` (string): Decimal string, like "19.90". Per payment.
- `limited_offer` (object, can be null): A lower price for a time. null = none.
  - `price` (string, can be null): Decimal string, like "19.90".
  - `starts_at` (string<date-time>, can be null): UTC, like 2026-01-31T14:05:00Z.
  - `ends_at` (string<date-time>, can be null): UTC, like 2026-01-31T14:05:00Z.
  - `running` (boolean): true = the offer price applies now.
  - `countdown` (object, can be null): Countdown to the end of the offer. null = none.
    - `style` (string): classic, classic_sticky, slim, slim_sticky, card_classic, card_slim or card_special_1.
    - `text` (string, can be null): The text.
    - `color` (string): Background color, hex.
    - `secondary_color` (string, can be null): Text or card color, hex.
- `variants` (array of object): Options that buyers choose at checkout.
  - `id` (integer): The ID.
  - `name` (string): The name.
  - `price` (string, can be null): Decimal string, like "19.90".
  - `stock_limit` (integer, can be null): null = no limit.
  - `course` (object, can be missing, can be null): course products only.
    - `id` (integer): The ID.
    - `name` (string): The name.
  - `course_id` (integer, can be missing, can be null): course products only.
  - `content` (array of object, can be missing): download products only.
    - One of:
      - Variant type: text:
        - `type` (string): The block type. Allowed values: `text`.
        - `html` (string): The text as HTML.
        - `folder` (string, can be null): Folder name. Blocks with the same folder show together.
      - Variant type: image, video:
        - `type` (string): The block type. Allowed values: `image`, `video`.
        - `file_id` (integer): The file ID (from upload_file).
        - `name` (string): The name.
        - `file_type` (string): File extension, like pdf.
        - `size_bytes` (integer, can be null): File size in bytes.
        - `folder` (string, can be null): Folder name. Blocks with the same folder show together.
      - Variant type: audio, file:
        - `type` (string): The block type. Allowed values: `audio`, `file`.
        - `file_id` (integer): The file ID (from upload_file).
        - `name` (string): The name.
        - `description` (string): file: text under the download. audio: title above the player.
        - `file_type` (string): File extension, like pdf.
        - `size_bytes` (integer, can be null): File size in bytes.
        - `folder` (string, can be null): Folder name. Blocks with the same folder show together.
      - Variant type: video_embed:
        - `type` (string): The block type. Allowed values: `video_embed`.
        - `url` (string): YouTube, Vimeo or Loom link.
        - `folder` (string, can be null): Folder name. Blocks with the same folder show together.
      - Variant type: button:
        - `type` (string): The block type. Allowed values: `button`.
        - `label` (string): The text that buyers see.
        - `url` (string): The link.
        - `folder` (string, can be null): Folder name. Blocks with the same folder show together.
- `content` (array of object): download, link and booking: what buyers get, in order.
  - One of:
    - Variant type: text:
      - `type` (string): The block type. Allowed values: `text`.
      - `html` (string): The text as HTML.
      - `folder` (string, can be null): Folder name. Blocks with the same folder show together.
    - Variant type: image, video:
      - `type` (string): The block type. Allowed values: `image`, `video`.
      - `file_id` (integer): The file ID (from upload_file).
      - `name` (string): The name.
      - `file_type` (string): File extension, like pdf.
      - `size_bytes` (integer, can be null): File size in bytes.
      - `folder` (string, can be null): Folder name. Blocks with the same folder show together.
    - Variant type: audio, file:
      - `type` (string): The block type. Allowed values: `audio`, `file`.
      - `file_id` (integer): The file ID (from upload_file).
      - `name` (string): The name.
      - `description` (string): file: text under the download. audio: title above the player.
      - `file_type` (string): File extension, like pdf.
      - `size_bytes` (integer, can be null): File size in bytes.
      - `folder` (string, can be null): Folder name. Blocks with the same folder show together.
    - Variant type: video_embed:
      - `type` (string): The block type. Allowed values: `video_embed`.
      - `url` (string): YouTube, Vimeo or Loom link.
      - `folder` (string, can be null): Folder name. Blocks with the same folder show together.
    - Variant type: button:
      - `type` (string): The block type. Allowed values: `button`.
      - `label` (string): The text that buyers see.
      - `url` (string): The link.
      - `folder` (string, can be null): Folder name. Blocks with the same folder show together.
- `course` (object, can be null): The course that buyers get.
  - `id` (integer): The ID.
  - `name` (string): The name.
- `bundle_items` (array of object): bundle products only.
  - `product_id` (integer): The product ID.
  - `variant_id` (integer, can be null): The variant ID, if any.
  - `name` (string): The name.
  - `variant` (string, can be null): The variant name, if any.
- `custom_fields` (array of object): Extra fields at checkout.
  - `label` (string): The text that buyers see.
  - `type` (string): The type.
  - `required` (boolean): true = buyers must fill it.
- `stock_limit` (integer, can be null): null = no limit.
- `available_from` (string<date>, can be null): Like 2026-01-31.
- `available_until` (string<date>, can be null): Like 2026-01-31.
- `access_days` (integer, can be null): Access ends this many days after purchase. null = no end.
- `access_starts_on` (string<date>, can be null): Like 2026-01-31. Buyers get access from this day at the earliest.
- `lead_magnet` (boolean): true = a free product that grows the e-mail list.
- `withdrawal_days` (integer): Withdrawal period shown at checkout, in days.
- `url_slug` (string, can be null): The address part of the URL.
- `marketing_emails` (boolean): true = buyers are subscribed to the marketing e-mails.
- `ebook` (boolean): true = taxed as an e-publication.
- `pdf_stamp` (boolean): true = PDFs are stamped with the buyer's e-mail address.
- `login_protection` (boolean): true = buyers must log in to open the product.
- `show_in_search` (boolean): true = search engines can show the sales page.
- `coupon_field` (boolean): true = checkout shows the coupon field.
- `external_url` (string, can be missing): external products only.
- `course_id` (integer, can be missing, can be null): course products only.

## Example request

```bash
curl "https://api.tentary.com/v1/products/101" \
  -H "Authorization: Bearer $TENTARY_API_KEY"
```

## Example response

```json
{
  "id": 101,
  "name": "Yoga Basics E-Book",
  "type": "download",
  "status": "live",
  "price": "19.00",
  "current_price": "19.00",
  "price_is_from": false,
  "billing": "one_time",
  "billing_interval_months": null,
  "hide_in_shop": false,
  "sales": 1,
  "paid_sales": 1,
  "url": "https://lena-yoga.mytentary.com/p/yoga-basics",
  "checkout_url": "https://lena-yoga.mytentary.com/p/yoga-basics/checkout",
  "admin_url": "https://app.tentary.com/products/edit/101",
  "description_html": "<p>Learn the 20 most important poses, step by step.</p>",
  "checkout_description_html": "",
  "checkout_banner_url": null,
  "buy_button_text": "",
  "images": [
    "https://img.tentary.com/demo-ebook-cover.jpg"
  ],
  "currency": "EUR",
  "compare_at_price": null,
  "intro_price": null,
  "installment_plans": [
    {
      "count": 2,
      "amount": "9.50"
    }
  ],
  "limited_offer": null,
  "variants": [],
  "content": [
    {
      "type": "file",
      "file_id": 501,
      "name": "Yoga Basics",
      "description": "The e-book as PDF, 84 pages.",
      "file_type": "pdf",
      "size_bytes": 4812330,
      "folder": null
    },
    {
      "type": "video",
      "file_id": 502,
      "name": "Welcome",
      "file_type": "mp4",
      "size_bytes": 91204117,
      "folder": null
    }
  ],
  "course": null,
  "bundle_items": [],
  "custom_fields": [
    {
      "label": "Your yoga level",
      "type": "text",
      "required": false
    }
  ],
  "stock_limit": null,
  "available_from": null,
  "available_until": null,
  "access_days": null,
  "access_starts_on": null,
  "lead_magnet": false,
  "withdrawal_days": 14,
  "url_slug": "yoga-basics",
  "marketing_emails": true,
  "ebook": true,
  "pdf_stamp": true,
  "login_protection": false,
  "show_in_search": true,
  "coupon_field": true
}
```
