---
title: "createCampaignQuestion"
method: POST
path: "/campaigns/{campaign}/questions"
tags: ["Question"]
---

# createCampaignQuestion

`POST /campaigns/{campaign}/questions`

## Request

- Base URL: `https://pro.gofundme.com/api/2.0`
- URL: `https://pro.gofundme.com/api/2.0/campaigns/{campaign}/questions`
- Auth: OAuth 2
  - Password
  - Token URL: `/oauth2/auth`

Create a new question for a specific campaign. Questions marked as required will automatically be treated as pre-conversion (where supported).

## Path parameters

- `campaign` integer, required

## Request body

- Question
  - `campaign_id` integer: Primary identifier of Campaign
  - `created_at` string, date-time: Date/time of when record created
  - `deleted_at` string, date-time, nullable: Date/time of when record deleted
  - `id` integer: Primary identifier of record
  - `is_deleted` boolean: Question deleted or not
  - `is_required` boolean: Whether the Question is required or not. If `is_required` is `true`, the question will be treated as pre-conversion (shown before donation), otherwise it will be treated as post-conversion (shown after donation) for supported workflows.
  - `is_pre_conversion` boolean: Whether the Question should be shown before donation (pre-conversion) or after donation (post-conversion). When true, the question is displayed before the donation is processed.
  - `label` string, required: Question label
  - `location` 'donation_page' | 'team_creation' | 'page_creation' | 'campaign_registration' | 'hidden', required: Question location. `hidden` is a read-only state set exclusively by the reduce-custom-questions hide mutation -- PUT /questions/{question} rejects it as a write value.
  - `product_id` integer, nullable: Identifier of associated product, such as a ticket
  - `tag` 'address' | 'address2' | 'address_type' | 'birthdate' | 'blog' | 'cellphone' | 'city' | 'company_name' | 'country' | 'email_address' | 'email_type' | 'emergency_first_name' | 'emergency_last_name' | 'emergency_phone' | 'event_waiver' | 'first_name' | 'gender' | 'pronoun' | 'homephone' | 'last_name' | 'middle_name' | 'postal_code' | 'prefix' | 'run_walk' | 'shirt_size' | 'state' | 'suffix' | 'text_opt_in' | 'website', nullable: Question tag, unique for a location on a campaign
  - `type` 'boolean' | 'integer' | 'currency' | 'enum' | 'text' | 'string' | 'date' | 'yes_no', required: Type of the Question
  - `updated_at` string, date-time, nullable: Date/time of last record update
  - `weight` integer, nullable: Weight of the Question, used for display order

## Response `200`

Success

- QuestionWithEnumOptions
  - `campaign_id` integer: Primary identifier of Campaign
  - `created_at` string, date-time: Date/time of when record created
  - `deleted_at` string, date-time, nullable: Date/time of when record deleted
  - `id` integer: Primary identifier of record
  - `is_deleted` boolean: Question deleted or not
  - `is_required` boolean: Whether the Question is required or not. If `is_required` is `true`, the question will be treated as pre-conversion (shown before donation), otherwise it will be treated as post-conversion (shown after donation) for supported workflows.
  - `is_pre_conversion` boolean: Whether the Question should be shown before donation (pre-conversion) or after donation (post-conversion). When true, the question is displayed before the donation is processed.
  - `label` string, required: Question label
  - `location` 'donation_page' | 'team_creation' | 'page_creation' | 'campaign_registration' | 'hidden', required: Question location. `hidden` is a read-only state set exclusively by the reduce-custom-questions hide mutation -- PUT /questions/{question} rejects it as a write value.
  - `product_id` integer, nullable: Identifier of associated product, such as a ticket
  - `tag` 'address' | 'address2' | 'address_type' | 'birthdate' | 'blog' | 'cellphone' | 'city' | 'company_name' | 'country' | 'email_address' | 'email_type' | 'emergency_first_name' | 'emergency_last_name' | 'emergency_phone' | 'event_waiver' | 'first_name' | 'gender' | 'pronoun' | 'homephone' | 'last_name' | 'middle_name' | 'postal_code' | 'prefix' | 'run_walk' | 'shirt_size' | 'state' | 'suffix' | 'text_opt_in' | 'website', nullable: Question tag, unique for a location on a campaign
  - `type` 'boolean' | 'integer' | 'currency' | 'enum' | 'text' | 'string' | 'date' | 'yes_no', required: Type of the Question
  - `updated_at` string, date-time, nullable: Date/time of last record update
  - `weight` integer, nullable: Weight of the Question, used for display order
  - `enum_options` QuestionEnumOption[]: Custom answer options for the question. Required if `type` is `enum`.
    - `label` string: QuestionEnumOption label
    - `question_id` integer: QuestionEnumOption Question ID

## Other responses

- `400`: A locked Custom Questions section on a template-linked campaign, keyed `custom_questions`, or a question field that failed validation.
- `403`: Requester is not authorized to perform this action
- `404`: Campaign not found
- `500`: Error when trying to duplicate a question across campaigns

## Changes

- **2026-09-23** `89ff5d9e304b`: 1 info
  - added the non-success response with the status `400`
- **2026-09-17** `206a8046892e`: 1 warning, 1 info
  - added the new `hidden` enum value to the `allOf[subschema #1: Question]/location` response property for the response status `200`
  - added the new `hidden` enum value to the request property `location`

[Operation history](https://skmtc.dev/gofundme/apis/gofundme-pro-api/changes/campaigns/:campaign/questions/post.md)

---

[API](https://skmtc.dev/gofundme/apis/gofundme-pro-api.md) - [All operations](https://skmtc.dev/gofundme/apis/gofundme-pro-api/llms.txt) - [OpenAPI document](https://skmtc.dev/gofundme/apis/gofundme-pro-api/revisions/094a1e510fe9?raw)
