---
title: "Save a survey draft"
url: https://docs.gleap.ai/en/reference/rest-api/save-draft
method: PUT
path: "/engagement/surveys/{surveyId}/draft"
api: "API Reference"
tag: "Engagement Survey"
operationId: "SaveDraft"
updatedAt: "2026-11-01T18:40:15.677Z"
language: en
---

# Save a survey draft

`PUT https://api.gleap.io/v3/engagement/surveys/{surveyId}/draft`

Save the Surveys 2.0 draft. Body `{ definition, baseRevision?, allowEmpty? }`. Invalid logic is saved and returned as `warnings`; a malformed definition answers 422 `{ errors }`. Live surveys keep serving the published version. Returns `{ definition, draftRevision, warnings }`.

Every save bumps the draft's `draftRevision`. With `baseRevision` (the revision you loaded) a save over a newer draft answers 409 `{ code: 'draft_changed', draftRevision }`. A save that would remove every question of a draft that has some answers 409 `{ code: 'draft_would_remove_all_questions' }` unless `allowEmpty: true`.

## Authorization

- `Authorization` (header, required): `Bearer <token>`

## Path parameters

- `surveyId` (string, required)

## Headers

- `project` (string, required)

## Request body (`application/json`, required)

## Example request

```bash
curl --request PUT \
  --url 'https://api.gleap.io/v3/engagement/surveys/{surveyId}/draft' \
  --header 'Authorization: Bearer <token>' \
  --header 'project: <project>' \
  --header 'Content-Type: application/json' \
  --data '{}'
```

## Responses

### 200 (`application/json`)

Ok
