Packshots

List, generate, and manage packshot images for your products.

GET /api/external/packshots

Returns a list of generated packshot images.

Headers

HeaderRequiredDescription
X-Api-KeyYesYour API key in the format mk_live_xxx.secret

Query Parameters

FieldTypeRequiredDescription
statusFilterstringNoFilter by status: all (default) or approved

Response

{
  "packshots": [
    {
      "id": "ps_abc123",
      "name": "White T-Shirt Packshot",
      "thumbnail": "https://cdn.example.com/packshots/thumb_abc123.jpg",
      "status": "DONE",
      "voting": "APPROVED",
      "createdAt": "2026-03-20T15:00:00.000Z"
    }
  ],
  "count": 1
}

Error Responses

CodeMeaning
401Missing or invalid API key
500Internal server error

Notes

  • No credits are consumed by this endpoint.
  • Use statusFilter=approved to retrieve only packshots that have been approved.

Example

curl -X GET "https://app.qamera.ai/api/external/packshots?statusFilter=approved" \
  -H "X-Api-Key: mk_live_abc123.secret456"

POST /api/external/packshots/register-ideas

Registers a new packshot generation job. Credits are reserved immediately and consumed after processing completes.

Headers

HeaderRequiredDescription
X-Api-KeyYesYour API key in the format mk_live_xxx.secret
Content-TypeYesapplication/json

Request Body

FieldTypeRequiredDescription
config.product.idstringYesID of the product to generate packshots for
config.preset.idstringNoID of the preset to apply
config.scenery.idstringNoID of the scenery/background to use
config.model.idstringNoID of the AI model to use
countnumberNoNumber of packshots to generate (default: 10, max: 50)

Response

{
  "createdRecordIds": ["ps_001", "ps_002", "ps_003"],
  "batchId": "batch_abc123",
  "orderId": "order_xyz789",
  "reservationId": "res_def456",
  "creditsReserved": 30
}

Error Responses

CodeMeaning
400Invalid request body or missing required fields
401Missing or invalid API key
402Insufficient credits
500Internal server error

Notes

  • Processing is asynchronous. The job is published to a message queue and processed by a worker.
  • Track the status of generated packshots using the GET endpoint.
  • Credits are reserved at creation, consumed after successful processing, and refunded on failure.
  • Each request generates a correlationId for log tracing.
  • Maximum of 50 packshots per request.

Example

curl -X POST "https://app.qamera.ai/api/external/packshots/register-ideas" \
  -H "X-Api-Key: mk_live_abc123.secret456" \
  -H "Content-Type: application/json" \
  -d '{
    "config": {
      "product": { "id": "prod_abc123" },
      "preset": { "id": "preset_xyz" },
      "scenery": { "id": "scenery_001" }
    },
    "count": 10
  }'

POST /api/external/packshots/update-packshot

Approve, reject, or archive a generated packshot.

Headers

HeaderRequiredDescription
X-Api-KeyYesYour API key in the format mk_live_xxx.secret
Content-TypeYesapplication/json

Request Body

FieldTypeRequiredDescription
recordIdstringYesID of the packshot to update
VotingstringNoSet to APPROVED or REJECTED. Rejecting a packshot automatically archives it.
verificationResultstringNoAdditional verification notes
statusstringNoSet to ARCHIVE to archive the packshot

Response

{
  "success": true
}

Error Responses

CodeMeaning
400Invalid request body or missing recordId
401Missing or invalid API key
404Packshot not found
500Internal server error

Notes

  • Setting Voting to APPROVED marks the packshot as approved.
  • Setting Voting to REJECTED automatically archives the packshot.
  • Setting status to ARCHIVE archives the packshot regardless of voting status.
  • No credits are consumed by this endpoint.

Example

curl -X POST "https://app.qamera.ai/api/external/packshots/update-packshot" \
  -H "X-Api-Key: mk_live_abc123.secret456" \
  -H "Content-Type: application/json" \
  -d '{
    "recordId": "ps_abc123",
    "Voting": "APPROVED"
  }'