Responses
Responses, their uploaded files, summaries, CSV export, and links from a response to a record in another app.
| Method | Path | Summary |
|---|---|---|
| GET | /v1/app/forms/forms/:id/submissions | Paginated list |
| GET | /v1/app/forms/forms/:id/submissions/export | CSV export (register before the :subId route below so "export" isn't parsed as a submission id) |
| GET | /v1/app/forms/forms/:id/submissions/:subId | Full detail |
| DELETE | /v1/app/forms/forms/:id/submissions | Bulk delete, body: { ids: [1,2,3] } |
| DELETE | /v1/app/forms/forms/:id/submissions/:subId | Single delete |
| GET | /v1/app/forms/forms/:id/uploads/:uploadId | Auth-gated file-answer download |
| GET | /v1/app/forms/forms/:id/submissions/:subId/links | A response's links to other records |
| POST | /v1/app/forms/forms/:id/submissions/:subId/links | Link a response to a record in another app |
| DELETE | /v1/app/forms/forms/:id/submissions/:subId/links/:linkId | Remove a link |
| POST | /v1/app/forms/forms/links | Same as the nested create above, but keyed by submission_id alone (no form_id needed in the URL) |
| GET | /v1/app/forms/forms/links/for-target | The reverse lookup, called from BRM-Project/BRM-ToDo to show what submissions link to a given work package/task |
#Paginated list
/v1/app/forms/forms/:id/submissions- Address
https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/:id/submissions- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: Forms.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer |
Query parameters
| Name | Type | Description |
|---|---|---|
page | integer | |
pageSize | integer |
Response 200
| Field | Type | Description |
|---|---|---|
submissions | array of object | |
submissions[].id | integer | |
submissions[].tenant_id | integer | |
submissions[].form_id | integer | |
submissions[].respondent_user_id | integer, or null | |
submissions[].is_anonymous | boolean | |
submissions[].respondent_email | string, or null | |
submissions[].submitted_at | string (date-time) | |
submissions[].ip_address | string, or null | |
submissions[].user_agent | string, or null | |
total | integer | |
page | integer | |
pageSize | any |
Example response
{
"submissions": [
{
"id": 42,
"tenant_id": 1,
"form_id": 7,
"respondent_user_id": 7,
"is_anonymous": true,
"respondent_email": "alex@example.com",
"submitted_at": "2026-11-12T09:30:00.000Z",
"ip_address": "192.0.2.10",
"user_agent": "string"
}
],
"total": 3,
"page": 1,
"pageSize": null
}Errors
| Status | Message |
|---|---|
| 404 | Form not found |
Example request
curl -X GET 'https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/42/submissions' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/42/submissions', {
method: 'GET',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.get(
"https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/42/submissions",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method GET -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/42/submissions' -Headers $headers#CSV export (register before the :subId route below so "export" isn't parsed as a submission id)
/v1/app/forms/forms/:id/submissions/export- Address
https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/:id/submissions/export- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: Forms.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer |
Response
A body.
Errors
| Status | Message |
|---|---|
| 404 | Form not found |
Example request
curl -X GET 'https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/42/submissions/export' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/42/submissions/export', {
method: 'GET',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.get(
"https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/42/submissions/export",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method GET -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/42/submissions/export' -Headers $headers#Full detail
/v1/app/forms/forms/:id/submissions/:subId- Address
https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/:id/submissions/:subId- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: Forms.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer | |
subIdrequired | integer |
Response 200
| Field | Type | Description |
|---|---|---|
submission | any | |
answers | array of any | |
uploads | array of any |
Example response
{
"submission": null,
"answers": [],
"uploads": []
}Errors
| Status | Message |
|---|---|
| 404 | Form not found |
| 404 | Submission not found |
Example request
curl -X GET 'https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/42/submissions/1' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/42/submissions/1', {
method: 'GET',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.get(
"https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/42/submissions/1",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method GET -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/42/submissions/1' -Headers $headers#Bulk delete, body: { ids: [1,2,3] }
/v1/app/forms/forms/:id/submissionsBulk delete, body: { ids: [1,2,3] }. Registered before the single-:subId route below isn't necessary (different HTTP method/no path collision), but kept next to it for readability. Cascades to form_submission_answers/form_uploads/form_submission_links.
- Address
https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/:id/submissions- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: Forms.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer |
Request body JSON
| Name | Type | Description |
|---|---|---|
ids | array of any |
Response 200
| Field | Type | Description |
|---|---|---|
ok | boolean | |
deleted | integer |
Example response
{
"ok": true,
"deleted": 1
}Errors
| Status | Message |
|---|---|
| 400 | ids (array of submission ids) is required |
| 404 | Form not found |
Example request
curl -X DELETE 'https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/42/submissions' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/42/submissions', {
method: 'DELETE',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.delete(
"https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/42/submissions",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method DELETE -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/42/submissions' -Headers $headers#Single delete
/v1/app/forms/forms/:id/submissions/:subId- Address
https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/:id/submissions/:subId- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: Forms.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer | |
subIdrequired | integer |
Response 200
| Field | Type | Description |
|---|---|---|
ok | boolean |
Example response
{
"ok": true
}Errors
| Status | Message |
|---|---|
| 404 | Form not found |
| 404 | Submission not found |
Example request
curl -X DELETE 'https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/42/submissions/1' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/42/submissions/1', {
method: 'DELETE',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.delete(
"https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/42/submissions/1",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method DELETE -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/42/submissions/1' -Headers $headers#Auth-gated file-answer download
/v1/app/forms/forms/:id/uploads/:uploadId- Address
https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/:id/uploads/:uploadId- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: Forms.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer | |
uploadIdrequired | integer |
Errors
| Status | Message |
|---|---|
| 404 | Not found |
Example request
curl -X GET 'https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/42/uploads/1' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/42/uploads/1', {
method: 'GET',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.get(
"https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/42/uploads/1",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method GET -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/42/uploads/1' -Headers $headers#A response's links to other records
/v1/app/forms/forms/:id/submissions/:subId/links- Address
https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/:id/submissions/:subId/links- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: Forms.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer | |
subIdrequired | integer |
Response 200
| Field | Type | Description |
|---|---|---|
links | array of any |
Example response
{
"links": []
}Errors
| Status | Message |
|---|---|
| 404 | Form not found |
| 404 | Submission not found |
Example request
curl -X GET 'https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/42/submissions/1/links' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/42/submissions/1/links', {
method: 'GET',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.get(
"https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/42/submissions/1/links",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method GET -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/42/submissions/1/links' -Headers $headers#Link a response to a record in another app
/v1/app/forms/forms/:id/submissions/:subId/links- Address
https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/:id/submissions/:subId/links- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: Forms.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer | |
subIdrequired | integer |
Request body JSON
| Name | Type | Description |
|---|---|---|
target_app | string: "project" | "todo" | The app (e.g. psa). |
target_idrequired | number | The record's id there. |
note | string | A note. |
Response 201
| Field | Type | Description |
|---|---|---|
link | any |
Example response
{
"link": null
}Errors
| Status | Message |
|---|---|
| 400 | target_app must be 'project' or 'todo' |
| 400 | target_id is required |
| 404 | Form not found |
| 404 | Submission not found |
Example request
curl -X POST 'https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/42/submissions/1/links' \
-H "X-API-Key: $BRAMBLE_KEY" \
-H "Content-Type: application/json" \
-d '{"target_app":"project","target_id":12.5,"note":"string"}'const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/42/submissions/1/links', {
method: 'POST',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({"target_app":"project","target_id":12.5,"note":"string"}),
});
const data = await res.json();import os, requests
r = requests.post(
"https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/42/submissions/1/links",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
json={"target_app":"project","target_id":12.5,"note":"string"},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
$body = '{"target_app":"project","target_id":12.5,"note":"string"}'
Invoke-RestMethod -Method POST -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/42/submissions/1/links' -Headers $headers -ContentType 'application/json' -Body $body#Remove a link
/v1/app/forms/forms/:id/submissions/:subId/links/:linkId- Address
https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/:id/submissions/:subId/links/:linkId- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: Forms.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer | |
subIdrequired | integer | |
linkIdrequired | integer |
Response 200
| Field | Type | Description |
|---|---|---|
ok | boolean |
Example response
{
"ok": true
}Errors
| Status | Message |
|---|---|
| 404 | Form not found |
| 404 | Link not found |
Example request
curl -X DELETE 'https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/42/submissions/1/links/1' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/42/submissions/1/links/1', {
method: 'DELETE',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.delete(
"https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/42/submissions/1/links/1",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method DELETE -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/42/submissions/1/links/1' -Headers $headers#Same as the nested create above, but keyed by submission_id alone (no form_id needed in the URL)
/v1/app/forms/forms/linksSame as the nested create above, but keyed by submission_id alone (no form_id needed in the URL). BRM-Project/BRM-ToDo know their own target_id but not which form a submission came from, so they can't hit the nested route above — this is the one they call to create a link from their side.
- Address
https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/links- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: Forms.
Request body JSON
| Name | Type | Description |
|---|---|---|
submission_idrequired | number | |
target_app | string: "project" | "todo" | |
target_idrequired | number | |
note | string |
Response 201
| Field | Type | Description |
|---|---|---|
link | any |
Example response
{
"link": null
}Errors
| Status | Message |
|---|---|
| 400 | target_app must be 'project' or 'todo' |
| 400 | target_id is required |
| 400 | submission_id is required |
| 404 | Submission not found |
Example request
curl -X POST 'https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/links' \
-H "X-API-Key: $BRAMBLE_KEY" \
-H "Content-Type: application/json" \
-d '{"submission_id":12.5,"target_app":"project","target_id":12.5,"note":"string"}'const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/links', {
method: 'POST',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({"submission_id":12.5,"target_app":"project","target_id":12.5,"note":"string"}),
});
const data = await res.json();import os, requests
r = requests.post(
"https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/links",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
json={"submission_id":12.5,"target_app":"project","target_id":12.5,"note":"string"},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
$body = '{"submission_id":12.5,"target_app":"project","target_id":12.5,"note":"string"}'
Invoke-RestMethod -Method POST -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/links' -Headers $headers -ContentType 'application/json' -Body $body#The reverse lookup, called from BRM-Project/BRM-ToDo to show what submissions link to a given work package/task
/v1/app/forms/forms/links/for-targetThe reverse lookup, called from BRM-Project/BRM-ToDo to show what submissions link to a given work package/task. Not nested under /forms/:id since the caller doesn't know (or care) which form a submission came from.
- Address
https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/links/for-target- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Query parameters
| Name | Type | Description |
|---|---|---|
target_app | string: "project" | "todo" | |
target_idrequired | integer |
Response 200
| Field | Type | Description |
|---|---|---|
links | array of any |
Example response
{
"links": []
}Errors
| Status | Message |
|---|---|
| 400 | target_app ('project'|'todo') and target_id are required |
Example request
curl -X GET 'https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/links/for-target?target_id=7' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/links/for-target?target_id=7', {
method: 'GET',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.get(
"https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/links/for-target?target_id=7",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method GET -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/forms/forms/links/for-target?target_id=7' -Headers $headersWas this page helpful?
Thanks for your feedback.