GET /v1/ecommerce/products/:id
Read a single product, with its variants, images, and stock.
GET
/
v1
/
ecommerce
/
products
/
{id}
Obtener detalle de un producto
curl --request GET \
--url https://api.keebai.com/v1/ecommerce/products/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.keebai.com/v1/ecommerce/products/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.keebai.com/v1/ecommerce/products/{id}', 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://api.keebai.com/v1/ecommerce/products/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://api.keebai.com/v1/ecommerce/products/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.keebai.com/v1/ecommerce/products/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.keebai.com/v1/ecommerce/products/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"product": {
"_id": "<string>",
"name": "<string>",
"price": 123,
"currency": "<string>",
"stock": 123,
"stock_managed": true,
"type": "<string>",
"variants": [
{
"external_id": "<string>",
"name": "<string>",
"price": 123,
"is_available": true,
"attributes": [
{
"key": "<string>",
"name": "<string>",
"value": "<string>",
"value_key": "<string>"
}
]
}
],
"attributes": [
{
"key": "<string>",
"name": "<string>",
"value": "<string>",
"value_key": "<string>"
}
],
"image_urls": [
"<string>"
],
"listings": [
{
"integration_id": "<string>",
"provider": "<string>",
"status": "pending",
"channel_status": "active",
"is_origin": true,
"variant_id": "<string>",
"channel_price": 123,
"store_name": "<string>",
"permalink": "<string>"
}
],
"is_active": true,
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"slug": "<string>",
"description": "<string>",
"sku": "<string>",
"base_price": 123,
"category_id": "<string>",
"external_id": "<string>",
"integration_id": "<string>",
"landing_url": "<string>"
}
}Returns one product by id. Use
GET /v1/ecommerce/products to find the id first.
Endpoint
GET https://api.keebai.com/v1/ecommerce/products/{id}
Required scope
ecommerce:products:read
Headers
| Header | Required | Value |
|---|---|---|
Authorization | Yes | Bearer kbai_pk_<token> |
Path parameters
| Field | Type | Required | Description |
|---|---|---|---|
id | string | Yes | ObjectId of the product. |
Example request
curl https://api.keebai.com/v1/ecommerce/products/65a1f2b3c4d5e6f7a8b9c0d1 \
-H "Authorization: Bearer kbai_pk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
const response = await fetch(
`https://api.keebai.com/v1/ecommerce/products/${productId}`,
{ headers: { Authorization: `Bearer ${process.env.KEEBAI_API_TOKEN}` } },
);
const { product } = await response.json();
import os, requests
resp = requests.get(
f"https://api.keebai.com/v1/ecommerce/products/{product_id}",
headers={"Authorization": f"Bearer {os.environ['KEEBAI_API_TOKEN']}"},
timeout=10,
)
resp.raise_for_status()
product = resp.json()["product"]
Response
200 OK
{
"product": {
"_id": "65a1f2b3c4d5e6f7a8b9c0d1",
"name": "Zapatilla Runner Pro",
"slug": "zapatilla-runner-pro",
"description": "Zapatilla de running con amortiguación reactiva",
"sku": "SKU-1234",
"price": 5990000,
"currency": "CLP",
"stock": 24,
"stock_managed": true,
"type": "shopify",
"external_id": "gid://shopify/Product/7891234567890",
"variants": [
{ "external_id": "42", "name": "Talla 42", "price": 5990000, "is_available": true },
{ "external_id": "43", "name": "Talla 43", "price": 5990000, "is_available": false }
],
"image_urls": ["https://cdn.example.com/products/runner-pro.jpg"],
"landing_url": "https://tienda.example.com/zapatilla-runner-pro",
"is_active": true,
"created_at": "2026-04-18T09:12:44.010Z",
"updated_at": "2026-05-02T14:31:07.221Z"
}
}
401 Unauthorized
Missing, invalid, revoked, or expired token.403 Forbidden
The token does not have theecommerce:products:read scope.
404 Not Found
No product with that id, or it belongs to a different company.502 Bad Gateway
ECOMMERCE_UPSTREAM_ERROR — the ecommerce service could not answer.
Operational notes
- Variants carry their own price, which may differ from the product’s
price. When a customer picks a size or a colour, quote the variant. is_availableon a variant is not the same asstock. A variant can be unavailable while the product still shows stock, typically because the platform marked that specific option as sold out.external_idis the platform’s id, in the platform’s format. Shopify uses agid://URI, other platforms use plain numbers. Do not parse it — pass it through.
Was this page helpful?
⌘I
Obtener detalle de un producto
curl --request GET \
--url https://api.keebai.com/v1/ecommerce/products/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.keebai.com/v1/ecommerce/products/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.keebai.com/v1/ecommerce/products/{id}', 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://api.keebai.com/v1/ecommerce/products/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://api.keebai.com/v1/ecommerce/products/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.keebai.com/v1/ecommerce/products/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.keebai.com/v1/ecommerce/products/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"product": {
"_id": "<string>",
"name": "<string>",
"price": 123,
"currency": "<string>",
"stock": 123,
"stock_managed": true,
"type": "<string>",
"variants": [
{
"external_id": "<string>",
"name": "<string>",
"price": 123,
"is_available": true,
"attributes": [
{
"key": "<string>",
"name": "<string>",
"value": "<string>",
"value_key": "<string>"
}
]
}
],
"attributes": [
{
"key": "<string>",
"name": "<string>",
"value": "<string>",
"value_key": "<string>"
}
],
"image_urls": [
"<string>"
],
"listings": [
{
"integration_id": "<string>",
"provider": "<string>",
"status": "pending",
"channel_status": "active",
"is_origin": true,
"variant_id": "<string>",
"channel_price": 123,
"store_name": "<string>",
"permalink": "<string>"
}
],
"is_active": true,
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"slug": "<string>",
"description": "<string>",
"sku": "<string>",
"base_price": 123,
"category_id": "<string>",
"external_id": "<string>",
"integration_id": "<string>",
"landing_url": "<string>"
}
}