Quickstart: render your first product image

Go from a new key to a finished render in six steps. Copy each request, run it, and read what comes back.

Updated

Before you start

  • A Skip Shoot workspace with the API switched on. It is in early access: ask for access if your workspace does not have it yet.
  • You are an owner or admin of the workspace, so you can create keys.
  • At least one product in your catalog, and 1 credit for the render.
  • A picture of a room as JPEG, PNG or WebP, up to 30 MB, at a public URL or on your computer.
  • A terminal with curl, or Node.js 18 or later, or Python 3 with the requests package.

1. Create a secret key

In Skip Shoot, open Settings → Developers and create a secret key named “Quickstart”. The key is shown once: copy it before you close the dialog.

Put it in an environment variable, so it stays out of your code:

Terminal
export SKIPSHOOT_SECRET_KEY="sk_live_…"  # paste your own key

2. Check the key

This spends nothing, and shows the key works:

curl https://www.skipshoot.com/api/v1/me \
  -H "Authorization: Bearer $SKIPSHOOT_SECRET_KEY"
200 OK
{
  "workspace": {
    "name": "Northwind Textiles"
  },
  "key": {
    "kind": "secret",
    "mode": "live"
  },
  "credits": {
    "used": 312,
    "limit": 1500,
    "remaining": 1188
  }
}

A 401 here means the key was not copied whole. See Authentication errors.

3. Add a scene

A scene is the room your product renders into. Send a room picture’s URL, or upload the file. Adding a scene is free.

curl -X POST https://www.skipshoot.com/api/v1/scenes \
  -H "Authorization: Bearer $SKIPSHOOT_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "image_url": "https://example.com/rooms/library.jpg",
  "name": "Library"
}'
201 Created
{
  "scene": {
    "id": 812,
    "name": "Library",
    "origin": "upload",
    "setting": "indoor",
    "status": "analyzing",
    "image_url": "https://…",
    "surfaces": [],
    "created_at": "2026-10-21T14:02:40.000Z"
  }
}

Note the scene’s id. Here it is 812.

4. Wait for the scene

The room’s surfaces are found in the background. Fetch the scene every few seconds until its status is ready:

curl https://www.skipshoot.com/api/v1/scenes/812 \
  -H "Authorization: Bearer $SKIPSHOOT_SECRET_KEY"
200 OK
{
  "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"
  }
}

If it comes back failed, the picture could not be read this time: add it again in a few minutes. If it is ready but lists only scene_lighting, no surfaces were found: try a sharper, wider picture of the room. Adding a scene costs nothing.

5. Choose a product

List the products your workspace can render, and pick one:

curl https://www.skipshoot.com/api/v1/products \
  -H "Authorization: Bearer $SKIPSHOOT_SECRET_KEY"
200 OK
{
  "products": [
    {
      "id": 4410,
      "name": "Emerald velvet",
      "brand": "Northwind",
      "sku": "NW-VEL-104",
      "category": "Upholstery fabric",
      "type": "furniture",
      "material_type": "fabric",
      "image_url": "https://…"
    }
  ]
}

6. Render and download

Ask for the product in the scene. Leave out surface_id and it goes on the first surface it fits. The Idempotency-Key makes a retry safe: the same request sent twice is charged once.

curl -X POST https://www.skipshoot.com/api/v1/renders \
  -H "Authorization: Bearer $SKIPSHOOT_SECRET_KEY" \
  -H "Idempotency-Key: quickstart-library-4410" \
  -H "Content-Type: application/json" \
  -d '{
  "scene_id": 812,
  "product_id": 4410
}'
202 Accepted
{
  "renders": [
    {
      "id": "3f2b8e9a-6c1d-4e7b-9a05-2d8c41f7b6e0",
      "scene": {
        "id": 812,
        "name": "Library"
      },
      "product": {
        "id": 4410,
        "name": "Emerald velvet"
      },
      "paint": null,
      "surface": "Sofa",
      "created_at": "2026-10-21T14:03:12.000Z",
      "status": "queued",
      "image_url": null,
      "upscale_status": "not_requested",
      "error": null
    }
  ],
  "credits_charged": 1
}

Fetch the render every few seconds until its status is completed:

curl https://www.skipshoot.com/api/v1/renders/3f2b8e9a-6c1d-4e7b-9a05-2d8c41f7b6e0 \
  -H "Authorization: Bearer $SKIPSHOOT_SECRET_KEY"
200 OK
{
  "render": {
    "id": "3f2b8e9a-6c1d-4e7b-9a05-2d8c41f7b6e0",
    "scene": {
      "id": 812,
      "name": "Library"
    },
    "product": {
      "id": 4410,
      "name": "Emerald velvet"
    },
    "paint": null,
    "surface": "Sofa",
    "created_at": "2026-10-21T14:03:12.000Z",
    "status": "completed",
    "image_url": "https://…",
    "upscale_status": "not_requested",
    "error": null
  }
}

Then download the image from image_url. The link needs no key:

Terminal
curl -o library-emerald-velvet.png "<image_url from the response>"

Next steps

Something these pages do not answer? Email admin@skipshoot.com and we’ll help.