---
title: "Update Question"
method: PATCH
path: "/v1/events/{event_slug}/questions/{question_id}"
tags: ["Questions"]
---

# Update Question

`PATCH /v1/events/{event_slug}/questions/{question_id}`

## 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/{question_id}`
- Auth: API key in header `X-API-Key`

Update a registration question.

``condition`` is tri-state: omitted = unchanged, null = remove logic,
object = set logic (Pro).

## Path parameters

- `event_slug` string, required
- `question_id` integer, required

## Request body

- ExternalQuestionUpdateRequest: Request to update a registration question via the external API. All fields are optional — only provided fields are updated. ``condition`` is tri-state: omitted = unchanged, null = remove logic, object = set logic (Pro plan).
  - `questionText` string, nullable
  - `questionType` 'text' | 'textarea' | 'select' | 'checkbox' | 'multiselect', nullable
  - `options` string[], nullable
  - `isRequired` boolean, nullable
  - `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 `200`

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)
