GetPrice API
Look up competitor prices for your own SKUs and feed them into your ERP, BI or pricing tools. Send a SKU, and the GetPrice API returns every competitor selling that item, with each price and when GetPrice last collected it.
https://api.getprice.ai/v1v1 pilotThe API in four sentences
You send a secret key in the Authorization header. Everything is JSON over HTTPS, at
https://api.getprice.ai/v1. Money is a decimal string with a currency, and times are UTC. Lists come in pages
that you follow with next_cursor.
BASE=https://api.getprice.ai/v1
curl -G "$BASE/comparison-sets" \
-H "Authorization: Bearer $GETPRICE_API_KEY" \
--data-urlencode "sku=10072L" \
--data-urlencode "sku=11247P"import os
import requests
BASE = "https://api.getprice.ai/v1"
KEY = os.environ["GETPRICE_API_KEY"]
resp = requests.get(
f"{BASE}/comparison-sets",
params=[("sku", "10072L"), ("sku", "11247P")],
headers={"Authorization": f"Bearer {KEY}"},
timeout=30,
)
resp.raise_for_status()
page = resp.json()
for entry in page["skus"]:
print(entry["sku"], entry["status"])
for cset in page["data"]:
for entry in cset["competitors"]:
price = entry["price"]
if price:
name = entry["competitor"]["name"]
print(cset["sku"], name, price["amount"])interface Entry {
competitor: { name: string };
price: { amount: string } | null;
}
interface Page {
data: { sku: string | null; competitors: Entry[] }[];
skus: { sku: string; status: string }[];
}
const BASE = "https://api.getprice.ai/v1";
const KEY = process.env.GETPRICE_API_KEY;
const params = new URLSearchParams([
["sku", "10072L"],
["sku", "11247P"],
]);
const url = `${BASE}/comparison-sets?${params}`;
const res = await fetch(url, {
headers: { Authorization: `Bearer ${KEY}` },
});
if (!res.ok) {
throw new Error(`GetPrice returned ${res.status}`);
}
const page = (await res.json()) as Page;
for (const { sku, status } of page.skus) {
console.log(sku, status);
}
for (const set of page.data) {
for (const { competitor, price } of set.competitors) {
if (!price) continue;
console.log(set.sku, competitor.name, price.amount);
}
}<?php
$base = "https://api.getprice.ai/v1";
$key = getenv("GETPRICE_API_KEY");
// Repeat sku once per SKU.
$skus = ["10072L", "11247P"];
$query = implode("&", array_map(
fn ($sku) => "sku=" . rawurlencode($sku),
$skus,
));
$ch = curl_init("$base/comparison-sets?$query");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => [
"Authorization: Bearer $key",
],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
if ($body === false || $status >= 400) {
throw new RuntimeException(
"GetPrice returned $status: $body"
);
}
$data = json_decode(
$body, true, flags: JSON_THROW_ON_ERROR
);
foreach ($data["skus"] as $entry) {
echo $entry["sku"], " ", $entry["status"], "\n";
}
foreach ($data["data"] as $set) {
foreach ($set["competitors"] as $entry) {
if ($entry["price"] === null) {
continue;
}
echo $set["sku"], " ",
$entry["competitor"]["name"], " ",
$entry["price"]["amount"], "\n";
}
}using System.Net.Http.Headers;
using System.Net.Http.Json;
using System.Text.Json;
using Naming = System.Text.Json.JsonNamingPolicy;
var key = Environment.GetEnvironmentVariable(
"GETPRICE_API_KEY");
var api = new Uri("https://api.getprice.ai/v1/");
var http = new HttpClient { BaseAddress = api };
http.Timeout = TimeSpan.FromSeconds(30);
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", key);
var json = new JsonSerializerOptions
{
PropertyNamingPolicy = Naming.SnakeCaseLower,
};
var res = await http.GetAsync(
"comparison-sets?sku=10072L&sku=11247P");
res.EnsureSuccessStatusCode();
var page = await res.Content
.ReadFromJsonAsync<Page>(json);
foreach (var s in page!.Skus)
Console.WriteLine($"{s.Sku} {s.Status}");
foreach (var set in page.Data)
foreach (var e in set.Competitors)
if (e.Price is { } price)
Console.WriteLine(
$"{set.Sku} {e.Competitor.Name} "
+ price.Amount);
record Page(List<CompSet> Data, List<SkuStatus> Skus);
record SkuStatus(string Sku, string Status);
record CompSet(string? Sku, List<Entry> Competitors);
record Entry(Competitor Competitor, Price? Price);
record Competitor(string Name);
record Price(string Amount);from decimal import Decimal
import requests
from odoo import models
API = "https://api.getprice.ai/v1"
class ProductProduct(models.Model):
_inherit = "product.product"
def action_getprice_competitor_prices(self):
"""Post the cheapest fresh competitor price.
Up to 100 products per call.
"""
icp = self.env["ir.config_parameter"].sudo()
key = icp.get_param("getprice.api_key")
resp = requests.get(
f"{API}/comparison-sets",
params=[
("sku", p.default_code) for p in self
],
headers={"Authorization": f"Bearer {key}"},
timeout=30,
)
resp.raise_for_status()
sets = {
s["sku"].strip().upper(): s
for s in resp.json()["data"]
}
for product in self:
sku = product.default_code.strip().upper()
cset = sets.get(sku, {})
entries = cset.get("competitors", [])
offers = [
e
for e in entries
if e["price"]
and not e["stale"]
and e["match"]["review"] == "same"
]
if not offers:
continue
best = min(
offers,
key=lambda e: Decimal(
e["price"]["amount"]
),
)
name = best["competitor"]["name"]
price = best["price"]
line = f"{name}: R{price['amount']}"
if price["was"]: # on promotion
line += f" (was R{price['was']})"
product.message_post(
body=f"Cheapest: {line}"
)Response
200
// shortened: the first set, 3 of its competitors
{
"data": [
{
"id": "set_x7Kp2Lm9",
"name": "Baked Beans in Tomato Sauce 410g",
"sku": "10072L",
"own_product": {
"id": "prd_8fK2mQa1",
"name": "Baked Beans in Tomato Sauce 410g",
"url": "https://shop.example.com/product/10072L",
"price": {
"amount": "18.99",
"was": null,
"currency": "ZAR"
},
"last_collected_at": "2026-11-02T04:12:09Z",
"stale": false
},
"competitors": [
{
"competitor": {
"id": "cmp_3LqV8nP2",
"name": "Harbour Market",
"domain": "harbourmarket.example.com"
},
"product": {
"id": "prd_Q2vN9cD4",
"name": "Baked Beans 410g",
"url": "https://harbourmarket.example.com/baked-beans-in-tomato-sauce-410g"
},
"price": {
"amount": "17.99",
"was": "19.99",
"currency": "ZAR"
},
"last_collected_at": "2026-11-02T03:05:11Z",
"availability": "unknown",
"status": "active",
"stale": false,
"match": {
"review": "same",
"reviewed_by": "customer",
"confidence": null
}
},
{
"competitor": {
"id": "cmp_7RwK4tB9",
"name": "Cape Fresh",
"domain": "capefresh.example.com"
},
"product": {
"id": "prd_Hm3Wc8Kp",
"name": "Baked Beans In Tomato Sauce 410g",
"url": "https://capefresh.example.com/baked-beans-in-tomato-sauce-410g"
},
"price": {
"amount": "18.99",
"was": null,
"currency": "ZAR"
},
"last_collected_at": "2026-11-02T03:11:40Z",
"availability": "unknown",
"status": "active",
"stale": false,
"match": {
"review": "same",
"reviewed_by": "getprice",
"confidence": 0.94
}
},
{
"competitor": {
"id": "cmp_9TzM2cX5",
"name": "Northwind Wholesale",
"domain": "northwindwholesale.example.com"
},
"product": {
"id": "prd_Zt6Pa2Rn",
"name": "Baked Beans In Tomato Sauce 410g",
"url": "https://northwindwholesale.example.com/baked-beans-in-tomato-sauce-410g"
},
"price": {
"amount": "17.99",
"was": null,
"currency": "ZAR"
},
"last_collected_at": "2026-11-02T03:20:05Z",
"availability": "unknown",
"status": "active",
"stale": false,
"match": {
"review": "unreviewed",
"reviewed_by": null,
"confidence": 0.81
}
}
],
"integrity": "ok",
"updated_at": "2026-11-02T04:14:00Z"
}
],
"next_cursor": null
}- QuickstartFrom API key to competitor prices in about five minutes.
- Odoo 17 guidePut the cheapest fresh competitor price on every product, nightly.
- API referenceEvery endpoint, parameter, response and error.
- Errors and rate limitsWhat each error code means and how to retry safely.
| You want to | Call |
|---|---|
| Check that your key works | GET /v1/me |
| Get competitor prices for up to 100 SKUs | GET /v1/comparison-sets?sku=…&sku=… |
| Sync every comparison set into your ERP | GET /v1/comparison-sets |
| Get one comparison set | GET /v1/comparison-sets/{set_id} |
| Find one of your products to link a SKU | GET /v1/products?q=… |
| See which competitors GetPrice tracks for you | GET /v1/competitors |
| Link or unlink your SKUs | PUT or DELETE /v1/sku-mappings/{sku} |
Prices are read-only. The only thing you can change is which of your SKUs points at which of your products.