RawQuotes Public API
The public API of RawQuotes — customer feedback analysis that names nothing it can't back with quotes.
Every request authenticates with an API key created in the RawQuotes
app, sent as Authorization: Bearer rq_live_….
The public API of RawQuotes — customer feedback analysis that names nothing it can't back with quotes.
Every request authenticates with an API key created in the RawQuotes
app, sent as Authorization: Bearer rq_live_….
Integer numbers.
Integer numbers.
curl 'https://app.rawquotes.io/api/v1/projects?page=1&perPage=50' \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
"items": [
{
"code": "string",
"createdAt": "2026-11-02T17:57:05.612Z",
"id": "string",
"name": "string"
}
],
"page": 1,
"perPage": 1,
"total": 1
}One page of the projects the caller sees, oldest first - empty, not refused, when they see none.
curl 'https://app.rawquotes.io/api/v1/projects/{projectId}' \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
"code": "string",
"createdAt": "2026-11-02T17:57:05.612Z",
"id": "string",
"name": "string"
}The project.
The window to filter by started time - period[from], period[to], both, or neither for no filter.
the date-time notation as defined by RFC 3339, section 5.6, for example, 2017-07-21T17:32:28Z
the date-time notation as defined by RFC 3339, section 5.6, for example, 2017-07-21T17:32:28Z
Page size; a value above 100 is clamped to 100.
Integer numbers.
curl 'https://app.rawquotes.io/api/v1/responses?perPage=50&projectId=&page=1' \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
"items": [
{
"answers": [
{
"optionId": null,
"optionIds": [
"string"
],
"optionLabel": null,
"optionLabels": [
"string"
],
"prompt": "string",
"questionId": "string",
"rating": null,
"skipped": true,
"text": null,
"type": "single_choice"
}
],
"externalId": null,
"id": "string",
"status": "string",
"submittedAt": "2026-11-02T17:57:05.612Z",
"surveyId": "string",
"surveyVersion": 1,
"surveyVersionId": "string"
}
],
"page": 1,
"perPage": 1,
"total": 1
}One page of the account's responses, newest first, with every answer each respondent gave.
Page size; a value above 100 is clamped to 100.
Integer numbers.
curl 'https://app.rawquotes.io/api/v1/sources?perPage=50&projectId=&page=1' \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
"items": [
{
"createdAt": "2026-11-02T17:57:05.612Z",
"description": null,
"id": "string",
"kind": "survey",
"name": "string",
"projectId": "string",
"responseCount": 1
}
],
"page": 1,
"perPage": 1,
"total": 1
}One page of the project's sources of both kinds, newest first.
Optional UUID naming this request. A repeat after the first one succeeded is answered 409 and not executed; a key that is not a UUID is refused with 400 validation.failed. Kept for 48 hours.
curl https://app.rawquotes.io/api/v1/sources \
--request POST \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
--data '{
"description": null,
"name": "",
"projectId": ""
}'
{
"createdAt": "2026-11-02T17:57:05.612Z",
"description": null,
"id": "string",
"kind": "survey",
"name": "string",
"projectId": "string",
"responseCount": 1
}The general source, in the shape the list answers with.
Optional UUID naming this request. A repeat after the first one succeeded is answered 409 and not executed; a key that is not a UUID is refused with 400 validation.failed. Kept for 48 hours.
The general source is gone, and so are its items.
curl 'https://app.rawquotes.io/api/v1/sources/{id}' \
--request DELETE \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN'
The general source is gone, and so are its items.
Optional UUID naming this request. A repeat after the first one succeeded is answered 409 and not executed; a key that is not a UUID is refused with 400 validation.failed. Kept for 48 hours.
curl 'https://app.rawquotes.io/api/v1/sources/{id}' \
--request PUT \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
--data '{
"description": null,
"name": ""
}'
{
"createdAt": "2026-11-02T17:57:05.612Z",
"description": null,
"id": "string",
"kind": "survey",
"name": "string",
"projectId": "string",
"responseCount": 1
}The general source as it now stands.
Optional UUID naming this request. A repeat after the first one succeeded is answered 409 and not executed; a key that is not a UUID is refused with 400 validation.failed. Kept for 48 hours.
curl 'https://app.rawquotes.io/api/v1/sources/{sourceId}/items' \
--request POST \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
--data '{
"dryRun": false,
"items": [
{
"date": null,
"text": null
}
]
}'
{
"accepted": 1,
"ao": 1,
"aoThisMonth": {
"remaining": null,
"total": null
},
"countedWindowsToRecompute": [
{
"from": "2026-11-02",
"granularity": "month",
"items": 1,
"label": "string",
"to": "2026-11-02"
}
],
"currentPeriods": {
"ao": 1,
"items": 1
},
"dateRange": {
"from": null,
"to": null
},
"datesWithoutTimeZone": 1,
"dryRun": true,
"itemsAo": [
{
"ao": 1,
"index": 1
}
],
"itemsPerRequest": {
"limit": 1
},
"pastPeriods": {
"from": null,
"items": 1,
"to": null
},
"received": 1,
"rejected": [
{
"code": "item.text_empty",
"index": 1,
"message": "string",
"sample": "string"
}
],
"responsesThisMonth": {
"adding": 1,
"limit": null,
"used": 1
}
}Bad items are skipped and listed in rejected, the rest saved - or, under dryRun, the same preview with nothing saved, also past the monthly limit.
Page size; a value above 100 is clamped to 100.
Integer numbers.
curl 'https://app.rawquotes.io/api/v1/surveys?perPage=50&projectId=&page=1' \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
"items": [
{
"activeSince": "2026-11-02T17:57:05.612Z",
"id": "string",
"name": "string",
"projectId": "string",
"questionCount": 1,
"responseCount": 1,
"version": 1
}
],
"page": 1,
"perPage": 1,
"total": 1
}One page of the account's surveys, newest first.
Optional UUID naming this request. A repeat after the first one succeeded is answered 409 and not executed; a key that is not a UUID is refused with 400 validation.failed. Kept for 48 hours.
curl https://app.rawquotes.io/api/v1/surveys \
--request POST \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
--data '{
"allowMultipleResponses": false,
"appearance": {
"accentColor": "#4F46E5",
"backgroundColor": "#FFFFFF",
"borderRadius": 12,
"choiceSize": "default",
"choicesAlign": "center",
"colorScheme": "light",
"container": null,
"ctaLabel": null,
"fontFamily": null,
"icon": "clipboard",
"language": null,
"placement": {
"corner": "bottom_right",
"mode": "floating",
"offset": {
"x": 20,
"y": 20
}
},
"sectionTitle": null,
"textColor": "#111827",
"thankYouText": null
},
"name": "",
"projectId": "",
"questions": [
{
"countedForInsights": true,
"display": "scale",
"id": "",
"isRequired": true,
"options": [],
"prompt": "",
"ratingMax": null,
"ratingMin": null,
"shownIf": {
"optionId": null,
"questionId": "",
"ratingMax": null,
"ratingMin": null
},
"type": "single_choice"
}
]
}'
{
"activeSince": "2026-11-02T17:57:05.612Z",
"allowMultipleResponses": true,
"appearance": {
"accentColor": "string",
"backgroundColor": "string",
"borderRadius": 1,
"choiceSize": "string",
"choicesAlign": "string",
"colorScheme": "string",
"ctaLabel": null,
"fontFamily": null,
"icon": "string",
"language": null,
"placement": {
"corner": "string",
"mode": "string",
"offset": {
"x": 1,
"y": 1
}
},
"sectionTitle": null,
"textColor": "string",
"thankYouText": null
},
"embed": {
"floating": "string",
"inline": "string",
"loaderUrl": "string"
},
"id": "string",
"name": "string",
"projectId": "string",
"questions": [
{
"countedForInsights": true,
"display": "scale",
"id": "string",
"isRequired": true,
"options": [
{
"id": "string",
"label": "string"
}
],
"prompt": "string",
"ratingMax": null,
"ratingMin": null,
"shownIf": {
"optionId": null,
"questionId": "string",
"ratingMax": null,
"ratingMin": null
},
"type": "single_choice"
}
],
"version": 1,
"versionChangedAt": "2026-11-02T17:57:05.612Z"
}The survey, in the same shape GET /api/v1/surveys/{id} answers with. version is 1 and activeSince is the moment of this request.
Optional UUID naming this request. A repeat after the first one succeeded is answered 409 and not executed; a key that is not a UUID is refused with 400 validation.failed. Kept for 48 hours.
The survey is gone, and so are its responses, its answers and the insights counted from them.
curl 'https://app.rawquotes.io/api/v1/surveys/{id}' \
--request DELETE \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN'
The survey is gone, and so are its responses, its answers and the insights counted from them.
curl 'https://app.rawquotes.io/api/v1/surveys/{id}' \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
"activeSince": "2026-11-02T17:57:05.612Z",
"allowMultipleResponses": true,
"appearance": {
"accentColor": "string",
"backgroundColor": "string",
"borderRadius": 1,
"choiceSize": "string",
"choicesAlign": "string",
"colorScheme": "string",
"ctaLabel": null,
"fontFamily": null,
"icon": "string",
"language": null,
"placement": {
"corner": "string",
"mode": "string",
"offset": {
"x": 1,
"y": 1
}
},
"sectionTitle": null,
"textColor": "string",
"thankYouText": null
},
"embed": {
"floating": "string",
"inline": "string",
"loaderUrl": "string"
},
"id": "string",
"name": "string",
"projectId": "string",
"questions": [
{
"countedForInsights": true,
"display": "scale",
"id": "string",
"isRequired": true,
"options": [
{
"id": "string",
"label": "string"
}
],
"prompt": "string",
"ratingMax": null,
"ratingMin": null,
"shownIf": {
"optionId": null,
"questionId": "string",
"ratingMax": null,
"ratingMin": null
},
"type": "single_choice"
}
],
"version": 1,
"versionChangedAt": "2026-11-02T17:57:05.612Z"
}Without versionId: the version respondents are being served. With versionId: that version's own definition, which may be a retired one.
Optional UUID naming this request. A repeat after the first one succeeded is answered 409 and not executed; a key that is not a UUID is refused with 400 validation.failed. Kept for 48 hours.
curl 'https://app.rawquotes.io/api/v1/surveys/{id}' \
--request PUT \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
--data '{
"allowMultipleResponses": false,
"appearance": {
"accentColor": "#4F46E5",
"backgroundColor": "#FFFFFF",
"borderRadius": 12,
"choiceSize": "default",
"choicesAlign": "center",
"colorScheme": "light",
"container": null,
"ctaLabel": null,
"fontFamily": null,
"icon": "clipboard",
"language": null,
"placement": {
"corner": "bottom_right",
"mode": "floating",
"offset": {
"x": 20,
"y": 20
}
},
"sectionTitle": null,
"textColor": "#111827",
"thankYouText": null
},
"name": "",
"questions": [
{
"countedForInsights": true,
"display": "scale",
"id": "",
"isRequired": true,
"options": [],
"prompt": "",
"ratingMax": null,
"ratingMin": null,
"shownIf": {
"optionId": null,
"questionId": "",
"ratingMax": null,
"ratingMin": null
},
"type": "single_choice"
}
]
}'
{
"activeSince": "2026-11-02T17:57:05.612Z",
"allowMultipleResponses": true,
"appearance": {
"accentColor": "string",
"backgroundColor": "string",
"borderRadius": 1,
"choiceSize": "string",
"choicesAlign": "string",
"colorScheme": "string",
"ctaLabel": null,
"fontFamily": null,
"icon": "string",
"language": null,
"placement": {
"corner": "string",
"mode": "string",
"offset": {
"x": 1,
"y": 1
}
},
"sectionTitle": null,
"textColor": "string",
"thankYouText": null
},
"embed": {
"floating": "string",
"inline": "string",
"loaderUrl": "string"
},
"id": "string",
"name": "string",
"projectId": "string",
"questions": [
{
"countedForInsights": true,
"display": "scale",
"id": "string",
"isRequired": true,
"options": [
{
"id": "string",
"label": "string"
}
],
"prompt": "string",
"ratingMax": null,
"ratingMin": null,
"shownIf": {
"optionId": null,
"questionId": "string",
"ratingMax": null,
"ratingMin": null
},
"type": "single_choice"
}
],
"version": 1,
"versionChangedAt": "2026-11-02T17:57:05.612Z"
}The survey as it now stands, in the same shape GET /api/v1/surveys/{id} answers with.
Optional UUID naming this request. A repeat after the first one succeeded is answered 409 and not executed; a key that is not a UUID is refused with 400 validation.failed. Kept for 48 hours.
curl 'https://app.rawquotes.io/api/v1/surveys/{surveyId}/fills' \
--request POST \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
--data '{
"externalId": null
}'
{
"id": "string",
"link": "string",
"status": "string"
}A pending fill against the survey's current published version. link opens it; POST /surveys/{surveyId}/responses/{id} completes it.