API reference

Base URL https://productaura.co/api/v1. Send Authorization: Bearer pa_… (Settings → API keys). Errors are JSON { error, message }. 1 credit = one 2K image; reading calls are free. Rate limit: 120 requests per minute per account. Machine-readable: openapi.json. Overview and CLI: API and CLI.

Packs, shots, languages and prices

GET /api/v1/catalog · no API key needed

Lists the platform packs with each shot and its credit cost, the languages for on-image text, plans and credit packs. No API key needed.

Cost: Free

Response 200

{
  "packs": [
    {
      "id": "amazon",
      "label": "Amazon listing",
      "shots": [
        {
          "key": "main-white",
          "credits": 1
        }
      ]
    }
  ]
}

Your e-mail and credit balance

GET /api/v1/me

Returns the account the key belongs to and its credit balance (1 credit = one 2K image).

Cost: Free

Response 200

{
  "email": "[email protected]",
  "balance": 20,
  "creditMeaning": "1 credit = one 2K image"
}

Signed URL for a direct photo upload

POST /api/v1/uploads

Returns a signed URL; PUT the photo bytes to it with the same Content-Type, then pass uploadId to POST /products. Use this for photos over a few MB.

Cost: Free

Request body

{
  "contentType": "image/jpeg",
  "size": 2400000
}

Response 200

{
  "uploadId": "6f1c2a9e-3b4d-4e5f-8a7b-1c2d3e4f5a6b",
  "uploadUrl": "https://…",
  "method": "PUT",
  "headers": {
    "Content-Type": "image/jpeg"
  }
}

Errors: 400

Create a product from a photo

POST /api/v1/products

Stores the photo and analyses it into a product profile (name, features, setting) that fills the prompts. Send imageBase64 or an uploadId. Takes a few seconds.

Cost: Free

Request body

{
  "imageBase64": "/9j/4AAQSkZJRg…",
  "name": "Soy candle"
}

Response 201

{
  "product": {
    "id": "6f1c2a9e-3b4d-4e5f-8a7b-1c2d3e4f5a6b",
    "name": "Soy wax candle in amber jar"
  }
}

Errors: 400, 404

Your products

GET /api/v1/products

Lists your products (newest first, up to 100) with their folder and image sets.

Cost: Free

Response 200

{
  "products": [
    {
      "id": "6f1c2a9e-3b4d-4e5f-8a7b-1c2d3e4f5a6b",
      "name": "Soy candle",
      "folder_id": null,
      "image_sets": [
        {
          "id": "6f1c2a9e-3b4d-4e5f-8a7b-1c2d3e4f5a6b",
          "pack": "amazon"
        }
      ]
    }
  ]
}

Move a product to a folder

POST /api/v1/products/{id}/move

Puts the product in a folder, or takes it out of every folder with folderId null.

Cost: Free

Request body

{
  "folderId": "6f1c2a9e-3b4d-4e5f-8a7b-1c2d3e4f5a6b"
}

Response 200

{}

Errors: 404

Your folders

GET /api/v1/folders

Lists your folders in tree order, each with its parent and product count.

Cost: Free

Response 200

{
  "folders": [
    {
      "id": "6f1c2a9e-3b4d-4e5f-8a7b-1c2d3e4f5a6b",
      "name": "Store 1",
      "parentId": null,
      "kind": "store",
      "products": 3
    }
  ]
}

Create a folder

POST /api/v1/folders

Creates a folder, optionally inside another one.

Cost: Free

Request body

{
  "name": "Client: Acme"
}

Response 201

{
  "folder": {
    "id": "6f1c2a9e-3b4d-4e5f-8a7b-1c2d3e4f5a6b",
    "name": "Client: Acme",
    "parentId": null
  }
}

Errors: 400, 404

Plan an image set

POST /api/v1/image-sets

Creates an image set for a product, platform pack and language, and returns the shot plan with the credit cost of each shot. Nothing is generated yet.

Cost: Free

Request body

{
  "productId": "6f1c2a9e-3b4d-4e5f-8a7b-1c2d3e4f5a6b",
  "pack": "amazon",
  "locale": "de"
}

Response 201

{
  "imageSetId": "6f1c2a9e-3b4d-4e5f-8a7b-1c2d3e4f5a6b",
  "balance": 20
}

Errors: 400, 404

Generate the images

POST /api/v1/image-sets/{id}/generate · send an Idempotency-Key header

Spends credits and queues the chosen shots, all or nothing (default: the plan’s default shots). Returns at once; images take about 1–3 minutes. Send an Idempotency-Key so a retry never charges twice.

Cost: The sum of the shots’ credits (usually 1 per image)

Request body

{
  "shots": [
    "main-white",
    "infographic-features",
    "lifestyle"
  ]
}

Response 202

{
  "generationIds": [
    "6f1c2a9e-3b4d-4e5f-8a7b-1c2d3e4f5a6b"
  ],
  "balance": 17,
  "status": "queued"
}

Errors: 400, 402, 404, 503

Status and images

GET /api/v1/image-sets/{id}

Returns every image with its status and signed URLs (valid 15 minutes). Poll every few seconds until done is true.

Cost: Free

Response 200

{
  "done": true,
  "pending": 0,
  "imageSet": {
    "id": "6f1c2a9e-3b4d-4e5f-8a7b-1c2d3e4f5a6b",
    "pack": "amazon",
    "generations": [
      {
        "id": "6f1c2a9e-3b4d-4e5f-8a7b-1c2d3e4f5a6b",
        "shotKey": "main-white",
        "status": "done"
      }
    ]
  }
}

Errors: 404

Check against platform rules

GET /api/v1/image-sets/{id}/checks

Checks the newest finished version of each image against the platform’s published rules: Amazon main image, sizes, formats, Etsy’s 1 MB warning, Shopify limits.

Cost: Free

Response 200

{
  "pack": "amazon",
  "set": [],
  "images": [
    {
      "shotKey": "main-white",
      "checks": [
        {
          "status": "pass",
          "text": "Pure white background (RGB 255, 255, 255)"
        }
      ]
    }
  ]
}

Errors: 404

Edit an image with a sentence

POST /api/v1/generations/{id}/edit · send an Idempotency-Key header

Changes one finished image as described ("warmer light, add a marble counter") and keeps the product and everything else. The result is a new version; the old one stays.

Cost: One image (usually 1)

Request body

{
  "instruction": "warmer light, add a marble counter"
}

Response 202

{
  "generationId": "6f1c2a9e-3b4d-4e5f-8a7b-1c2d3e4f5a6b",
  "imageSetId": "6f1c2a9e-3b4d-4e5f-8a7b-1c2d3e4f5a6b",
  "cost": 1,
  "balance": 16,
  "status": "queued"
}

Errors: 400, 402, 404, 409, 503

Make an image again

POST /api/v1/generations/{id}/regenerate · send an Idempotency-Key header

Makes the same shot again with the same prompt, as a new version. Not for the main image on white (a cut-out of your photo); edit that one instead.

Cost: One image (usually 1)

Response 202

{
  "generationId": "6f1c2a9e-3b4d-4e5f-8a7b-1c2d3e4f5a6b",
  "imageSetId": "6f1c2a9e-3b4d-4e5f-8a7b-1c2d3e4f5a6b",
  "cost": 1,
  "balance": 15,
  "status": "queued"
}

Errors: 400, 402, 404, 409, 503

Rate an image

POST /api/v1/generations/{id}/rating

Thumbs up (1), down (-1) or clear (null), with optional reasons: product-changed, wrong-text, not-realistic, bad-composition, wrong-style, low-quality.

Cost: Free

Request body

{
  "rating": -1,
  "reasons": [
    "wrong-text"
  ]
}

Response 200

{}

Errors: 400, 404

Send feedback

POST /api/v1/feedback

Sends a message to the Product Aura team.

Cost: Free

Request body

{
  "message": "The German callouts are great."
}

Response 201

{}

Errors: 400

Payment link for credits

POST /api/v1/checkout

Returns a Stripe payment link for a credit pack or a plan. A person opens it and pays; nothing is charged by this call. Without an API key it returns the card links for buying credits without an account (the page after payment shows a key).

Cost: Free

Request body

{
  "kind": "pack",
  "pack": "pack_m"
}

Response 200

{
  "url": "https://checkout.stripe.com/…"
}

Errors: 400, 503