Download OpenAPI specification:
Login request with user ID.
| uid required | string The user ID to login as. |
{- "uid": "3c5fa073-7b97-43a3-bc44-ddc98f390a08"
}{- "message": "Login successful"
}| oauthProvider required | string (Auth.OAuthLoginProviders) Enum: "GOOGLE" "NYCU" The OAuth2 provider to use for login. |
| c required | string The callback URL of the OAuth2 login. See details |
| r | string The redirect URL for login callback. |
| base | string Custom base URL for OAuth callback (only used in dev mode). |
{- "id": "3c5fa073-7b97-43a3-bc44-ddc98f390a08",
- "username": "john_doe",
- "name": "John Doe",
- "emails": [
- "john.doe@example.com",
- "john@gmail.com"
], - "roles": [
- "USER"
], - "require_onboarding": true
}Onboard the current user by updating their username and other details.
| username required | string The user's username, can change, but must be unique across the system. |
| name required | string [ 4 .. 15 ] characters ^\w+$ The user's nickname. |
{- "username": "jane_smith",
- "name": "Jane Smith"
}{- "id": "3c5fa073-7b97-43a3-bc44-ddc98f390a08",
- "username": "john_doe",
- "name": "John Doe",
- "emails": [
- "john.doe@example.com",
- "john@gmail.com"
], - "roles": [
- "USER"
], - "require_onboarding": true
}List all forms assigned to the current user with per-user progress. Returns an empty array when the user has no forms. Requires authentication.
[- {
- "id": "5a1b2c3d-4e5f-6789-0abc-def123456789",
- "title": "Annual Survey 2026",
- "deadline": "2026-03-31T23:59:59Z",
- "allowEditResponse": false,
- "status": "NOT_STARTED",
- "responseIds": [ ]
}, - {
- "id": "9a843aa0-8451-4e3b-b6a0-8c0e994e9040",
- "title": "SDC 2025 Recruitment Form",
- "deadline": "2025-03-31T23:59:59Z",
- "status": "IN_PROGRESS",
- "allowEditResponse": true,
- "responseIds": [
- "a12b3c4d-5e6f-7a8b-9c0d-e1f2a3b4c5d6"
]
}, - {
- "id": "7f6e5d4c-3b2a-1098-7654-321fedcba098",
- "title": "Member Information Update 2025",
- "deadline": "2025-02-15T23:59:59Z",
- "status": "COMPLETED",
- "allowEditResponse": true,
- "responseIds": [
- "b23c4d5e-6f7a-8b9c-0d1e-f2a3b4c5d6e7",
- "c34d5e6f-7a8b-9c0d-1e2f-a3b4c5d6e7f8"
]
}
][- {
- "id": "3c5fa073-7b97-43a3-bc44-ddc98f390a08",
- "name": "NYCU SDC",
- "description": "National Yang Ming Chiao Tung University Software Development Club",
- "metadata": {
- "type": "club",
- "founded": "2020"
}, - "createdAt": "2024-01-15T08:00:00Z",
- "updatedAt": "2024-12-20T10:30:00Z",
- "slug": "nycu-sdc"
}
]Create a new organization
| name required | string The name of the unit or organization |
| description required | string A brief description of the unit or organization |
required | object Metadata for the unit or organization, can include additional information like contact details, address, etc. |
| slug required | string |
{- "name": "NYCU SDC2",
- "description": "陽明交大軟體開發社",
- "slug": "nycu-sdc1",
- "metadata": {
- "type": "club"
}
}{- "id": "3c5fa073-7b97-43a3-bc44-ddc98f390a08",
- "name": "NYCU SDC",
- "description": "National Yang Ming Chiao Tung University Software Development Club",
- "metadata": {
- "type": "club",
- "founded": "2020"
}, - "createdAt": "2024-01-15T08:00:00Z",
- "updatedAt": "2024-12-20T10:30:00Z",
- "slug": "nycu-sdc"
}[- {
- "id": "3c5fa073-7b97-43a3-bc44-ddc98f390a08",
- "name": "NYCU SDC",
- "description": "National Yang Ming Chiao Tung University Software Development Club",
- "metadata": {
- "type": "club",
- "founded": "2020"
}, - "createdAt": "2024-01-15T08:00:00Z",
- "updatedAt": "2024-12-20T10:30:00Z",
- "slug": "nycu-sdc"
}
]Create a new parent-child relationship between units by linking them
| parentId | string <uuid> (uuid) |
| childId required | string <uuid> (uuid) |
| orgId required | string <uuid> (uuid) |
{- "parentId": "3c5fa073-7b97-43a3-bc44-ddc98f390a08",
- "childId": "d26e9c90-4747-496b-9953-7e7c4f97643f",
- "orgId": "3c5fa073-7b97-43a3-bc44-ddc98f390a08"
}{- "parentId": "3c5fa073-7b97-43a3-bc44-ddc98f390a08",
- "childId": "d26e9c90-4747-496b-9953-7e7c4f97643f",
- "orgId": "3c5fa073-7b97-43a3-bc44-ddc98f390a08"
}Get a specific organization by its unique identifier
| slug required | string |
{- "id": "3c5fa073-7b97-43a3-bc44-ddc98f390a08",
- "name": "NYCU SDC",
- "description": "National Yang Ming Chiao Tung University Software Development Club",
- "metadata": {
- "type": "club",
- "founded": "2020"
}, - "createdAt": "2024-01-15T08:00:00Z",
- "updatedAt": "2024-12-20T10:30:00Z",
- "slug": "nycu-sdc"
}Update an existing organization by its unique identifier
| slug required | string |
| name required | string The name of the unit or organization |
| description required | string A brief description of the unit or organization |
required | object Metadata for the unit or organization, can include additional information like contact details, address, etc. |
| slug required | string |
{- "name": "NYCU SDC 2025",
- "description": "Updated organization description",
- "slug": "nycu-sdc",
- "metadata": {
- "type": "club",
- "members": "150"
}
}{- "id": "3c5fa073-7b97-43a3-bc44-ddc98f390a08",
- "name": "NYCU SDC",
- "description": "National Yang Ming Chiao Tung University Software Development Club",
- "metadata": {
- "type": "club",
- "founded": "2020"
}, - "createdAt": "2024-01-15T08:00:00Z",
- "updatedAt": "2024-12-20T10:30:00Z",
- "slug": "nycu-sdc"
}Create a new form under an organization.
| slug required | string |
| title required | string The title of the form. |
object The form description as ProseMirror JSON, edited in Tiptap and sent by the admin interface. | |
| previewMessage | string (Optional) Preview text for the form. If not provided, fallback to first 25 characters of description. |
| deadline | string <date-time> (Optional) Deadline for form completion. |
| publishTime | string <date-time> When the form is available to be filled. |
| messageAfterSubmission | string The message to show after user's submission. |
object The dressing of the form. | |
| coverImage | string The image path returned by the upload API. |
| googleSheetUrl | string The google sheet url this form's responses will be sent to. |
| visibility required | string Enum: "PUBLIC" "PRIVATE" The visibility setting of the form. Public forms are visible to all logged-in users. Private forms require a direct link to access. |
| allowEditResponse required | boolean Whether the user can edit their responses to the form. This is true if the form is still open and the user has already started a response, allowing them to continue editing until the deadline. |
{- "title": "Enter SDC Form",
- "description": {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "If you want to join us, just fill in this form!"
}
]
}
]
}, - "messageAfterSubmission": "Thank you for your submission!",
- "visibility": "PUBLIC",
- "allowEditResponse": true
}{- "id": "9a843aa0-8451-4e3b-b6a0-8c0e994e9040",
- "title": "SDC 2025 Recruitment Form",
- "description": {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Join us for an exciting journey in "
}, - {
- "type": "text",
- "marks": [
- {
- "type": "bold"
}
], - "text": "software development"
}, - {
- "type": "text",
- "text": "!"
}
]
}
]
}, - "descriptionHtml": "<p>Join us for an exciting journey in <strong>software development</strong>!</p>",
- "previewMessage": "Join us for an exciting journey",
- "status": "PUBLISHED",
- "unitId": "d26e9c90-4747-496b-9953-7e7c4f97643f",
- "creator": {
- "id": "3c5fa073-7b97-43a3-bc44-ddc98f390a08",
- "name": "John Doe",
- "username": "john_doe",
- "emails": [
- "john.doe@example.com",
- "john@gmail.com"
]
}, - "lastEditor": {
- "id": "3c5fa073-7b97-43a3-bc44-ddc98f390a08",
- "name": "John Doe",
- "username": "john_doe",
- "emails": [
- "john.doe@example.com",
- "john@gmail.com"
]
}, - "deadline": "2025-03-31T23:59:59Z",
- "publishTime": "2025-02-01T00:00:00Z",
- "messageAfterSubmission": "Thank you for your application! We'll get back to you soon.",
- "dressing": {
- "color": "#0066cc",
- "headerFont": "LINESeedTW",
- "questionFont": "LINESeedTW",
- "textFont": "LINESeedTW"
}, - "visibility": "PUBLIC",
- "allowEditResponse": true,
- "createdAt": "2025-01-15T10:00:00Z",
- "updatedAt": "2025-02-10T14:30:00Z"
}List forms under a specific organization.
| slug required | string |
| status | Array of strings (Forms.FormStatus) Default: "DRAFT,PUBLISHED" Items Enum: "DRAFT" "PUBLISHED" "ARCHIVED" Filter forms by status. If omitted, [DRAFT, PUBLISHED] are returned. Providing any status will override this default. |
[- {
- "id": "9a843aa0-8451-4e3b-b6a0-8c0e994e9040",
- "title": "SDC 2025 Recruitment Form",
- "description": {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Join us for an exciting journey in "
}, - {
- "type": "text",
- "marks": [
- {
- "type": "bold"
}
], - "text": "software development"
}, - {
- "type": "text",
- "text": "!"
}
]
}
]
}, - "descriptionHtml": "<p>Join us for an exciting journey in <strong>software development</strong>!</p>",
- "previewMessage": "Join us for an exciting journey",
- "status": "PUBLISHED",
- "unitId": "d26e9c90-4747-496b-9953-7e7c4f97643f",
- "creator": {
- "id": "3c5fa073-7b97-43a3-bc44-ddc98f390a08",
- "name": "John Doe",
- "username": "john_doe",
- "emails": [
- "john.doe@example.com",
- "john@gmail.com"
]
}, - "lastEditor": {
- "id": "3c5fa073-7b97-43a3-bc44-ddc98f390a08",
- "name": "John Doe",
- "username": "john_doe",
- "emails": [
- "john.doe@example.com",
- "john@gmail.com"
]
}, - "deadline": "2025-03-31T23:59:59Z",
- "publishTime": "2025-02-01T00:00:00Z",
- "messageAfterSubmission": "Thank you for your application! We'll get back to you soon.",
- "dressing": {
- "color": "#0066cc",
- "headerFont": "LINESeedTW",
- "questionFont": "LINESeedTW",
- "textFont": "LINESeedTW"
}, - "visibility": "PUBLIC",
- "allowEditResponse": true,
- "createdAt": "2025-01-15T10:00:00Z",
- "updatedAt": "2025-02-10T14:30:00Z"
}
]Add a member to an organization
| slug required | string |
| email required | string |
{- "email": "123@gmail.com"
}{- "orgId": "3c5fa073-7b97-43a3-bc44-ddc98f390a08",
- "member": {
- "id": "d26e9c90-4747-496b-9953-7e7c4f97643f",
- "username": "alice_wang",
- "name": "Alice Wang",
- "emails": [
- "alice@example.com"
], - "roles": [
- "USER"
], - "require_onboarding": true
}
}List all members of an organization
| slug required | string |
[- {
- "id": "3c5fa073-7b97-43a3-bc44-ddc98f390a08",
- "username": "john_doe",
- "name": "John Doe",
- "emails": [
- "john.doe@example.com",
- "john@gmail.com"
], - "roles": [
- "USER"
], - "require_onboarding": true
}
]List all unit IDs, optionally filtered by parent organization ID
| slug required | string |
| parentId | string <uuid> (uuid) The parent unit ID used to filter subunits by their parent-child relationship |
[- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]List all units, optionally filtered by parent organization ID
| slug required | string |
| parentId | string <uuid> (uuid) The parent unit ID used to filter subunits by their parent-child relationship |
[- {
- "id": "d26e9c90-4747-496b-9953-7e7c4f97643f",
- "name": "Backend Team",
- "description": "Backend development team",
- "metadata": {
- "tech": "Go, Node.js"
}, - "createdAt": "2024-03-01T09:00:00Z",
- "updatedAt": "2024-11-15T14:20:00Z"
}
]Create a new unit
| slug required | string |
| name required | string The name of the unit or organization |
| description required | string A brief description of the unit or organization |
required | object Metadata for the unit or organization, can include additional information like contact details, address, etc. |
{- "name": "2025 Backend",
- "description": "Backend course",
- "metadata": {
- "year": "2025",
- "type": "education program"
}
}{- "id": "d26e9c90-4747-496b-9953-7e7c4f97643f",
- "name": "Backend Team",
- "description": "Backend development team",
- "metadata": {
- "tech": "Go, Node.js"
}, - "createdAt": "2024-03-01T09:00:00Z",
- "updatedAt": "2024-11-15T14:20:00Z"
}Get a specific unit with the slug of its organization by its unique identifier
| slug required | string |
| unitId required | string <uuid> (uuid) |
{- "id": "d26e9c90-4747-496b-9953-7e7c4f97643f",
- "name": "Backend Team",
- "description": "Backend development team",
- "metadata": {
- "tech": "Go, Node.js"
}, - "createdAt": "2024-03-01T09:00:00Z",
- "updatedAt": "2024-11-15T14:20:00Z"
}Update an existing unit or organization by its unique identifier
| slug required | string |
| unitId required | string <uuid> (uuid) |
| name required | string The name of the unit or organization |
| description required | string A brief description of the unit or organization |
required | object Metadata for the unit or organization, can include additional information like contact details, address, etc. |
{- "name": "Updated Backend Team",
- "description": "Backend and Infrastructure team",
- "metadata": {
- "tech": "Go, Node.js, Kubernetes"
}
}{- "id": "d26e9c90-4747-496b-9953-7e7c4f97643f",
- "name": "Backend Team",
- "description": "Backend development team",
- "metadata": {
- "tech": "Go, Node.js"
}, - "createdAt": "2024-03-01T09:00:00Z",
- "updatedAt": "2024-11-15T14:20:00Z"
}List all unit IDs, optionally filtered by parent unit ID
| slug required | string |
| unitId required | string <uuid> (uuid) |
| parentId | string <uuid> (uuid) The parent unit ID used to filter subunits by their parent-child relationship |
[- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]List all units, optionally filtered by parent unit ID
| slug required | string |
| unitId required | string <uuid> (uuid) |
| parentId | string <uuid> (uuid) The parent unit ID used to filter subunits by their parent-child relationship |
[- {
- "id": "d26e9c90-4747-496b-9953-7e7c4f97643f",
- "name": "Backend Team",
- "description": "Backend development team",
- "metadata": {
- "tech": "Go, Node.js"
}, - "createdAt": "2024-03-01T09:00:00Z",
- "updatedAt": "2024-11-15T14:20:00Z"
}
]List the complete usage history of a given slug
| slug required | string |
{- "current": {
- "available": false,
- "orgId": "3c5fa073-7b97-43a3-bc44-ddc98f390a08"
}, - "history": [
- {
- "orgId": "3c5fa073-7b97-43a3-bc44-ddc98f390a08",
- "orgName": "NYCU SDC",
- "startedAt": "2024-01-15T08:00:00Z",
- "endedAt": null
}
]
}[- {
- "id": "9a843aa0-8451-4e3b-b6a0-8c0e994e9040",
- "title": "SDC 2025 Recruitment Form",
- "description": {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Join us for an exciting journey in "
}, - {
- "type": "text",
- "marks": [
- {
- "type": "bold"
}
], - "text": "software development"
}, - {
- "type": "text",
- "text": "!"
}
]
}
]
}, - "descriptionHtml": "<p>Join us for an exciting journey in <strong>software development</strong>!</p>",
- "previewMessage": "Join us for an exciting journey",
- "status": "PUBLISHED",
- "unitId": "d26e9c90-4747-496b-9953-7e7c4f97643f",
- "creator": {
- "id": "3c5fa073-7b97-43a3-bc44-ddc98f390a08",
- "name": "John Doe",
- "username": "john_doe",
- "emails": [
- "john.doe@example.com",
- "john@gmail.com"
]
}, - "lastEditor": {
- "id": "3c5fa073-7b97-43a3-bc44-ddc98f390a08",
- "name": "John Doe",
- "username": "john_doe",
- "emails": [
- "john.doe@example.com",
- "john@gmail.com"
]
}, - "deadline": "2025-03-31T23:59:59Z",
- "publishTime": "2025-02-01T00:00:00Z",
- "messageAfterSubmission": "Thank you for your application! We'll get back to you soon.",
- "dressing": {
- "color": "#0066cc",
- "headerFont": "LINESeedTW",
- "questionFont": "LINESeedTW",
- "textFont": "LINESeedTW"
}, - "visibility": "PUBLIC",
- "allowEditResponse": true,
- "createdAt": "2025-01-15T10:00:00Z",
- "updatedAt": "2025-02-10T14:30:00Z"
}
]Verify the Google Sheet URL and whether the system can access it.
| googleSheetUrl required | string The Google Sheet URL provided by user. |
{
}{- "isValid": true
}Get a specific form by its unique identifier. Description fields are returned as ProseMirror JSON for admin editing, with rendered HTML available in descriptionHtml for frontend display.
| formId required | string <uuid> (uuid) |
{- "id": "9a843aa0-8451-4e3b-b6a0-8c0e994e9040",
- "title": "SDC 2025 Recruitment Form",
- "description": {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Join us for an exciting journey in "
}, - {
- "type": "text",
- "marks": [
- {
- "type": "bold"
}
], - "text": "software development"
}, - {
- "type": "text",
- "text": "!"
}
]
}
]
}, - "descriptionHtml": "<p>Join us for an exciting journey in <strong>software development</strong>!</p>",
- "previewMessage": "Join us for an exciting journey",
- "status": "PUBLISHED",
- "unitId": "d26e9c90-4747-496b-9953-7e7c4f97643f",
- "creator": {
- "id": "3c5fa073-7b97-43a3-bc44-ddc98f390a08",
- "name": "John Doe",
- "username": "john_doe",
- "emails": [
- "john.doe@example.com",
- "john@gmail.com"
]
}, - "lastEditor": {
- "id": "3c5fa073-7b97-43a3-bc44-ddc98f390a08",
- "name": "John Doe",
- "username": "john_doe",
- "emails": [
- "john.doe@example.com",
- "john@gmail.com"
]
}, - "deadline": "2025-03-31T23:59:59Z",
- "publishTime": "2025-02-01T00:00:00Z",
- "messageAfterSubmission": "Thank you for your application! We'll get back to you soon.",
- "dressing": {
- "color": "#0066cc",
- "headerFont": "LINESeedTW",
- "questionFont": "LINESeedTW",
- "textFont": "LINESeedTW"
}, - "visibility": "PUBLIC",
- "allowEditResponse": true,
- "createdAt": "2025-01-15T10:00:00Z",
- "updatedAt": "2025-02-10T14:30:00Z"
}Update an existing form by its unique identifier. Description fields in the request body should be sent as ProseMirror JSON from the Tiptap editor.
| formId required | string <uuid> (uuid) |
| title | string The title of the form. |
object The form description as ProseMirror JSON, edited in Tiptap and sent by the admin interface. | |
| previewMessage | string (Optional) Preview text for the form. If not provided, fallback to first 25 characters of description. |
| deadline | string <date-time> (Optional) Deadline for form completion. |
| publishTime | string <date-time> When the form is available to be filled. |
| messageAfterSubmission | string The message to show after user's submission. |
object The dressing of the form. | |
| coverImage | string The image path returned by the upload API. |
| googleSheetUrl | string The google sheet url this form's responses will be sent to. |
| visibility | string Enum: "PUBLIC" "PRIVATE" The visibility setting of the form. Public forms are visible to all logged-in users. Private forms require a direct link to access. |
| allowEditResponse | boolean Whether the user can edit their responses to the form. This is true if the form is still open and the user has already started a response, allowing them to continue editing until the deadline. |
{- "title": "Enter SDC Form",
- "description": {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "If you want to join us, just fill in this form!"
}
]
}
]
}, - "messageAfterSubmission": "Thank you for your submission!",
- "visibility": "PUBLIC",
- "allowEditResponse": true
}{- "id": "9a843aa0-8451-4e3b-b6a0-8c0e994e9040",
- "title": "SDC 2025 Recruitment Form",
- "description": {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Join us for an exciting journey in "
}, - {
- "type": "text",
- "marks": [
- {
- "type": "bold"
}
], - "text": "software development"
}, - {
- "type": "text",
- "text": "!"
}
]
}
]
}, - "descriptionHtml": "<p>Join us for an exciting journey in <strong>software development</strong>!</p>",
- "previewMessage": "Join us for an exciting journey",
- "status": "PUBLISHED",
- "unitId": "d26e9c90-4747-496b-9953-7e7c4f97643f",
- "creator": {
- "id": "3c5fa073-7b97-43a3-bc44-ddc98f390a08",
- "name": "John Doe",
- "username": "john_doe",
- "emails": [
- "john.doe@example.com",
- "john@gmail.com"
]
}, - "lastEditor": {
- "id": "3c5fa073-7b97-43a3-bc44-ddc98f390a08",
- "name": "John Doe",
- "username": "john_doe",
- "emails": [
- "john.doe@example.com",
- "john@gmail.com"
]
}, - "deadline": "2025-03-31T23:59:59Z",
- "publishTime": "2025-02-01T00:00:00Z",
- "messageAfterSubmission": "Thank you for your application! We'll get back to you soon.",
- "dressing": {
- "color": "#0066cc",
- "headerFont": "LINESeedTW",
- "questionFont": "LINESeedTW",
- "textFont": "LINESeedTW"
}, - "visibility": "PUBLIC",
- "allowEditResponse": true,
- "createdAt": "2025-01-15T10:00:00Z",
- "updatedAt": "2025-02-10T14:30:00Z"
}Archive a form. Set status to 'ARCHIVED'. Archived forms are hidden from default lists.
| formId required | string <uuid> (uuid) |
{- "id": "9a843aa0-8451-4e3b-b6a0-8c0e994e9040",
- "title": "SDC 2025 Recruitment Form",
- "description": {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Join us for an exciting journey in "
}, - {
- "type": "text",
- "marks": [
- {
- "type": "bold"
}
], - "text": "software development"
}, - {
- "type": "text",
- "text": "!"
}
]
}
]
}, - "descriptionHtml": "<p>Join us for an exciting journey in <strong>software development</strong>!</p>",
- "previewMessage": "Join us for an exciting journey",
- "status": "PUBLISHED",
- "unitId": "d26e9c90-4747-496b-9953-7e7c4f97643f",
- "creator": {
- "id": "3c5fa073-7b97-43a3-bc44-ddc98f390a08",
- "name": "John Doe",
- "username": "john_doe",
- "emails": [
- "john.doe@example.com",
- "john@gmail.com"
]
}, - "lastEditor": {
- "id": "3c5fa073-7b97-43a3-bc44-ddc98f390a08",
- "name": "John Doe",
- "username": "john_doe",
- "emails": [
- "john.doe@example.com",
- "john@gmail.com"
]
}, - "deadline": "2025-03-31T23:59:59Z",
- "publishTime": "2025-02-01T00:00:00Z",
- "messageAfterSubmission": "Thank you for your application! We'll get back to you soon.",
- "dressing": {
- "color": "#0066cc",
- "headerFont": "LINESeedTW",
- "questionFont": "LINESeedTW",
- "textFont": "LINESeedTW"
}, - "visibility": "PUBLIC",
- "allowEditResponse": true,
- "createdAt": "2025-01-15T10:00:00Z",
- "updatedAt": "2025-02-10T14:30:00Z"
}Upload a cover image for a form. The frontend should send images in WebP format with max-width/height: 1800px and quality 80%.
| formId required | string <uuid> (uuid) |
| coverImage required | string <binary> |
{
}Get the highlight question and its response statistics for a specific form. Returns 200 with questionId=null when no highlight is configured.
| formId required | string <uuid> (uuid) |
{- "questionId": "ee894524-4bd8-4a64-8fd2-a53b39ca94cd",
- "questionTitle": "你的年級是?",
- "displayTitle": "年級分佈統計",
- "choices": [
- {
- "choiceId": "f421cfc2-2b84-4da9-9629-011af609935a",
- "name": "大一",
- "count": 42
}, - {
- "choiceId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
- "name": "大二",
- "count": 30
}
]
}Set or update the highlight question for a specific form. Returns 400 if the question is not a choice-based type (singleChoice, multipleChoice, dropdown, detailedMultipleChoice).
| formId required | string <uuid> (uuid) |
| questionId required | string <uuid> The question ID to highlight. Must be a choice-based question (singleChoice, multipleChoice, dropdown, detailedMultipleChoice). |
string or null Custom display title for the highlight. If omitted or null, the backend falls back to the question's current title. |
{- "questionId": "ee894524-4bd8-4a64-8fd2-a53b39ca94cd",
- "displayTitle": "年級分佈統計"
}{- "questionId": "ee894524-4bd8-4a64-8fd2-a53b39ca94cd",
- "questionTitle": "你的年級是?",
- "displayTitle": "年級分佈統計",
- "choices": [
- {
- "choiceId": "f421cfc2-2b84-4da9-9629-011af609935a",
- "name": "大一",
- "count": 42
}, - {
- "choiceId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
- "name": "大二",
- "count": 30
}
]
}Partially update the configured highlight for a specific form. Currently supports updating displayTitle only. Send displayTitle: null to fall back to the question's current title.
| formId required | string <uuid> (uuid) |
string or null Custom display title for the highlight. Send null to fall back to the question's current title. |
{- "displayTitle": "Updated highlight title"
}{- "questionId": "ee894524-4bd8-4a64-8fd2-a53b39ca94cd",
- "questionTitle": "你的年級是?",
- "displayTitle": "年級分佈統計",
- "choices": [
- {
- "choiceId": "f421cfc2-2b84-4da9-9629-011af609935a",
- "name": "大一",
- "count": 42
}, - {
- "choiceId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
- "name": "大二",
- "count": 30
}
]
}List all the questions of the sections in the form. Descriptions are returned as ProseMirror JSON for admin editing, with rendered HTML available in descriptionHtml for frontend form display and preview.
| formId required | string <uuid> (uuid) |
[- {
- "section": {
- "id": "c34d5e6f-7a8b-9c0d-1e2f-3a4b5c6d7e8f",
- "formId": "9a843aa0-8451-4e3b-b6a0-8c0e994e9040",
- "title": "Empty Section",
- "progress": "",
- "description": {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [ ]
}
]
}, - "descriptionHtml": "<p></p>",
- "createdAt": "2025-01-20T10:00:00Z",
- "updatedAt": "2025-02-01T15:30:00Z"
}, - "questions": null
}
]Update an existing section by its unique identifier. Description fields in the request body should be sent as ProseMirror JSON from the Tiptap editor.
| formId required | string <uuid> (uuid) |
| sectionId required | string <uuid> (uuid) |
| title | string Section title (e.g., 'Group Info'). |
object The section description as ProseMirror JSON, edited in Tiptap and sent by the admin interface. |
{- "title": "Personal Information",
- "description": {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Please provide your "
}, - {
- "type": "text",
- "marks": [
- {
- "type": "bold"
}
], - "text": "basic information"
}
]
}
]
}
}{- "id": "b23f2668-c2dc-4213-88fe-eceedff46398",
- "formId": "9a843aa0-8451-4e3b-b6a0-8c0e994e9040",
- "title": "Personal Information",
- "description": {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Please provide your "
}, - {
- "type": "text",
- "marks": [
- {
- "type": "bold"
}
], - "text": "basic information"
}
]
}
]
}, - "descriptionHtml": "<p>Please provide your <strong>basic information</strong></p>",
- "questions": [ ]
}Unarchive a form. Set status to 'DRAFT'.
| formId required | string <uuid> (uuid) |
{- "id": "9a843aa0-8451-4e3b-b6a0-8c0e994e9040",
- "title": "SDC 2025 Recruitment Form",
- "description": {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Join us for an exciting journey in "
}, - {
- "type": "text",
- "marks": [
- {
- "type": "bold"
}
], - "text": "software development"
}, - {
- "type": "text",
- "text": "!"
}
]
}
]
}, - "descriptionHtml": "<p>Join us for an exciting journey in <strong>software development</strong>!</p>",
- "previewMessage": "Join us for an exciting journey",
- "status": "PUBLISHED",
- "unitId": "d26e9c90-4747-496b-9953-7e7c4f97643f",
- "creator": {
- "id": "3c5fa073-7b97-43a3-bc44-ddc98f390a08",
- "name": "John Doe",
- "username": "john_doe",
- "emails": [
- "john.doe@example.com",
- "john@gmail.com"
]
}, - "lastEditor": {
- "id": "3c5fa073-7b97-43a3-bc44-ddc98f390a08",
- "name": "John Doe",
- "username": "john_doe",
- "emails": [
- "john.doe@example.com",
- "john@gmail.com"
]
}, - "deadline": "2025-03-31T23:59:59Z",
- "publishTime": "2025-02-01T00:00:00Z",
- "messageAfterSubmission": "Thank you for your application! We'll get back to you soon.",
- "dressing": {
- "color": "#0066cc",
- "headerFont": "LINESeedTW",
- "questionFont": "LINESeedTW",
- "textFont": "LINESeedTW"
}, - "visibility": "PUBLIC",
- "allowEditResponse": true,
- "createdAt": "2025-01-15T10:00:00Z",
- "updatedAt": "2025-02-10T14:30:00Z"
}Get distinct answers of the question for filtering.
| formId required | string <uuid> (uuid) |
| viewId required | string <uuid> (uuid) |
| questionId required | string <uuid> (uuid) |
{- "viewId": "f81d4fae-7dec-11d0-a765-00a0c91e6bf6",
- "formId": "550e8400-e29b-41d4-a716-446655440000",
- "questionId": "74723192-bc11-412e-a576-928b76c8c9e0",
- "answers": [
- {
- "displayValue": "開發部",
- "matchValue": "abc-123-def",
- "selected": false
}, - {
- "displayValue": "品牌部",
- "matchValue": "ghi-456-jkl",
- "selected": false
}
]
}Create a new question for a specific section. Description fields in the request body should be sent as ProseMirror JSON from the Tiptap editor.
The order field specifies where to insert the question within the section. The value is clamped to the valid range [1, currentCount + 1]. If the question is inserted in the middle (i.e., not appended at the end), all existing questions at or after the specified position are shifted down by one to make room for the new question.
| sectionId required | string <uuid> (uuid) |
| required required | boolean Whether the question is required to answer or not. |
| type required | string Enum: "SHORT_TEXT" "LONG_TEXT" "SINGLE_CHOICE" "MULTIPLE_CHOICE" "DROPDOWN" "DETAILED_MULTIPLE_CHOICE" "DATE" "UPLOAD_FILE" "LINEAR_SCALE" "RATING" "RANKING" "OAUTH_CONNECT" "HYPERLINK" The type of the question. |
| title required | string What is the question. |
required | object The question description as ProseMirror JSON, edited in Tiptap and sent by the admin interface. |
| order required | integer <int32> The desired position of this question within the section (1-indexed). On create, clamped to |
Array of objects (Forms.ChoiceOption) Available choice options for single_choice, multiple_choice, dropdown, and ranking questions. | |
object Available options for linear scale and rating questions. | |
object Available options for file upload questions. | |
object Available options for date questions. | |
| oauthConnect | string Enum: "GOOGLE" "GITHUB" Available options for OAuth connect questions. |
| sourceId | string <uuid> If set, choices are dynamically generated from answers to this question. |
{- "required": true,
- "type": "DATE",
- "title": "Which year did you join?",
- "description": {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Select year and month only"
}
]
}
]
}, - "order": 14,
- "date": {
- "hasYear": true,
- "hasMonth": true,
- "hasDay": false
}
}{- "id": "ee894524-4bd8-4a64-8fd2-a53b39ca94cd",
- "sectionId": "b23f2668-c2dc-4213-88fe-eceedff46398",
- "required": true,
- "type": "SHORT_TEXT",
- "title": "What's your name?",
- "description": {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Please enter your "
}, - {
- "type": "text",
- "marks": [
- {
- "type": "bold"
}
], - "text": "full name"
}
]
}
]
}, - "descriptionHtml": "<p>Please enter your <strong>full name</strong></p>",
- "createdAt": "2025-01-20T10:00:00Z",
- "updatedAt": "2025-02-01T15:30:00Z"
}Update an existing question by its unique identifier. Description fields in the request body should be sent as ProseMirror JSON from the Tiptap editor.
If the order field differs from the question's current position, the question is moved to the new position (clamped to [1, totalCount]). All questions between the old and new positions are shifted accordingly to maintain a contiguous order sequence.
| sectionId required | string <uuid> (uuid) |
| questionId required | string <uuid> (uuid) |
| required required | boolean Whether the question is required to answer or not. |
| type required | string Enum: "SHORT_TEXT" "LONG_TEXT" "SINGLE_CHOICE" "MULTIPLE_CHOICE" "DROPDOWN" "DETAILED_MULTIPLE_CHOICE" "DATE" "UPLOAD_FILE" "LINEAR_SCALE" "RATING" "RANKING" "OAUTH_CONNECT" "HYPERLINK" The type of the question. |
| title required | string What is the question. |
required | object The question description as ProseMirror JSON, edited in Tiptap and sent by the admin interface. |
| order required | integer <int32> The desired position of this question within the section (1-indexed). On create, clamped to |
Array of objects (Forms.ChoiceOption) Available choice options for single_choice, multiple_choice, dropdown, and ranking questions. | |
object Available options for linear scale and rating questions. | |
object Available options for file upload questions. | |
object Available options for date questions. | |
| oauthConnect | string Enum: "GOOGLE" "GITHUB" Available options for OAuth connect questions. |
| sourceId | string <uuid> If set, choices are dynamically generated from answers to this question. |
{- "required": true,
- "type": "DATE",
- "title": "Which year did you join?",
- "description": {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Select year and month only"
}
]
}
]
}, - "order": 14,
- "date": {
- "hasYear": true,
- "hasMonth": true,
- "hasDay": false
}
}{- "id": "ee894524-4bd8-4a64-8fd2-a53b39ca94cd",
- "sectionId": "b23f2668-c2dc-4213-88fe-eceedff46398",
- "required": true,
- "type": "SHORT_TEXT",
- "title": "What's your name?",
- "description": {
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "Please enter your "
}, - {
- "type": "text",
- "marks": [
- {
- "type": "bold"
}
], - "text": "full name"
}
]
}
]
}, - "descriptionHtml": "<p>Please enter your <strong>full name</strong></p>",
- "createdAt": "2025-01-20T10:00:00Z",
- "updatedAt": "2025-02-01T15:30:00Z"
}Delete an existing question by its unique identifier.
After deletion, all remaining questions in the same section with a higher order value are shifted up by one to maintain a contiguous order sequence without gaps.
| sectionId required | string <uuid> (uuid) |
| questionId required | string <uuid> (uuid) |
Update workflow for a form
| formId required | string <uuid> (uuid) |
| id required | string <uuid> Unique identifier for the node. |
| label required | string The label for the node |
required | object Arbitrary frontend-specific configuration payload for this node, stored as JSON (e.g., layout, UI settings). |
object The condition rule for the node, only for condition nodes | |
| next | string <uuid> Next node id for sequential flow (for start and section nodes) |
| nextTrue | string <uuid> Next node id when condition is true (for condition nodes) |
| nextFalse | string <uuid> Next node id when condition is false (for condition nodes) |
[- {
- "id": "b23f2668-c2dc-4213-88fe-eceedff46398",
- "label": "Personal Information Section",
- "payload": {
- "x": 1,
- "y": 2
}, - "conditionRule": {
- "source": "NON_CHOICE",
- "question": "9a843aa0-8451-4e3b-b6a0-8c0e994e9040",
- "pattern": "^([6-9]|[1-9][0-9]+)$"
}, - "next": "c34g3779-d3ed-5c24-99gf-fdffegg57409",
- "nextTrue": "d45h4880-e4fe-6d35-00hg-gegffhh68510",
- "nextFalse": "e56i5991-f5gf-7e46-11ih-hfhggii79621"
}
][- {
- "id": "b23f2668-c2dc-4213-88fe-eceedff46398",
- "type": "SECTION",
- "label": "Personal Information",
- "payload": {
- "x": 1,
- "y": 2
}, - "conditionRule": {
- "source": "NON_CHOICE",
- "question": "9a843aa0-8451-4e3b-b6a0-8c0e994e9040",
- "pattern": "^([6-9]|[1-9][0-9]+)$"
}, - "next": "c34g3779-d3ed-5c24-99gf-fdffegg57409",
- "nextTrue": "d45h4880-e4fe-6d35-00hg-gegffhh68510",
- "nextFalse": "e56i5991-f5gf-7e46-11ih-hfhggii79621"
}
]Create a new node for a workflow
| formId required | string <uuid> (uuid) |
| type required | string Enum: "SECTION" "CONDITION" Type of the node |
required | object Payload for node layout/UI settings. |
{- "type": "SECTION",
- "payload": {
- "x": 1,
- "y": 2
}
}{- "id": "b23f2668-c2dc-4213-88fe-eceedff46398",
- "type": "START",
- "label": "開始表單"
}Download form responses in XLSX format.
| formId required | string <uuid> (uuid) |
| questionIds required | Array of strings <uuid> (uuid) [ items <uuid > ] The list of question IDs to include in the export. |
{- "questionIds": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}{- "title": "Not Found",
- "status": 404,
- "detail": "The requested resource was not found"
}Get a preview of the form responses based on selected question IDs.
| formId required | string <uuid> (uuid) |
| questionIds required | Array of strings <uuid> (uuid) [ items <uuid > ] The list of question IDs to include in the export. |
{- "questionIds": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}{- "headers": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string"
}
], - "rows": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "answers": { }
}
]
}Get all responses submitted by the currently logged-in user for a specific form.
| formId required | string <uuid> (uuid) |
{- "formId": "9a843aa0-8451-4e3b-b6a0-8c0e994e9040",
- "totalCount": 150,
- "draftCount": 30,
- "submittedCount": 120,
- "responses": [ ]
}Query and filter form responses based on a list of selected question answers.
| formId required | string <uuid> (uuid) |
required | Array of objects (Responses.ResponseQueryFilter) The List of questions selected. |
{- "filters": [
- {
- "questionId": "a1b2c3d4-1111-2222-3333-444455556666",
- "answers": [
- {
- "option": "abc-123-def"
}, - {
- "option": "ghi-456-jkl"
}
]
}
]
}{- "formId": "126460ed-49b2-4c69-849a-bd8904ec5d8f",
- "responses": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "answers": { }
}
]
}Get the preview answer by response ID.
| formId required | string <uuid> (uuid) |
| responseId required | string <uuid> (uuid) |
{- "id": "a12b3c4d-5e6f-7a8b-9c0d-e1f2a3b4c5d6",
- "formId": "9a843aa0-8451-4e3b-b6a0-8c0e994e9040",
- "progress": "DRAFT",
- "sections": [ ]
}Delete a response and all its associated data.
| formId required | string <uuid> (uuid) |
| responseId required | string <uuid> (uuid) |
{- "title": "Not Found",
- "status": 404,
- "detail": "The requested resource was not found"
}OAuth provider redirects here after the user authorizes (or denies) the connection.
The server exchanges the code for profile data, stores it as the answer for the question encoded in `state`, then redirects the user to `r`.
The redirect URL (`r`) will always receive the following query parameters:
| Parameter | Values | Description |
|-----------|--------|-------------|
| `status` | `success` \| `error` | Outcome of the OAuth flow. |
| `error` | OAuth error code (e.g. `access_denied`) | Only present when `status=error`. |
**Example redirects:**
- Success: `{r}?status=success`
- Failure: `{r}?status=error&error=access_denied`
| provider required | string (Auth.OAuthProviders) Enum: "GOOGLE" "GITHUB" |
| code | string Authorization code returned by the OAuth provider on success. |
| state | string Opaque state value created during initiation; encodes responseId, questionId, and redirect URL. |
| error | string Error code returned by the OAuth provider when the user denied authorization (e.g. |
{- "title": "Bad Request",
- "status": 400,
- "detail": "The request body contains invalid data"
}Update answers for the response.
| responseId required | string <uuid> (uuid) |
Array of Responses.StringAnswer (object) or Responses.StringArrayAnswer (object) or Responses.ScaleAnswer (object) or Responses.DateAnswer (object) The answers to be saved. Can contain a partial subset for drafts or the full set for submission. |
{- "answers": [
- {
- "questionId": "ee894524-4bd8-4a64-8fd2-a53b39ca94cd",
- "questionType": "SHORT_TEXT",
- "value": "John Doe"
}, - {
- "questionId": "2b2bc4f4-71c1-478b-9e36-516eac6b36c3",
- "questionType": "LINEAR_SCALE",
- "value": 4
}
]
}{- "answers": [
- {
- "createdAt": "2025-02-15T10:00:00Z",
- "updatedAt": "2025-02-17T16:45:00Z",
- "responseId": "a12b3c4d-5e6f-7a8b-9c0d-e1f2a3b4c5d6",
- "answer": {
- "questionId": "ee894524-4bd8-4a64-8fd2-a53b39ca94cd",
- "questionType": "SHORT_TEXT",
- "value": "John Doe"
}, - "displayValue": "John Doe"
}
]
}Cancel a submitted response and revert it to draft. Only submitted responses can be canceled.
| responseId required | string <uuid> (uuid) |
{- "title": "Bad Request",
- "status": 400,
- "detail": "The request body contains invalid data"
}Get a specific answer by question ID in the response.
| responseId required | string <uuid> (uuid) |
| questionId required | string <uuid> (uuid) |
{- "id": "a12b3c4d-5e6f-7a8b-9c0d-e1f2a3b4c5d6",
- "answer": {
- "createdAt": "2025-02-15T10:00:00Z",
- "updatedAt": "2025-02-17T16:45:00Z",
- "responseId": "a12b3c4d-5e6f-7a8b-9c0d-e1f2a3b4c5d6",
- "answer": {
- "questionId": "ee894524-4bd8-4a64-8fd2-a53b39ca94cd",
- "questionType": "SHORT_TEXT",
- "value": "John Doe"
}, - "displayValue": "John Doe"
}
}Upload files as answers for a specific question in the response. This operation automatically creates or updates the answer for this question with the uploaded file URLs. The limit for each question is 10 files, and each file must be less than 10MB.
| responseId required | string <uuid> (uuid) |
| questionId required | string <uuid> (uuid) |
| files required | Array of strings The file(s) being uploaded. |
{- "files": [
- {
- "fileId": "a12b3c4d-5e6f-7a8b-9c0d-e1f2a3b4c5d6",
- "originalFilename": "resume.pdf",
- "contentType": "application/pdf",
- "size": 204800
}
]
}Initiate OAuth flow for connecting an account to answer a question. This endpoint redirects (302) to the OAuth provider's authorization page. After authorization, the OAuth profile data (username, avatar_url) is stored as the answer and can be fetched via GET /responses/{responseId}/questions/{questionId}.
| responseId required | string <uuid> (uuid) The response ID to associate this OAuth answer with. |
| questionId required | string <uuid> (uuid) The question ID being answered. |
| r | string Optional redirect URL after OAuth completion. |
Submit all the answer in the form response.
| responseId required | string <uuid> (uuid) |
required | Array of Responses.StringAnswer (object) or Responses.StringArrayAnswer (object) or Responses.ScaleAnswer (object) or Responses.DateAnswer (object) The answers to be saved. Can contain a partial subset for drafts or the full set for submission. |
{- "answers": [
- {
- "questionId": "ee894524-4bd8-4a64-8fd2-a53b39ca94cd",
- "questionType": "SHORT_TEXT",
- "value": "John Doe"
}, - {
- "questionId": "2b2bc4f4-71c1-478b-9e36-516eac6b36c3",
- "questionType": "LINEAR_SCALE",
- "value": 4
}
]
}{- "title": "Not Found",
- "status": 404,
- "detail": "The requested resource was not found"
}Create a new view for a form with default settings. Conflict when the name is already in use.
| formId required | string <uuid> (uuid) |
{- "id": "f1a2b3c4-5d6e-7f8a-9b0c-1d2e3f4a5b6c",
- "title": "Core System",
- "locked": false,
- "order": 0,
- "createdAt": "2025-01-15T10:00:00Z",
- "updatedAt": "2025-02-10T14:30:00Z",
- "columns": [
- {
- "questionId": "f81d4fae-7dec-11d0-a765-00a0c91e6bf6",
- "questionTitle": "部門"
}, - {
- "questionId": "6ec0bd7f-11c0-43da-975e-2a8ad9ebae0b",
- "questionTitle": "姓名"
}
]
}List all views for a specific form.
| formId required | string <uuid> (uuid) |
[- {
- "id": "f1a2b3c4-5d6e-7f8a-9b0c-1d2e3f4a5b6c",
- "title": "Core System",
- "locked": false,
- "order": 0,
- "createdAt": "2025-01-15T10:00:00Z",
- "updatedAt": "2025-02-10T14:30:00Z",
- "columns": [
- {
- "questionId": "f81d4fae-7dec-11d0-a765-00a0c91e6bf6",
- "questionTitle": "部門"
}, - {
- "questionId": "6ec0bd7f-11c0-43da-975e-2a8ad9ebae0b",
- "questionTitle": "姓名"
}
]
}
]Get a specific view by its unique identifier.
| formId required | string <uuid> (uuid) |
| viewId required | string <uuid> (uuid) |
{- "id": "f1a2b3c4-5d6e-7f8a-9b0c-1d2e3f4a5b6c",
- "title": "Core System",
- "locked": false,
- "order": 0,
- "createdAt": "2025-01-15T10:00:00Z",
- "updatedAt": "2025-02-10T14:30:00Z",
- "columns": [
- {
- "questionId": "f81d4fae-7dec-11d0-a765-00a0c91e6bf6",
- "questionTitle": "部門"
}, - {
- "questionId": "6ec0bd7f-11c0-43da-975e-2a8ad9ebae0b",
- "questionTitle": "姓名"
}
]
}Partially update a view. Only the provided fields (name, order) will be updated. Can be used to rename, or update column visibility.
| formId required | string <uuid> (uuid) |
| viewId required | string <uuid> (uuid) |
| title | string The new display title of the view. |
| order | integer The new order of the current view among all views. |
{- "title": "React"
}{- "id": "f1a2b3c4-5d6e-7f8a-9b0c-1d2e3f4a5b6c",
- "title": "Core System",
- "locked": false,
- "order": 0,
- "createdAt": "2025-01-15T10:00:00Z",
- "updatedAt": "2025-02-10T14:30:00Z",
- "columns": [
- {
- "questionId": "f81d4fae-7dec-11d0-a765-00a0c91e6bf6",
- "questionTitle": "部門"
}, - {
- "questionId": "6ec0bd7f-11c0-43da-975e-2a8ad9ebae0b",
- "questionTitle": "姓名"
}
]
}Create a duplicate of an existing view. The new view's name defaults to the original name suffixed with '的副本'.
| formId required | string <uuid> (uuid) |
| viewId required | string <uuid> (uuid) |
{- "id": "f1a2b3c4-5d6e-7f8a-9b0c-1d2e3f4a5b6c",
- "title": "Core System",
- "locked": false,
- "order": 0,
- "createdAt": "2025-01-15T10:00:00Z",
- "updatedAt": "2025-02-10T14:30:00Z",
- "columns": [
- {
- "questionId": "f81d4fae-7dec-11d0-a765-00a0c91e6bf6",
- "questionTitle": "部門"
}, - {
- "questionId": "6ec0bd7f-11c0-43da-975e-2a8ad9ebae0b",
- "questionTitle": "姓名"
}
]
}Lock a view to prevent further modifications (delete).
| formId required | string <uuid> (uuid) |
| viewId required | string <uuid> (uuid) |
{- "id": "f1a2b3c4-5d6e-7f8a-9b0c-1d2e3f4a5b6c",
- "title": "Core System",
- "locked": false,
- "order": 0,
- "createdAt": "2025-01-15T10:00:00Z",
- "updatedAt": "2025-02-10T14:30:00Z",
- "columns": [
- {
- "questionId": "f81d4fae-7dec-11d0-a765-00a0c91e6bf6",
- "questionTitle": "部門"
}, - {
- "questionId": "6ec0bd7f-11c0-43da-975e-2a8ad9ebae0b",
- "questionTitle": "姓名"
}
]
}Unlock a view to allow modifications (delete).
| formId required | string <uuid> (uuid) |
| viewId required | string <uuid> (uuid) |
{- "id": "f1a2b3c4-5d6e-7f8a-9b0c-1d2e3f4a5b6c",
- "title": "Core System",
- "locked": false,
- "order": 0,
- "createdAt": "2025-01-15T10:00:00Z",
- "updatedAt": "2025-02-10T14:30:00Z",
- "columns": [
- {
- "questionId": "f81d4fae-7dec-11d0-a765-00a0c91e6bf6",
- "questionTitle": "部門"
}, - {
- "questionId": "6ec0bd7f-11c0-43da-975e-2a8ad9ebae0b",
- "questionTitle": "姓名"
}
]
}List all files with pagination. Requires authentication.
| limit | integer <int32> Maximum number of files to return. Defaults to 20. |
| offset | integer <int32> Number of files to skip. Defaults to 0. |
{- "files": [
- {
- "id": "a12b3c4d-5e6f-7a8b-9c0d-e1f2a3b4c5d6",
- "originalFilename": "resume.pdf",
- "contentType": "application/pdf",
- "size": 204800,
- "uploadedBy": "3c5fa073-7b97-43a3-bc44-ddc98f390a08",
- "createdAt": "2025-01-20T10:00:00Z"
}
], - "total": 1,
- "limit": 20,
- "offset": 0
}[- {
- "id": "a12b3c4d-5e6f-7a8b-9c0d-e1f2a3b4c5d6",
- "originalFilename": "resume.pdf",
- "contentType": "application/pdf",
- "size": 204800,
- "uploadedBy": "3c5fa073-7b97-43a3-bc44-ddc98f390a08",
- "createdAt": "2025-01-20T10:00:00Z"
}
]Download a file by its ID. Returns the raw file content with appropriate Content-Type and Content-Disposition headers.
| id required | string <uuid> (uuid) |
{- "title": "Not Found",
- "status": 404,
- "detail": "The requested resource was not found"
}{- "title": "Unauthorized",
- "status": 401,
- "detail": "Authentication credentials were missing or invalid"
}Get metadata of a file by its ID, without downloading the binary content.
| id required | string <uuid> (uuid) |
{- "id": "a12b3c4d-5e6f-7a8b-9c0d-e1f2a3b4c5d6",
- "originalFilename": "resume.pdf",
- "contentType": "application/pdf",
- "size": 204800,
- "uploadedBy": "3c5fa073-7b97-43a3-bc44-ddc98f390a08",
- "createdAt": "2025-01-20T10:00:00Z"
}