---
title: "Create Question"
method: POST
path: "/v1/events/{event_slug}/questions"
tags: ["Questions"]
---

# Create Question

`POST /v1/events/{event_slug}/questions`

## Request

- Base URL: `https://developer.eventship.com` (the document declares no server; this is the origin it was published from)
- URL: `https://developer.eventship.com/v1/events/{event_slug}/questions`
- Auth: API key in header `X-API-Key`

Add a registration question to an event.

``condition`` (Pro) makes the question conditional on an earlier
select / multiselect / checkbox question's answer.

## Path parameters

- `event_slug` string, required

## Request body

- ExternalQuestionCreateRequest: Request to create a registration question via the external API.
  - `questionText` string, required
  - `questionType` 'text' | 'textarea' | 'select' | 'checkbox' | 'multiselect'
  - `options` string[], nullable
  - `isRequired` boolean
  - `condition` ExternalQuestionCondition: ``condition`` as the external API accepts it: the shared rule, strict. Fields come from ``QuestionConditionSchema`` (one definition, so the two cannot drift) and ``extra="forbid"`` comes from ``ExternalRequest``. Base order is load-bearing: Pydantic merges each base's ``model_config`` in declaration order, so ``ExternalRequest`` has to come last to win. It is also a real subclass of the shared schema, so the validators and services that read a condition keep their existing parameter type. The shared schema itself stays permissive because the web and mobile wizards post to the first-party question routes; strictness that would 422 our own clients is a separate decision.
    - `sourceQuestionId` integer, required
    - `op` 'is' | 'is_not', required
    - `values` string[], required

## Response `201`

Successful Response

- ExternalQuestionResponse: Registration question for external API consumers. Reads carry the full ``QuestionType``, deliberately including ``address``. The external API cannot *author* an address question (see ``AuthoredQuestionType`` on the create/update requests below), but the host can add the mailing-address system question in-app, and this schema then has to serialize it — narrowing the type here would 500 every read of that event.
  - `id` integer, required
  - `questionText` string, required
  - `questionType` 'text' | 'textarea' | 'select' | 'checkbox' | 'multiselect' | 'address', required: Type of registration question on an event.
  - `options` string[], nullable
  - `addressScope` 'full' | 'postal_code', nullable
  - `isRequired` boolean
  - `condition` QuestionConditionSchema: Conditional visibility rule on a registration/membership question. The question is only shown when the source question's answer matches (``is``) / does not match (``is_not``) one of ``values``. Canonical evaluation semantics: ``api/services/question_visibility.py``.
    - `sourceQuestionId` integer, required
    - `op` 'is' | 'is_not', required
    - `values` string[], required

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/eventship/apis/eventship-api.md) · [All operations](https://skmtc.dev/eventship/apis/eventship-api/llms.txt) · [OpenAPI document](https://skmtc.dev/eventship/apis/eventship-api/revisions/4b7e010cb94f?raw)
