---
title: "Get a product"
method: GET
path: "/api/products/{id}"
tags: ["products"]
---

# Get a product

`GET /api/products/{id}`

## Request

- Base URL: `https://api.depixapp.com`
- URL: `https://api.depixapp.com/api/products/{id}`
- Auth: HTTP bearer

Full product row with checkout aggregates. Requires scope `merchant_read` on the API-key path.

## Path parameters

- `id` string, required

## Response `200`

Product detail.

- ProductGetResponse: Single product with checkout aggregates. NOTE: `product` mirrors the full database row (SELECT *), so additional columns may appear as the schema evolves — additionalProperties is intentionally open here.
  - `product` object, required: Full product row.
    - `id` string: Product id (prd_*).
    - `merchant_id` string: Owning merchant id.
    - `charge_state` ChargeState: Derived payable state of a charge (kind='charge' product). Settlement is FIFO over the due-date series: the current cycle is selected by the number of cycles that EVER settled (a checkout that reached approved or completed — a later reversal does not rewind the series; re-billing a reversed cycle is the merchant's decision, not the API's) PLUS un-expired pending QRs, since a minted QR reserves the cycle it was priced for and two open QRs must never bill the same competência; the total is base + one-time fine + linear pro-rata interest (base × monthlyBps/10000 × daysLate/30), computed on the América/São_Paulo calendar (the due date itself is not late; lateness starts the next day) and clamped at the R$ 6.000 per-transaction cap.
      - `settled` boolean, required: True when a one-time charge is fully paid (every other field is then absent).
      - `cycle_due_date` string: Due date (YYYY-MM-DD) of the current — oldest unsettled — cycle.
      - `days_late` integer: Days past the due date on the São Paulo calendar (0 = not late).
      - `base_cents` integer: Configured base amount in cents.
      - `fine_cents` integer: One-time late fine in cents (0 when not late).
      - `interest_cents` integer: Accrued pro-rata interest in cents (0 when not late).
      - `total_today_cents` integer: What a QR created now charges: base + fine + interest, capped at 600000.
      - `capped` boolean: True when base + encargos exceeded the per-transaction cap and the total was clamped.
      - `status` 'late' | 'due_today' | 'upcoming': Cycle status.
      - `open_past_due_cycles` integer: Cycles already due and still unpaid (>1 means competências accumulated).
      - `in_flight` boolean: True when a processing checkout exists (Pix paid, settling) — present on list rows only.
    - `slug` string: URL slug.
    - `name` string, nullable: Product name.
    - `amount` integer: Price in cents.
    - `description` string, nullable: Product description.
    - `image_url` string, nullable: Product image URL.
    - `callback_url` string, nullable: Webhook endpoint for this product's checkouts.
    - `redirect_url` string, nullable: Post-payment redirect.
    - `metadata` union: Metadata (parsed to an object when valid JSON).
      - object
      - string
    - `expires_in` integer: Checkout QR lifetime in seconds.
    - `active` 0 | 1: 1 = active, 0 = deactivated (raw SQLite boolean).
    - `is_live` 0 | 1: 1 = live, 0 = sandbox (raw SQLite boolean).
    - `position` integer, nullable: Pinned position on the public page (null = not pinned).
    - `created_at` string: Creation timestamp (RFC 3339 UTC).
    - `updated_at` string: Last update timestamp (RFC 3339 UTC).
  - `stats` object, required: Checkout aggregates for the product.
    - `total` integer, required: Total checkouts created from this product.
    - `completed` integer, required: Completed checkouts.
    - `pending` integer, required: Pending checkouts.
    - `completed_amount` integer, required: Sum of completed amounts in cents.

## Other responses

- `401`: Missing/invalid credentials. `invalid_api_key` for a failed sk_* lookup (revoked/expired/unknown); `invalid_token` for a bad or missing JWT/Authorization header.
- `403`: The API key lacks the `merchant_read` scope required by this operation. May also be `account_blocked`, or an operation-specific 403 — see the error catalog.
- `404`: Product not found — includes rows owned by another account (ownership is never disclosed).
- `429`: Rate limited. Beyond the endpoint's own limit when set (`rate_limited`), API-key calls are also bounded by the shared per-merchant budget (`merchant_rate_limited`, default 30 req/min across all endpoints) and by the key's own rate limit when configured (`rate_limited`). Retry after `retry_after` seconds (also in the Retry-After header).

---

[API](https://skmtc.dev/depixapp/apis/depix-api.md) · [All operations](https://skmtc.dev/depixapp/apis/depix-api/llms.txt) · [OpenAPI document](https://skmtc.dev/depixapp/apis/depix-api/revisions/04094536dd0f?raw)
