Quickstart
Create a key, make your first call, and read the response.
Everything lives under https://app.bloomcount.com/api/v1, speaks JSON, and
authenticates with a bearer token.
Create an API key
In the app, open Settings → API and create a key. Tick only the scopes the
integration needs: a key without products:write cannot create products, and a
key with no scope for a resource cannot read it either.
The key is shown once, at creation. It looks like bloomcount_ followed by
48 hex characters. Store it where your server can read it and nobody else can.
Make a call
List a few products, asking for two fields so the response is easy to read:
curl "https://app.bloomcount.com/api/v1/products?limit=3&fields=name,category" \
-H "Authorization: Bearer bloomcount_..."const res = await fetch(
"https://app.bloomcount.com/api/v1/products?limit=3&fields=name,category",
{ headers: { Authorization: `Bearer ${process.env.BLOOMCOUNT_API_KEY}` } },
);
const { items } = await res.json();import os, requests
res = requests.get(
"https://app.bloomcount.com/api/v1/products",
params={"limit": 3, "fields": "name,category"},
headers={"Authorization": f"Bearer {os.environ['BLOOMCOUNT_API_KEY']}"},
)
items = res.json()["items"]Read the response
Every list endpoint returns the same envelope: the rows in items, plus
isDone and cursor for paging.
{
"items": [
{
"productId": "prod_h71eaa8d4mr3vk2qz9pn5wf",
"name": "Rose",
"category": "Roses"
}
],
"isDone": false,
"cursor": "..."
}The id came back even though it was not asked for, because it always does. Pass
cursor back as a query parameter for the next page, and stop when isDone is
true.