Skip to content

Draft a survey

Workforce module

POST/surveys/draftsurveys.draft

Drafts a pulse survey with its questions. Requires `Idempotency-Key`; a replay returns the original response. A rule that refuses the request returns 422 with `refusal` and `reason`.

  • Requires the capability knowledge.sop.publish.
  • OAuth scopes: knowledge.
  • Send an Idempotency-Key header. A replay with the same key returns the original response.
  • Error statuses: 400, 401, 409, 422, 429. Errors are RFC 9457 problem details.

Request body: SurveyDraftRequest

surveys.draft: SurveyDraftRequest
FieldTypeRequiredDescription
titlestringYesSurvey title.Constraints: length 1 to 200
descriptionstringNoWhat the survey asks about.Constraints: length 0 to 2000
audience_kind"Organization" | "Project" | "Team" | "Department" | "Role" | "Group"NoWho the row reaches. Department (a canon department, 1365) is for feed posts only.
project_idstring (uuid)NoProject audience.
team_idstring (uuid)NoTeam audience.
role_idstring (uuid)NoRole audience.
group_idstring (uuid)NoGroup audience.
is_anonymousbooleanNoAnonymous by default.
min_responsesintegerNoResponses before results show; 5 by default.Constraints: range 3 to 1000
closes_atstring (date-time)NoWhen responses stop.
questionsarray of objectYes1 to 50 questions in order.
{
  "title": "Load-in pulse",
  "description": "How did it go?",
  "audience_kind": "Organization",
  "project_id": "0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f",
  "team_id": "0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f",
  "role_id": "0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f",
  "group_id": "0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f",
  "is_anonymous": true,
  "min_responses": 5,
  "closes_at": "2026-10-08T14:30:00Z",
  "questions": [
    {
      "prompt": "How safe did it feel?",
      "kind": "Scale"
    }
  ]
}

Response 201: Survey

surveys.draft: Survey
FieldTypeRequiredDescription
idstring (uuid)YesIdentifier of the survey.
org_idstring (uuid)YesIdentifier of the owning organization, derived from the parent row and never accepted from the caller.
created_atstring (date-time)YesWhen the row was created.
created_bystring (uuid) | nullYesPerson who created the row; null for seed, platform or system writes.
updated_atstring (date-time)YesWhen the row was last updated.
updated_bystring (uuid) | nullYesPerson who last updated the row; null for seed, platform or system writes.
titlestringYesSurvey title.Constraints: length 1 to 200
descriptionstring | nullYesWhat the survey asks about.Constraints: length 1 to 2000
audience_kind"Organization" | "Project" | "Team" | "Department" | "Role" | "Group"YesWho the row reaches. Department (a canon department, 1365) is for feed posts only.
project_idstring (uuid) | nullYesIdentifier of the project audience, or the project the row belongs to.
team_idstring (uuid) | nullYesIdentifier of the team audience.
role_idstring (uuid) | nullYesIdentifier of the org role audience.
group_idstring (uuid) | nullYesIdentifier of the group audience, including department groups.
author_membership_idstring (uuid) | nullYesIdentifier of the member who wrote the survey.
is_anonymousbooleanYesWhether answers are stored with no respondent.
min_responsesintegerYesResponses needed before results show.Constraints: range 3 to any
survey_state"Draft" | "Open" | "Closed"YesDraft, Open or Closed.
closes_atstring (date-time) | nullYesWhen responses stop.
{
  "id": "0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f",
  "org_id": "0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f",
  "created_at": "2026-10-08T14:30:00Z",
  "created_by": "0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f",
  "updated_at": "2026-10-08T14:30:00Z",
  "updated_by": "0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f",
  "title": "Load-in pulse",
  "description": "Tell us how the load-in felt.",
  "audience_kind": "Organization",
  "project_id": "0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f",
  "team_id": "0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f",
  "role_id": "0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f",
  "group_id": "0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f",
  "author_membership_id": "0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f",
  "is_anonymous": true,
  "min_responses": 5,
  "survey_state": "Draft",
  "closes_at": "2026-10-08T14:30:00Z"
}

Code samples

curl -X POST "$XOS_BASE_URL/surveys/draft" \
  -H "Authorization: Bearer $XOS_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"title":"Load-in pulse","description":"How did it go?","audience_kind":"Organization","project_id":"0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f","team_id":"0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f","role_id":"0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f","group_id":"0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f","is_anonymous":true,"min_responses":5,"closes_at":"2026-10-08T14:30:00Z","questions":[{"prompt":"How safe did it feel?","kind":"Scale"}]}'
const { data } = await xos.surveys.draft({
    "title": "Load-in pulse",
    "description": "How did it go?",
    "audience_kind": "Organization",
    "project_id": "0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f",
    "team_id": "0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f",
    "role_id": "0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f",
    "group_id": "0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f",
    "is_anonymous": true,
    "min_responses": 5,
    "closes_at": "2026-10-08T14:30:00Z",
    "questions": [
      {
        "prompt": "How safe did it feel?",
        "kind": "Scale"
      }
    ]
  });
response = xos.surveys.draft({"title": "Load-in pulse", "description": "How did it go?", "audience_kind": "Organization", "project_id": "0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f", "team_id": "0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f", "role_id": "0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f", "group_id": "0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f", "is_anonymous": True, "min_responses": 5, "closes_at": "2026-10-08T14:30:00Z", "questions": [{"prompt": "How safe did it feel?", "kind": "Scale"}]})
xos surveys draft --data '{"title":"Load-in pulse","description":"How did it go?","audience_kind":"Organization","project_id":"0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f","team_id":"0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f","role_id":"0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f","group_id":"0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f","is_anonymous":true,"min_responses":5,"closes_at":"2026-10-08T14:30:00Z","questions":[{"prompt":"How safe did it feel?","kind":"Scale"}]}'