---
title: "Get job status and results"
method: GET
path: "/v1/jobs/{id}"
tags: ["Jobs"]
---

# Get job status and results

`GET /v1/jobs/{id}`

## Request

- Base URL: `https://api.shopfront.app`
- URL: `https://api.shopfront.app/v1/jobs/{id}`
- Auth: HTTP bearer

Poll for processing status. When complete, returns full results.

**Polling strategy:**
- Start with 2-second intervals
- Use exponential backoff: 2s → 4s → 8s → 15s
- Stop when status is 'completed' or 'failed'
- Processing duration varies; inspect the returned job status

**While processing:** Returns status/progress with currentStage
**When complete:** Returns full results with all product data

## Path parameters

- `id` string, uuid, required

## Response `200`

Job status

- JobStatus: Processing job status. The response structure varies by status: - **processing**: Status fields only (no results) - **completed**: Includes `results.listings[]` with full listing data - **failed**: Includes `error` message
  - `id` string, uuid, required
  - `status` 'pending' | 'processing' | 'completed' | 'failed', required
  - `currentStage` 'preprocessing' | 'analysis' | 'category_matching' | 'grouping' | 'extraction' | 'enrichment', nullable: Current processing stage
  - `progress` integer, required: Overall progress percentage
  - `totalItems` integer, nullable: Total number of images to process
  - `processedItems` integer, nullable: Number of images processed so far
  - `createdAt` string, date-time, required: When the job was submitted
  - `completedAt` string, date-time, nullable: When processing finished (success or failure)
  - `progressMessage` string, nullable: Human-readable progress message
  - `results` object, nullable: Available when status is 'completed'. Contains generated listings.
    - `listings` JobListingResult[]: Generated listings (one per product identified)
      - `listing` object: Core listing data
        - `title` string, nullable
        - `description` string, nullable
        - `brand` string, nullable
        - `condition` string, nullable
        - `conditionNotes` string, nullable: Customer-facing condition description, independent of requested marketplaces. Null when absent or cleared; distinct from the condition grade and general description.
        - `sizeSystem` 'US' | 'UK' | 'EU' | 'FR' | 'AU' | 'IT', nullable: Source sizing system, when known.
        - `size` string, nullable
        - `colour` string, nullable
        - `material` string, nullable
        - `pattern` string, nullable
        - `gender` string, nullable
        - `measurements` object, nullable
        - `tags` string[]
        - `productType` string, nullable
        - `category` string, nullable
        - `packageWeight` number, nullable: AI-estimated package weight in kilograms (item plus typical packaging), for shipping calculations. Null when no estimate is available.
        - `packageWeightConfidence` number, nullable: Confidence of the AI weight estimate — the model's stated estimation basis mapped to calibrated tiers in code (0.85 standard catalogue item, 0.7 adjusted from size/material/type, 0.4 rough guess). Null when packageWeight is null, when the surfaced value no longer matches the AI estimate (manual edit), or when no estimation basis was recorded (jobs generated before this field existed).
        - `packageDimensions` object, nullable: Packaged parcel dimensions in centimetres. Individual axes may be null when only partially provided (e.g. via manual edits). Null when no dimensions are available.
          - `height` number, nullable
          - `width` number, nullable
          - `length` number, nullable
        - `packageDimensionsConfidence` number, nullable: As packageWeightConfidence, for the dimensions estimate — one shared estimation basis drives both. Null when no dimensions are surfaced, when any axis no longer matches the AI estimate (manual edit), or when no estimation basis was recorded.
      - `marketplaces` object: Marketplace-specific mappings (only channels that were generated)
        - `ebay` object, nullable
          - `categoryId` string
          - `categoryName` string
          - `conditionId` string
          - `itemSpecifics` object
        - `depop` object, nullable
          - `categoryId` integer, nullable
          - `brandId` integer, nullable
          - `condition` string
          - `colour` string, nullable
          - `size` string, nullable
        - `grailed` object, nullable
          - `designerId` string, nullable
          - `department` string, nullable
          - `category` string, nullable
          - `subcategory` string, nullable
          - `condition` string
          - `size` string, nullable
        - `shopify` object, nullable
          - `title` string
          - `body_html` string
          - `vendor` string, nullable
          - `product_type` string
      - `pricing` object, nullable: Pricing recommendation (null if insufficient market data)
        - `recommended` number
        - `confidence` number, nullable
        - `currency` string
        - `marketAverage` number, nullable
        - `priceRange` object, nullable
          - `min` number
          - `max` number
      - `images` object
        - `hero` string, nullable: Primary/hero image URL
        - `all` string[]: All image URLs in order
  - `error` string, nullable

## Other responses

- `401`: Unauthorized - missing or invalid token
- `404`: Job not found
- `429`: Rate limit exceeded

---

[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)
