---
title: "Read workspace custom CSS"
method: GET
path: "/api/v3/workspaces/{workspaceId}/custom-css"
tags: ["V3 Workspaces"]
---

# Read workspace custom CSS

`GET /api/v3/workspaces/{workspaceId}/custom-css`

## Request

- Base URL: `https://app.formbricks.com`
- URL: `https://app.formbricks.com/api/v3/workspaces/{workspaceId}/custom-css`
- Auth: one of:
  - API key in cookie `next-auth.session-token`
  - API key in header `x-api-key`
  - HTTP bearer

Returns the workspace's shared survey CSS as editable **source** (light and dark), the one recoverable previous revision, whether the stored CSS is being delivered to respondents (`status`), and whether this caller may change it (`canEdit`, `planAllowed`). Compiled output is never returned here. Requires read access to the workspace. Session cookie, `x-api-key`, or a Bearer token.

## Path parameters

- `workspaceId` string, cuid2, required

## Response `200`

Workspace custom CSS

- object
  - `data` WorkspaceCustomCssResource, required: A workspace's shared survey CSS (ENG-3641): editable source for authorized readers, never compiled output. It applies to every survey in the workspace, beneath each survey's own CSS.
    - `workspaceId` string, required
    - `customCss` CustomCssInput, required: Custom CSS **source** as a caller writes it (ENG-3641). Both keys are required. `light` is base CSS that applies in both appearances; `dark` adds overrides on top of it when the survey renders dark. `null`, an empty string or whitespace means "no CSS" for that field. Source only: compiled output and the processor version are computed by the server on every write, and a request that supplies either is rejected. The combined source is limited to 100 000 UTF-8 bytes for a workspace and 20 000 for a survey; larger CSS is a **422** with error code `source_too_large`.
      - `light` string, nullable, required: Base CSS, applied in light and dark appearance.
      - `dark` string, nullable, required: Additional CSS applied only in dark appearance.
    - `previous` CustomCssInput, required: Custom CSS **source** as a caller writes it (ENG-3641). Both keys are required. `light` is base CSS that applies in both appearances; `dark` adds overrides on top of it when the survey renders dark. `null`, an empty string or whitespace means "no CSS" for that field. Source only: compiled output and the processor version are computed by the server on every write, and a request that supplies either is rejected. The combined source is limited to 100 000 UTF-8 bytes for a workspace and 20 000 for a survey; larger CSS is a **422** with error code `source_too_large`.
      - `light` string, nullable, required: Base CSS, applied in light and dark appearance.
      - `dark` string, nullable, required: Additional CSS applied only in dark appearance.
    - `status` 'ok' | 'stale' | 'withheld', required: `stale`: compiled by an older processor and delivered by recompiling its source. `withheld`: the source no longer passes the current processor, so respondents receive none of it until it is fixed and saved again.
    - `errors` CustomCssError[]: Present only when `status` is `withheld`.
      - `code` 'syntax_error' | 'source_too_large' | 'output_too_large' | 'limit_exceeded' | 'processing_failed', required
      - `scope` 'workspace' | 'survey', required
      - `appearance` 'light' | 'dark' | 'null', nullable, required
      - `line` integer, nullable, required
      - `column` integer, nullable, required
      - `reason` string, required
    - `canEdit` boolean, required: Whether this caller may PATCH it: organization owners and managers for signed-in users, a `manage` grant on this workspace for API keys.
    - `planAllowed` boolean, required: Whether the organization's plan allows additions and edits (Scale on Formbricks Cloud; every self-hosted plan). Removing CSS is always allowed.

## Other responses

- `400`: Bad Request — malformed JSON, invalid query/body/params, duplicate name, or unsupported field.
- `401`: Not authenticated (no valid session or API key).
- `403`: Forbidden — no workspace access, or resource does not exist (404 not used; avoids existence leak).
- `429`: Rate limit exceeded.
- `500`: Internal Server Error.

## Changes

- **2026-10-28** `84820a01e550`: 15 warning
  - added the new `chart_in_use` enum value to the `code` response property for the response status `400`
  - added the new `chart_in_use` enum value to the `code` response property for the response status `401`
  - added the new `chart_in_use` enum value to the `code` response property for the response status `403`
  - added the new `chart_in_use` enum value to the `code` response property for the response status `429`
  - …11 more
- **2026-10-27** `aad5dc1d8236`: 10 warning
  - added the new `creatives_not_entitled` enum value to the `code` response property for the response status `400`
  - added the new `creatives_not_entitled` enum value to the `code` response property for the response status `401`
  - added the new `creatives_not_entitled` enum value to the `code` response property for the response status `403`
  - added the new `creatives_not_entitled` enum value to the `code` response property for the response status `429`
  - …6 more
- …earlier changes not shown

[Operation history](https://skmtc.dev/formbricks/apis/formbricks-api-v3/changes/api/v3/workspaces/:workspaceId/custom-css/get.md)

---

[API](https://skmtc.dev/formbricks/apis/formbricks-api-v3.md) - [All operations](https://skmtc.dev/formbricks/apis/formbricks-api-v3/llms.txt) - [OpenAPI document](https://skmtc.dev/formbricks/apis/formbricks-api-v3/revisions/25335c959a13?raw)
