---
title: "Get presigned URLs for single listing image upload"
method: POST
path: "/v1/listings/presign"
tags: ["Listings"]
---

# Get presigned URLs for single listing image upload

`POST /v1/listings/presign`

## Request

- Base URL: `https://api.shopfront.app`
- URL: `https://api.shopfront.app/v1/listings/presign`
- Auth: HTTP bearer

Get presigned S3 upload URLs for single listing generation.
Use this when sending images via S3 keys instead of URLs or base64.

**Flow:**
1. Call this endpoint with `requestId` and `imageCount`
2. Upload images directly to S3 using the returned presigned URLs (parallel PUT requests)
3. Call `POST /v1/listings/generate` with the returned `keys` as `imageS3Keys`

Presigned URLs expire after 10 minutes.
The first upload slot (offset 0) includes a dedicated hero image URL.

## Request body

- object
  - `requestId` string, uuid, required: Client-generated UUID for request tracking (same ID used in generate call)
  - `imageCount` integer, required: Number of presigned URLs to generate
  - `offset` integer: Starting index for image keys (for chunked uploads)

## Response `200`

Presigned URLs generated

- object
  - `data` object
    - `heroUrl` string, uri: Presigned PUT URL for the hero image (only when offset=0)
    - `imageUrls` string[]: Presigned PUT URLs for uploading images to S3
    - `keys` object
      - `hero` string: S3 key for the hero image (only when offset=0)
      - `images` string[]: S3 keys for uploaded images. Pass the entire `keys` object from this response as the `imageS3Keys` field in `POST /v1/listings/generate` (i.e. `imageS3Keys: { hero: keys.hero, images: keys.images }`). Each filename is `{index}_{requestId}.jpg`, so it stays unique across requests.

## Other responses

- `400`: Invalid request
- `401`: Unauthorized - missing or invalid token

---

[API](https://skmtc.dev/shopfront/apis/shopfront-public-api.md) - [All operations](https://skmtc.dev/shopfront/apis/shopfront-public-api/llms.txt) - [OpenAPI document](https://skmtc.dev/shopfront/apis/shopfront-public-api/revisions/4dbfb90550d4?raw)
