# Activate dataset

`PATCH https://stylor.ai/api/v1/datasets/{datasetId}/activate`

- Authentication: private API key, sent as `Authorization: Bearer sgpt-sk-…::…`
- Rate-limit resource: `api.v1.datasets.activate`
- Demo key: not accepted
- Web page: https://stylor.ai/guides/rest/v1/activate-dataset

Sets a dataset's status to `active`, making it eligible for search, chat,
outfit generation and the widget. Any number of datasets can be active at
the same time.

When the dataset was not already active, related records are brought
back with it:

- data sources that were switched off by an archive are set back to
  `active`, so scheduled syncs resume;
- items that were archived are set back to `active`.

Calling this on a dataset that is already active is harmless — the
response has `alreadyActive: true` and nothing else changes.

## Good to know

- Queue rows that were archived are **not** re-queued by activation.
  Re-upload those items if you need them processed.
- `archivedOthersCount` is always `0`; it remains for compatibility with
  an earlier behaviour that archived sibling datasets.
- The returned `dataset` is the stored record as-is and additionally
  carries the database's `_id` and `__v` bookkeeping fields. Ignore them.

## Example request

```bash
curl -X PATCH "https://stylor.ai/api/v1/datasets/YOUR_DATASET_ID/activate" \
  -H "Authorization: Bearer $STYLOR_API_KEY"
```

## Path parameters

- `datasetId` (string (uuid), required): The dataset to activate.

## Responses

### 200

The dataset is active.

Content type `application/json`:

- `activated` (boolean, required): Always `true` on success.
- `alreadyActive` (boolean, required): `true` when the dataset was already active and no cascade ran.
- `archivedOthersCount` (integer, required): Always `0`. Kept for compatibility with an earlier single-active-dataset behaviour.
- `dataset` (Dataset, required): The full stored dataset record. Returned by *Update dataset*, *Activate dataset* and *Archive dataset*. List and retrieve responses project a subset — see `DatasetSummary` and `DatasetDetail`. Internal `_id` and `__v` fields are stripped by *Update dataset* but are still present on the activate and archive responses; ignore them.
  - `datasetId` (string (uuid), required): Unique id of the dataset. Use it as the `datasetId` path parameter. [example `"c9b3c6c0-9b0f-4f42-bf3f-2b7a6b1b9d31"`]
  - `organizationId` (string (uuid), required): Id of the organization that owns the dataset — the one behind your API key. [example `"0a2c1f4e-5b6d-7e8f-9012-3456789abcde"`]
  - `status` (string, required): Lifecycle state of a dataset. - `draft` — newly created; not visible to search, chat or the widget. - `active` — live. Any number of datasets can be active at once. - `archived` — parked. Data is kept, items and sources are switched off. [default `"draft"`; one of `"draft"`, `"active"`, `"archived"`]
  - `name` (string, required): Display name. Trimmed on create; cut to 200 characters on update. [example `"Spring 2026"`]
  - `description` (string): Free-text description. Defaults to an empty string; cut to 2000 characters on update. [example `"Women's spring drop"`]
  - `metadata` (object): Arbitrary JSON you attach to the dataset. Omitted when never set. Replaced wholesale by *Update dataset*. [example `null`]
  - `config` (DatasetConfig, required): Store details attached to a dataset. Set on create, editable field-by-field on update.
    - `storeUrl` (string): The storefront URL, stored exactly as sent. Create accepts it with or without a scheme; update requires `http://` or `https://`. [example `"https://example-boutique.com"`]
    - `storeId` (string): Your identifier for the store (for example the Shopify shop id). Cut to 200 characters on update. [max length 200; example `"58712345678"`]
    - `storeDomain` (string): Bare domain of the store — no scheme, path or query. [example `"example-boutique.com"`]
    - `storeName` (string): Display name of the store. Cut to 200 characters on update. [max length 200; example `"Example Boutique"`]
    - `currency` (string): Three-letter ISO 4217 code such as `USD`. Validated case-insensitively but stored exactly as sent. [min length 3; max length 3; example `"USD"`]
    - `countryName` (string): Country of the store. Not settable through this API; present only when it was set by another integration. [example `"United States"`]
    - `targetGender` (string, nullable): Forces every item ingested into this dataset to this gender instead of the detected one. `null` keeps detection on. [default `null`; one of `"mens"`, `"womens"`]
  - `autoPublish` (boolean, required): Whether newly processed items go live automatically. Set on create; `true` unless explicitly `false`. [default `true`]
  - `createdAt` (string (date-time), required): When the dataset was created. [example `"2026-03-02T09:14:31.208Z"`]
  - `updatedAt` (string (date-time), required): When the dataset record was last written. [example `"2026-08-19T16:40:02.911Z"`]

Example:

```json
{
  "activated": true,
  "alreadyActive": false,
  "archivedOthersCount": 0,
  "dataset": {
    "datasetId": "c9b3c6c0-9b0f-4f42-bf3f-2b7a6b1b9d31",
    "organizationId": "0a2c1f4e-5b6d-7e8f-9012-3456789abcde",
    "status": "active",
    "name": "Spring 2026",
    "description": "Women's spring drop",
    "config": {
      "storeUrl": "https://example-boutique.com",
      "storeId": "58712345678",
      "storeDomain": "example-boutique.com",
      "storeName": "Example Boutique",
      "currency": "USD",
      "targetGender": "womens"
    },
    "autoPublish": true,
    "createdAt": "2026-03-02T09:14:31.208Z",
    "updatedAt": "2026-09-12T10:05:12.402Z"
  }
}
```

## Errors

Every error is a JSON object with an `error` string. Match on the status code; the message is written for people.

| Status | Message | When |
| --- | --- | --- |
| 401 | Organization '<organizationId>' not found. | The organization that owns the key no longer exists. |
| 404 | Dataset '<datasetId>' not found for organization '<organizationId>'. | No dataset with that id belongs to your organization. |
| 422 | Invalid 'datasetId': expected a non-empty string. | `datasetId` is empty. |

### Shared authentication, quota and rate-limit errors

| Status | Message | When |
| --- | --- | --- |
| 401 | API key missing. | The `Authorization` header is absent, is not `Bearer <key>`, or the key does not have three dash-separated segments. |
| 401 | Authentication failed: public key is invalid or not recognized. | A public-key endpoint was called with a key that does not exist. |
| 401 | Authentication failed: private key provided instead of a public key. | A public-key endpoint was called with an `sgpt-sk-…` key. |
| 401 | Authentication failed: token is not recognized. | A private-key endpoint was called with a key whose lookup segment does not exist. |
| 401 | Authentication failed: private key is invalid. | A private-key endpoint was called with a key whose secret does not match. |
| 401 | Authentication failed: public key provided instead of a private key. | A private-key endpoint was called with an `sgpt-pk-…` key. |
| 401 | Authentication failed: bearer token format is invalid. | A private key was sent without its `::` lookup segment. |
| 401 | Authentication failed: API key could not be read. Regenerate the key. | The key's embedded organization data could not be decrypted or parsed. |
| 403 | Demo mode is not available for private-key routes. Demos are only supported with public API keys. | The demo key was sent to a private-key endpoint. |
| 403 | Demo mode is not supported on this API route. Check the documentation for available demo endpoints. | The demo key was sent to a public-key endpoint that opts out of demo mode. |
| 403 | No active subscription for this organization. | The organization that owns the key has no active subscription. |
| 403 | No quota found for organization "<organizationId>". | The organization has no quota record for the current billing period. |
| 403 | No entitlement for "<resource>". | The plan's quota template has no entry for this endpoint. |
| 403 | Access denied to "<resource>". | The plan's quota template turns this endpoint off. |
| 429 | Monthly quota exceeded for "<resource>" (<quota>/<quota> used). | The billing-period quota for this endpoint is exhausted. `Retry-After` gives the seconds until the period resets. |
| 429 | RPM limit exceeded for "<resource>" (<used>/<limit> used). | More than the allowed requests per minute were sent. `Retry-After` is 60. |
| 500 | Internal server error. | An unexpected failure on the server. The message is always this string; details are logged, never returned. Quota consumed by the request is refunded, as it is for every 5xx response. |
