# Catalog GraphQL (https://developer.godaddy.com/en/docs/references/rest/catalog)

***

title: Catalog GraphQL
description: Query and mutate the commerce catalog subgraph for a store.
full: true
----------

Store-scoped catalog GraphQL over HTTP. Use `commerce.product:read` to query and
`commerce.product:write` to mutate. See [Commerce API Scopes](https://developer.godaddy.com/docs/references/rest/commerce-scopes).

**Endpoint:** `POST /v2/commerce/stores/{storeId}/catalog-subgraph`

Send the same store ID in the `{storeId}` path and the `x-store-id` header. The
header is required. If they differ, the subgraph uses the header.

**Rate limit:** Read `RateLimit-Limit`, `RateLimit-Remaining`, and
`RateLimit-Reset` on every response. On HTTP `429`, wait for
`RateLimit-Reset` or `Retry-After`. See [Handle rate limits](https://developer.godaddy.com/docs/api-users/rate-limits).

For `SimpleMoneyInput.value`, send `1999` for $19.99 USD, not `19.99`. Copy the sample
variables as-is (`1000`) or convert dollars to cents before calling.

The GraphQL domain model uses **SKU** / **SKU group** (not a `Product` type). PAT
scopes stay `commerce.product:*` for historical naming.

Sidebar is grouped by **action/resource**. Expand a resource, then **Query**
(`commerce.product:read`, 27 fields) or **Mutation**
(`commerce.product:write`, 108 fields).

## Example query

query

Requires `commerce.product:read`. See [`sku`](https://developer.godaddy.com/docs/references/rest/catalog/sku/queries/sku) for the full schema.

```graphql
query GetSku($id: String!) {
  sku(id: $id) {
    id
    name
    status
  }
}
```

```bash
curl -X POST "https://api.godaddy.com/v2/commerce/stores/{storeId}/catalog-subgraph" \
  -H "Authorization: Bearer $GODADDY_PAT" \
  -H "Content-Type: application/json" \
  -H "x-store-id: {storeId}" \
  -d '{
    "query": "query GetSku($id: String!) { sku(id: $id) { id name status } }",
    "variables": { "id": "SKU_ID" }
  }'
```

## Example mutation

mutation

Requires `commerce.product:write`. See [`createSku`](https://developer.godaddy.com/docs/references/rest/catalog/sku/mutations/createSku) for the full schema.

```graphql
mutation CreateSku($input: CreateSKUInput!) {
  createSku(input: $input) {
    id
    name
    status
  }
}
```

***

## HTTP reference

OpenAPI contract for the subgraph POST (headers, auth, response envelope):

## POST /stores/{storeId}/catalog-subgraph

Catalog GraphQL endpoint

Proxies GraphQL to the catalog subgraph. Use the `query` field for the GraphQL document and optional `variables` / `operationName`. Send the same store ID in the `{storeId}` path and the `x-store-id` header. The header is required. If they differ, the subgraph uses the header. This endpoint is rate-limited per credential per window. Read the RateLimit-Limit, RateLimit-Remaining, and RateLimit-Reset response headers; do not assume 60 requests per minute. Exceeding the live limit returns HTTP 429; honor RateLimit-Reset or Retry-After before retrying.

### Path parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `storeId` | unknown | yes |  |

### Header parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `x-store-id` | unknown | yes | Required store ID. Send the same value as `{storeId}` in the path. If they differ, the subgraph uses this header. |

### Request body (required)

Content-Type: `application/json`

```json
{
  "query": "query GetSku($id: String!) { sku(id: $id) { id name status } }",
  "variables": {
    "id": "SKU_ID"
  }
}
```

Schema:

- object
  - `query` (required): string
  - `variables`: object
  - `operationName`: string

### Responses

**200** — GraphQL response. RateLimit-Limit, RateLimit-Remaining, and RateLimit-Reset are present on every response (including 200).

Content-Type: `application/json`

Schema:

- object
  - `data`: object
  - `errors`: array
      - items:

**400** — Invalid request

Content-Type: `application/json`

Schema:

- unknown

**401** — Unauthorized

Content-Type: `application/json`

Schema:

- unknown

**403** — Forbidden

Content-Type: `application/json`

Schema:

- unknown

**404** — Store not found

Content-Type: `application/json`

Schema:

- unknown

**429** — Rate limit exceeded (RateLimit-Remaining is 0). Wait RateLimit-Reset seconds. Honor Retry-After when the gateway sends it.

Content-Type: `application/json`

Schema:

- unknown

**500** — Internal server error

Content-Type: `application/json`

Schema:

- unknown

**Security:** requires `PAT`; scopes `commerce.product:read`, `commerce.product:write`.
