<!-- https://pricto.dev/docs/api/get-product-prices · versión en inglés: https://pricto.dev/docs/api/get-product-prices.en.md -->

# Precios actuales de un producto en cada tienda

`GET https://pricto.dev/v1/products/{product_id}/prices`

One row per retailer offer matched to the product: in stock first, then by `price` ascending. Use `as_of` to get the prices that were in force on a past date.

| Créditos | MCP |
|---|---|
| 1 per retailer offer returned | [`get_prices`](/docs/mcp#get_prices) |

## Parámetros

| Parámetro | En | Tipo | Descripción |
|---|---|---|---|
| `product_id` **requerido** | path | `string` | Canonical product ID (`prd_...`). A GTIN is also accepted here and resolved. |
| `max_credits` | query | `number` | Spend at most this many credits on this call. Results are cut to fit and `meta.usage.truncated` is true. |
| `dry_run` | query | `boolean` | Return the quote in `meta.usage` with `data` set to null, without charging. Default: `false`. |
| `retailer` | query | `string` | One or more retailer IDs, comma separated (e.g. `cl-jumbo,cl-unimarc`). |
| `location` | query | `string` | Store ID (`str_...`), administrative area as `CL:13114` (country and comuna CUT code) or a place name ("Las Condes"). Only affects retailers whose prices vary by location; the resolved value is echoed in `meta.location`. |
| `as_of` | query | `string (date)` | Return the prices that were in force at the end of this date instead of the latest. |
| `include_unavailable` | query | `boolean` | Include offers that are out of stock. Default: `true`. |
| `min_confidence` | query | `number` | Only include offers whose match confidence is at least this value. Default 0.85: below it an offer is not grouped with the product automatically. Default: `0.85`. |
| `match_kinds` | query | `string` | Match kinds to include, comma separated. Default `identical`. Add `pack` for offers that are N units of the product (compare by unit price, see `match.pack_ratio`) and `equivalent` for declared substitutes (another brand or lab), which are not the same item. Default: `identical`. |
| `lang` | query | `string` | Response language as a BCP 47 tag (`es`, `es-CL`, `en`, `en-US`...). Supported today: es, en. An unsupported language falls back to English with a warning, never an error. Falls back to `Accept-Language`, then to the account default. The resolved value is in `meta.lang`. |
| `currency` | query | `string` | Add converted amounts in this ISO 4217 currency. `local` (default) returns source currency only. Default: `local`. |

## Respuesta

`200` Prices by retailer.

| Campo | Tipo | Descripción |
|---|---|---|
| `data` **requerido** | `object` |  |
| `data.product` **requerido** | `ProductSummary` |  |
| `data.product.id` **requerido** | `string` |  |
| `data.product.name` **requerido** | `string` |  |
| `data.product.brand` **requerido** | `BrandRef` |  |
| `data.product.brand.id` **requerido** | `string` |  |
| `data.product.brand.name` **requerido** | `string` |  |
| `data.product.category` **requerido** | `CategoryRef` |  |
| `data.product.category.id` **requerido** | `string` |  |
| `data.product.category.label` **requerido** | `string` |  |
| `data.product.category.path` | `string[]` |  |
| `data.product.size` | `object` |  |
| `data.product.gtin` | `string[]` |  |
| `data.product.image_url` | `string \| null` |  |
| `data.product.price_summary` **requerido** | `PriceSummary` |  |
| `data.product.price_summary.currency` **requerido** | `string` |  |
| `data.product.price_summary.min` **requerido** | `number \| null` |  |
| `data.product.price_summary.max` **requerido** | `number \| null` |  |
| `data.product.price_summary.median` | `number \| null` |  |
| `data.product.price_summary.offers_count` **requerido** | `integer` |  |
| `data.product.price_summary.retailers_count` **requerido** | `integer` |  |
| `data.product.price_summary.best` | `object \| null` |  |
| `data.product.price_summary.observed_at` | `string (date-time) \| null` |  |
| `data.product.price_summary.converted` | `object` |  |
| `data.product.score` | `number` | Relevance score, search only. |
| `data.prices` **requerido** | `RetailerPrice[]` |  |
| `data.prices[].currency` **requerido** | `string` |  |
| `data.prices[].price` **requerido** | `number` |  |
| `data.prices[].list_price` **requerido** | `number` |  |
| `data.prices[].sale_price` | `number \| null` |  |
| `data.prices[].card_price` | `number \| null` | Convenience: the lowest price in conditional_prices that requires a payment method or membership. |
| `data.prices[].card_label` | `string \| null` |  |
| `data.prices[].conditional_prices` | `ConditionalPrice[]` | Every price that requires a condition other than quantity (payment method, loyalty tier, app, coupon), as published. |
| `data.prices[].conditional_prices[].kind` **requerido** | `string` | Valores / values: `payment_method`, `membership`, `app_only`, `coupon`, `other`. |
| `data.prices[].conditional_prices[].label` **requerido** | `string` | As shown by the retailer. |
| `data.prices[].conditional_prices[].price` **requerido** | `number` |  |
| `data.prices[].conditional_prices[].payment_method` | `string \| null` |  |
| `data.prices[].conditional_prices[].membership_tier` | `string \| null` |  |
| `data.prices[].conditional_prices[].installments_count` | `integer \| null` |  |
| `data.prices[].conditional_prices[].interest_free` | `boolean \| null` |  |
| `data.prices[].unit_price` | `object \| null` |  |
| `data.prices[].unit_price.amount` **requerido** | `number` |  |
| `data.prices[].unit_price.per` **requerido** | `string` | Valores / values: `kg`, `l`, `unit`, `m`, `m2`. |
| `data.prices[].promotions` | `Promotion[]` |  |
| `data.prices[].promotions[].type` **requerido** | `string` | Valores / values: `multi_buy`, `nth_unit`, `percent_off`, `amount_off`, `bundle`, `gift`, `other`. |
| `data.prices[].promotions[].label` **requerido** | `string` | As shown by the retailer, e.g. "2 x $2.990". |
| `data.prices[].promotions[].min_quantity` | `integer \| null` |  |
| `data.prices[].promotions[].effective_unit_price` | `number \| null` | Price per item when the promotion applies. |
| `data.prices[].promotions[].requires_card` | `string \| null` | Payment method required, if any. |
| `data.prices[].promotions[].valid_until` | `string (date) \| null` |  |
| `data.prices[].availability` **requerido** | `string` | Valores / values: `in_stock`, `out_of_stock`, `limited`, `unknown`. |
| `data.prices[].tax_included` | `boolean` | As shown by the retailer (observed). |
| `data.prices[].tax_rate` | `number \| null` | Derived. Main VAT rate for this country and category, null when not known. |
| `data.prices[].price_ex_tax` | `number \| null` | Derived from price and tax_rate. Null when tax_rate is null. |
| `data.prices[].tax_rule_id` | `string \| null` | Versioned rule used to derive tax_rate. |
| `data.prices[].other_taxes_included` | `boolean \| null` | True when other taxes remain in price_ex_tax (e.g. Chile IABA on sweetened drinks). |
| `data.prices[].installments` | `object` |  |
| `data.prices[].observed_at` **requerido** | `string (date-time)` |  |
| `data.prices[].observed_local_date` | `string (date)` | Capture date in the retailer time zone. Daily series use this date. |
| `data.prices[].capture_method` **requerido** | `string` | How the price was obtained, part of the provenance with `url` and `observed_at`. `public_page`: read from the retailer's public web page (HTML, JSON-LD or the page payload). `public_api`: an open, unauthenticated JSON endpoint of the retailer's own site. `retailer_feed`: delivered by the retailer under an agreement. `open_data`: a public dataset published by a government or third party. Valores / values: `public_page`, `public_api`, `retailer_feed`, `open_data`. |
| `data.prices[].quality_status` | `string` | `warning` when a validation flagged the observation (price jump, zero, unusual unit). Quarantined observations are never served. Valores / values: `ok`, `warning`. |
| `data.prices[].quality_flags` | `string[]` | Why the price was flagged. The price is delivered as published, never corrected. `discount_over_85`: more than 85% off the list price. `round_price_low`: a round price of CLP 1,000 or less. Both often mean a placeholder price or a store error. |
| `data.prices[].corrected` | `boolean` | True when the observation was amended after capture (the original is kept). |
| `data.prices[].converted` | `Converted` |  |
| `data.prices[].converted.currency` **requerido** | `string` |  |
| `data.prices[].converted.price` **requerido** | `number` |  |
| `data.prices[].converted.list_price` | `number \| null` |  |
| `data.prices[].converted.card_price` | `number \| null` |  |
| `data.prices[].converted.unit_price` | `number \| null` |  |
| `data.prices[].converted.fx_rate` **requerido** | `number` | Units of target currency per unit of source currency. |
| `data.prices[].converted.fx_date` **requerido** | `string (date)` | Publication date of the rate used (last published on or before the observation date). |
| `data.prices[].converted.fx_source` | `string` |  |
| `data.prices[].converted.fx_method` | `string` | Valores / values: `direct`, `cross`. |
| `data.prices[].retailer` **requerido** | `RetailerRef` |  |
| `data.prices[].retailer.id` **requerido** | `string` |  |
| `data.prices[].retailer.name` **requerido** | `string` |  |
| `data.prices[].offer_id` **requerido** | `string` |  |
| `data.prices[].store_id` | `string \| null` | Null when the price is national/online. |
| `data.prices[].url` **requerido** | `string (uri)` |  |
| `data.prices[].title_original` **requerido** | `string` |  |
| `data.prices[].seller` | `Seller` | Who sells the offer. On marketplaces it is a third party; `name` is null when the seller is a natural person (no personal data). |
| `data.prices[].seller.id` **requerido** | `string` |  |
| `data.prices[].seller.name` **requerido** | `string \| null` |  |
| `data.prices[].seller.is_retailer_itself` **requerido** | `boolean` |  |
| `data.prices[].match` **requerido** | `Match` | How the offer was linked to the canonical product. |
| `data.prices[].match.method` **requerido** | `string` | `singleton`: the offer matched nothing else and is its own product. Valores / values: `gtin`, `rules`, `model`, `manual`, `singleton`. |
| `data.prices[].match.confidence` **requerido** | `number` |  |
| `data.prices[].match.kind` **requerido** | `string` | `identical`: the same item. `pack`: the offer is N units of the product (`pack_ratio`), comparable by unit price. `equivalent`: a declared substitute of another brand or lab, not the same item. Valores / values: `identical`, `pack`, `equivalent`. |
| `data.prices[].match.pack_ratio` | `number \| null` | Units of the product in the offer, for kind pack. |
| `data.summary` **requerido** | `PriceSummary` |  |
| `data.summary.currency` **requerido** | `string` |  |
| `data.summary.min` **requerido** | `number \| null` |  |
| `data.summary.max` **requerido** | `number \| null` |  |
| `data.summary.median` | `number \| null` |  |
| `data.summary.offers_count` **requerido** | `integer` |  |
| `data.summary.retailers_count` **requerido** | `integer` |  |
| `data.summary.best` | `object \| null` |  |
| `data.summary.best.retailer` | `RetailerRef` |  |
| `data.summary.best.offer_id` | `string` |  |
| `data.summary.best.price` | `number` |  |
| `data.summary.observed_at` | `string (date-time) \| null` |  |
| `data.summary.converted` | `object` |  |
| `data.summary.converted.currency` | `string` |  |
| `data.summary.converted.min` | `number \| null` |  |
| `data.summary.converted.max` | `number \| null` |  |
| `data.summary.converted.fx_rate` | `number` |  |
| `data.summary.converted.fx_date` | `string (date)` |  |
| `data.summary.converted.fx_source` | `string` |  |
| `data.summary.converted.fx_method` | `string` | Valores / values: `direct`, `cross`. |
| `meta` **requerido** | `Meta` |  |

`meta` trae el costo, la fuente para citar, el idioma, la moneda y los avisos (ver [Convenciones](/docs/convenciones)).

## Errores

- [`unauthorized`](/docs/errores#unauthorized)
- [`not_found`](/docs/errores#not_found)

## Ejemplo

```bash
curl "https://pricto.dev/v1/products/2000070000007/prices" \
  -H "Authorization: Bearer sk_test_sandbox"
```
```python
import requests

API_KEY = "sk_test_sandbox"

r = requests.get(
    "https://pricto.dev/v1/products/2000070000007/prices",
    headers={"Authorization": f"Bearer {API_KEY}"},
)
print(r.status_code, r.json())
```
```js
const API_KEY = "sk_test_sandbox";

const res = await fetch("https://pricto.dev/v1/products/2000070000007/prices", {
  headers: { Authorization: `Bearer ${API_KEY}` },
});
console.log(res.status, await res.json());
```

```json
{
  "data": {
    "product": {
      "id": "prd_01colu",
      "name": "Leche entera Colun 1 L",
      "brand": {
        "id": "colun",
        "name": "Colun"
      },
      "category": {
        "id": "food.dairy.milk",
        "label": "Leche",
        "path": [
          "Alimentos y bebidas",
          "Lácteos",
          "… 1 más / more"
        ]
      },
      "size": {
        "value": 1,
        "unit": "l",
        "pack_count": 1,
        "text": "1 L"
      },
      "gtin": [
        "2000070000007"
      ],
      "image_url": null,
      "price_summary": {
        "currency": "CLP",
        "min": 1090,
        "max": 1290,
        "median": 1190,
        "offers_count": 3,
        "retailers_count": 3,
        "best": {
          "retailer": {
            "id": "cl-unimarc",
            "name": "Unimarc"
          },
          "offer_id": "ofr_01nuni",
          "price": 1090
        },
        "observed_at": "2026-10-23T11:00:00Z"
      }
    },
    "prices": [
      {
        "currency": "CLP",
        "price": 1090,
        "list_price": 1090,
        "sale_price": null,
        "card_price": null,
        "card_label": null,
        "conditional_prices": [],
        "unit_price": {
          "amount": 1090,
          "per": "l"
        },
        "promotions": [],
        "availability": "in_stock",
        "tax_included": true,
        "tax_rate": 0.19,
        "price_ex_tax": 916,
        "tax_rule_id": "CL-IVA-19-2026",
        "other_taxes_included": false,
        "installments": null,
        "observed_at": "2026-10-23T11:00:00Z",
        "observed_local_date": "2026-10-23",
        "capture_method": "public_page",
        "quality_status": "ok",
        "quality_flags": [],
        "corrected": false,
        "retailer": {
          "id": "cl-unimarc",
          "name": "Unimarc"
        },
        "offer_id": "ofr_01nuni",
        "store_id": null,
        "url": "https://example.com/cl-unimarc/leche-entera-colun-1-l",
        "title_original": "LECHE ENTERA COLUN 1 LT",
        "seller": {
          "id": "cl-unimarc",
          "name": "Unimarc",
          "is_retailer_itself": true
        },
        "match": {
          "method": "gtin",
          "confidence": 0.99,
          "kind": "identical",
          "pack_ratio": null
        }
      },
      {
        "currency": "CLP",
        "price": 1190,
        "list_price": 1190,
        "sale_price": null,
        "card_price": null,
        "card_label": null,
        "conditional_prices": [],
        "unit_price": {
          "amount": 1190,
          "per": "l"
        },
        "promotions": [],
        "availability": "in_stock",
        "tax_included": true,
        "tax_rate": 0.19,
        "price_ex_tax": 1000,
        "tax_rule_id": "CL-IVA-19-2026",
        "other_taxes_included": false,
        "installments": null,
        "observed_at": "2026-10-23T11:00:00Z",
        "observed_local_date": "2026-10-23",
        "capture_method": "public_page",
        "quality_status": "ok",
        "quality_flags": [],
        "corrected": false,
        "retailer": {
          "id": "cl-santaisabel",
          "name": "Santa Isabel"
        },
        "offer_id": "ofr_00tsan",
        "store_id": null,
        "url": "https://example.com/cl-santaisabel/leche-entera-colun-1-l",
        "title_original": "Leche entera Colun, 1 L",
        "seller": {
          "id": "cl-santaisabel",
          "name": "Santa Isabel",
          "is_retailer_itself": true
        },
        "match": {
          "method": "gtin",
          "confidence": 0.99,
          "kind": "identical",
          "pack_ratio": null
        }
      },
      "… 1 más / more"
    ],
    "summary": {
      "currency": "CLP",
      "min": 1090,
      "max": 1290,
      "median": 1190,
      "offers_count": 3,
      "retailers_count": 3,
      "best": {
        "retailer": {
          "id": "cl-unimarc",
          "name": "Unimarc"
        },
        "offer_id": "ofr_01nuni",
        "price": 1090
      },
      "observed_at": "2026-10-23T11:00:00Z"
    }
  },
  "meta": {
    "request_id": "req_419958bb0d0142b1807f",
    "attribution": {
      "text": "Fuente: Pricto · 23-10-2026 08:00 CLST · prd_01colu",
      "source": "Pricto",
      "as_of": "2026-10-23T11:00:00Z",
      "resource_id": "prd_01colu",
      "url": null,
      "capture_method": null,
      "source_url": null
    },
    "credits_charged": 3,
    "credits_deduplicated": 0,
    "credits_remaining": 14994,
    "period_resets_at": "2026-11-01T00:00:00.000Z",
    "usage": {
      "credits_charged": 3,
      "credits_deduplicated": 0,
      "truncated": false,
      "truncated_reason": null,
      "dry_run": false,
      "units": {
        "offers": 3
      }
    },
    "lang": "es",
    "currency": "local",
    "data_as_of": "2026-10-23T11:00:00Z",
    "location": null,
    "warnings": [
      "synthetic_data: datos sintéticos de ejemplo / synthetic sample data",
      "Hay ofertas de tipo pack que no son el mismo artículo; agrégalas con match_kinds=identical,pack."
    ]
  }
}
```
