Registered components: list what a project has synced
A read-only route on the managed Studio API service, alongside the composition endpoints. It reports the components a project has synced to Studio's component service, with their prop schemas. Same base URL, same authentication, same error envelope as the rest of the chapter.
Preview: not yet GA. As with every route in this chapter, paths and response shapes may still change, and the service may not be enabled on your region or tenant yet.
What this list actually contains
Three different things are easy to confuse. Only the third one is what this endpoint returns.
| Where it lives | How it gets there | |
|---|---|---|
| Registered in code | Your app's Studio registry, in the browser | registerComponent / registerComponents / registerLazyComponent at app boot. See Registering components |
| Visible in the palette | Studio's canvas UI | Registration runs before the canvas iframe loads |
| Synced to the service (what this endpoint returns) | Studio's component service | csdx studio:component:sync. See Studio CLI |
A component registered in code but never synced does not appear here, and an empty list does not mean the palette is empty. Use this endpoint when a tool outside the browser (a Figma mapping flow, a script, an agent) needs to know what a project declares and what props each component takes.
List registered components
GET /v1/projects/{projectUid}/registered-components
| Param | In | Required | Notes |
|---|---|---|---|
| projectUid | path | yes | UID of the Studio project. Must be a live project in the organization you authenticate with. |
| $CS_AUTH | header | yes | Your credential: attempt OAuth first (authorization: Bearer <access_token>), with a session authtoken as the last rung. See Authentication and authorization. |
| organization_uid | header | yes | Organization the project belongs to. |
No query parameters. The route returns every synced component for the project. There is no pagination, filtering, or sorting.
curl 'https://<host>/v1/projects/<projectUid>/registered-components' \ -H "$CS_AUTH" -H 'organization_uid: <org-uid>'
Response: 200 OK
{
"registered_components": [
{
"uid": "bd3c9c3c…",
"organization_uid": "blt739e38d90d4fc4e6",
"projectId": "69a541cc…",
"componentName": "HeroBanner",
"displayName": "Hero Banner",
"description": "Full-width hero with a headline",
"aiDescription": "",
"version": "1.0.0",
"importPath": "src/components/HeroBanner.tsx",
"createdAt": "2026-08-24T09:46:25.440Z",
"updatedAt": "2026-08-24T09:46:25.440Z",
"props": [
{ "type": "string", "name": "title", "displayName": "Title" }
]
}
],
"meta": { "count": 1 }
}meta.count is the number of components in this response. Since the route never paginates, it is also the project's total.
Component fields
| Field | Type | Notes |
|---|---|---|
| uid | string | Component UID in the component service. |
| organization_uid | string | Organization that owns the record. |
| projectId | string | UID of the Studio project, matches the projectUid you requested. |
| componentName | string | The component's name in code, e.g. HeroBanner. This is the identifier a composition's ui node references as its type. |
| displayName | string, optional | Human-readable label. Often absent. Fall back to componentName rather than assuming it is set. |
| description | string, optional | Author-facing description. |
| aiDescription | string, optional | Description used by AI-assisted flows. |
| version | string | Version recorded at sync time. |
| importPath | string | Path to the component source in the repo, e.g. src/components/HeroBanner.tsx. |
| props | array | The component's prop schema. See below. |
| createdAt / updatedAt | string, optional | ISO 8601 timestamps. |
Prop fields
| Field | Type | Notes |
|---|---|---|
| type | string | Prop type as recorded at sync time, e.g. string, number. For the full set supported in a registry schema, see Component schema: prop types. |
| name | string | Prop name in code. |
| displayName | string, optional | Label for the prop. |
| description | string, optional | Help text. |
| placeholder | string, optional | Placeholder for the input. |
| defaultValue | any, optional | Default recorded for the prop. |
Only these fields are published. The service maps the component service's records onto this contract field by field, so storage internals never appear in the response.
Errors
The envelope is the same as everywhere else in this chapter. See Errors & validation for the shared shape.
| Status | error_code | When |
|---|---|---|
| 401 | 48 | Neither a session authtoken nor an OAuth Authorization: Bearer token reached the service. Both styles are accepted. This fires only when neither arrived. |
| 404 | 1 | No live project with that UID in this organization. A soft-deleted project reads the same as a missing one. |
| 422 | 21 | The caller has no read access to the project's connected stack. |
| 502 | 46 | The component service could not be reached, failed, or answered with something other than the documented array. |
| upstream status | 46 | A client error from the component service (for example 403) is passed through with its own status rather than masked as a 502. |
An empty list is a 200, never a 404: a project with nothing synced returns {"registered_components": [], "meta": {"count": 0}}.
Scope
This route is read-only. The managed service has no create, update, or delete for registered components. Components enter the list through csdx studio:component:sync and are removed through the CLI. To change what a project can build with, change the registrations in your app and sync again.
Where to go next
- Registering components: the three register APIs, and how components reach Studio's palette in the first place.
- Studio CLI: studio:component:register and studio:component:sync.
- Endpoint reference: all 16 routes on this service, and the envelope they share.
- Compositions: the composition routes on this same service.
- OpenAPI 3.1 spec. This route is included as operationId: listRegisteredComponents, with RegisteredComponent + RegisteredComponentProp component schemas.