> ## Documentation Index
> Fetch the complete documentation index at: https://docs.screenframed.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Projects

Manage project scopes, defaults, brand context, and signing secrets.

Projects organize captures, auth profiles, render history, brand context, and signing secrets for signed URLs.

## Endpoints

| Method | Path | Purpose |
|---|---|---|
| `GET` | `/v1/projects` | List projects. |
| `POST` | `/v1/projects` | Create a project. |
| `GET` | `/v1/projects/{id}` | Get one project. |
| `PATCH` | `/v1/projects/{id}` | Update name or domain. |
| `POST` | `/v1/projects/ensure-default` | Ensure the account has a default project. |
| `POST` | `/v1/projects/{id}/default` | Make project default. |
| `GET` | `/v1/projects/{id}/signing-secret` | Reveal signing secret. |
| `POST` | `/v1/projects/{id}/signing-secret/rotate` | Rotate signing secret. |
| `POST` | `/v1/projects/{id}/brand/refresh` | Refresh project brand context. |
| `GET` | `/v1/projects/{id}/brand/status` | Check brand status. |

## Create project

```bash
curl -X POST "https://screenframed.com/v1/projects" \
  -H "Authorization: Bearer $SCREENFRAMED_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "domain": "example.com",
    "name": "Example marketing site",
    "make_default": true
  }'
```

```json
{
  "project": {
    "id": "prj_01K...",
    "name": "Example marketing site",
    "domain": "example.com",
    "brand": null,
    "brand_status": "pending",
    "brand_error": null,
    "is_default": true,
    "created_at": "2026-04-27 15:00:00",
    "updated_at": "2026-04-27 15:00:00"
  },
  "signing_secret": "..."
}
```

## Brand context

Project brand context can be used by product surfaces and AI-assisted styling. Refresh it when the site's visual identity changes:

```bash
curl -X POST "https://screenframed.com/v1/projects/prj_01K.../brand/refresh" \
  -H "Authorization: Bearer $SCREENFRAMED_API_KEY"
```

Check status:

```bash
curl "https://screenframed.com/v1/projects/prj_01K.../brand/status" \
  -H "Authorization: Bearer $SCREENFRAMED_API_KEY"
```

## Signed URLs

Use `/v1/projects/{id}/signing-secret` to read the current secret and `/rotate` to replace it. See [Signed URLs](/captures/signed-urls).

Signing secrets should only be used from your backend. Rotate immediately if a secret is exposed.

` GET /v1/projects `

List projects

## Servers

- ` https://screenframed.com ` — Production

## Authentication

The operation accepts these alternatives. Schemes within one alternative are required together.

### Alternative 1

- ` bearerAuth `: ` http `

  - HTTP scheme: ` bearer `

  - ScreenFramed API key, such as `sf_live_...`.

## Responses

### ` 200 ` — Project list

Content type: ` application/json `

- ` value `: type ` object `

  - ` projects `: type ` array `

    - ` array item `: type ` object `

      - ` id `: type ` string `

        - pattern: ` "^prj_" `

      - ` name `: type ` string `

      - ` domain `: type ` string `; nullable

      - ` brand `: type ` object `; nullable

      - ` brand_status `: type ` string `

        - enum: ` ["none","pending","processing","completed","failed","skipped"] `

      - ` brand_error `: type ` string `; nullable

      - ` is_default `: type ` boolean `

      - ` created_at `: type ` string `

      - ` updated_at `: type ` string `

  - ` active_project_id `: type ` string `; nullable

### ` 401 ` — Error response

Content type: ` application/json `

- ` value `: type ` object `

  - Required fields: ` error `

  - ` error `: type ` object `

    - Required fields: ` code `, ` message `

    - ` code `: type ` string `

    - ` message `: type ` string `

    - ` details `: type ` object `

    - ` retry_after `: type ` integer `

### ` 403 ` — Error response

Content type: ` application/json `

- ` value `: type ` object `

  - Required fields: ` error `

  - ` error `: type ` object `

    - Required fields: ` code `, ` message `

    - ` code `: type ` string `

    - ` message `: type ` string `

    - ` details `: type ` object `

    - ` retry_after `: type ` integer `

## Request examples

### cURL

```curl
curl -X GET 'https://screenframed.com/v1/projects' \
  -H 'Authorization: Bearer YOUR_API_TOKEN'
```

### JavaScript

```javascript
const response = await fetch('https://screenframed.com/v1/projects', {
  method: 'GET',
  headers: {
      "Authorization": "Bearer YOUR_API_TOKEN"
  }
});

const data = await response.json();
console.log(data);
```

### Python

```python
import requests

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN'
}

response = requests.get('https://screenframed.com/v1/projects', headers=headers)
print(response.json())
```