Products
Create products, assign Sphere product tax codes, and retrieve them.
A product represents something you sell. Assign a Sphere product tax code so the tax engine can determine taxability and rates. Reference a product as product_id on a transaction line.
Creates a product, or merges into the existing one with the same external_id. Assign a Sphere product tax code so the engine can determine taxability and rates. With an API key associated to a billing integration connection, external_id is that system's product idand the write updates the synced product in place.
Body for POST /v1/products.
external_id is the caller's own product identifier and doubles as the
natural idempotency key: re-posting the same external_id updates the
existing product (merge — only the fields you send change).
nullnullnulltrueA product.
nullnullnullValidation error, keyed by the failing field.
Missing, invalid, or inactive API key.
Rate limit exceeded. Carries Retry-After and RateLimit-* headers.
POST /v1/products HTTP/1.1
Host: api.getsphere.com
X-API-KEY: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 89
{
"external_id": "text",
"name": "text",
"description": "text",
"tax_code": "text",
"active": true
}{
"external_id": "text",
"name": "text",
"description": "text",
"tax_code": "text",
"active": true,
"created_at": "2026-01-01T00:00:00.000Z"
}Base for every public v1 endpoint (products, and customers/transactions later) — named for the surface, not any one resource.
The external_id you assigned to the record.
A product.
nullnullnullMissing, invalid, or inactive API key.
No record with that external_id.
Rate limit exceeded. Carries Retry-After and RateLimit-* headers.
GET /v1/products/{external_id} HTTP/1.1
Host: api.getsphere.com
X-API-KEY: YOUR_API_KEY
Accept: */*
{
"external_id": "text",
"name": "text",
"description": "text",
"tax_code": "text",
"active": true,
"created_at": "2026-01-01T00:00:00.000Z"
}Was this helpful?