Forms & Surveys
Forms
The Forms API allows you to retrieve information about forms, surveys, and assessments created in your organisation. Forms are used for applications, surveys, progress reports, scorecards, and session plans.
List Forms
Retrieve a paginated list of forms with optional filtering.
Endpoint
GET /api/v1/forms
Query Parameters
Pagination:
limit(number, default: 100, max: 250) - Maximum number of forms to returnoffset(number, default: 0) - Number of forms to skip for pagination
Filtering:
type(string) - Filter by form type:application- Application formssurvey- Survey formsanonymous- Anonymous surveysprogress-report- Progress report formsscorecard- Assessment scorecardssession-plan- Session planning forms
isArchived(boolean) - Filter by archive statusformFor(string) - Filter by who the form is for:MembersVolunteersPartners
Response
{
"forms": [
{
"formId": "form_abc123",
"name": "Client Intake Survey",
"type": "survey",
"managedBy": "org123",
"description": "Initial assessment survey for new clients",
"questionCount": 15,
"sections": [
{
"title": "Personal Information",
"description": "Basic contact details",
"id": "section_1"
},
{
"title": "Support Needs",
"description": "Understanding your requirements",
"id": "section_2"
}
],
"settings": {
"isArchived": false,
"isAnonymous": false,
"individualMode": true,
"requiresLogin": false,
"coverPage": true,
"afterSubmitMessage": "Thank you for completing this survey.",
"hideQuestionNumbers": false,
"calculateOverallScore": false,
"scoreDirection": "ascending"
},
"linkedFormId": null,
"assessmentFormId": null,
"allowMultipleApplications": false,
"deadline": "2025-03-31T23:59:59.000Z",
"schemaForm": false,
"formFor": "Members",
"addPersonPublic": false,
"created": "2025-01-01T10:00:00.000Z",
"updated": "2025-01-15T14:30:00.000Z"
}
],
"offset": 0,
"limit": 100,
"total": 25
}
Example Requests
List all forms:
curl -X GET "https://app.plinth.org.uk/api/v1/forms" \
-H "x-api-key: sk_your_api_key"
Filter by type:
curl -X GET "https://app.plinth.org.uk/api/v1/forms?type=survey" \
-H "x-api-key: sk_your_api_key"
Filter active forms for members:
curl -X GET "https://app.plinth.org.uk/api/v1/forms?isArchived=false&formFor=Members" \
-H "x-api-key: sk_your_api_key"
Get Single Form
Retrieve a specific form by ID, including full question details.
Endpoint
GET /api/v1/forms/:formId
Path Parameters
formId(string, required) - The unique identifier of the form
Response
{
"form": {
"formId": "form_abc123",
"name": "Client Intake Survey",
"type": "survey",
"managedBy": "org123",
"description": "Initial assessment survey for new clients",
"sections": [
{
"title": "Personal Information",
"description": "Basic contact details",
"id": "section_1"
},
{
"title": "Support Needs",
"description": "Understanding your requirements",
"id": "section_2"
}
],
"questions": [
{
"questionId": "q_001",
"title": "What is your full name?",
"type": "text",
"section": 0,
"required": true,
"order": 1,
"options": [],
"description": "",
"outcome": null,
"validation": {
"minAllowed": null,
"maxAllowed": null,
"wordCount": null
},
"hasConditions": false
},
{
"questionId": "q_002",
"title": "How did you hear about us?",
"type": "select",
"section": 0,
"required": true,
"order": 2,
"options": [
{ "label": "Word of mouth", "value": "word_of_mouth" },
{ "label": "Social media", "value": "social_media" },
{ "label": "Website", "value": "website" },
{ "label": "Referral", "value": "referral" },
{ "label": "Other", "value": "other" }
],
"description": "Select the option that best applies",
"outcome": null,
"validation": {},
"hasConditions": false
},
{
"questionId": "q_003",
"title": "Please describe your support needs",
"type": "textarea",
"section": 1,
"required": false,
"order": 3,
"options": [],
"description": "Tell us about what support you're looking for",
"outcome": "support_needs",
"validation": {
"wordCount": 500
},
"hasConditions": true
}
],
"settings": {
"isArchived": false,
"isAnonymous": false,
"individualMode": true,
"requiresLogin": false,
"coverPage": true,
"afterSubmitMessage": "Thank you for completing this survey.",
"hideQuestionNumbers": false,
"calculateOverallScore": false,
"scoreDirection": "ascending"
},
"created": "2025-01-01T10:00:00.000Z",
"updated": "2025-01-15T14:30:00.000Z"
}
}
Example Request
curl -X GET "https://app.plinth.org.uk/api/v1/forms/form_abc123" \
-H "x-api-key: sk_your_api_key"
Response Fields
Form Object (List)
| Field | Type | Description |
|---|---|---|
formId | string | Unique identifier for the form |
name | string | Form name/title |
type | string | Form type (application, survey, anonymous, progress-report, scorecard, session-plan) |
managedBy | string | Organisation ID that manages this form |
description | string | Form description |
questionCount | number | Total number of questions |
sections | array | Form sections |
settings | object | Form configuration settings |
linkedFormId | string/null | ID of linked form (if any) |
assessmentFormId | string/null | ID of assessment form (if any) |
allowMultipleApplications | boolean | Whether multiple submissions are allowed |
deadline | string/null | Submission deadline (ISO 8601) |
schemaForm | boolean | Whether this is a schema form |
formFor | string/null | Target audience (Members, Volunteers, Partners) |
addPersonPublic | boolean | Whether the form can add people publicly |
created | string | Creation timestamp (ISO 8601) |
updated | string | Last update timestamp (ISO 8601) |
Question Object
| Field | Type | Description |
|---|---|---|
questionId | string | Unique question identifier |
title | string | Question text |
type | string | Question type (see Question Types below) |
section | number | Section index (0-based) |
required | boolean | Whether the question is required |
order | number | Display order within section |
options | array | Available options for select/multiselect types |
description | string | Help text or description |
outcome | string/null | Associated outcome ID |
validation | object | Validation rules |
hasConditions | boolean | Whether the question has conditional display logic |
Question Types
Forms support the following question types:
Text Input Types
| Type | Description |
|---|---|
Text Input | Single-line text field for short answers |
Paragraph Text Input | Multi-line text area for longer responses |
number | Numeric input field |
Selection Types
| Type | Description |
|---|---|
Multiple Choice | Radio button selection (single choice) |
Dropdown | Basic dropdown select (single choice) |
Dropdown with custom input | Dropdown with an "Other" option allowing free text |
Dropdown: Multiple choice | Multi-select dropdown |
Checkbox | Multiple checkbox selections |
Likert Scale | Scale-based survey questions (e.g., 1-5, Strongly Agree to Strongly Disagree) |
Ranking | Drag-and-drop ranked list |
Specialised Input Types
| Type | Description |
|---|---|
Location | Location/address picker |
Country | Country selector dropdown |
Tag | Tag input for categorisation |
Relationship | Relationship mapping between entities |
Table | Tabular data entry with rows and columns |
Media & File Types
| Type | Description |
|---|---|
Upload Images | Image file upload |
Upload Document | Document file upload (PDF, Word, etc.) |
Upload Video | Video file upload |
Video Link | Video URL input (YouTube, Vimeo, etc.) |
Media Embed | Embedded media content |
Display Types (Non-Interactive)
| Type | Description |
|---|---|
Heading | Section heading/divider (no user input) |
Explainer Text | Explanatory text block (no user input) |
Note
Display types like Heading and Explainer Text appear in the questions array but don't collect responses. They're used for form structure and instructions.
Settings Object
| Field | Type | Description |
|---|---|---|
isArchived | boolean | Whether the form is archived |
isAnonymous | boolean | Whether responses are anonymous |
individualMode | boolean | Individual vs group mode |
requiresLogin | boolean | Whether login is required to submit |
coverPage | boolean | Whether to show a cover page |
afterSubmitMessage | string | Message shown after submission |
hideQuestionNumbers | boolean | Whether to hide question numbers |
calculateOverallScore | boolean | Whether to calculate an overall score |
scoreDirection | string | Score direction (ascending/descending) |
Error Responses
| Status | Description |
|---|---|
| 400 | Bad Request - Invalid parameters |
| 401 | Unauthorized - Invalid or missing API key |
| 404 | Not Found - Form not found |
| 500 | Internal Server Error |
