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 products
const 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 tags
const 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 product
const 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 product
const 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 product
const 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 product
const 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 orders
const 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 order
const 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 order
const 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 order
const 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 order
const 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 tags
const 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 tag
const 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 tag
const 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 tag
const 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 tag
const 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 relationship
const 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 relationship
const 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 relationship
const 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)