> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.ordergroove.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.ordergroove.com/_mcp/server.

# List

GET https://restapi.ordergroove.com/products/

Returns a list of all merchant's products that are autoship enabled and not discontinued.

Reference: https://docs.ordergroove.com/reference/rest-rpc-api/products/list

## OpenAPI Specification

```yaml
openapi: 3.1.0
info:
  title: ordergroove-restrpc
  version: 1.0.0
paths:
  /products/:
    get:
      operationId: list
      summary: List
      description: >-
        Returns a list of all merchant's products that are autoship enabled and
        not discontinued.
      tags:
        - products
      parameters:
        - name: search
          in: query
          description: >-
            A single string value used to search for products. The value in this
            parameter will be matched against product’s name, sku, or
            external_product_id, depending on the field specified in the
            "fields" parameter. e.g. /products?search=12345&fields=sku
          required: false
          schema:
            type: string
        - name: fields
          in: query
          description: >-
            Specifies which field (name, sku, or external_product_id) the
            "search" parameter value should be matched against. name – Matches
            the search value against the product’s name. sku – Matches the
            search value against the product’s SKU. external_product_id –
            Matches the search value against the product’s external product ID.
            e.g. /products?search=12345&fields=sku
          required: false
          schema:
            type: string
        - name: id_or_name
          in: query
          description: Case insensitive partial match for Product ID or Name
          required: false
          schema:
            type: string
        - name: autoship_enabled
          in: query
          description: >-
            By default the endpoint will only return products that are autoship
            enabled, but you can change the behavior by passing "all" to return
            all products regardless of their autoship status. You can also pass
            "false" to only return products that are NOT autoship enabled
          required: false
          schema:
            type: string
        - name: allow_discontinued
          in: query
          description: >-
            By default the endpoint returns non-discontinued products, but you
            can change the behavior by passing "true" to also include
            discontinued products. You can also pass "strict" to only list the
            discontinued products
          required: false
          schema:
            type: string
        - name: group_name
          in: query
          description: Product group's name
          required: false
          schema:
            type: string
        - name: group_type
          in: query
          description: Product group's type
          required: false
          schema:
            type: string
        - name: autoship_by_default
          in: query
          required: false
          schema:
            type: boolean
        - name: live
          in: query
          description: 'Account status: active = True'
          required: false
          schema:
            type: boolean
        - name: external_product_ids[]
          in: query
          description: >-
            Product ID (could be passed multiple times in the query string to
            match multiple products). Note there is "[]" at the end of this
            field that is required
          required: false
          schema:
            type: string
        - name: product_type
          in: query
          description: Product Type
          required: false
          schema:
            $ref: '#/components/schemas/ProductsGetParametersProductType'
        - name: include_product_selection_rules
          in: query
          description: >-
            For rotating products this param returns a product_selection_rules
            list with all selection_list_elements
          required: false
          schema:
            type: boolean
            default: false
        - name: x-api-key
          in: header
          required: true
          schema:
            type: string
      responses:
        '200':
          description: '200'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Products_list_Response_200'
        '403':
          description: '403'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Products-listRequestForbiddenError'
        '404':
          description: '404'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Products-listRequestNotFoundError'
servers:
  - url: https://restapi.ordergroove.com
    description: https://restapi.ordergroove.com
components:
  schemas:
    ProductsGetParametersProductType:
      type: string
      enum:
        - '"standard"'
        - '"rotating"'
        - '"static price bundle"'
        - '"dynamic price bundle"'
      title: ProductsGetParametersProductType
    ProductsGetResponsesContentApplicationJsonSchemaResultsItemsGroupsItems:
      type: object
      properties:
        name:
          type: string
        group_type:
          type: string
      title: ProductsGetResponsesContentApplicationJsonSchemaResultsItemsGroupsItems
    ProductsGetResponsesContentApplicationJsonSchemaResultsItems:
      type: object
      properties:
        merchant:
          type: string
        groups:
          type: array
          items:
            $ref: >-
              #/components/schemas/ProductsGetResponsesContentApplicationJsonSchemaResultsItemsGroupsItems
        name:
          type: string
        price:
          type: string
        image_url:
          type: string
        detail_url:
          type: string
        external_product_id:
          type: string
        sku:
          type: string
        autoship_enabled:
          type: boolean
          default: true
        premier_enabled:
          type: integer
          default: 0
        created:
          type: string
        last_update:
          type: string
        live:
          type: boolean
          default: true
        discontinued:
          type: boolean
          default: true
        extra_data:
          description: Any type
        product_type:
          type: string
        autoship_by_default:
          type: boolean
          default: true
        every:
          description: Any type
        every_period:
          description: Any type
        offer_profile:
          description: Any type
        incentive_group:
          description: Any type
      title: ProductsGetResponsesContentApplicationJsonSchemaResultsItems
    Products_list_Response_200:
      type: object
      properties:
        count:
          type: integer
          default: 0
        next:
          type: string
        previous:
          description: Any type
        results:
          type: array
          items:
            $ref: >-
              #/components/schemas/ProductsGetResponsesContentApplicationJsonSchemaResultsItems
      title: Products_list_Response_200
    Products-listRequestForbiddenError:
      type: object
      properties:
        detail:
          type: string
      title: Products-listRequestForbiddenError
    Products-listRequestNotFoundError:
      type: object
      properties:
        detail:
          type: string
      title: Products-listRequestNotFoundError
  securitySchemes:
    x-api-key:
      type: apiKey
      in: header
      name: x-api-key

```

## Examples



**Response**

```json
{}
```

**SDK Code**

```python Result
import requests

url = "https://restapi.ordergroove.com/products/"

headers = {"x-api-key": "<apiKey>"}

response = requests.get(url, headers=headers)

print(response.json())
```

```javascript Result
const url = 'https://restapi.ordergroove.com/products/';
const options = {method: 'GET', headers: {'x-api-key': '<apiKey>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Result
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://restapi.ordergroove.com/products/"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("x-api-key", "<apiKey>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Result
require 'uri'
require 'net/http'

url = URI("https://restapi.ordergroove.com/products/")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<apiKey>'

response = http.request(request)
puts response.read_body
```

```java Result
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://restapi.ordergroove.com/products/")
  .header("x-api-key", "<apiKey>")
  .asString();
```

```php Result
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://restapi.ordergroove.com/products/', [
  'headers' => [
    'x-api-key' => '<apiKey>',
  ],
]);

echo $response->getBody();
```

```csharp Result
using RestSharp;

var client = new RestClient("https://restapi.ordergroove.com/products/");
var request = new RestRequest(Method.GET);
request.AddHeader("x-api-key", "<apiKey>");
IRestResponse response = client.Execute(request);
```

```swift Result
import Foundation

let headers = ["x-api-key": "<apiKey>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://restapi.ordergroove.com/products/")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```