# List active products

`GET /accounts/{accountID}/products`

API version: `v2026.10.00`. Send `X-Moov-Version: v2026.10.00` to get the behavior described here.

> AI agents: search and read all Moov docs with the docs MCP server at https://docs.moov.io/mcp (no API key). Setup: https://docs.moov.io/guides/developer-tools/mcp-ai/docs-mcp/index.md

List active (non-disabled) products for an account.

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `X-Moov-Version` | header | string |  | Set this header to v2026.10.00 to use the API described in this specification. When omitted, the server defaults to v2024.01.00, the earliest supported version, which may not match the behavior documented here. An unrecognized well-formed version uses the latest supported version that is not newer than the requested version, when one exists. For example, `v2026.08.00` uses `v2026.07.00`. A malformed value, such as `2022`, returns a `404` response. Values: `v2026.10.00`. |
| `accountID` | path | string | Yes |  |
| `title` | query | string |  | Allows filtering products by title. This supports partial matches and is case-insensitive |
| `category` | query | string |  | Filter products by category. Accepts a category ID at any level of the taxonomy; a product matches when the given category is anywhere in its category's breadcrumb (i.e. filtering by a top-level category returns products in any of its descendants). |
| `skip` | query | integer (int64) |  | The number of entries to skip when paginating a large result set. |
| `count` | query | integer (int64) |  | Page size. When omitted, the server defaults to `200`. |

## Response 200

The request completed successfully.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `[].productID` | string | Yes | Unique identifier for a product. |
| `[].title` | string | Yes |  |
| `[].description` | string |  | A detailed description of the product. - Must be valid UTF-8 text - Supports Markdown for formatting - HTML is not permitted and will be rejected |
| `[].basePrice` | object | Yes | A product's starting price, before applying modifiers. |
| `[].basePrice.currency` | string | Yes | A 3-letter ISO 4217 currency code. |
| `[].basePrice.valueDecimal` | string | Yes | A decimal-formatted numerical string that represents up to 9 decimal place precision. For example, $12.987654321 is '12.987654321'. |
| `[].isTaxable` | boolean | Yes | Whether applicable tax rules may be applied to this product. The value can be used to determine how to populate the tax amount on a transfer (Moov does not compute or assess tax). true means a tax amount can be included; false means it should not. Omitted values default to true on creation and preserve the existing setting on update. This setting does not determine jurisdiction-specific taxability. |
| `[].optionGroups` | array of object |  | Optional configuration options for a product, such as size or color. |
| `[].optionGroups[].name` | string | Yes |  |
| `[].optionGroups[].description` | string |  | A detailed description of the option group. - Must be valid UTF-8 text - Supports Markdown for formatting - HTML is not permitted and will be rejected |
| `[].optionGroups[].minSelect` | integer (int32) | Yes | The minimum number of options that must be selected from this group. A value of 0 indicates that no selection from this group is required. |
| `[].optionGroups[].maxSelect` | integer (int32) | Yes | The maximum number of options that can be selected from this group. |
| `[].optionGroups[].options` | array of object | Yes | The options available within this group. |
| `[].images` | array of object |  | Optional images associated with the product. |
| `[].images[].imageID` | string | Yes | Unique identifier for a product or product option image resource. |
| `[].images[].altText` | string |  | Alternative text for the image. |
| `[].images[].link` | string (uri) | Yes | The image's public URL. |
| `[].images[].publicID` | string | Yes | The public ID used to access the image. |
| `[].category` | object |  | The product taxonomy category associated with the product, if any. |
| `[].category.categoryID` | string | Yes | The unique identifier for the category. |
| `[].category.name` | string | Yes | The short display name of the category. |
| `[].category.fullName` | string | Yes | The full taxonomy path name of the category. |
| `[].category.level` | integer (int32) | Yes | The depth of the category in the taxonomy tree (1 = top-level). |
| `[].category.parentID` | string |  | The identifier of the parent category, if any. Absent for top-level categories. |
| `[].createdOn` | string (date-time) | Yes | The date and time when the product was added. |
| `[].updatedOn` | string (date-time) | Yes | The date and time when the product was last updated. |
| `[].disabledOn` | string (date-time) |  | The date and time when the product was disabled. |

## Errors

| Status | Meaning |
| --- | --- |
| 401 | The request contained missing or expired authentication. |
| 403 | The user is not authorized to make the request. |
| 429 | Request was refused due to rate limiting. |
| 500 | The request failed due to an unexpected error. |
| 504 | The request failed because a downstream service failed to respond. |

## Examples

### cURL

```bash
curl -X GET "https://api.moov.io/accounts/{accountID}/products" \
  -H "Authorization: Bearer {token}" \
  -H "X-Moov-Version: v2026.10.00"
```

### Typescript (SDK)

```typescript
import { Moov } from "@moovio/sdk";

const moov = new Moov({
  security: {
    username: "",
    password: "",
  },
});

async function run() {
  const result = await moov.products.list({
    accountID: "cd696219-4308-446c-b0d8-1759254995c2",
    skip: 60,
    count: 20,
  });

  console.log(result);
}

run();
```

Full reference with SDK examples in every language: https://docs.moov.io/api/v2026.10.00/tools/products/list/
