curl --request GET \
--url https://www.closient.com/agent/api/v1/products/{gtin}/availability \
--header 'X-API-Key: <api-key>'import requests
url = "https://www.closient.com/agent/api/v1/products/{gtin}/availability"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://www.closient.com/agent/api/v1/products/{gtin}/availability', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://www.closient.com/agent/api/v1/products/{gtin}/availability",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://www.closient.com/agent/api/v1/products/{gtin}/availability"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://www.closient.com/agent/api/v1/products/{gtin}/availability")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.closient.com/agent/api/v1/products/{gtin}/availability")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body[
{
"address": "270 Greenwich St, New York, NY, 10007",
"distance_km": 1.23,
"last_verified": "2026-04-30T14:22:00Z",
"price": "4.99 USD",
"stock_confidence": "active",
"stock_status": "In Stock",
"store": "Whole Foods Tribeca"
}
]{
"type": "https://closient.com/docs/errors/not_found",
"title": "Not Found",
"status": 404,
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"timestamp": "2026-03-31T12:00:00+00:00"
}{
"type": "https://closient.com/docs/errors/not_found",
"title": "Not Found",
"status": 404,
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"timestamp": "2026-03-31T12:00:00+00:00"
}{
"type": "https://closient.com/docs/errors/not_found",
"title": "Not Found",
"status": 404,
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"timestamp": "2026-03-31T12:00:00+00:00"
}{
"type": "https://closient.com/docs/errors/not_found",
"title": "Not Found",
"status": 404,
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"timestamp": "2026-03-31T12:00:00+00:00"
}{
"type": "https://closient.com/docs/errors/not_found",
"title": "Not Found",
"status": 404,
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"timestamp": "2026-03-31T12:00:00+00:00"
}Check store availability for a product
Returns nearby store availability for a known product. Provide the user’s location and search radius to find stores carrying this product, sorted by distance (closest first).
curl --request GET \
--url https://www.closient.com/agent/api/v1/products/{gtin}/availability \
--header 'X-API-Key: <api-key>'import requests
url = "https://www.closient.com/agent/api/v1/products/{gtin}/availability"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://www.closient.com/agent/api/v1/products/{gtin}/availability', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://www.closient.com/agent/api/v1/products/{gtin}/availability",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://www.closient.com/agent/api/v1/products/{gtin}/availability"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://www.closient.com/agent/api/v1/products/{gtin}/availability")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.closient.com/agent/api/v1/products/{gtin}/availability")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body[
{
"address": "270 Greenwich St, New York, NY, 10007",
"distance_km": 1.23,
"last_verified": "2026-04-30T14:22:00Z",
"price": "4.99 USD",
"stock_confidence": "active",
"stock_status": "In Stock",
"store": "Whole Foods Tribeca"
}
]{
"type": "https://closient.com/docs/errors/not_found",
"title": "Not Found",
"status": 404,
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"timestamp": "2026-03-31T12:00:00+00:00"
}{
"type": "https://closient.com/docs/errors/not_found",
"title": "Not Found",
"status": 404,
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"timestamp": "2026-03-31T12:00:00+00:00"
}{
"type": "https://closient.com/docs/errors/not_found",
"title": "Not Found",
"status": 404,
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"timestamp": "2026-03-31T12:00:00+00:00"
}{
"type": "https://closient.com/docs/errors/not_found",
"title": "Not Found",
"status": 404,
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"timestamp": "2026-03-31T12:00:00+00:00"
}{
"type": "https://closient.com/docs/errors/not_found",
"title": "Not Found",
"status": 404,
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"timestamp": "2026-03-31T12:00:00+00:00"
}Authorizations
Path Parameters
GTIN of the product to look up. Accepts GTIN-8, GTIN-12 (UPC-A), GTIN-13 (EAN-13), or GTIN-14; the service pads shorter forms to GTIN-14 internally before lookup.
8 - 14^\d{8}$|^\d{12,14}$Query Parameters
Latitude in decimal degrees (WGS84). Positive north / negative south. Required — the endpoint is location-anchored and has no default.
-90 <= x <= 90Longitude in decimal degrees (WGS84). Positive east / negative west. Required — the endpoint is location-anchored and has no default.
-180 <= x <= 180Search radius in kilometers from the latitude/longitude pair. Stores beyond this distance are excluded. Capped at 100 km.
x <= 100Response
OK
Store / branch name as the shopper would recognize it (e.g. 'Whole Foods Tribeca'). Sourced from Place.name.
Comma-joined street address ('line 1, city, region, postal_code'). Components missing on the underlying Place are omitted from the joined string.
Great-circle distance from the user's location to this store, in kilometers, rounded to 2 decimals. Zero when the distance could not be computed.
x >= 0Customer-facing stock label derived from the underlying offer status. Use this when surfacing availability to a shopper. See stock_confidence for the machine-readable wire value.
In Stock, Discontinued, Seasonal, Out of Stock, Unknown Wire value of the underlying InStoreOffer.status (apps.retailers.models.OfferStatus). Use this for programmatic decisions; see stock_status for the display label.
active, discontinued, seasonal, out_of_stock Price as an amount followed by its ISO 4217 code (e.g. '4.99 USD'), read off the offer record. Never a bare symbol: '$' alone names USD, CAD, AUD and MXN, and Closient carries offers in several of them. Null when no price is on file for this store.
ISO 8601 timestamp of the last inventory verification on the underlying InStoreOffer.quantity_updated_at. Null when the offer has never had a quantity update.