API reference overview
The base URL, request and response formats, identifiers, dates and versioning that every endpoint shares.
Updated
Base URL
Every endpoint lives under one base URL, over HTTPS only:
https://www.skipshoot.com/api/v1Every request is authenticated with a secret key in the Authorization header. Authenticate API requests shows how.
Endpoints
| Method | Path | Resource | Does |
|---|---|---|---|
| GET | /me | Account | Retrieve your account |
| GET | /products | Products | List all products |
| GET | /scenes | Scenes | List all scenes |
| POST | /scenes | Scenes | Create a scene |
| GET | /scenes/{id} | Scenes | Retrieve a scene |
| POST | /renders | Renders | Create renders |
| GET | /renders/{id} | Renders | Retrieve a render |
| DELETE | /renders/{id} | Renders | Cancel a render |
Requests
- Send request bodies as JSON with
Content-Type: application/json. The one exception is uploading a room picture, which may be sent asmultipart/form-data. - Field names are
snake_case, in requests and responses. - Fields marked optional can be left out. Unknown fields are ignored.
- Only Create renders spends credits. It takes an Idempotency-Key, so a retry never charges twice.
- Each secret key may make 600 requests a minute. See Rate limits.
Responses
Every response is JSON. A successful response wraps what you asked for in a named field (scene, scenes, render, renders, products), so new fields can be added beside it later without breaking your code.
{
"scene": {
"id": 812,
"name": "Library",
"origin": "upload",
"setting": "indoor",
"status": "ready",
"image_url": "https://…",
"surfaces": [
{
"id": "wall_1",
"name": "Back wall",
"type": "wall"
},
{
"id": "floor_1",
"name": "Floor",
"type": "floor"
},
{
"id": "sofa_1",
"name": "Sofa",
"type": "furniture"
},
{
"id": "scene_lighting",
"name": "Scene lighting",
"type": "lighting"
}
],
"created_at": "2026-10-21T14:02:40.000Z"
}
}An error carries an HTTP status and an error object with a stable type and a message written for people. Errors and status codes lists every one.
{
"error": {
"type": "not_found",
"message": "No such scene."
}
}Responses are never cached (Cache-Control: no-store), and successful ones carry your rate limit headers.
Identifiers
| Object | Identifier | Example |
|---|---|---|
| Scene | Integer | 812 |
| Product | Integer | 4410 |
| Render | UUID string | 3f2b8e9a-6c1d-4e7b-9a05-2d8c41f7b6e0 |
| Surface | String, unique within its scene | wall_1 |
Treat identifiers as opaque. Store them as they come back, and do not build them yourself.
Dates and times
Timestamps such as created_at are ISO 8601 strings in UTC, for example 2026-10-21T14:03:12.000Z. A timestamp the API does not have is null.
Lists
List all products and List all scenes return the whole list in one response. There are no pages to walk through.
Versioning
The version is in the path: /api/v1. Changes that affect integrations are listed in the API changelog, and the OpenAPI specification carries its own version number.
Something these pages do not answer? Email admin@skipshoot.com and we’ll help.
