Zum Inhalt springen

API-Referenz

Jeder Endpunkt der Daten-API, erzeugt aus ihrem OpenAPI-Dokument (Beschreibungen auf Englisch). Jede Antwort ist JSON, wenn nichts anderes dasteht.

Basis-URL
https://pricana.io/api/v1
Anmeldung
Your API key as a bearer token: Authorization: Bearer prc_live_…. Live keys read your datasets, test keys only the sample datasets. Create keys in the portal (API).
OpenAPI-Dokument
OpenAPI 3.1.0 (Pricana Data API v1)

Die Anfragen gehen mit Ihrem Key an diesen Server. Der Key bleibt nur im Speicher dieser Seite.

Datasets

What you can read: your datasets and the values to filter them by.

GET /api/v1/datasets

Your datasets

The datasets your plan lets you read, with how many items and websites each has and when its sources were last read. Their id is the dataset filter of the other requests.

Antworten

  • 200 Your datasets. application/json Dataset[]
  • 401 No API key, or one that is invalid or revoked. application/json Error
  • 402 Not in your plan (a dataset beyond it, the change feed on Free), or a payment overdue for 30 days (limit: paymentOverdue). application/json LimitError
  • 429 Too many requests per second, or the month's calls are used up (limit says which). Retry-After says when to try again. application/json LimitError

Beispiel

[
  {
    "description": "Laptops and notebooks from shops in Germany, Austria and Switzerland.",
    "healthyModels": 14,
    "id": 12,
    "items": 18342,
    "models": 14,
    "name": "Laptops DACH",
    "newestScrapeAt": "2026-10-07T09:12:00Z",
    "oldestScrapeAt": "2026-10-07T05:40:00Z",
    "sites": 9
  }
]
curl -H "Authorization: Bearer $PRICANA_KEY" \
  "https://pricana.io/api/v1/datasets"
Ausprobieren

GET /api/v1/facets

Websites, categories and currencies to filter by

The values the items can be filtered by, each with the number of items listed now.

Parameter

NameTypBeschreibung
dataset
query
integerOne of your datasets (its id from /datasets); without it, all of them.
Beispiel: 12

Antworten

  • 200 The facets. application/json Facets
  • 401 No API key, or one that is invalid or revoked. application/json Error
  • 402 Not in your plan (a dataset beyond it, the change feed on Free), or a payment overdue for 30 days (limit: paymentOverdue). application/json LimitError
  • 404 No such dataset of yours. application/json Error
  • 429 Too many requests per second, or the month's calls are used up (limit says which). Retry-After says when to try again. application/json LimitError

Beispiel

{
  "categories": [
    {
      "id": 8,
      "items": 1804,
      "name": "Laptops",
      "parentId": 2,
      "path": "Computers > Laptops",
      "slug": "computers-laptops"
    }
  ],
  "currencies": [
    {
      "code": "EUR",
      "items": 17920
    }
  ],
  "sites": [
    {
      "host": "www.notebookshop.example",
      "id": 4,
      "items": 2310,
      "name": "Notebookshop"
    }
  ]
}
curl -H "Authorization: Bearer $PRICANA_KEY" \
  "https://pricana.io/api/v1/facets"
Ausprobieren

Items

Listings as they are now, and their history.

GET /api/v1/items

Find items

Items of your datasets, filtered and sorted, a page at a time (up to 500). To keep a copy in sync, use the change feed (/changes) or changedSince.

Parameter

NameTypBeschreibung
dataset
query
integerOne of your datasets (its id from /datasets); without it, all of them.
Beispiel: 12
site
query
integerOnly items of this website (id from /facets).
Beispiel: 4
category
query
stringA category's slug (from /facets), with its subcategories.
Beispiel: computers-laptops
q
query
stringWords to look for (all of them, in any order) in the title, brand, codes and other values of the item; parts of words count.
Beispiel: thinkpad x1
minPrice
query
numberLowest price, in the item's currency.
Beispiel: 500
maxPrice
query
numberHighest price, in the item's currency.
Beispiel: 1500
currency
query
stringISO 4217 code.
Beispiel: EUR
status
query
string, einer von active, removed, allactive (listed now, the default), removed (no longer listed) or all.
changedSince
query
string (date-time)Only items with a change after this time (ISO 8601), e.g. the start of your last sync.
Beispiel: 2026-10-01T00:00:00Z
gtin
query
stringEAN/UPC/ISBN-13: the same product in every shop (leading zeros may be left out).
Beispiel: 0196802123456
sort
query
string, einer von price, -price, -lastChanged, -lastSeen, -firstSeen, titleprice, -price (highest first), -lastChanged (the default), -lastSeen, -firstSeen (newest listings first) or title.
page
query
integerThe page, from 0.
Beispiel: 0
Standard: 0
size
query
integerItems per page, 1 to 500.
Beispiel: 100
Standard: 50

Antworten

  • 200 A page of items. application/json PageDtoItem
  • 400 A parameter is not valid; message says which. application/json Error
  • 401 No API key, or one that is invalid or revoked. application/json Error
  • 402 Not in your plan (a dataset beyond it, the change feed on Free), or a payment overdue for 30 days (limit: paymentOverdue). application/json LimitError
  • 429 Too many requests per second, or the month's calls are used up (limit says which). Retry-After says when to try again. application/json LimitError

Beispiel

{
  "content": [
    {
      "attributes": {
        "availability": "in stock",
        "shipping": 0
      },
      "brand": "Lenovo",
      "category": {
        "name": null,
        "path": null,
        "slug": null,
        "source": null
      },
      "currency": "EUR",
      "datasets": [
        "Laptops DACH"
      ],
      "firstSeenAt": "2026-09-01T10:00:00Z",
      "gtin": "0196802123456",
      "id": 77,
      "image": "https://www.notebookshop.example/img/thinkpad-x1.jpg",
      "lastChangedAt": "2026-10-06T21:03:00Z",
      "lastSeenAt": "2026-10-07T09:12:00Z",
      "mpn": "21KC004MGE",
      "previousPrice": 1499,
      "price": 1399,
      "priceChangedAt": "2026-10-06T21:03:00Z",
      "removedAt": "2026-10-07T03:30:00Z",
      "site": {
        "attribution": null,
        "host": null,
        "id": null,
        "name": null
      },
      "source": {
        "modelId": null,
        "name": null
      },
      "title": "Lenovo ThinkPad X1 Carbon Gen 12",
      "url": "https://www.notebookshop.example/p/thinkpad-x1"
    }
  ],
  "page": 0,
  "size": 50,
  "totalElements": 1804,
  "totalPages": 37
}
curl -H "Authorization: Bearer $PRICANA_KEY" \
  "https://pricana.io/api/v1/items"
Ausprobieren

GET /api/v1/items/{id}

One item

The item as it is now (as /items shows it), also once it is no longer listed.

Parameter

NameTypBeschreibung
id
path, Pflicht
integerThe item's id.
Beispiel: 77

Antworten

  • 200 The item. application/json Item
  • 401 No API key, or one that is invalid or revoked. application/json Error
  • 402 Not in your plan (a dataset beyond it, the change feed on Free), or a payment overdue for 30 days (limit: paymentOverdue). application/json LimitError
  • 404 Not found among the items you can see. application/json Error
  • 429 Too many requests per second, or the month's calls are used up (limit says which). Retry-After says when to try again. application/json LimitError

Beispiel

{
  "attributes": {
    "availability": "in stock",
    "shipping": 0
  },
  "brand": "Lenovo",
  "category": {
    "name": "Laptops",
    "path": "Computers > Laptops",
    "slug": "computers-laptops",
    "source": "AI"
  },
  "currency": "EUR",
  "datasets": [
    "Laptops DACH"
  ],
  "firstSeenAt": "2026-09-01T10:00:00Z",
  "gtin": "0196802123456",
  "id": 77,
  "image": "https://www.notebookshop.example/img/thinkpad-x1.jpg",
  "lastChangedAt": "2026-10-06T21:03:00Z",
  "lastSeenAt": "2026-10-07T09:12:00Z",
  "mpn": "21KC004MGE",
  "previousPrice": 1499,
  "price": 1399,
  "priceChangedAt": "2026-10-06T21:03:00Z",
  "removedAt": "2026-10-07T03:30:00Z",
  "site": {
    "attribution": "Source: European Commission, Weekly Oil Bulletin, CC BY 4.0",
    "host": "www.notebookshop.example",
    "id": 4,
    "name": "Notebookshop"
  },
  "source": {
    "modelId": 31,
    "name": "Notebookshop – Laptops"
  },
  "title": "Lenovo ThinkPad X1 Carbon Gen 12",
  "url": "https://www.notebookshop.example/p/thinkpad-x1"
}
curl -H "Authorization: Bearer $PRICANA_KEY" \
  "https://pricana.io/api/v1/items/77"
Ausprobieren

GET /api/v1/items/{id}/history

An item's history

Every change of the item within your plan's history, oldest first: its prices over time.

Parameter

NameTypBeschreibung
id
path, Pflicht
integerThe item's id.
Beispiel: 77

Antworten

  • 200 The item's history. application/json HistoryEntry[]
  • 401 No API key, or one that is invalid or revoked. application/json Error
  • 402 Not in your plan (a dataset beyond it, the change feed on Free), or a payment overdue for 30 days (limit: paymentOverdue). application/json LimitError
  • 404 Not found among the items you can see. application/json Error
  • 429 Too many requests per second, or the month's calls are used up (limit says which). Retry-After says when to try again. application/json LimitError

Beispiel

[
  {
    "changes": {
      "availability": [
        "2-3 days",
        "in stock"
      ]
    },
    "id": 812,
    "kind": "NEW",
    "observedAt": "2026-10-06T21:03:00Z",
    "previousPrice": 1499,
    "price": 1399
  }
]
curl -H "Authorization: Bearer $PRICANA_KEY" \
  "https://pricana.io/api/v1/items/77/history"
Ausprobieren

Changes

Every new item, change and removal, in order: to keep a copy in sync.

GET /api/v1/changes

The change feed

Everything that happened after after, oldest first. Start with after=0, then pass each answer's nextCursor as after; repeat while hasMore is true. Store the last cursor and go on from it next time: you get each change exactly once. Changes show here about 30 seconds after they happen. Paid plans (on Free it answers 402).

Parameter

NameTypBeschreibung
dataset
query
integerOne of your datasets (its id from /datasets); without it, all of them.
Beispiel: 12
after
query
integerThe cursor: the nextCursor of the last answer (0 = from the beginning of your plan's history).
Beispiel: 0
Standard: 0
limit
query
integerChanges per answer, 1 to 1000.
Beispiel: 1000
Standard: 500

Antworten

  • 200 The next changes. application/json ChangePage
  • 401 No API key, or one that is invalid or revoked. application/json Error
  • 402 Not in your plan (a dataset beyond it, the change feed on Free), or a payment overdue for 30 days (limit: paymentOverdue). application/json LimitError
  • 429 Too many requests per second, or the month's calls are used up (limit says which). Retry-After says when to try again. application/json LimitError

Beispiel

{
  "changes": [
    {
      "changes": {
        "price": [
          1499,
          1399
        ]
      },
      "id": 812,
      "item": {
        "currency": null,
        "id": null,
        "site": null,
        "title": null,
        "url": null
      },
      "kind": "NEW",
      "observedAt": "2026-10-06T21:03:00Z",
      "previousPrice": 1499,
      "price": 1399
    }
  ],
  "hasMore": true,
  "nextCursor": 1811
}
curl -H "Authorization: Bearer $PRICANA_KEY" \
  "https://pricana.io/api/v1/changes"
Ausprobieren

GET /api/v1/changes/recent

Recent changes, newest first

For people: the latest changes, newest first, optionally only of one kind. Page back with before. To sync a copy, use /changes. A change shows here when it shows in /changes (within about 30 seconds), so the id of the newest one is a safe place to start /changes?after= from.

Parameter

NameTypBeschreibung
dataset
query
integerOne of your datasets (its id from /datasets); without it, all of them.
Beispiel: 12
kind
query
string, einer von NEW, CHANGED, REMOVED, RELISTED, PRICE_DROP, PRICE_RISENEW, CHANGED, REMOVED, RELISTED, PRICE_DROP or PRICE_RISE.
before
query
integerThe last id of the previous page.
Beispiel: 1811
limit
query
integerChanges per answer, 1 to 200.
Beispiel: 50
Standard: 50

Antworten

  • 200 The changes. application/json ChangePage
  • 400 A parameter is not valid; message says which. application/json Error
  • 401 No API key, or one that is invalid or revoked. application/json Error
  • 402 Not in your plan (a dataset beyond it, the change feed on Free), or a payment overdue for 30 days (limit: paymentOverdue). application/json LimitError
  • 429 Too many requests per second, or the month's calls are used up (limit says which). Retry-After says when to try again. application/json LimitError

Beispiel

{
  "changes": [
    {
      "changes": {
        "price": [
          1499,
          1399
        ]
      },
      "id": 812,
      "item": {
        "currency": null,
        "id": null,
        "site": null,
        "title": null,
        "url": null
      },
      "kind": "NEW",
      "observedAt": "2026-10-06T21:03:00Z",
      "previousPrice": 1499,
      "price": 1399
    }
  ],
  "hasMore": true,
  "nextCursor": 1811
}
curl -H "Authorization: Bearer $PRICANA_KEY" \
  "https://pricana.io/api/v1/changes/recent"
Ausprobieren

Products

The same product across shops: compare its prices.

GET /api/v1/products

Find products across shops

Products with offers in your datasets: the same product in several shops, matched by GTIN, else by brand and part number, with its price range and how many shops sell it.

Parameter

NameTypBeschreibung
dataset
query
integerOne of your datasets (its id from /datasets); without it, all of them.
Beispiel: 12
q
query
stringWords to look for (all of them, in any order) in the title, brand, codes and other values of the item; parts of words count.
Beispiel: thinkpad
category
query
stringA category's slug (from /facets), with its subcategories.
Beispiel: computers-laptops
brand
query
stringThe brand, as the shops name it.
Beispiel: Lenovo
gtin
query
stringEAN/UPC/ISBN-13: the same product in every shop (leading zeros may be left out).
Beispiel: 0196802123456
currency
query
stringISO 4217 code.
Beispiel: EUR
minShops
query
integerSold by at least this many websites (2: products to compare).
Beispiel: 2
Standard: 1
sort
query
string, einer von -offers, -shops, price, -price-offers (the default), -shops, price (lowest first) or -price.
page
query
integerThe page, from 0.
Beispiel: 0
Standard: 0
size
query
integerProducts per page, 1 to 200.
Beispiel: 50
Standard: 50

Antworten

  • 200 A page of products. application/json PageDtoProduct
  • 400 A parameter is not valid; message says which. application/json Error
  • 401 No API key, or one that is invalid or revoked. application/json Error
  • 402 Not in your plan (a dataset beyond it, the change feed on Free), or a payment overdue for 30 days (limit: paymentOverdue). application/json LimitError
  • 429 Too many requests per second, or the month's calls are used up (limit says which). Retry-After says when to try again. application/json LimitError

Beispiel

{
  "content": [
    {
      "brand": "Lenovo",
      "category": {
        "name": null,
        "path": null,
        "slug": null,
        "source": null
      },
      "gtin": "0196802123456",
      "id": "0196802123456",
      "mpn": "21KC004MGE",
      "offers": 6,
      "prices": [
        null
      ],
      "shops": 5,
      "title": "Lenovo ThinkPad X1 Carbon Gen 12"
    }
  ],
  "page": 0,
  "size": 50,
  "totalElements": 1804,
  "totalPages": 37
}
curl -H "Authorization: Bearer $PRICANA_KEY" \
  "https://pricana.io/api/v1/products"
Ausprobieren

GET /api/v1/products/{id}

One product with its offers

A product by its id (a GTIN, or a brand-MPN key) with all its offers you can see, cheapest first.

Parameter

NameTypBeschreibung
id
path, Pflicht
stringThe product's id: a GTIN (any of its forms) or a brand-MPN key.
Beispiel: 0196802123456
dataset
query
integerOne of your datasets (its id from /datasets); without it, all of them.
Beispiel: 12
currency
query
stringOnly offers in this currency (ISO 4217).
Beispiel: EUR

Antworten

  • 200 The product and its offers. application/json ProductDetail
  • 401 No API key, or one that is invalid or revoked. application/json Error
  • 402 Not in your plan (a dataset beyond it, the change feed on Free), or a payment overdue for 30 days (limit: paymentOverdue). application/json LimitError
  • 404 No offers of this product among the items you can see. application/json Error
  • 429 Too many requests per second, or the month's calls are used up (limit says which). Retry-After says when to try again. application/json LimitError

Beispiel

{
  "offers": [
    {
      "attributes": {
        "availability": "in stock",
        "shipping": 0
      },
      "brand": "Lenovo",
      "category": {
        "name": null,
        "path": null,
        "slug": null,
        "source": null
      },
      "currency": "EUR",
      "datasets": [
        "Laptops DACH"
      ],
      "firstSeenAt": "2026-09-01T10:00:00Z",
      "gtin": "0196802123456",
      "id": 77,
      "image": "https://www.notebookshop.example/img/thinkpad-x1.jpg",
      "lastChangedAt": "2026-10-06T21:03:00Z",
      "lastSeenAt": "2026-10-07T09:12:00Z",
      "mpn": "21KC004MGE",
      "previousPrice": 1499,
      "price": 1399,
      "priceChangedAt": "2026-10-06T21:03:00Z",
      "removedAt": "2026-10-07T03:30:00Z",
      "site": {
        "attribution": null,
        "host": null,
        "id": null,
        "name": null
      },
      "source": {
        "modelId": null,
        "name": null
      },
      "title": "Lenovo ThinkPad X1 Carbon Gen 12",
      "url": "https://www.notebookshop.example/p/thinkpad-x1"
    }
  ],
  "product": {
    "brand": "Lenovo",
    "category": {
      "name": "Laptops",
      "path": "Computers > Laptops",
      "slug": "computers-laptops",
      "source": "AI"
    },
    "gtin": "0196802123456",
    "id": "0196802123456",
    "mpn": "21KC004MGE",
    "offers": 6,
    "prices": [
      {
        "currency": null,
        "max": null,
        "min": null,
        "offers": null
      }
    ],
    "shops": 5,
    "title": "Lenovo ThinkPad X1 Carbon Gen 12"
  }
}
curl -H "Authorization: Bearer $PRICANA_KEY" \
  "https://pricana.io/api/v1/products/0196802123456"
Ausprobieren

Export

Everything at once, as CSV or NDJSON.

GET /api/v1/export

Export items

All matching items, streamed as CSV (UTF-8, a header row) or NDJSON (one JSON object per line), with the filters of /items. Rows count against your plan's export rows per month. On paid plans, rows beyond them are billed as overage per started 10,000 and the export is complete (X-Export-Overage); on Free, in the trial, or with overage switched off, an export that would go beyond them ends at the limit and says so in X-Export-Truncated.

Parameter

NameTypBeschreibung
format
query
string, einer von csv, ndjsoncsv (the default) or ndjson.
dataset
query
integerOne of your datasets (its id from /datasets); without it, all of them.
Beispiel: 12
site
query
integerOnly items of this website (id from /facets).
Beispiel: 4
category
query
stringA category's slug (from /facets), with its subcategories.
Beispiel: computers-laptops
q
query
stringWords to look for (all of them, in any order) in the title, brand, codes and other values of the item; parts of words count.
Beispiel: thinkpad
minPrice
query
numberLowest price, in the item's currency.
Beispiel: 500
maxPrice
query
numberHighest price, in the item's currency.
Beispiel: 1500
currency
query
stringISO 4217 code.
Beispiel: EUR
status
query
string, einer von active, removed, allactive (listed now, the default), removed (no longer listed) or all.
changedSince
query
string (date-time)Only items with a change after this time (ISO 8601), e.g. the start of your last sync.
Beispiel: 2026-10-01T00:00:00Z
gtin
query
stringEAN/UPC/ISBN-13: the same product in every shop (leading zeros may be left out).
Beispiel: 0196802123456

Antworten

  • 200 The rows, streamed. application/x-ndjson string text/csv string
    • X-Export-Matching: With X-Export-Truncated: how many rows matched.
    • X-Export-Overage: true if rows beyond the month's quota are in it, billed as overage.
    • X-Export-Rows: Rows in this export.
    • X-Export-Rows-Remaining: Export rows left this month after it.
    • X-Export-Truncated: true if the export ended at the monthly limit.
  • 400 A parameter is not valid; message says which. application/json Error
  • 401 No API key, or one that is invalid or revoked. application/json Error
  • 402 Not in your plan (a dataset beyond it, the change feed on Free), or a payment overdue for 30 days (limit: paymentOverdue). application/json LimitError
  • 429 Too many requests per second, or the month's calls are used up (limit says which). Retry-After says when to try again. application/json LimitError
curl -H "Authorization: Bearer $PRICANA_KEY" \
  "https://pricana.io/api/v1/export"
Ausprobieren

Nur der Anfang der Antwort wird gelesen und gezeigt, und der Export endet dort; die Zeilen bis dahin zählen zu Ihren Exportzeilen im Monat. Filter halten ihn klein.

Plan

Your plan, its limits and this month's use.

GET /api/v1/plan

Your plan and this month's use

The plan in effect, its limits (null is unlimited), the calls and export rows used this month and when they start over. Every answer also carries RateLimit-* and X-Quota-* headers.

Antworten

  • 200 Your plan. application/json PlanInfo
  • 401 No API key, or one that is invalid or revoked. application/json Error
  • 402 Not in your plan (a dataset beyond it, the change feed on Free), or a payment overdue for 30 days (limit: paymentOverdue). application/json LimitError
  • 429 Too many requests per second, or the month's calls are used up (limit says which). Retry-After says when to try again. application/json LimitError

Beispiel

{
  "limits": {
    "datasets": 10,
    "apiCallsPerMonth": 250000,
    "ratePerSecond": 20,
    "delayHours": 0,
    "historyDays": 365,
    "exportRowsPerMonth": 1000000,
    "changeFeed": true,
    "webhooks": true
  },
  "lockedDatasets": 0,
  "name": "Pro",
  "plan": "pro",
  "status": "ACTIVE",
  "trialEndsAt": "2026-10-21T09:00:00Z",
  "upgradeUrl": "https://pricana.io/pricing",
  "usage": {
    "apiCalls": 48211,
    "exportRows": 12000,
    "resetsAt": "2026-11-01T00:00:00Z"
  }
}
curl -H "Authorization: Bearer $PRICANA_KEY" \
  "https://pricana.io/api/v1/plan"
Ausprobieren

Webhooks

Diese schickt Pricana an Ihren Endpunkt. Endpunkte richten Sie im Portal ein (API); der Leitfaden erklärt die Signatur. Leitfaden Webhooks

POST https://your-server.example/…

New changes of the change feed (sent by Pricana)

Pricana posts the next changes of your datasets to your endpoint, in order, up to 100 at a time, as the change feed lists them (type: changes), and a test when you send one from the portal (type: ping). Check the signature before you use the body: HMAC-SHA256 with your endpoint's secret over <t>.<body>, compared with each v1 value. Answer with any 2xx within 10 seconds; anything else is tried again after 1, 5, 15 and 30 minutes, then 1, 2 and every 4 hours, and later changes wait. After 24 hours of failures the endpoint is turned off and your team gets an email.

Parameter

NameTypBeschreibung
Pricana-Signature
header, Pflicht
stringt=<unix seconds>,v1=<hex HMAC-SHA256>; a second v1 while a rolled secret's old one is still valid.
Beispiel: t=1791374400,v1=26ff918ca24488a1a2aa21935c219eaed5c31c721399ca4d400ebecf2784fdf4
Pricana-Event-Id
header, Pflicht
stringThe event's id, as id in the body.
Beispiel: evt_5f1c0b2a9d7e4c3b8a6f0e1d
Pricana-Event-Type
header, Pflicht
stringchanges or ping.
Beispiel: changes
Pricana-Delivery-Attempt
header, Pflicht
integer1 for the first attempt, then 2, 3 …
Beispiel: 1

Body, den Pricana schickt: WebhookEvent

{
  "changes": [
    {
      "changes": {
        "price": [
          1499,
          1399
        ]
      },
      "id": 812,
      "item": {
        "currency": null,
        "id": null,
        "site": null,
        "title": null,
        "url": null
      },
      "kind": "NEW",
      "observedAt": "2026-10-06T21:03:00Z",
      "previousPrice": 1499,
      "price": 1399
    }
  ],
  "createdAt": "2026-10-07T09:12:31Z",
  "cursor": 1811,
  "id": "evt_5f1c0b2a9d7e4c3b8a6f0e1d",
  "type": "changes"
}

Antworten

  • 200 Received (any 2xx will do; the body is ignored).
  • default Anything else (and no answer in 10 seconds): tried again later.

Datenmodell

CategoryRef

The item's category in Pricana's taxonomy.

NameTypBeschreibung
namestring
Beispiel: "Laptops"
pathstring
Beispiel: "Computers > Laptops"
slugstring
Beispiel: "computers-laptops"
sourcestring, einer von AI, MANUALWho chose it (EU AI Act transparency): AI, or MANUAL (a person).
Beispiel: "AI"

Change

One entry of the change feed: an item appeared (NEW), changed (CHANGED), was no longer listed (REMOVED) or came back (RELISTED). id is the cursor.

NameTypBeschreibung
changesobjectValues that changed, by name: [old, new].
Beispiel: {"price":[1499,1399]}
idintegerIncreasing: pass the last one you have as after.
Beispiel: 812
itemChangeItemNull if the item is gone from your data meanwhile.
kindstring, einer von NEW, CHANGED, REMOVED, RELISTED
observedAtstring (date-time)
Beispiel: "2026-10-06T21:03:00Z"
previousPricenumber | nullSet when the price changed.
Beispiel: 1499
pricenumber | null
Beispiel: 1399

ChangeItem

The item a change belongs to (its title and link then).

NameTypBeschreibung
currencystring | null
Beispiel: "EUR"
idinteger
Beispiel: 77
siteSiteRef
titlestring
Beispiel: "Lenovo ThinkPad X1 Carbon Gen 12"
urlstring | null
Beispiel: "https://www.notebookshop.example/p/thinkpad-x1"

ChangePage

A page of changes. Pass nextCursor on to get the next entries: as after to /changes, as before to /changes/recent.

NameTypBeschreibung
changesChange[]
hasMorebooleanMore changes are waiting now: ask again at once.
Beispiel: true
nextCursorintegerStore it, and continue from it next time (after for /changes, before for /changes/recent).
Beispiel: 1811

Dataset

A dataset: the listings of a set of websites on one topic, as your plan shows them.

NameTypBeschreibung
descriptionstring | null
Beispiel: "Laptops and notebooks from shops in Germany, Austria and Switzerland."
healthyModelsintegerSources collecting without problems; the others are being repaired.
Beispiel: 14
idintegerUse it as dataset in other requests.
Beispiel: 12
itemsintegerItems listed now.
Beispiel: 18342
modelsintegerSources: one listing of one website each.
Beispiel: 14
namestring
Beispiel: "Laptops DACH"
newestScrapeAtstring (date-time) | nullWhen a source of the dataset was last read; null before the first.
Beispiel: "2026-10-07T09:12:00Z"
oldestScrapeAtstring (date-time) | nullWhen the source read longest ago was read.
Beispiel: "2026-10-07T05:40:00Z"
sitesintegerWebsites the items come from.
Beispiel: 9

Error

Every error answer.

NameTypBeschreibung
docsUrlstringThe docs' page about this error.
Beispiel: "https://pricana.io/docs/errors#not-found"
errorstring
Beispiel: "Not Found"
messagestring
Beispiel: "Item 77 not found"
statusinteger
Beispiel: 404

FacetCategory

A category among the facets, with its items (subcategories included).

NameTypBeschreibung
idinteger
Beispiel: 8
itemsinteger
Beispiel: 1804
namestring
Beispiel: "Laptops"
parentIdinteger | nullNull for a top category.
Beispiel: 2
pathstring
Beispiel: "Computers > Laptops"
slugstring
Beispiel: "computers-laptops"

FacetCurrency

A currency among the facets, with its items.

NameTypBeschreibung
codestring
Beispiel: "EUR"
itemsinteger
Beispiel: 17920

Facets

What the items can be filtered by, with counts.

NameTypBeschreibung
categoriesFacetCategory[]
currenciesFacetCurrency[]
sitesFacetSite[]

FacetSite

A website among the facets, with its items.

NameTypBeschreibung
hoststring
Beispiel: "www.notebookshop.example"
idinteger
Beispiel: 4
itemsinteger
Beispiel: 2310
namestring
Beispiel: "Notebookshop"

HistoryEntry

One step in an item's history.

NameTypBeschreibung
changesobjectValues that changed, by name: [old, new].
Beispiel: {"availability":["2-3 days","in stock"]}
idinteger
Beispiel: 812
kindstring, einer von NEW, CHANGED, REMOVED, RELISTED
observedAtstring (date-time)
Beispiel: "2026-10-06T21:03:00Z"
previousPricenumber | nullSet when the price changed.
Beispiel: 1499
pricenumber | null
Beispiel: 1399

Item

A listing (an offer of a product in a shop), as it is now: the shop's own values, with Pricana's category and the product codes that identify it across shops.

NameTypBeschreibung
attributesobjectFurther values the shop shows (stock, shipping, ratings …), by name.
Beispiel: {"availability":"in stock","shipping":0}
brandstring | null
Beispiel: "Lenovo"
categoryCategoryRefNull while it has none.
currencystring | null
Beispiel: "EUR"
datasetsstring[]Your datasets the item is in.
Beispiel: ["Laptops DACH"]
firstSeenAtstring (date-time)
Beispiel: "2026-09-01T10:00:00Z"
gtinstring | nullEAN/UPC/ISBN-13 (8, 13 or 14 digits): the same product in every shop. Null when the shop doesn't name it.
Beispiel: "0196802123456"
idinteger
Beispiel: 77
imagestring | nullThe shop's product image, if it shows one.
Beispiel: "https://www.notebookshop.example/img/thinkpad-x1.jpg"
lastChangedAtstring (date-time)The last time a value changed (use it with changedSince).
Beispiel: "2026-10-06T21:03:00Z"
lastSeenAtstring (date-time)The last time a scrape found it.
Beispiel: "2026-10-07T09:12:00Z"
mpnstring | nullThe manufacturer's part number.
Beispiel: "21KC004MGE"
previousPricenumber | nullThe price before the last price change; null if it never changed.
Beispiel: 1499
pricenumber | nullNull when the shop shows none.
Beispiel: 1399
priceChangedAtstring (date-time) | nullWhen the price last changed.
Beispiel: "2026-10-06T21:03:00Z"
removedAtstring (date-time) | nullWhen the shop stopped listing it; null while it is listed.
Beispiel: "2026-10-07T03:30:00Z"
siteSiteRef
sourceSource
titlestring | null
Beispiel: "Lenovo ThinkPad X1 Carbon Gen 12"
urlstring | nullThe item's page in the shop.
Beispiel: "https://www.notebookshop.example/p/thinkpad-x1"

LimitError

A plan limit (402) or a rate or monthly limit (429): which one, its value in your plan, and where to upgrade.

NameTypBeschreibung
allowedobjectIts value in your plan.
Beispiel: 100000
docsUrlstring
Beispiel: "https://pricana.io/docs/errors#apiCallsPerMonth"
errorstring
Beispiel: "Too Many Requests"
limitstringThe limit: datasets, changeFeed, apiCallsPerMonth, ratePerSecond, exportRowsPerMonth or paymentOverdue.
Beispiel: "apiCallsPerMonth"
messagestring
Beispiel: "The monthly quota of 100,000 calls is used up; it starts over on 1 November"
planstring
Beispiel: "pro"
statusinteger
Beispiel: 429
upgradeUrlstring
Beispiel: "https://pricana.io/pricing"

PageDtoItem

A page of results.

NameTypBeschreibung
contentItem[]
pageintegerThis page, from 0.
Beispiel: 0
sizeintegerResults per page.
Beispiel: 50
totalElementsintegerAll results.
Beispiel: 1804
totalPagesintegerPages in all.
Beispiel: 37

PageDtoProduct

A page of results.

NameTypBeschreibung
contentProduct[]
pageintegerThis page, from 0.
Beispiel: 0
sizeintegerResults per page.
Beispiel: 50
totalElementsintegerAll results.
Beispiel: 1804
totalPagesintegerPages in all.
Beispiel: 37

PlanInfo

Your plan in effect (Free once a trial ended), its limits and this month's use.

NameTypBeschreibung
limitsobjectThe limits by name; null is unlimited.
Beispiel: {"datasets":10,"apiCallsPerMonth":250000,"ratePerSecond":20,"delayHours":0,"historyDays":365,"exportRowsPerMonth":1000000,"changeFeed":true,"webhooks":true}
lockedDatasetsintegerYour datasets beyond what the plan includes: they answer 402.
Beispiel: 0
namestring
Beispiel: "Pro"
planstring
Beispiel: "pro"
statusstring | nullTRIALING, ACTIVE, PAST_DUE or CANCELED; null without a subscription.
Beispiel: "ACTIVE"
trialEndsAtstring (date-time) | nullWhen the trial ends (status TRIALING).
Beispiel: "2026-10-21T09:00:00Z"
upgradeUrlstringWhere to get more: the plans and their prices.
Beispiel: "https://pricana.io/pricing"
usagePlanUsageThis month's use; null for an operator's token.

PlanUsage

Calls with API keys or tokens and exported rows this calendar month (UTC).

NameTypBeschreibung
apiCallsinteger
Beispiel: 48211
exportRowsinteger
Beispiel: 12000
resetsAtstring (date-time)When both start over (the first of next month, 00:00 UTC).
Beispiel: "2026-11-01T00:00:00Z"

PriceRange

The lowest and highest price of a product's offers in one currency.

NameTypBeschreibung
currencystring
Beispiel: "EUR"
maxnumber
Beispiel: 1529
minnumber
Beispiel: 1349
offersinteger
Beispiel: 6

Product

A product across shops: the offers of the same product, matched by GTIN, else by brand and part number.

NameTypBeschreibung
brandstring | null
Beispiel: "Lenovo"
categoryCategoryRefNull while it has none.
gtinstring | null
Beispiel: "0196802123456"
idstringIts GTIN (digits), else its brand-MPN key.
Beispiel: "0196802123456"
mpnstring | null
Beispiel: "21KC004MGE"
offersintegerOffers (items) of it you can see.
Beispiel: 6
pricesPriceRange[]The price range per currency.
shopsintegerDifferent websites selling it.
Beispiel: 5
titlestring | null
Beispiel: "Lenovo ThinkPad X1 Carbon Gen 12"

ProductDetail

A product with all its offers, cheapest first.

NameTypBeschreibung
offersItem[]
productProduct

SiteRef

The website an item comes from.

NameTypBeschreibung
attributionstring | nullThe source's licence and credit (open data, e.g. CC BY 4.0): pass it on with its data. Null for other sources.
Beispiel: "Source: European Commission, Weekly Oil Bulletin, CC BY 4.0"
hoststring
Beispiel: "www.notebookshop.example"
idinteger
Beispiel: 4
namestring
Beispiel: "Notebookshop"

Source

The source (one listing of one website) an item was read from.

NameTypBeschreibung
modelIdinteger
Beispiel: 31
namestring
Beispiel: "Notebookshop – Laptops"

WebhookEvent

What your webhook endpoint receives: the next changes of the change feed, in order, up to 100 at a time (type changes), or a test from the portal (type ping, no changes).

NameTypBeschreibung
changesChange[]
createdAtstring (date-time)
Beispiel: "2026-10-07T09:12:31Z"
cursorinteger | nullThe id of the last change in it (null for a ping): /changes?after= goes on from it.
Beispiel: 1811
idstringThe same on every attempt and when sent again: drop repeats by it.
Beispiel: "evt_5f1c0b2a9d7e4c3b8a6f0e1d"
typestring, einer von changes, ping
Beispiel: "changes"