Catalog

List the service groups

GET
/api/v1/service-groups

The service groups (configurators) as the studio is editing them - the DRAFT the admin shows - with their stages, entries and questions, every id included, so an integrator can learn the ids the other group endpoints take and see what it wrote before publishing. findings lists the structure problems that block POST /catalog/publish (empty = publishable). Ordered by sortOrder. Requires the catalog:read scope; a publishable key cannot call it.

Authorization

ApiKeyAuth catalog:read
headerAuthorizationBearer <shyni_sk_live_*>

An API key, issued once and never retrievable again: an organization key in the developer portal, or a studio key in the studio's admin (Moje studio → API). Send as Authorization: Bearer shyni_sk_live_....

Scope: catalog:read

Query Parameters

page?integer
Range1 <= value
Default1
perPage?integer
Range1 <= value <= 100
Default20

Response Body

One page of draft service groups.

application/json
  1. response
data*array<>
meta*
Example Request
curl -X GET 'https://api.shyni.io/api/v1/service-groups' \  -H 'Authorization: Bearer shyni_sk_test_YOUR_KEY'

Response 200

One page of draft service groups.

{  "data": [    {      "id": "string",      "slug": "string",      "name": "string",      "sortOrder": 0,      "categoryId": "string",      "inspectionMode": "OFF",      "defaultServiceId": "string",      "lead": "string",      "scaleTitle": "string",      "imageId": "string",      "stages": [        {          "serviceId": "string",          "name": "string",          "label": "string",          "forWhom": "string",          "groupOrder": 0        }      ],      "questions": [        {          "id": "string",          "groupId": "string",          "name": "string",          "sortOrder": 0,          "unansweredName": "string",          "unansweredSentence": "string",          "options": [            {              "id": "string",              "name": "string",              "sentence": "string",              "surcharge": 0,              "scalesWithSize": true,              "extraMinutes": 0,              "isDefault": true            }          ],          "stageLinks": [            {              "serviceId": "string",              "required": true,              "requiredSentence": "string"            }          ]        }      ],      "entries": [        {          "id": "string",          "name": "string",          "lead": "string",          "serviceId": "string",          "optionIds": [            "string"          ],          "sortOrder": 0        }      ],      "findings": [        {          "code": "string",          "refs": [            "string"          ]        }      ]    }  ],  "meta": {    "page": 0,    "perPage": 0,    "total": 0  }}

Response 400

A parameter, header or request body is missing, malformed, or out of range. A request body property the endpoint does not define answers UNKNOWN_FIELD instead, with field naming it.

{  "code": "INVALID_INPUT",  "message": "Parameter perPage must be between 1 and 100."}

Response 401

Missing, malformed, unknown, or revoked API key (INVALID_API_KEY).

{  "code": "INVALID_API_KEY",  "message": "Missing or invalid API key."}

Response 403

The key is valid but the request is refused. Branch on code: INSUFFICIENT_SCOPE (the key lacks the permission this endpoint requires), PLAN_REQUIRED (the studio is not on a plan that includes API keys, Pro and above), ORIGIN_NOT_ALLOWED, SECRET_KEY_IN_BROWSER, or DEMO_STUDIO on a write to the demo studio. See Authentication and Scopes above.

{  "code": "INSUFFICIENT_SCOPE",  "message": "This API key does not have the permission this endpoint requires."}

Response 404

The resource does not exist, or belongs to a different studio.

{  "code": "NOT_FOUND",  "message": "Order not found."}

Response 429

Burst rate limit exceeded.

{  "code": "RATE_LIMITED",  "message": "Too many requests. Retry after the time given in the Retry-After header."}