---
title: "Renew Product"
method: POST
path: "/v1/products/{product_id}/renew"
tags: ["Products"]
---

# Renew Product

`POST /v1/products/{product_id}/renew`

## Request

- Base URL: `http://localhost:8000`
- URL: `http://localhost:8000/v1/products/{product_id}/renew`
- Auth: HTTP bearer

Reset expires_at to now + 90 days (owner only).

## Path parameters

- `product_id` integer, required

## Headers

- `X-API-Key` string, nullable

## Response `200`

Successful Response

- ProductOut: What the API returns.
  - `store_id` integer, nullable: Store ID to list under (omit for personal listing)
  - `name` string, required: Product name/title
  - `sku` string, nullable: Stock Keeping Unit - unique per store
  - `spec` string, nullable
  - `price` string, nullable: Price in whole currency units (e.g. 15.99 means €15.99). NOT cents.
  - `currency` string, nullable: Currency symbol (e.g. €, $, CHF)
  - `url` string, uri, nullable: Link to the product page
  - `lat` number, nullable
  - `lon` number, nullable
  - `description` string, nullable: Product description
  - `expires_at` string, date-time, nullable: When the listing expires (for second-hand items)
  - `verified` boolean: Whether the responsible human has confirmed this listing. Default true covers humans, scrapers (the source website's listing is the implicit confirmation), and AI agents acting as the seller themselves. Set false ONLY when an AI agent is proposing a listing on behalf of a human who has not explicitly confirmed it (tentative).
  - `listing_type` 'in_stock' | 'tentative': Whether a product row is real stock or a demand probe. ``in_stock`` is a normal listing: someone has the thing and you can go buy it. That is Partle's whole promise, so it is the default and the only type the catalog returns unless a caller opts out. ``tentative`` is a seller floating an item they do not stock yet, to see whether anyone wants it. Interest is recorded in ``product_demand``. A tentative row is excluded from every catalog read by default (see ``apply_visible_products_filter``) — a shopper searching for a drill must never be shown one that cannot be bought. Named ``listing_type`` rather than ``inventory_type`` because ``inventory_items`` / ``InventoryStatus`` in this module already mean a user's personal holdings, which is a different thing entirely. Buyers asking for something nobody sells are NOT modelled here — that is ``BuyRequest`` below, which predates this and has its own table, public feed at /v1/public/wanted, and MCP tools.
  - `id` integer, required
  - `created_at` string, date-time, required
  - `updated_at` string, date-time, required
  - `updated_by_id` integer, nullable
  - `creator_id` integer, nullable
  - `creator` AppSchemasProductUserBasic: Basic user info for product creator display.
    - `id` integer, required
    - `username` string, nullable
  - `store` StoreBasic: Minimal store info included with products.
    - `id` integer, required
    - `name` string, required
    - `address` string, nullable
    - `country` string, nullable
  - `tags` Tag[]
    - `name` string, required
    - `description` string, nullable
    - `id` integer, required
  - `images` ProductImageOut[]
    - `id` integer, required
    - `image_filename` string, nullable
    - `image_content_type` string, nullable
    - `image_path` string, nullable
    - `source_url` string, nullable
    - `position` integer
  - `sold_at` string, date-time, nullable
  - `accurate_share` number, nullable
  - `report_count` integer, nullable
  - `last_verified_at` string, date-time, nullable
  - `product_average_rating` number, nullable
  - `product_rating_count` integer
  - `accuracy_average_rating` number, nullable
  - `accuracy_rating_count` integer
  - `relevance_score` number, nullable
  - `demand_count` integer, nullable
  - `type` string
  - `partle_url` string, required
  - `_hint` string, required

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/rubenayla/apis/partle-api.md) · [All operations](https://skmtc.dev/rubenayla/apis/partle-api/llms.txt) · [OpenAPI document](https://skmtc.dev/rubenayla/apis/partle-api/revisions/628cce2acee5?raw)
