---
title: "Create a product line"
method: POST
path: "/org/product-lines"
tags: ["Product Lines"]
---

# Create a product line

`POST /org/product-lines`

## Request

- Base URL: `https://apiv2.senso.ai/api/v1`
- URL: `https://apiv2.senso.ai/api/v1/org/product-lines`
- Auth: API key in header `X-API-Key`

Creates a product line. `name` is trimmed and must be unique among your organization's product lines (case-sensitive; a deleted product line's name can be reused). `details` is an open JSON object for whatever metadata your workflows need — omit it to start with `{}`; an explicit `null` or any non-object JSON is rejected. Requires the GEO product.

## Request body

- CreateProductLineRequest: `name` is required (trimmed; must not collide with another active product line's name). `details` is optional — omit it to start with `{}`; when provided it must be a JSON object (`null` or any other JSON type is a `400`).
  - `name` string, required
  - `details` ProductLineDetails: Open-ended JSON object describing this product line — the keys and values are yours to define (SKUs, URLs, positioning, pricing tiers, anything downstream generation and evaluation should know). The server requires a JSON object but never validates the contents; what you store is re-serialized in canonical form — key order is normalized and numbers are re-encoded (integers above 2^53 lose precision), so send very large identifiers as strings.

## Response `201`

The created product line.

- ProductLineResponse: One product line.
  - `product_line_id` string, uuid, required
  - `org_id` string, uuid, required
  - `name` string, required
  - `details` ProductLineDetails, required: Open-ended JSON object describing this product line — the keys and values are yours to define (SKUs, URLs, positioning, pricing tiers, anything downstream generation and evaluation should know). The server requires a JSON object but never validates the contents; what you store is re-serialized in canonical form — key order is normalized and numbers are re-encoded (integers above 2^53 lose precision), so send very large identifiers as strings.
  - `created_at` string, date-time, required
  - `updated_at` string, date-time, required

## Other responses

- `400`: The request was malformed — a bad path/query parameter or an invalid value.
- `401`: Missing or invalid credentials — supply a valid org API key in the `X-API-Key` header.
- `403`: The API key is authenticated but not permitted to access this resource.
- `409`: The request conflicts with the current state (e.g. a duplicate).

---

[API](https://skmtc.dev/senso/apis/senso-org-api.md) - [All operations](https://skmtc.dev/senso/apis/senso-org-api/llms.txt) - [OpenAPI document](https://skmtc.dev/senso/apis/senso-org-api/revisions/d789b4fcbe84?raw)
