> For the complete documentation index, see [llms.txt](https://docs.shortcutco.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.shortcutco.com/developers/api-reference/reference/products.md).

# Products

Products sold alongside services.

A product is sold by its unit at a default price, such as mulch by the yard.

Fields: [The product object](https://docs.shortcutco.com/developers/reference/objects/product).

## List products

> The product catalog, newest first, or by last change when \`updatedSince\` is set. Archived products are included unless \`status\` filters them out.\
> \
> Returns a list of \[product objects]\(<https://docs.shortcutco.com/developers/reference/objects/product>).

```json
{"openapi":"3.1.0","info":{"title":"Shortcut API","version":"v1"},"tags":[{"name":"Products","description":"A product is sold by its unit at a default price, such as mulch by the yard.\n\nFields: [The product object](https://docs.shortcutco.com/developers/reference/objects/product)."}],"servers":[{"url":"https://api.shortcutco.com","description":"Production"}],"security":[{"bearerAuth":["products:read"]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"scut_<env>_<id>_<secret>","description":"A workspace API token. Each operation lists the scopes it needs; `write` implies `read`, and `send`/`complete` are never implied."}},"headers":{"RateLimitLimit":{"schema":{"type":"integer"},"description":"Requests allowed in the tightest window."},"RateLimitRemaining":{"schema":{"type":"integer"},"description":"Requests left in that window."},"RateLimitReset":{"schema":{"type":"integer"},"description":"Seconds until that window resets."}},"schemas":{"Product":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"The product's id."},"object":{"type":"string","const":"product","description":"Always `product`."},"name":{"type":"string","description":"The product's name, unique in the workspace regardless of case."},"description":{"type":["string","null"],"description":"Description shown on estimates and invoices."},"unitLabel":{"type":"string","description":"The unit it is sold in, such as `yard` or `bag`."},"defaultUnitPrice":{"type":"number","description":"Default price per unit in US dollars."},"taxable":{"type":"boolean","description":"Whether sales tax applies by default."},"defaultDisplay":{"type":"string","enum":["itemized","included"],"description":"`itemized` shows the product as its own line to the customer; `included` folds it into the service."},"status":{"type":"string","enum":["active","archived"],"description":"Archived products are no longer offered for new work."},"archivedAt":{"anyOf":[{"type":"string","format":"date-time","description":"When the product was archived, ISO 8601 in UTC."},{"type":"null"}],"description":"When the product was archived, ISO 8601 in UTC."},"createdAt":{"type":"string","format":"date-time","description":"When the product was created, ISO 8601 in UTC."},"updatedAt":{"type":"string","format":"date-time","description":"When the product last changed, ISO 8601 in UTC."}},"required":["id","object","name","description","unitLabel","defaultUnitPrice","taxable","defaultDisplay","status","archivedAt","createdAt","updatedAt"],"additionalProperties":false,"description":"A product in the workspace's catalog."},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"type":{"type":"string","description":"Error family, such as `invalid_request` or `permission`."},"code":{"type":"string","description":"Specific error code; see the errors page."},"message":{"type":"string","description":"A human-readable explanation."},"param":{"type":"string","description":"The input the error is about, such as `query.limit`."},"requiredScope":{"type":"string","description":"The scope the token is missing."},"requestId":{"type":"string","description":"Quote this id to support."},"docs":{"type":"string","description":"Link to the error's documentation."}},"required":["type","code","message","requestId","docs"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}},"responses":{"BadRequest":{"description":"The request is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unauthenticated":{"description":"The token is missing, invalid, expired, or revoked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"SubscriptionRequired":{"description":"The workspace's subscription needs attention.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Forbidden":{"description":"The token is missing a required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"No such object in this workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"RateLimited":{"description":"Rate limited; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"InternalError":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unavailable":{"description":"Temporarily unavailable; retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/v1/products":{"get":{"operationId":"products.list","tags":["Products"],"summary":"List products","description":"The product catalog, newest first, or by last change when `updatedSince` is set. Archived products are included unless `status` filters them out.\n\nReturns a list of [product objects](https://docs.shortcutco.com/developers/reference/objects/product).","parameters":[{"name":"limit","in":"query","required":false,"description":"How many items to return, 1-200. Defaults to 50.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"cursor","in":"query","required":false,"description":"The `meta.nextCursor` from the previous page. Omit it for the first page.","schema":{"type":"string","minLength":1,"maxLength":4096}},{"name":"status","in":"query","required":false,"description":"Only active or only archived products.","schema":{"type":"string","enum":["active","archived"]}},{"name":"updatedSince","in":"query","required":false,"description":"ISO 8601 timestamp. Returns objects changed at or after it, oldest change first. Keep the largest `updatedAt` you have seen, subtract five minutes, and pass it on the next sync; deduplicate by `id`.","schema":{"type":"string","format":"date-time"}}],"responses":{"200":{"description":"Success.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Product"}},"meta":{"type":"object","properties":{"nextCursor":{"type":["string","null"],"description":"Pass as `cursor` to get the next page; null on the last page."},"hasMore":{"type":"boolean","description":"Whether another page exists."}},"required":["nextCursor","hasMore"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"402":{"$ref":"#/components/responses/SubscriptionRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/Unavailable"}}}}}}
```

## Create a product

> Adds a product to the catalog with the same rules as the app: names are unique regardless of case, archived products included. Unit cost is set in the app, not through the API. Send an \`Idempotency-Key\` to retry safely.\
> \
> Returns \[the product object]\(<https://docs.shortcutco.com/developers/reference/objects/product).\\>
> \
> \*\*Errors specific to this endpoint:\*\* \[\`already\_exists\`]\(<https://docs.shortcutco.com/developers/concepts/errors#already\\_exists>). Every endpoint can also return the \[common errors]\(<https://docs.shortcutco.com/developers/concepts/errors>).

```json
{"openapi":"3.1.0","info":{"title":"Shortcut API","version":"v1"},"tags":[{"name":"Products","description":"A product is sold by its unit at a default price, such as mulch by the yard.\n\nFields: [The product object](https://docs.shortcutco.com/developers/reference/objects/product)."}],"servers":[{"url":"https://api.shortcutco.com","description":"Production"}],"security":[{"bearerAuth":["products:write"]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"scut_<env>_<id>_<secret>","description":"A workspace API token. Each operation lists the scopes it needs; `write` implies `read`, and `send`/`complete` are never implied."}},"parameters":{"IdempotencyKey":{"name":"Idempotency-Key","in":"header","required":false,"description":"Any string up to 255 characters. Retrying with the same key returns the first response instead of repeating the write, for 24 hours.","schema":{"type":"string","maxLength":255}}},"headers":{"RateLimitLimit":{"schema":{"type":"integer"},"description":"Requests allowed in the tightest window."},"RateLimitRemaining":{"schema":{"type":"integer"},"description":"Requests left in that window."},"RateLimitReset":{"schema":{"type":"integer"},"description":"Seconds until that window resets."}},"schemas":{"Product":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"The product's id."},"object":{"type":"string","const":"product","description":"Always `product`."},"name":{"type":"string","description":"The product's name, unique in the workspace regardless of case."},"description":{"type":["string","null"],"description":"Description shown on estimates and invoices."},"unitLabel":{"type":"string","description":"The unit it is sold in, such as `yard` or `bag`."},"defaultUnitPrice":{"type":"number","description":"Default price per unit in US dollars."},"taxable":{"type":"boolean","description":"Whether sales tax applies by default."},"defaultDisplay":{"type":"string","enum":["itemized","included"],"description":"`itemized` shows the product as its own line to the customer; `included` folds it into the service."},"status":{"type":"string","enum":["active","archived"],"description":"Archived products are no longer offered for new work."},"archivedAt":{"anyOf":[{"type":"string","format":"date-time","description":"When the product was archived, ISO 8601 in UTC."},{"type":"null"}],"description":"When the product was archived, ISO 8601 in UTC."},"createdAt":{"type":"string","format":"date-time","description":"When the product was created, ISO 8601 in UTC."},"updatedAt":{"type":"string","format":"date-time","description":"When the product last changed, ISO 8601 in UTC."}},"required":["id","object","name","description","unitLabel","defaultUnitPrice","taxable","defaultDisplay","status","archivedAt","createdAt","updatedAt"],"additionalProperties":false,"description":"A product in the workspace's catalog."},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"type":{"type":"string","description":"Error family, such as `invalid_request` or `permission`."},"code":{"type":"string","description":"Specific error code; see the errors page."},"message":{"type":"string","description":"A human-readable explanation."},"param":{"type":"string","description":"The input the error is about, such as `query.limit`."},"requiredScope":{"type":"string","description":"The scope the token is missing."},"requestId":{"type":"string","description":"Quote this id to support."},"docs":{"type":"string","description":"Link to the error's documentation."}},"required":["type","code","message","requestId","docs"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}},"responses":{"BadRequest":{"description":"The request is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unauthenticated":{"description":"The token is missing, invalid, expired, or revoked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"SubscriptionRequired":{"description":"The workspace's subscription needs attention.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Forbidden":{"description":"The token is missing a required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"No such object in this workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Conflict":{"description":"Conflict with the current state or an in-flight request with the same idempotency key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unprocessable":{"description":"The request cannot be applied, or its idempotency key was used for a different request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"RateLimited":{"description":"Rate limited; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"InternalError":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unavailable":{"description":"Temporarily unavailable; retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/v1/products":{"post":{"operationId":"products.create","tags":["Products"],"summary":"Create a product","description":"Adds a product to the catalog with the same rules as the app: names are unique regardless of case, archived products included. Unit cost is set in the app, not through the API. Send an `Idempotency-Key` to retry safely.\n\nReturns [the product object](https://docs.shortcutco.com/developers/reference/objects/product).\n\n**Errors specific to this endpoint:** [`already_exists`](https://docs.shortcutco.com/developers/concepts/errors#already_exists). Every endpoint can also return the [common errors](https://docs.shortcutco.com/developers/concepts/errors).","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":160,"description":"The product's name; unique in the workspace regardless of case."},"unitLabel":{"type":"string","minLength":1,"maxLength":40,"description":"The unit it is sold in, such as `yard` or `bag`."},"defaultUnitPrice":{"type":"number","minimum":0,"maximum":10000000,"description":"Default price per unit in US dollars."},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"description":"Description shown on estimates and invoices; null clears it."},"taxable":{"type":"boolean","description":"Whether sales tax applies by default. Defaults to true."},"defaultDisplay":{"type":"string","enum":["itemized","included"],"description":"`itemized` (the default) shows the product as its own line; `included` folds it into the service."}},"required":["name","unitLabel","defaultUnitPrice"],"additionalProperties":false}}}},"responses":{"201":{"description":"Success.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Product"},"meta":{"type":"object","properties":{},"additionalProperties":true,"description":"Facts about this request beside the object, such as `alreadyReminded` on a repeated reminder. Present only when there is something to report."}},"required":["data"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"402":{"$ref":"#/components/responses/SubscriptionRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/Unavailable"}}}}}}
```

## Get a product

> One product from the catalog.\
> \
> Returns \[the product object]\(<https://docs.shortcutco.com/developers/reference/objects/product>).

```json
{"openapi":"3.1.0","info":{"title":"Shortcut API","version":"v1"},"tags":[{"name":"Products","description":"A product is sold by its unit at a default price, such as mulch by the yard.\n\nFields: [The product object](https://docs.shortcutco.com/developers/reference/objects/product)."}],"servers":[{"url":"https://api.shortcutco.com","description":"Production"}],"security":[{"bearerAuth":["products:read"]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"scut_<env>_<id>_<secret>","description":"A workspace API token. Each operation lists the scopes it needs; `write` implies `read`, and `send`/`complete` are never implied."}},"headers":{"RateLimitLimit":{"schema":{"type":"integer"},"description":"Requests allowed in the tightest window."},"RateLimitRemaining":{"schema":{"type":"integer"},"description":"Requests left in that window."},"RateLimitReset":{"schema":{"type":"integer"},"description":"Seconds until that window resets."}},"schemas":{"Product":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"The product's id."},"object":{"type":"string","const":"product","description":"Always `product`."},"name":{"type":"string","description":"The product's name, unique in the workspace regardless of case."},"description":{"type":["string","null"],"description":"Description shown on estimates and invoices."},"unitLabel":{"type":"string","description":"The unit it is sold in, such as `yard` or `bag`."},"defaultUnitPrice":{"type":"number","description":"Default price per unit in US dollars."},"taxable":{"type":"boolean","description":"Whether sales tax applies by default."},"defaultDisplay":{"type":"string","enum":["itemized","included"],"description":"`itemized` shows the product as its own line to the customer; `included` folds it into the service."},"status":{"type":"string","enum":["active","archived"],"description":"Archived products are no longer offered for new work."},"archivedAt":{"anyOf":[{"type":"string","format":"date-time","description":"When the product was archived, ISO 8601 in UTC."},{"type":"null"}],"description":"When the product was archived, ISO 8601 in UTC."},"createdAt":{"type":"string","format":"date-time","description":"When the product was created, ISO 8601 in UTC."},"updatedAt":{"type":"string","format":"date-time","description":"When the product last changed, ISO 8601 in UTC."}},"required":["id","object","name","description","unitLabel","defaultUnitPrice","taxable","defaultDisplay","status","archivedAt","createdAt","updatedAt"],"additionalProperties":false,"description":"A product in the workspace's catalog."},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"type":{"type":"string","description":"Error family, such as `invalid_request` or `permission`."},"code":{"type":"string","description":"Specific error code; see the errors page."},"message":{"type":"string","description":"A human-readable explanation."},"param":{"type":"string","description":"The input the error is about, such as `query.limit`."},"requiredScope":{"type":"string","description":"The scope the token is missing."},"requestId":{"type":"string","description":"Quote this id to support."},"docs":{"type":"string","description":"Link to the error's documentation."}},"required":["type","code","message","requestId","docs"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}},"responses":{"BadRequest":{"description":"The request is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unauthenticated":{"description":"The token is missing, invalid, expired, or revoked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"SubscriptionRequired":{"description":"The workspace's subscription needs attention.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Forbidden":{"description":"The token is missing a required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"No such object in this workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"RateLimited":{"description":"Rate limited; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"InternalError":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unavailable":{"description":"Temporarily unavailable; retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/v1/products/{id}":{"get":{"operationId":"products.get","tags":["Products"],"summary":"Get a product","description":"One product from the catalog.\n\nReturns [the product object](https://docs.shortcutco.com/developers/reference/objects/product).","parameters":[{"name":"id","in":"path","required":true,"description":"The object's id.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Product"},"meta":{"type":"object","properties":{},"additionalProperties":true,"description":"Facts about this request beside the object, such as `alreadyReminded` on a repeated reminder. Present only when there is something to report."}},"required":["data"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"402":{"$ref":"#/components/responses/SubscriptionRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/Unavailable"}}}}}}
```

## Update a product

> Changes only the fields sent. \`archived: true\` archives the product and \`false\` restores it. Lines already on estimates and visits keep their own prices.\
> \
> Returns \[the product object]\(<https://docs.shortcutco.com/developers/reference/objects/product).\\>
> \
> \*\*Errors specific to this endpoint:\*\* \[\`already\_exists\`]\(<https://docs.shortcutco.com/developers/concepts/errors#already\\_exists>). Every endpoint can also return the \[common errors]\(<https://docs.shortcutco.com/developers/concepts/errors>).

```json
{"openapi":"3.1.0","info":{"title":"Shortcut API","version":"v1"},"tags":[{"name":"Products","description":"A product is sold by its unit at a default price, such as mulch by the yard.\n\nFields: [The product object](https://docs.shortcutco.com/developers/reference/objects/product)."}],"servers":[{"url":"https://api.shortcutco.com","description":"Production"}],"security":[{"bearerAuth":["products:write"]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"scut_<env>_<id>_<secret>","description":"A workspace API token. Each operation lists the scopes it needs; `write` implies `read`, and `send`/`complete` are never implied."}},"headers":{"RateLimitLimit":{"schema":{"type":"integer"},"description":"Requests allowed in the tightest window."},"RateLimitRemaining":{"schema":{"type":"integer"},"description":"Requests left in that window."},"RateLimitReset":{"schema":{"type":"integer"},"description":"Seconds until that window resets."}},"schemas":{"Product":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"The product's id."},"object":{"type":"string","const":"product","description":"Always `product`."},"name":{"type":"string","description":"The product's name, unique in the workspace regardless of case."},"description":{"type":["string","null"],"description":"Description shown on estimates and invoices."},"unitLabel":{"type":"string","description":"The unit it is sold in, such as `yard` or `bag`."},"defaultUnitPrice":{"type":"number","description":"Default price per unit in US dollars."},"taxable":{"type":"boolean","description":"Whether sales tax applies by default."},"defaultDisplay":{"type":"string","enum":["itemized","included"],"description":"`itemized` shows the product as its own line to the customer; `included` folds it into the service."},"status":{"type":"string","enum":["active","archived"],"description":"Archived products are no longer offered for new work."},"archivedAt":{"anyOf":[{"type":"string","format":"date-time","description":"When the product was archived, ISO 8601 in UTC."},{"type":"null"}],"description":"When the product was archived, ISO 8601 in UTC."},"createdAt":{"type":"string","format":"date-time","description":"When the product was created, ISO 8601 in UTC."},"updatedAt":{"type":"string","format":"date-time","description":"When the product last changed, ISO 8601 in UTC."}},"required":["id","object","name","description","unitLabel","defaultUnitPrice","taxable","defaultDisplay","status","archivedAt","createdAt","updatedAt"],"additionalProperties":false,"description":"A product in the workspace's catalog."},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"type":{"type":"string","description":"Error family, such as `invalid_request` or `permission`."},"code":{"type":"string","description":"Specific error code; see the errors page."},"message":{"type":"string","description":"A human-readable explanation."},"param":{"type":"string","description":"The input the error is about, such as `query.limit`."},"requiredScope":{"type":"string","description":"The scope the token is missing."},"requestId":{"type":"string","description":"Quote this id to support."},"docs":{"type":"string","description":"Link to the error's documentation."}},"required":["type","code","message","requestId","docs"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}},"responses":{"BadRequest":{"description":"The request is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unauthenticated":{"description":"The token is missing, invalid, expired, or revoked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"SubscriptionRequired":{"description":"The workspace's subscription needs attention.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Forbidden":{"description":"The token is missing a required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"No such object in this workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Conflict":{"description":"Conflict with the current state or an in-flight request with the same idempotency key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unprocessable":{"description":"The request cannot be applied, or its idempotency key was used for a different request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"RateLimited":{"description":"Rate limited; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"InternalError":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unavailable":{"description":"Temporarily unavailable; retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/v1/products/{id}":{"patch":{"operationId":"products.update","tags":["Products"],"summary":"Update a product","description":"Changes only the fields sent. `archived: true` archives the product and `false` restores it. Lines already on estimates and visits keep their own prices.\n\nReturns [the product object](https://docs.shortcutco.com/developers/reference/objects/product).\n\n**Errors specific to this endpoint:** [`already_exists`](https://docs.shortcutco.com/developers/concepts/errors#already_exists). Every endpoint can also return the [common errors](https://docs.shortcutco.com/developers/concepts/errors).","parameters":[{"name":"id","in":"path","required":true,"description":"The object's id.","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":160,"description":"The product's name; unique in the workspace regardless of case."},"unitLabel":{"type":"string","minLength":1,"maxLength":40,"description":"The unit it is sold in, such as `yard` or `bag`."},"defaultUnitPrice":{"type":"number","minimum":0,"maximum":10000000,"description":"Default price per unit in US dollars."},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"description":"Description shown on estimates and invoices; null clears it."},"taxable":{"type":"boolean","description":"Whether sales tax applies by default."},"defaultDisplay":{"type":"string","enum":["itemized","included"],"description":"How the product shows to the customer."},"archived":{"type":"boolean","description":"True archives the product so it is no longer offered; false restores it."}},"additionalProperties":false}}}},"responses":{"200":{"description":"Success.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Product"},"meta":{"type":"object","properties":{},"additionalProperties":true,"description":"Facts about this request beside the object, such as `alreadyReminded` on a repeated reminder. Present only when there is something to report."}},"required":["data"],"additionalProperties":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"402":{"$ref":"#/components/responses/SubscriptionRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/Unavailable"}}}}}}
```
