NeonDB · Prisma · Next.js
E-commerce API
A small REST API for managing products and orders. All endpoints require an API key sent in the x-api-key header (or as a Bearer token).
Authentication
curl https://your-app.vercel.app/api/products \
-H "x-api-key: $API_KEY"Code examples
These controls apply to every endpoint below.
Products
GET
/api/productsList productsconst response = await fetch("https://your-app.vercel.app/api/products", {
method: "GET",
headers: {
"x-api-key": process.env.API_KEY,
},
})
const data = await response.json()
console.log(data)GET
/api/products?tags=red,largeFilter by all tagsconst response = await fetch("https://your-app.vercel.app/api/products?tags=red,large", {
method: "GET",
headers: {
"x-api-key": process.env.API_KEY,
},
})
const data = await response.json()
console.log(data)POST
/api/productsCreate a productconst response = await fetch("https://your-app.vercel.app/api/products", {
method: "POST",
headers: {
"x-api-key": process.env.API_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"name": "Example product",
"description": "A useful product",
"priceCents": 1999,
"stock": 10,
"tags": [
{
"type": "color",
"name": "red"
}
]
}),
})
const data = await response.json()
console.log(data)GET
/api/products/:idGet one productconst response = await fetch("https://your-app.vercel.app/api/products/PRODUCT_OR_ORDER_ID", {
method: "GET",
headers: {
"x-api-key": process.env.API_KEY,
},
})
const data = await response.json()
console.log(data)PATCH
/api/products/:idUpdate a productconst response = await fetch("https://your-app.vercel.app/api/products/PRODUCT_OR_ORDER_ID", {
method: "PATCH",
headers: {
"x-api-key": process.env.API_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"priceCents": 2499,
"stock": 8
}),
})
const data = await response.json()
console.log(data)DELETE
/api/products/:idDelete a productconst response = await fetch("https://your-app.vercel.app/api/products/PRODUCT_OR_ORDER_ID", {
method: "DELETE",
headers: {
"x-api-key": process.env.API_KEY,
},
})
const data = await response.json()
console.log(data)Orders
GET
/api/ordersList ordersconst response = await fetch("https://your-app.vercel.app/api/orders", {
method: "GET",
headers: {
"x-api-key": process.env.API_KEY,
},
})
const data = await response.json()
console.log(data)POST
/api/ordersCreate an orderconst response = await fetch("https://your-app.vercel.app/api/orders", {
method: "POST",
headers: {
"x-api-key": process.env.API_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"customerEmail": "customer@example.com",
"items": [
{
"productId": "PRODUCT_ID",
"quantity": 1
}
]
}),
})
const data = await response.json()
console.log(data)GET
/api/orders/:idGet one orderconst response = await fetch("https://your-app.vercel.app/api/orders/PRODUCT_OR_ORDER_ID", {
method: "GET",
headers: {
"x-api-key": process.env.API_KEY,
},
})
const data = await response.json()
console.log(data)PATCH
/api/orders/:idUpdate an orderconst response = await fetch("https://your-app.vercel.app/api/orders/PRODUCT_OR_ORDER_ID", {
method: "PATCH",
headers: {
"x-api-key": process.env.API_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"status": "shipped"
}),
})
const data = await response.json()
console.log(data)DELETE
/api/orders/:idDelete an orderconst response = await fetch("https://your-app.vercel.app/api/orders/PRODUCT_OR_ORDER_ID", {
method: "DELETE",
headers: {
"x-api-key": process.env.API_KEY,
},
})
const data = await response.json()
console.log(data)Tags
Tags use ASCII names and types. Product tag filters use comma-separated names with AND semantics.
GET
/api/tagsList tagsconst response = await fetch("https://your-app.vercel.app/api/tags", {
method: "GET",
headers: {
"x-api-key": process.env.API_KEY,
},
})
const data = await response.json()
console.log(data)POST
/api/tagsCreate a tagconst response = await fetch("https://your-app.vercel.app/api/tags", {
method: "POST",
headers: {
"x-api-key": process.env.API_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"type": "color",
"name": "red"
}),
})
const data = await response.json()
console.log(data)GET
/api/tags/:idGet one tagconst response = await fetch("https://your-app.vercel.app/api/tags/PRODUCT_OR_ORDER_ID", {
method: "GET",
headers: {
"x-api-key": process.env.API_KEY,
},
})
const data = await response.json()
console.log(data)PATCH
/api/tags/:idUpdate a tagconst response = await fetch("https://your-app.vercel.app/api/tags/PRODUCT_OR_ORDER_ID", {
method: "PATCH",
headers: {
"x-api-key": process.env.API_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"name": "blue"
}),
})
const data = await response.json()
console.log(data)DELETE
/api/tags/:idDelete a tagconst response = await fetch("https://your-app.vercel.app/api/tags/PRODUCT_OR_ORDER_ID", {
method: "DELETE",
headers: {
"x-api-key": process.env.API_KEY,
},
})
const data = await response.json()
console.log(data)GET
/api/product_tag/:idGet a product-tag relationshipconst response = await fetch("https://your-app.vercel.app/api/product_tag/PRODUCT_OR_ORDER_ID", {
method: "GET",
headers: {
"x-api-key": process.env.API_KEY,
},
})
const data = await response.json()
console.log(data)PATCH
/api/product_tag/:idUpdate a product-tag relationshipconst response = await fetch("https://your-app.vercel.app/api/product_tag/PRODUCT_OR_ORDER_ID", {
method: "PATCH",
headers: {
"x-api-key": process.env.API_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"tagId": "TAG_ID"
}),
})
const data = await response.json()
console.log(data)DELETE
/api/product_tag/:idDelete a product-tag relationshipconst response = await fetch("https://your-app.vercel.app/api/product_tag/PRODUCT_OR_ORDER_ID", {
method: "DELETE",
headers: {
"x-api-key": process.env.API_KEY,
},
})
const data = await response.json()
console.log(data)Health
GET
/api/healthLiveness + DB check (no key)const response = await fetch("https://your-app.vercel.app/api/health", {
method: "GET",
headers: {
},
})
const data = await response.json()
console.log(data)