Developers
Build on SitesPlaced
SitesPlaced has a public API. An API is a way for your code to read and change a store's data without a person clicking through the dashboard. There are two ways to use it. You can put your own website in front of a SitesPlaced store. Or you can keep a shop you already run somewhere else and copy its orders in. The API is on the free plan.
Updated 18 September 2026
What you can build
Quick start in 3 steps
1. Create a key
An API key is a password for a program. Open your store in the dashboard, go to Settings → Developer and create one. Pick secretfor code that runs on a server, and give it only the permissions it needs. The full key is shown once, so copy it straight away and keep it in your server's environment settings.
You need a SitesPlaced store for this. The free plan is enough. If the person who owns the store is not a developer, send them the Help Center guide to API keys.
2. Make a request
GET /me accepts any valid key and tells you which store the key belongs to. Send the key in the Authorization header. A key in the URL is refused.
curl https://sitesplaced.com/api/v1/me \
-H "Authorization: Bearer sp_live_sk_your_key_here"{
"api_version": "v1",
"store": {
"id": "uuid",
"name": "Asha Jewels",
"slug": "asha-jewels",
"url": "https://asha-jewels.sitesplaced.site",
"tracking_url": "https://asha-jewels.sitesplaced.site/track-order",
"currency": "INR",
"mode": "full"
},
"key": { "kind": "secret", "scopes": ["orders:read"], "connection_id": null },
"limits": { "requests_per_minute": 60 }
}Always use https://sitesplaced.com/api/v1, without www.
3. Handle the response
- Check the HTTP status first. Anything from 400 up carries an
errorobject with a fixedcode, a message in plain words, and arequest_id. - A
429means you went over the rate limit. Wait for the number of seconds in theRetry-Afterheader, then try again. - Every response has an
X-Request-Idheader. Log it. If you ever ask us for help, that id finds the exact call.
const res = await fetch("https://sitesplaced.com/api/v1/me", {
headers: { Authorization: `Bearer ${process.env.SITESPLACED_KEY}` },
});
const body = await res.json();
if (!res.ok) {
// Every error has the same shape. The request id finds the call in our logs.
const { code, message, request_id } = body.error;
if (res.status === 429) {
const waitSeconds = Number(res.headers.get("Retry-After"));
// wait that long, then try again
}
throw new Error(`${code}: ${message} (${request_id})`);
}
console.log(body.store.name, body.limits.requests_per_minute);From here, the API reference has every route with request and response examples.
Two kinds of key
| Key | Starts with | Where it may live | What it can do |
|---|---|---|---|
| Secret | sp_live_sk_ | Servers only | Whatever permissions you gave it |
| Publishable | sp_live_pk_ | Browser code | Read products, prepare a checkout and look up tracking, and only from the websites on its allowed list |
What is done to protect a key:
- SitesPlaced stores only a hash of each key. A hash is a one-way fingerprint, so the key itself cannot be read back. This is why a key is shown once.
- Each key has its own list of permissions, and any key can be revoked on its own without touching the others.
- A secret key sent from a web browser is refused. A publishable key is refused from any website that is not on its allowed list.
- Webhooks and the updates sent to a connected shop are signed, so the receiver can check they came from SitesPlaced.
What it costs
| Free plan | Paid store plan | |
|---|---|---|
| API access | Yes | Yes |
| Requests a minute, per secret key | 60 | 300 |
| Requests a minute, per publishable key | 600, and 30 per visitor | 3,000, and 60 per visitor |
| Connected shops | 1 | 5 |
| Order sync | Yes | Yes |
| Tracking page | With the SitesPlaced badge | Badge removed |
| WhatsApp order messages | No | Yes |
A paid store plan means Growth or AI Co-founder. Prices are on the pricing page. If a paid plan ends, the limits drop back to the free ones and nothing is deleted.
Where to go next
- API reference: authentication, permissions, errors, paging, the order object, every route, webhooks, the headless checkout and tracking.
- WooCommerce plugin: install the zip, connect, what is copied and what is sent back. You can also download the plugin directly.
- Shopify connector: early access. What it will do and how to ask for it.
- MCP server: connect ChatGPT, Claude or Cursor.
- A machine-readable description of the API, in the OpenAPI 3.1 format, is at /api/v1/openapi.json. Tools can read it to generate a client.
More in the developer docs: API reference, WooCommerce, Shopify, MCP for AI assistants.
Not a developer? The Help Center explains the same things step by step. Stuck on something? Send us the request id from the reply you got, through the contact page.