API reference
Media
Media endpoints.
| Method | Path | Summary |
|---|---|---|
GET | /v1/account/asset-links | Links of one file, or on one service, option or special, with the files they name (the account’s and the caller’s locations’) |
POST | /v1/account/asset-links | Link a file to a service, an option, a service with an option, or a location in general: for every location, or one. A location may also hide or replace an account file there |
POST | /v1/account/asset-links/bulk | Link several files to one service, option, special or location in general, with the same checks as one at a time. Each file is linked on its own: one that cannot be is named with why, and the rest are linked |
PATCH | /v1/account/asset-links/{linkId} | Move a link earlier or later among the files shown for its target |
DELETE | /v1/account/asset-links/{linkId} | Remove a link: the file stops showing there (or, for a hide or a replacement, the account’s file shows again) |
GET | /v1/account/assets | The media library: files and tour links the caller can see, newest first, with the account’s storage use and media settings |
POST | /v1/account/assets | Add a file to the media library (multipart: a fields part with the asset’s details as JSON, then the file). Files larger than the upload limit use POST /assets/direct |
POST | /v1/account/assets/bulk/archive | Archive several assets, with the same checks as one at a time. Each is archived on its own: one that cannot be is named with why, and the rest are archived |
POST | /v1/account/assets/bulk/suggest | For files about to be added together: the location and the service or option each file name names, worked out from the names alone, for people to confirm |
POST | /v1/account/assets/direct | Start adding a large file: makes the asset and returns a one-time link to PUT the bytes to, then POST /assets/\{assetId\}/files/\{fileId\}/complete |
PUT | /v1/account/assets/settings | Whether location managers may add their own media and hide or replace the account’s |
POST | /v1/account/assets/tour | Add a virtual tour link to the media library |
GET | /v1/account/assets/{assetId} | One asset: its details, its files (current and replaced), and where it is used |
PATCH | /v1/account/assets/{assetId} | Change an asset’s title, alt text, caption, tags, tour link or floor plan details |
DELETE | /v1/account/assets/{assetId} | Delete an asset and every file it has had, for good. Refused while a saved setting still shows it |
POST | /v1/account/assets/{assetId}/archive | Archive an asset: it is no longer offered anywhere. Refused while a saved setting still shows it |
DELETE | /v1/account/assets/{assetId}/files/{fileId} | Give up a large replacement that was never finished (its upload failed): the room it held goes back at once |
POST | /v1/account/assets/{assetId}/files/{fileId}/complete | Finish a direct upload: checks the stored file’s size and type, then makes it the asset’s file (a new asset’s, or a replacement) |
POST | /v1/account/assets/{assetId}/files/{fileId}/restore | Undo a replace: make one of the asset’s earlier files its current one again. The file it replaces is kept in turn |
POST | /v1/account/assets/{assetId}/knowledge | Let a brochure or document answer callers’ questions, or stop it: its text is read into a knowledge document at its owner’s level, and kept up to date when the file is replaced |
POST | /v1/account/assets/{assetId}/replace | Replace an asset’s file (multipart: file). Its link stays the same, so everything that shows it shows the new file. The old file is kept and can be restored |
POST | /v1/account/assets/{assetId}/replace/direct | Start replacing an asset’s file with a large one: returns a one-time link to PUT the bytes to, then POST /assets/\{assetId\}/files/\{fileId\}/complete. The new file must be the same type |
POST | /v1/account/assets/{assetId}/unarchive | Bring an archived asset back |
GET | /v1/account/groups/{groupId}/media | What one location shows: for the location in general and each service and option it offers, its files in order, with inherited, hidden and replaced account files marked |
GET | /v1/account/media-matrix | Every location the caller can see against the location in general, each service and each option: how many files each shows, by kind, and where something is missing |
Links of one file, or on one service, option or special, with the files they name (the account’s and the caller’s locations’)#
GET /v1/account/asset-links
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
assetId | string (ast_… ID) | No | ID (ast_…) |
serviceId | string (srv_… ID) | No | ID (srv_…) |
optionId | string (sopt_… ID) | No | ID (sopt_…) |
specialId | string (spcl_… ID) | No | ID (spcl_…) |
owner | enum | string (grp_… ID) | No | — |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
assets | array<Asset> | Yes | — |
assets[].altText | string | Yes | — |
assets[].archivedAt | string (date-time) | null | Yes | — |
assets[].canEdit | boolean | Yes | — |
assets[].caption | string | Yes | — |
assets[].contentType | string | null | Yes | — |
assets[].createdAt | string (date-time) | Yes | — |
assets[].floorPlan | object | null | Yes | — |
assets[].floorPlan.bathrooms | number | No | Between 0 and 10. |
assets[].floorPlan.bedrooms | integer | No | Between 0 and 10. |
assets[].floorPlan.layoutName | string | No | 1–60 characters. |
assets[].floorPlan.squareFeet | integer | object | No | — |
assets[].floorPlan.squareFeet.max | integer | Yes | (variant 2) Between 50 and 20000. |
assets[].floorPlan.squareFeet.min | integer | Yes | (variant 2) Between 50 and 20000. |
assets[].groupId | string | null | Yes | — |
assets[].groupName | string | null | Yes | — |
assets[].height | integer | null | Yes | — |
assets[].id | string | Yes | — |
assets[].kind | enum | Yes | One of: "photo", "floor_plan", "brochure", "video", "tour", "document", "logo", "captions". |
assets[].pageCount | integer | null | Yes | — |
assets[].previewUrl | string | null | Yes | — |
assets[].sizeBytes | integer | Yes | — |
assets[].status | enum | Yes | One of: "uploading", "ready", "failed". |
assets[].tags | array<string> | Yes | — |
assets[].thumbUrl | string | null | Yes | — |
assets[].title | string | Yes | — |
assets[].tourUrl | string | null | Yes | — |
assets[].updatedAt | string (date-time) | Yes | — |
assets[].url | string | null | Yes | — |
assets[].width | integer | null | Yes | — |
links | array<AssetLink> | Yes | — |
links[].assetId | string | Yes | — |
links[].effect | enum | Yes | One of: "show", "hide". |
links[].groupId | string | null | Yes | — |
links[].groupName | string | null | Yes | — |
links[].id | string | Yes | — |
links[].optionId | string | null | Yes | — |
links[].replacesAssetId | string | null | Yes | — |
links[].serviceId | string | null | Yes | — |
links[].sort | integer | Yes | — |
links[].specialId | string | null | Yes | — |
links[].targetKind | enum | Yes | One of: "location", "service", "option", "service_option", "special". |
links[].targetLabel | string | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/account/asset-links" \
-H "Authorization: Bearer $ACCESS_TOKEN"Link a file to a service, an option, a service with an option, or a location in general: for every location, or one. A location may also hide or replace an account file there#
POST /v1/account/asset-links
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
assetId | string (ast_… ID) | Yes | ID (ast_…) |
effect | enum | No | One of: "show", "hide". Default: "show". |
groupId | string (grp_… ID) | null | Yes | — |
replacesAssetId | string (ast_… ID) | null | No | — |
target | object | Yes | — |
target.kind | enum | Yes | One of: "location", "service", "option", "service_option", "special". |
target.optionId | string | null | No | Default: null. |
target.serviceId | string | null | No | Default: null. |
target.specialId | string | null | No | Default: null. |
Response 201
| Field | Type | Required | Description |
|---|---|---|---|
assetId | string | Yes | — |
effect | enum | Yes | One of: "show", "hide". |
groupId | string | null | Yes | — |
groupName | string | null | Yes | — |
id | string | Yes | — |
optionId | string | null | Yes | — |
replacesAssetId | string | null | Yes | — |
serviceId | string | null | Yes | — |
sort | integer | Yes | — |
specialId | string | null | Yes | — |
targetKind | enum | Yes | One of: "location", "service", "option", "service_option", "special". |
targetLabel | string | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/account/asset-links" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"assetId": "ast_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE",
"groupId": "grp_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE",
"target": {
"kind": "location"
}
}'Link several files to one service, option, special or location in general, with the same checks as one at a time. Each file is linked on its own: one that cannot be is named with why, and the rest are linked#
POST /v1/account/asset-links/bulk
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
assetIds | array<string (ast_… ID)> | Yes | Up to 100 items. |
groupId | string (grp_… ID) | null | Yes | — |
target | object | Yes | — |
target.kind | enum | Yes | One of: "location", "service", "option", "service_option", "special". |
target.optionId | string | null | No | Default: null. |
target.serviceId | string | null | No | Default: null. |
target.specialId | string | null | No | Default: null. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
created | array<AssetLink> | Yes | — |
created[].assetId | string | Yes | — |
created[].effect | enum | Yes | One of: "show", "hide". |
created[].groupId | string | null | Yes | — |
created[].groupName | string | null | Yes | — |
created[].id | string | Yes | — |
created[].optionId | string | null | Yes | — |
created[].replacesAssetId | string | null | Yes | — |
created[].serviceId | string | null | Yes | — |
created[].sort | integer | Yes | — |
created[].specialId | string | null | Yes | — |
created[].targetKind | enum | Yes | One of: "location", "service", "option", "service_option", "special". |
created[].targetLabel | string | Yes | — |
failed | array<object> | Yes | — |
failed[].assetId | string | Yes | — |
failed[].message | string | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/account/asset-links/bulk" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"assetIds": [
"ast_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE"
],
"groupId": "grp_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE",
"target": {
"kind": "location"
}
}'Move a link earlier or later among the files shown for its target#
PATCH /v1/account/asset-links/{linkId}
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
linkId | string (asl_… ID) | Yes | ID (asl_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
sort | integer | Yes | Between 0 and 10000. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
assetId | string | Yes | — |
effect | enum | Yes | One of: "show", "hide". |
groupId | string | null | Yes | — |
groupName | string | null | Yes | — |
id | string | Yes | — |
optionId | string | null | Yes | — |
replacesAssetId | string | null | Yes | — |
serviceId | string | null | Yes | — |
sort | integer | Yes | — |
specialId | string | null | Yes | — |
targetKind | enum | Yes | One of: "location", "service", "option", "service_option", "special". |
targetLabel | string | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X PATCH "$ANSWERSTACK_API_URL/v1/account/asset-links/{linkId}" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"sort": 0
}'Remove a link: the file stops showing there (or, for a hide or a replacement, the account’s file shows again)#
DELETE /v1/account/asset-links/{linkId}
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
linkId | string (asl_… ID) | Yes | ID (asl_…) |
Response 204
No content.
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X DELETE "$ANSWERSTACK_API_URL/v1/account/asset-links/{linkId}" \
-H "Authorization: Bearer $ACCESS_TOKEN"The media library: files and tour links the caller can see, newest first, with the account’s storage use and media settings#
GET /v1/account/assets
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
kind | enum | No | One of: "photo", "floor_plan", "brochure", "video", "tour", "document", "logo", "captions". |
kinds | string | No | Up to 200 characters. |
owner | enum | string (grp_… ID) | No | — |
archived | enum | No | One of: "true", "false". |
missingAlt | enum | No | One of: "true", "false". |
unlinked | enum | No | One of: "true", "false". |
q | string | No | Up to 120 characters. |
before | string (ast_… ID) | No | ID (ast_…) |
limit | integer | No | Between 1 and 200. Default: 60. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
assets | array<Asset> | Yes | — |
assets[].altText | string | Yes | — |
assets[].archivedAt | string (date-time) | null | Yes | — |
assets[].canEdit | boolean | Yes | — |
assets[].caption | string | Yes | — |
assets[].contentType | string | null | Yes | — |
assets[].createdAt | string (date-time) | Yes | — |
assets[].floorPlan | object | null | Yes | — |
assets[].floorPlan.bathrooms | number | No | Between 0 and 10. |
assets[].floorPlan.bedrooms | integer | No | Between 0 and 10. |
assets[].floorPlan.layoutName | string | No | 1–60 characters. |
assets[].floorPlan.squareFeet | integer | object | No | — |
assets[].floorPlan.squareFeet.max | integer | Yes | (variant 2) Between 50 and 20000. |
assets[].floorPlan.squareFeet.min | integer | Yes | (variant 2) Between 50 and 20000. |
assets[].groupId | string | null | Yes | — |
assets[].groupName | string | null | Yes | — |
assets[].height | integer | null | Yes | — |
assets[].id | string | Yes | — |
assets[].kind | enum | Yes | One of: "photo", "floor_plan", "brochure", "video", "tour", "document", "logo", "captions". |
assets[].pageCount | integer | null | Yes | — |
assets[].previewUrl | string | null | Yes | — |
assets[].sizeBytes | integer | Yes | — |
assets[].status | enum | Yes | One of: "uploading", "ready", "failed". |
assets[].tags | array<string> | Yes | — |
assets[].thumbUrl | string | null | Yes | — |
assets[].title | string | Yes | — |
assets[].tourUrl | string | null | Yes | — |
assets[].updatedAt | string (date-time) | Yes | — |
assets[].url | string | null | Yes | — |
assets[].width | integer | null | Yes | — |
canChangeSettings | boolean | Yes | — |
canManageAccount | boolean | Yes | — |
groups | array<object> | Yes | — |
groups[].canEdit | boolean | Yes | — |
groups[].id | string | Yes | — |
groups[].name | string | Yes | — |
nextCursor | string | null | Yes | — |
settings | object | Yes | — |
settings.locationsMayAddMedia | boolean | Yes | Default: true. |
storage | MediaStorage | Yes | — |
storage.limitBytes | number | Yes | — |
storage.usedBytes | number | Yes | — |
storage.warn | boolean | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/account/assets" \
-H "Authorization: Bearer $ACCESS_TOKEN"Add a file to the media library (multipart: a fields part with the asset’s details as JSON, then the file). Files larger than the upload limit use POST /assets/direct#
POST /v1/account/assets
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Response 201
| Field | Type | Required | Description |
|---|---|---|---|
altText | string | Yes | — |
archivedAt | string (date-time) | null | Yes | — |
canEdit | boolean | Yes | — |
canManageKnowledge | boolean | Yes | — |
caption | string | Yes | — |
contentType | string | null | Yes | — |
createdAt | string (date-time) | Yes | — |
files | array<AssetFile> | Yes | — |
files[].contentType | string | Yes | — |
files[].createdAt | string (date-time) | Yes | — |
files[].current | boolean | Yes | — |
files[].id | string | Yes | — |
files[].sizeBytes | integer | Yes | — |
files[].status | enum | Yes | One of: "pending", "ready", "failed". |
files[].supersededAt | string (date-time) | null | Yes | — |
files[].url | string | null | Yes | — |
floorPlan | object | null | Yes | — |
floorPlan.bathrooms | number | No | Between 0 and 10. |
floorPlan.bedrooms | integer | No | Between 0 and 10. |
floorPlan.layoutName | string | No | 1–60 characters. |
floorPlan.squareFeet | integer | object | No | — |
floorPlan.squareFeet.max | integer | Yes | (variant 2) Between 50 and 20000. |
floorPlan.squareFeet.min | integer | Yes | (variant 2) Between 50 and 20000. |
groupId | string | null | Yes | — |
groupName | string | null | Yes | — |
height | integer | null | Yes | — |
id | string | Yes | — |
kind | enum | Yes | One of: "photo", "floor_plan", "brochure", "video", "tour", "document", "logo", "captions". |
knowledge | object | null | Yes | — |
knowledge.docId | string | Yes | — |
knowledge.error | string | null | Yes | — |
knowledge.status | enum | Yes | One of: "pending", "processing", "ready", "failed". |
links | array<AssetLink> | Yes | — |
links[].assetId | string | Yes | — |
links[].effect | enum | Yes | One of: "show", "hide". |
links[].groupId | string | null | Yes | — |
links[].groupName | string | null | Yes | — |
links[].id | string | Yes | — |
links[].optionId | string | null | Yes | — |
links[].replacesAssetId | string | null | Yes | — |
links[].serviceId | string | null | Yes | — |
links[].sort | integer | Yes | — |
links[].specialId | string | null | Yes | — |
links[].targetKind | enum | Yes | One of: "location", "service", "option", "service_option", "special". |
links[].targetLabel | string | Yes | — |
pageCount | integer | null | Yes | — |
previewUrl | string | null | Yes | — |
sizeBytes | integer | Yes | — |
status | enum | Yes | One of: "uploading", "ready", "failed". |
tags | array<string> | Yes | — |
thumbUrl | string | null | Yes | — |
title | string | Yes | — |
tourUrl | string | null | Yes | — |
updatedAt | string (date-time) | Yes | — |
url | string | null | Yes | — |
uses | array<AssetUse> | Yes | — |
uses[].id | string | Yes | — |
uses[].kind | enum | Yes | One of: "playbook", "location", "brand", "booking_page". |
uses[].name | string | Yes | — |
width | integer | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 413, 415, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/account/assets" \
-H "Authorization: Bearer $ACCESS_TOKEN"Archive several assets, with the same checks as one at a time. Each is archived on its own: one that cannot be is named with why, and the rest are archived#
POST /v1/account/assets/bulk/archive
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
assetIds | array<string (ast_… ID)> | Yes | Up to 100 items. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
archived | array<string> | Yes | — |
failed | array<object> | Yes | — |
failed[].assetId | string | Yes | — |
failed[].message | string | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/account/assets/bulk/archive" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"assetIds": [
"ast_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE"
]
}'For files about to be added together: the location and the service or option each file name names, worked out from the names alone, for people to confirm#
POST /v1/account/assets/bulk/suggest
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
names | array<string> | Yes | Up to 200 items. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
suggestions | array<object> | Yes | — |
suggestions[].groupId | string | null | Yes | — |
suggestions[].name | string | Yes | — |
suggestions[].target | object | object | object | null | Yes | — |
suggestions[].target.kind | constant | Yes | (variant 1) Always "service". |
suggestions[].target.serviceId | string | Yes | (variant 1) |
suggestions[].target.kind | constant | Yes | (variant 2) Always "option". |
suggestions[].target.optionId | string | Yes | (variant 2) |
suggestions[].target.kind | constant | Yes | (variant 3) Always "service_option". |
suggestions[].target.optionId | string | Yes | (variant 3) |
suggestions[].target.serviceId | string | Yes | (variant 3) |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/account/assets/bulk/suggest" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"names": [
"string"
]
}'Start adding a large file: makes the asset and returns a one-time link to PUT the bytes to, then POST /assets/\{assetId\}/files/\{fileId\}/complete#
POST /v1/account/assets/direct
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
fields | object | Yes | — |
fields.altText | string | No | Up to 300 characters. Default: "". |
fields.caption | string | No | Up to 200 characters. Default: "". |
fields.floorPlan | object | No | — |
fields.floorPlan.bathrooms | number | No | Between 0 and 10. |
fields.floorPlan.bedrooms | integer | No | Between 0 and 10. |
fields.floorPlan.layoutName | string | No | 1–60 characters. |
fields.floorPlan.squareFeet | integer | object | No | — |
fields.floorPlan.squareFeet.max | integer | Yes | (variant 2) Between 50 and 20000. |
fields.floorPlan.squareFeet.min | integer | Yes | (variant 2) Between 50 and 20000. |
fields.groupId | string | null | No | Default: null. |
fields.kind | enum | Yes | One of: "photo", "floor_plan", "brochure", "video", "tour", "document", "logo", "captions". |
fields.tags | array<string> | No | Up to 20 items. Default: []. |
fields.title | string | Yes | 1–120 characters. |
fields.tourUrl | string (uri) | No | A https:// link Up to 2000 characters. |
file | object | Yes | — |
file.name | string | Yes | 1–255 characters. |
file.size | integer | Yes | Minimum 1. |
file.type | string | Yes | 1–100 characters. |
Response 201
| Field | Type | Required | Description |
|---|---|---|---|
asset | Asset | Yes | — |
asset.altText | string | Yes | — |
asset.archivedAt | string (date-time) | null | Yes | — |
asset.canEdit | boolean | Yes | — |
asset.caption | string | Yes | — |
asset.contentType | string | null | Yes | — |
asset.createdAt | string (date-time) | Yes | — |
asset.floorPlan | object | null | Yes | — |
asset.floorPlan.bathrooms | number | No | Between 0 and 10. |
asset.floorPlan.bedrooms | integer | No | Between 0 and 10. |
asset.floorPlan.layoutName | string | No | 1–60 characters. |
asset.floorPlan.squareFeet | integer | object | No | — |
asset.floorPlan.squareFeet.max | integer | Yes | (variant 2) Between 50 and 20000. |
asset.floorPlan.squareFeet.min | integer | Yes | (variant 2) Between 50 and 20000. |
asset.groupId | string | null | Yes | — |
asset.groupName | string | null | Yes | — |
asset.height | integer | null | Yes | — |
asset.id | string | Yes | — |
asset.kind | enum | Yes | One of: "photo", "floor_plan", "brochure", "video", "tour", "document", "logo", "captions". |
asset.pageCount | integer | null | Yes | — |
asset.previewUrl | string | null | Yes | — |
asset.sizeBytes | integer | Yes | — |
asset.status | enum | Yes | One of: "uploading", "ready", "failed". |
asset.tags | array<string> | Yes | — |
asset.thumbUrl | string | null | Yes | — |
asset.title | string | Yes | — |
asset.tourUrl | string | null | Yes | — |
asset.updatedAt | string (date-time) | Yes | — |
asset.url | string | null | Yes | — |
asset.width | integer | null | Yes | — |
upload | object | Yes | — |
upload.fileId | string | Yes | — |
upload.url | string | Yes | — |
Errors: 400, 401, 403, 404, 409, 413, 415, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/account/assets/direct" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"fields": {
"kind": "photo",
"title": "string"
},
"file": {
"name": "string",
"type": "string",
"size": 1
}
}'Whether location managers may add their own media and hide or replace the account’s#
PUT /v1/account/assets/settings
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
locationsMayAddMedia | boolean | No | Default: true. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
locationsMayAddMedia | boolean | Yes | Default: true. |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X PUT "$ANSWERSTACK_API_URL/v1/account/assets/settings" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"locationsMayAddMedia": true
}'Add a virtual tour link to the media library#
POST /v1/account/assets/tour
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
altText | string | No | Up to 300 characters. Default: "". |
caption | string | No | Up to 200 characters. Default: "". |
floorPlan | object | No | — |
floorPlan.bathrooms | number | No | Between 0 and 10. |
floorPlan.bedrooms | integer | No | Between 0 and 10. |
floorPlan.layoutName | string | No | 1–60 characters. |
floorPlan.squareFeet | integer | object | No | — |
floorPlan.squareFeet.max | integer | Yes | (variant 2) Between 50 and 20000. |
floorPlan.squareFeet.min | integer | Yes | (variant 2) Between 50 and 20000. |
groupId | string | null | No | Default: null. |
kind | enum | Yes | One of: "tour". |
tags | array<string> | No | Up to 20 items. Default: []. |
title | string | Yes | 1–120 characters. |
tourUrl | string (uri) | No | A https:// link Up to 2000 characters. |
Response 201
| Field | Type | Required | Description |
|---|---|---|---|
altText | string | Yes | — |
archivedAt | string (date-time) | null | Yes | — |
canEdit | boolean | Yes | — |
canManageKnowledge | boolean | Yes | — |
caption | string | Yes | — |
contentType | string | null | Yes | — |
createdAt | string (date-time) | Yes | — |
files | array<AssetFile> | Yes | — |
files[].contentType | string | Yes | — |
files[].createdAt | string (date-time) | Yes | — |
files[].current | boolean | Yes | — |
files[].id | string | Yes | — |
files[].sizeBytes | integer | Yes | — |
files[].status | enum | Yes | One of: "pending", "ready", "failed". |
files[].supersededAt | string (date-time) | null | Yes | — |
files[].url | string | null | Yes | — |
floorPlan | object | null | Yes | — |
floorPlan.bathrooms | number | No | Between 0 and 10. |
floorPlan.bedrooms | integer | No | Between 0 and 10. |
floorPlan.layoutName | string | No | 1–60 characters. |
floorPlan.squareFeet | integer | object | No | — |
floorPlan.squareFeet.max | integer | Yes | (variant 2) Between 50 and 20000. |
floorPlan.squareFeet.min | integer | Yes | (variant 2) Between 50 and 20000. |
groupId | string | null | Yes | — |
groupName | string | null | Yes | — |
height | integer | null | Yes | — |
id | string | Yes | — |
kind | enum | Yes | One of: "photo", "floor_plan", "brochure", "video", "tour", "document", "logo", "captions". |
knowledge | object | null | Yes | — |
knowledge.docId | string | Yes | — |
knowledge.error | string | null | Yes | — |
knowledge.status | enum | Yes | One of: "pending", "processing", "ready", "failed". |
links | array<AssetLink> | Yes | — |
links[].assetId | string | Yes | — |
links[].effect | enum | Yes | One of: "show", "hide". |
links[].groupId | string | null | Yes | — |
links[].groupName | string | null | Yes | — |
links[].id | string | Yes | — |
links[].optionId | string | null | Yes | — |
links[].replacesAssetId | string | null | Yes | — |
links[].serviceId | string | null | Yes | — |
links[].sort | integer | Yes | — |
links[].specialId | string | null | Yes | — |
links[].targetKind | enum | Yes | One of: "location", "service", "option", "service_option", "special". |
links[].targetLabel | string | Yes | — |
pageCount | integer | null | Yes | — |
previewUrl | string | null | Yes | — |
sizeBytes | integer | Yes | — |
status | enum | Yes | One of: "uploading", "ready", "failed". |
tags | array<string> | Yes | — |
thumbUrl | string | null | Yes | — |
title | string | Yes | — |
tourUrl | string | null | Yes | — |
updatedAt | string (date-time) | Yes | — |
url | string | null | Yes | — |
uses | array<AssetUse> | Yes | — |
uses[].id | string | Yes | — |
uses[].kind | enum | Yes | One of: "playbook", "location", "brand", "booking_page". |
uses[].name | string | Yes | — |
width | integer | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 413, 415, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/account/assets/tour" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"kind": "tour",
"title": "string"
}'One asset: its details, its files (current and replaced), and where it is used#
GET /v1/account/assets/{assetId}
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
assetId | string (ast_… ID) | Yes | ID (ast_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
altText | string | Yes | — |
archivedAt | string (date-time) | null | Yes | — |
canEdit | boolean | Yes | — |
canManageKnowledge | boolean | Yes | — |
caption | string | Yes | — |
contentType | string | null | Yes | — |
createdAt | string (date-time) | Yes | — |
files | array<AssetFile> | Yes | — |
files[].contentType | string | Yes | — |
files[].createdAt | string (date-time) | Yes | — |
files[].current | boolean | Yes | — |
files[].id | string | Yes | — |
files[].sizeBytes | integer | Yes | — |
files[].status | enum | Yes | One of: "pending", "ready", "failed". |
files[].supersededAt | string (date-time) | null | Yes | — |
files[].url | string | null | Yes | — |
floorPlan | object | null | Yes | — |
floorPlan.bathrooms | number | No | Between 0 and 10. |
floorPlan.bedrooms | integer | No | Between 0 and 10. |
floorPlan.layoutName | string | No | 1–60 characters. |
floorPlan.squareFeet | integer | object | No | — |
floorPlan.squareFeet.max | integer | Yes | (variant 2) Between 50 and 20000. |
floorPlan.squareFeet.min | integer | Yes | (variant 2) Between 50 and 20000. |
groupId | string | null | Yes | — |
groupName | string | null | Yes | — |
height | integer | null | Yes | — |
id | string | Yes | — |
kind | enum | Yes | One of: "photo", "floor_plan", "brochure", "video", "tour", "document", "logo", "captions". |
knowledge | object | null | Yes | — |
knowledge.docId | string | Yes | — |
knowledge.error | string | null | Yes | — |
knowledge.status | enum | Yes | One of: "pending", "processing", "ready", "failed". |
links | array<AssetLink> | Yes | — |
links[].assetId | string | Yes | — |
links[].effect | enum | Yes | One of: "show", "hide". |
links[].groupId | string | null | Yes | — |
links[].groupName | string | null | Yes | — |
links[].id | string | Yes | — |
links[].optionId | string | null | Yes | — |
links[].replacesAssetId | string | null | Yes | — |
links[].serviceId | string | null | Yes | — |
links[].sort | integer | Yes | — |
links[].specialId | string | null | Yes | — |
links[].targetKind | enum | Yes | One of: "location", "service", "option", "service_option", "special". |
links[].targetLabel | string | Yes | — |
pageCount | integer | null | Yes | — |
previewUrl | string | null | Yes | — |
sizeBytes | integer | Yes | — |
status | enum | Yes | One of: "uploading", "ready", "failed". |
tags | array<string> | Yes | — |
thumbUrl | string | null | Yes | — |
title | string | Yes | — |
tourUrl | string | null | Yes | — |
updatedAt | string (date-time) | Yes | — |
url | string | null | Yes | — |
uses | array<AssetUse> | Yes | — |
uses[].id | string | Yes | — |
uses[].kind | enum | Yes | One of: "playbook", "location", "brand", "booking_page". |
uses[].name | string | Yes | — |
width | integer | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/account/assets/{assetId}" \
-H "Authorization: Bearer $ACCESS_TOKEN"Change an asset’s title, alt text, caption, tags, tour link or floor plan details#
PATCH /v1/account/assets/{assetId}
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
assetId | string (ast_… ID) | Yes | ID (ast_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
altText | string | No | Up to 300 characters. |
caption | string | No | Up to 200 characters. |
floorPlan | object | null | No | — |
floorPlan.bathrooms | number | No | Between 0 and 10. |
floorPlan.bedrooms | integer | No | Between 0 and 10. |
floorPlan.layoutName | string | No | 1–60 characters. |
floorPlan.squareFeet | integer | object | No | — |
floorPlan.squareFeet.max | integer | Yes | (variant 2) Between 50 and 20000. |
floorPlan.squareFeet.min | integer | Yes | (variant 2) Between 50 and 20000. |
tags | array<string> | No | Up to 20 items. |
title | string | No | 1–120 characters. |
tourUrl | string (uri) | No | A https:// link Up to 2000 characters. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
altText | string | Yes | — |
archivedAt | string (date-time) | null | Yes | — |
canEdit | boolean | Yes | — |
canManageKnowledge | boolean | Yes | — |
caption | string | Yes | — |
contentType | string | null | Yes | — |
createdAt | string (date-time) | Yes | — |
files | array<AssetFile> | Yes | — |
files[].contentType | string | Yes | — |
files[].createdAt | string (date-time) | Yes | — |
files[].current | boolean | Yes | — |
files[].id | string | Yes | — |
files[].sizeBytes | integer | Yes | — |
files[].status | enum | Yes | One of: "pending", "ready", "failed". |
files[].supersededAt | string (date-time) | null | Yes | — |
files[].url | string | null | Yes | — |
floorPlan | object | null | Yes | — |
floorPlan.bathrooms | number | No | Between 0 and 10. |
floorPlan.bedrooms | integer | No | Between 0 and 10. |
floorPlan.layoutName | string | No | 1–60 characters. |
floorPlan.squareFeet | integer | object | No | — |
floorPlan.squareFeet.max | integer | Yes | (variant 2) Between 50 and 20000. |
floorPlan.squareFeet.min | integer | Yes | (variant 2) Between 50 and 20000. |
groupId | string | null | Yes | — |
groupName | string | null | Yes | — |
height | integer | null | Yes | — |
id | string | Yes | — |
kind | enum | Yes | One of: "photo", "floor_plan", "brochure", "video", "tour", "document", "logo", "captions". |
knowledge | object | null | Yes | — |
knowledge.docId | string | Yes | — |
knowledge.error | string | null | Yes | — |
knowledge.status | enum | Yes | One of: "pending", "processing", "ready", "failed". |
links | array<AssetLink> | Yes | — |
links[].assetId | string | Yes | — |
links[].effect | enum | Yes | One of: "show", "hide". |
links[].groupId | string | null | Yes | — |
links[].groupName | string | null | Yes | — |
links[].id | string | Yes | — |
links[].optionId | string | null | Yes | — |
links[].replacesAssetId | string | null | Yes | — |
links[].serviceId | string | null | Yes | — |
links[].sort | integer | Yes | — |
links[].specialId | string | null | Yes | — |
links[].targetKind | enum | Yes | One of: "location", "service", "option", "service_option", "special". |
links[].targetLabel | string | Yes | — |
pageCount | integer | null | Yes | — |
previewUrl | string | null | Yes | — |
sizeBytes | integer | Yes | — |
status | enum | Yes | One of: "uploading", "ready", "failed". |
tags | array<string> | Yes | — |
thumbUrl | string | null | Yes | — |
title | string | Yes | — |
tourUrl | string | null | Yes | — |
updatedAt | string (date-time) | Yes | — |
url | string | null | Yes | — |
uses | array<AssetUse> | Yes | — |
uses[].id | string | Yes | — |
uses[].kind | enum | Yes | One of: "playbook", "location", "brand", "booking_page". |
uses[].name | string | Yes | — |
width | integer | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 413, 415, 429, 500, with an ErrorBody body.
Example
curl -X PATCH "$ANSWERSTACK_API_URL/v1/account/assets/{assetId}" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"altText": "string",
"caption": "string",
"floorPlan": {
"bathrooms": 0,
"bedrooms": 0,
"layoutName": "string",
"squareFeet": 50
},
"tags": [
"string"
],
"title": "string",
"tourUrl": "https://example.com"
}'Delete an asset and every file it has had, for good. Refused while a saved setting still shows it#
DELETE /v1/account/assets/{assetId}
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
assetId | string (ast_… ID) | Yes | ID (ast_…) |
Response 204
No content.
Errors: 400, 401, 403, 404, 409, 413, 415, 429, 500, with an ErrorBody body.
Example
curl -X DELETE "$ANSWERSTACK_API_URL/v1/account/assets/{assetId}" \
-H "Authorization: Bearer $ACCESS_TOKEN"Archive an asset: it is no longer offered anywhere. Refused while a saved setting still shows it#
POST /v1/account/assets/{assetId}/archive
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
assetId | string (ast_… ID) | Yes | ID (ast_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
altText | string | Yes | — |
archivedAt | string (date-time) | null | Yes | — |
canEdit | boolean | Yes | — |
canManageKnowledge | boolean | Yes | — |
caption | string | Yes | — |
contentType | string | null | Yes | — |
createdAt | string (date-time) | Yes | — |
files | array<AssetFile> | Yes | — |
files[].contentType | string | Yes | — |
files[].createdAt | string (date-time) | Yes | — |
files[].current | boolean | Yes | — |
files[].id | string | Yes | — |
files[].sizeBytes | integer | Yes | — |
files[].status | enum | Yes | One of: "pending", "ready", "failed". |
files[].supersededAt | string (date-time) | null | Yes | — |
files[].url | string | null | Yes | — |
floorPlan | object | null | Yes | — |
floorPlan.bathrooms | number | No | Between 0 and 10. |
floorPlan.bedrooms | integer | No | Between 0 and 10. |
floorPlan.layoutName | string | No | 1–60 characters. |
floorPlan.squareFeet | integer | object | No | — |
floorPlan.squareFeet.max | integer | Yes | (variant 2) Between 50 and 20000. |
floorPlan.squareFeet.min | integer | Yes | (variant 2) Between 50 and 20000. |
groupId | string | null | Yes | — |
groupName | string | null | Yes | — |
height | integer | null | Yes | — |
id | string | Yes | — |
kind | enum | Yes | One of: "photo", "floor_plan", "brochure", "video", "tour", "document", "logo", "captions". |
knowledge | object | null | Yes | — |
knowledge.docId | string | Yes | — |
knowledge.error | string | null | Yes | — |
knowledge.status | enum | Yes | One of: "pending", "processing", "ready", "failed". |
links | array<AssetLink> | Yes | — |
links[].assetId | string | Yes | — |
links[].effect | enum | Yes | One of: "show", "hide". |
links[].groupId | string | null | Yes | — |
links[].groupName | string | null | Yes | — |
links[].id | string | Yes | — |
links[].optionId | string | null | Yes | — |
links[].replacesAssetId | string | null | Yes | — |
links[].serviceId | string | null | Yes | — |
links[].sort | integer | Yes | — |
links[].specialId | string | null | Yes | — |
links[].targetKind | enum | Yes | One of: "location", "service", "option", "service_option", "special". |
links[].targetLabel | string | Yes | — |
pageCount | integer | null | Yes | — |
previewUrl | string | null | Yes | — |
sizeBytes | integer | Yes | — |
status | enum | Yes | One of: "uploading", "ready", "failed". |
tags | array<string> | Yes | — |
thumbUrl | string | null | Yes | — |
title | string | Yes | — |
tourUrl | string | null | Yes | — |
updatedAt | string (date-time) | Yes | — |
url | string | null | Yes | — |
uses | array<AssetUse> | Yes | — |
uses[].id | string | Yes | — |
uses[].kind | enum | Yes | One of: "playbook", "location", "brand", "booking_page". |
uses[].name | string | Yes | — |
width | integer | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 413, 415, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/account/assets/{assetId}/archive" \
-H "Authorization: Bearer $ACCESS_TOKEN"Give up a large replacement that was never finished (its upload failed): the room it held goes back at once#
DELETE /v1/account/assets/{assetId}/files/{fileId}
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
assetId | string (ast_… ID) | Yes | ID (ast_…) |
fileId | string (asf_… ID) | Yes | ID (asf_…) |
Response 204
No content.
Errors: 400, 401, 403, 404, 409, 413, 415, 429, 500, with an ErrorBody body.
Example
curl -X DELETE "$ANSWERSTACK_API_URL/v1/account/assets/{assetId}/files/{fileId}" \
-H "Authorization: Bearer $ACCESS_TOKEN"Finish a direct upload: checks the stored file’s size and type, then makes it the asset’s file (a new asset’s, or a replacement)#
POST /v1/account/assets/{assetId}/files/{fileId}/complete
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
assetId | string (ast_… ID) | Yes | ID (ast_…) |
fileId | string (asf_… ID) | Yes | ID (asf_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
altText | string | Yes | — |
archivedAt | string (date-time) | null | Yes | — |
canEdit | boolean | Yes | — |
canManageKnowledge | boolean | Yes | — |
caption | string | Yes | — |
contentType | string | null | Yes | — |
createdAt | string (date-time) | Yes | — |
files | array<AssetFile> | Yes | — |
files[].contentType | string | Yes | — |
files[].createdAt | string (date-time) | Yes | — |
files[].current | boolean | Yes | — |
files[].id | string | Yes | — |
files[].sizeBytes | integer | Yes | — |
files[].status | enum | Yes | One of: "pending", "ready", "failed". |
files[].supersededAt | string (date-time) | null | Yes | — |
files[].url | string | null | Yes | — |
floorPlan | object | null | Yes | — |
floorPlan.bathrooms | number | No | Between 0 and 10. |
floorPlan.bedrooms | integer | No | Between 0 and 10. |
floorPlan.layoutName | string | No | 1–60 characters. |
floorPlan.squareFeet | integer | object | No | — |
floorPlan.squareFeet.max | integer | Yes | (variant 2) Between 50 and 20000. |
floorPlan.squareFeet.min | integer | Yes | (variant 2) Between 50 and 20000. |
groupId | string | null | Yes | — |
groupName | string | null | Yes | — |
height | integer | null | Yes | — |
id | string | Yes | — |
kind | enum | Yes | One of: "photo", "floor_plan", "brochure", "video", "tour", "document", "logo", "captions". |
knowledge | object | null | Yes | — |
knowledge.docId | string | Yes | — |
knowledge.error | string | null | Yes | — |
knowledge.status | enum | Yes | One of: "pending", "processing", "ready", "failed". |
links | array<AssetLink> | Yes | — |
links[].assetId | string | Yes | — |
links[].effect | enum | Yes | One of: "show", "hide". |
links[].groupId | string | null | Yes | — |
links[].groupName | string | null | Yes | — |
links[].id | string | Yes | — |
links[].optionId | string | null | Yes | — |
links[].replacesAssetId | string | null | Yes | — |
links[].serviceId | string | null | Yes | — |
links[].sort | integer | Yes | — |
links[].specialId | string | null | Yes | — |
links[].targetKind | enum | Yes | One of: "location", "service", "option", "service_option", "special". |
links[].targetLabel | string | Yes | — |
pageCount | integer | null | Yes | — |
previewUrl | string | null | Yes | — |
sizeBytes | integer | Yes | — |
status | enum | Yes | One of: "uploading", "ready", "failed". |
tags | array<string> | Yes | — |
thumbUrl | string | null | Yes | — |
title | string | Yes | — |
tourUrl | string | null | Yes | — |
updatedAt | string (date-time) | Yes | — |
url | string | null | Yes | — |
uses | array<AssetUse> | Yes | — |
uses[].id | string | Yes | — |
uses[].kind | enum | Yes | One of: "playbook", "location", "brand", "booking_page". |
uses[].name | string | Yes | — |
width | integer | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 413, 415, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/account/assets/{assetId}/files/{fileId}/complete" \
-H "Authorization: Bearer $ACCESS_TOKEN"Undo a replace: make one of the asset’s earlier files its current one again. The file it replaces is kept in turn#
POST /v1/account/assets/{assetId}/files/{fileId}/restore
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
assetId | string (ast_… ID) | Yes | ID (ast_…) |
fileId | string (asf_… ID) | Yes | ID (asf_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
altText | string | Yes | — |
archivedAt | string (date-time) | null | Yes | — |
canEdit | boolean | Yes | — |
canManageKnowledge | boolean | Yes | — |
caption | string | Yes | — |
contentType | string | null | Yes | — |
createdAt | string (date-time) | Yes | — |
files | array<AssetFile> | Yes | — |
files[].contentType | string | Yes | — |
files[].createdAt | string (date-time) | Yes | — |
files[].current | boolean | Yes | — |
files[].id | string | Yes | — |
files[].sizeBytes | integer | Yes | — |
files[].status | enum | Yes | One of: "pending", "ready", "failed". |
files[].supersededAt | string (date-time) | null | Yes | — |
files[].url | string | null | Yes | — |
floorPlan | object | null | Yes | — |
floorPlan.bathrooms | number | No | Between 0 and 10. |
floorPlan.bedrooms | integer | No | Between 0 and 10. |
floorPlan.layoutName | string | No | 1–60 characters. |
floorPlan.squareFeet | integer | object | No | — |
floorPlan.squareFeet.max | integer | Yes | (variant 2) Between 50 and 20000. |
floorPlan.squareFeet.min | integer | Yes | (variant 2) Between 50 and 20000. |
groupId | string | null | Yes | — |
groupName | string | null | Yes | — |
height | integer | null | Yes | — |
id | string | Yes | — |
kind | enum | Yes | One of: "photo", "floor_plan", "brochure", "video", "tour", "document", "logo", "captions". |
knowledge | object | null | Yes | — |
knowledge.docId | string | Yes | — |
knowledge.error | string | null | Yes | — |
knowledge.status | enum | Yes | One of: "pending", "processing", "ready", "failed". |
links | array<AssetLink> | Yes | — |
links[].assetId | string | Yes | — |
links[].effect | enum | Yes | One of: "show", "hide". |
links[].groupId | string | null | Yes | — |
links[].groupName | string | null | Yes | — |
links[].id | string | Yes | — |
links[].optionId | string | null | Yes | — |
links[].replacesAssetId | string | null | Yes | — |
links[].serviceId | string | null | Yes | — |
links[].sort | integer | Yes | — |
links[].specialId | string | null | Yes | — |
links[].targetKind | enum | Yes | One of: "location", "service", "option", "service_option", "special". |
links[].targetLabel | string | Yes | — |
pageCount | integer | null | Yes | — |
previewUrl | string | null | Yes | — |
sizeBytes | integer | Yes | — |
status | enum | Yes | One of: "uploading", "ready", "failed". |
tags | array<string> | Yes | — |
thumbUrl | string | null | Yes | — |
title | string | Yes | — |
tourUrl | string | null | Yes | — |
updatedAt | string (date-time) | Yes | — |
url | string | null | Yes | — |
uses | array<AssetUse> | Yes | — |
uses[].id | string | Yes | — |
uses[].kind | enum | Yes | One of: "playbook", "location", "brand", "booking_page". |
uses[].name | string | Yes | — |
width | integer | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 413, 415, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/account/assets/{assetId}/files/{fileId}/restore" \
-H "Authorization: Bearer $ACCESS_TOKEN"Let a brochure or document answer callers’ questions, or stop it: its text is read into a knowledge document at its owner’s level, and kept up to date when the file is replaced#
POST /v1/account/assets/{assetId}/knowledge
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
assetId | string (ast_… ID) | Yes | ID (ast_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
enabled | boolean | Yes | — |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
altText | string | Yes | — |
archivedAt | string (date-time) | null | Yes | — |
canEdit | boolean | Yes | — |
canManageKnowledge | boolean | Yes | — |
caption | string | Yes | — |
contentType | string | null | Yes | — |
createdAt | string (date-time) | Yes | — |
files | array<AssetFile> | Yes | — |
files[].contentType | string | Yes | — |
files[].createdAt | string (date-time) | Yes | — |
files[].current | boolean | Yes | — |
files[].id | string | Yes | — |
files[].sizeBytes | integer | Yes | — |
files[].status | enum | Yes | One of: "pending", "ready", "failed". |
files[].supersededAt | string (date-time) | null | Yes | — |
files[].url | string | null | Yes | — |
floorPlan | object | null | Yes | — |
floorPlan.bathrooms | number | No | Between 0 and 10. |
floorPlan.bedrooms | integer | No | Between 0 and 10. |
floorPlan.layoutName | string | No | 1–60 characters. |
floorPlan.squareFeet | integer | object | No | — |
floorPlan.squareFeet.max | integer | Yes | (variant 2) Between 50 and 20000. |
floorPlan.squareFeet.min | integer | Yes | (variant 2) Between 50 and 20000. |
groupId | string | null | Yes | — |
groupName | string | null | Yes | — |
height | integer | null | Yes | — |
id | string | Yes | — |
kind | enum | Yes | One of: "photo", "floor_plan", "brochure", "video", "tour", "document", "logo", "captions". |
knowledge | object | null | Yes | — |
knowledge.docId | string | Yes | — |
knowledge.error | string | null | Yes | — |
knowledge.status | enum | Yes | One of: "pending", "processing", "ready", "failed". |
links | array<AssetLink> | Yes | — |
links[].assetId | string | Yes | — |
links[].effect | enum | Yes | One of: "show", "hide". |
links[].groupId | string | null | Yes | — |
links[].groupName | string | null | Yes | — |
links[].id | string | Yes | — |
links[].optionId | string | null | Yes | — |
links[].replacesAssetId | string | null | Yes | — |
links[].serviceId | string | null | Yes | — |
links[].sort | integer | Yes | — |
links[].specialId | string | null | Yes | — |
links[].targetKind | enum | Yes | One of: "location", "service", "option", "service_option", "special". |
links[].targetLabel | string | Yes | — |
pageCount | integer | null | Yes | — |
previewUrl | string | null | Yes | — |
sizeBytes | integer | Yes | — |
status | enum | Yes | One of: "uploading", "ready", "failed". |
tags | array<string> | Yes | — |
thumbUrl | string | null | Yes | — |
title | string | Yes | — |
tourUrl | string | null | Yes | — |
updatedAt | string (date-time) | Yes | — |
url | string | null | Yes | — |
uses | array<AssetUse> | Yes | — |
uses[].id | string | Yes | — |
uses[].kind | enum | Yes | One of: "playbook", "location", "brand", "booking_page". |
uses[].name | string | Yes | — |
width | integer | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 413, 415, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/account/assets/{assetId}/knowledge" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"enabled": true
}'Replace an asset’s file (multipart: file). Its link stays the same, so everything that shows it shows the new file. The old file is kept and can be restored#
POST /v1/account/assets/{assetId}/replace
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
assetId | string (ast_… ID) | Yes | ID (ast_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
altText | string | Yes | — |
archivedAt | string (date-time) | null | Yes | — |
canEdit | boolean | Yes | — |
canManageKnowledge | boolean | Yes | — |
caption | string | Yes | — |
contentType | string | null | Yes | — |
createdAt | string (date-time) | Yes | — |
files | array<AssetFile> | Yes | — |
files[].contentType | string | Yes | — |
files[].createdAt | string (date-time) | Yes | — |
files[].current | boolean | Yes | — |
files[].id | string | Yes | — |
files[].sizeBytes | integer | Yes | — |
files[].status | enum | Yes | One of: "pending", "ready", "failed". |
files[].supersededAt | string (date-time) | null | Yes | — |
files[].url | string | null | Yes | — |
floorPlan | object | null | Yes | — |
floorPlan.bathrooms | number | No | Between 0 and 10. |
floorPlan.bedrooms | integer | No | Between 0 and 10. |
floorPlan.layoutName | string | No | 1–60 characters. |
floorPlan.squareFeet | integer | object | No | — |
floorPlan.squareFeet.max | integer | Yes | (variant 2) Between 50 and 20000. |
floorPlan.squareFeet.min | integer | Yes | (variant 2) Between 50 and 20000. |
groupId | string | null | Yes | — |
groupName | string | null | Yes | — |
height | integer | null | Yes | — |
id | string | Yes | — |
kind | enum | Yes | One of: "photo", "floor_plan", "brochure", "video", "tour", "document", "logo", "captions". |
knowledge | object | null | Yes | — |
knowledge.docId | string | Yes | — |
knowledge.error | string | null | Yes | — |
knowledge.status | enum | Yes | One of: "pending", "processing", "ready", "failed". |
links | array<AssetLink> | Yes | — |
links[].assetId | string | Yes | — |
links[].effect | enum | Yes | One of: "show", "hide". |
links[].groupId | string | null | Yes | — |
links[].groupName | string | null | Yes | — |
links[].id | string | Yes | — |
links[].optionId | string | null | Yes | — |
links[].replacesAssetId | string | null | Yes | — |
links[].serviceId | string | null | Yes | — |
links[].sort | integer | Yes | — |
links[].specialId | string | null | Yes | — |
links[].targetKind | enum | Yes | One of: "location", "service", "option", "service_option", "special". |
links[].targetLabel | string | Yes | — |
pageCount | integer | null | Yes | — |
previewUrl | string | null | Yes | — |
sizeBytes | integer | Yes | — |
status | enum | Yes | One of: "uploading", "ready", "failed". |
tags | array<string> | Yes | — |
thumbUrl | string | null | Yes | — |
title | string | Yes | — |
tourUrl | string | null | Yes | — |
updatedAt | string (date-time) | Yes | — |
url | string | null | Yes | — |
uses | array<AssetUse> | Yes | — |
uses[].id | string | Yes | — |
uses[].kind | enum | Yes | One of: "playbook", "location", "brand", "booking_page". |
uses[].name | string | Yes | — |
width | integer | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 413, 415, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/account/assets/{assetId}/replace" \
-H "Authorization: Bearer $ACCESS_TOKEN"Start replacing an asset’s file with a large one: returns a one-time link to PUT the bytes to, then POST /assets/\{assetId\}/files/\{fileId\}/complete. The new file must be the same type#
POST /v1/account/assets/{assetId}/replace/direct
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
assetId | string (ast_… ID) | Yes | ID (ast_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
file | object | Yes | — |
file.name | string | Yes | 1–255 characters. |
file.size | integer | Yes | Minimum 1. |
file.type | string | Yes | 1–100 characters. |
Response 201
| Field | Type | Required | Description |
|---|---|---|---|
asset | Asset | Yes | — |
asset.altText | string | Yes | — |
asset.archivedAt | string (date-time) | null | Yes | — |
asset.canEdit | boolean | Yes | — |
asset.caption | string | Yes | — |
asset.contentType | string | null | Yes | — |
asset.createdAt | string (date-time) | Yes | — |
asset.floorPlan | object | null | Yes | — |
asset.floorPlan.bathrooms | number | No | Between 0 and 10. |
asset.floorPlan.bedrooms | integer | No | Between 0 and 10. |
asset.floorPlan.layoutName | string | No | 1–60 characters. |
asset.floorPlan.squareFeet | integer | object | No | — |
asset.floorPlan.squareFeet.max | integer | Yes | (variant 2) Between 50 and 20000. |
asset.floorPlan.squareFeet.min | integer | Yes | (variant 2) Between 50 and 20000. |
asset.groupId | string | null | Yes | — |
asset.groupName | string | null | Yes | — |
asset.height | integer | null | Yes | — |
asset.id | string | Yes | — |
asset.kind | enum | Yes | One of: "photo", "floor_plan", "brochure", "video", "tour", "document", "logo", "captions". |
asset.pageCount | integer | null | Yes | — |
asset.previewUrl | string | null | Yes | — |
asset.sizeBytes | integer | Yes | — |
asset.status | enum | Yes | One of: "uploading", "ready", "failed". |
asset.tags | array<string> | Yes | — |
asset.thumbUrl | string | null | Yes | — |
asset.title | string | Yes | — |
asset.tourUrl | string | null | Yes | — |
asset.updatedAt | string (date-time) | Yes | — |
asset.url | string | null | Yes | — |
asset.width | integer | null | Yes | — |
upload | object | Yes | — |
upload.fileId | string | Yes | — |
upload.url | string | Yes | — |
Errors: 400, 401, 403, 404, 409, 413, 415, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/account/assets/{assetId}/replace/direct" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"file": {
"name": "string",
"type": "string",
"size": 1
}
}'Bring an archived asset back#
POST /v1/account/assets/{assetId}/unarchive
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
assetId | string (ast_… ID) | Yes | ID (ast_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
altText | string | Yes | — |
archivedAt | string (date-time) | null | Yes | — |
canEdit | boolean | Yes | — |
canManageKnowledge | boolean | Yes | — |
caption | string | Yes | — |
contentType | string | null | Yes | — |
createdAt | string (date-time) | Yes | — |
files | array<AssetFile> | Yes | — |
files[].contentType | string | Yes | — |
files[].createdAt | string (date-time) | Yes | — |
files[].current | boolean | Yes | — |
files[].id | string | Yes | — |
files[].sizeBytes | integer | Yes | — |
files[].status | enum | Yes | One of: "pending", "ready", "failed". |
files[].supersededAt | string (date-time) | null | Yes | — |
files[].url | string | null | Yes | — |
floorPlan | object | null | Yes | — |
floorPlan.bathrooms | number | No | Between 0 and 10. |
floorPlan.bedrooms | integer | No | Between 0 and 10. |
floorPlan.layoutName | string | No | 1–60 characters. |
floorPlan.squareFeet | integer | object | No | — |
floorPlan.squareFeet.max | integer | Yes | (variant 2) Between 50 and 20000. |
floorPlan.squareFeet.min | integer | Yes | (variant 2) Between 50 and 20000. |
groupId | string | null | Yes | — |
groupName | string | null | Yes | — |
height | integer | null | Yes | — |
id | string | Yes | — |
kind | enum | Yes | One of: "photo", "floor_plan", "brochure", "video", "tour", "document", "logo", "captions". |
knowledge | object | null | Yes | — |
knowledge.docId | string | Yes | — |
knowledge.error | string | null | Yes | — |
knowledge.status | enum | Yes | One of: "pending", "processing", "ready", "failed". |
links | array<AssetLink> | Yes | — |
links[].assetId | string | Yes | — |
links[].effect | enum | Yes | One of: "show", "hide". |
links[].groupId | string | null | Yes | — |
links[].groupName | string | null | Yes | — |
links[].id | string | Yes | — |
links[].optionId | string | null | Yes | — |
links[].replacesAssetId | string | null | Yes | — |
links[].serviceId | string | null | Yes | — |
links[].sort | integer | Yes | — |
links[].specialId | string | null | Yes | — |
links[].targetKind | enum | Yes | One of: "location", "service", "option", "service_option", "special". |
links[].targetLabel | string | Yes | — |
pageCount | integer | null | Yes | — |
previewUrl | string | null | Yes | — |
sizeBytes | integer | Yes | — |
status | enum | Yes | One of: "uploading", "ready", "failed". |
tags | array<string> | Yes | — |
thumbUrl | string | null | Yes | — |
title | string | Yes | — |
tourUrl | string | null | Yes | — |
updatedAt | string (date-time) | Yes | — |
url | string | null | Yes | — |
uses | array<AssetUse> | Yes | — |
uses[].id | string | Yes | — |
uses[].kind | enum | Yes | One of: "playbook", "location", "brand", "booking_page". |
uses[].name | string | Yes | — |
width | integer | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 413, 415, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/account/assets/{assetId}/unarchive" \
-H "Authorization: Bearer $ACCESS_TOKEN"What one location shows: for the location in general and each service and option it offers, its files in order, with inherited, hidden and replaced account files marked#
GET /v1/account/groups/{groupId}/media
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
groupId | string (grp_… ID) | Yes | ID (grp_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
canEdit | boolean | Yes | — |
groupId | string | Yes | — |
hasPriceBook | boolean | Yes | — |
targets | array<object> | Yes | — |
targets[].hidden | array<object> | Yes | — |
targets[].hidden[].asset | Asset | Yes | — |
targets[].hidden[].asset.altText | string | Yes | — |
targets[].hidden[].asset.archivedAt | string (date-time) | null | Yes | — |
targets[].hidden[].asset.canEdit | boolean | Yes | — |
targets[].hidden[].asset.caption | string | Yes | — |
targets[].hidden[].asset.contentType | string | null | Yes | — |
targets[].hidden[].asset.createdAt | string (date-time) | Yes | — |
targets[].hidden[].asset.floorPlan | object | null | Yes | — |
targets[].hidden[].asset.groupId | string | null | Yes | — |
targets[].hidden[].asset.groupName | string | null | Yes | — |
targets[].hidden[].asset.height | integer | null | Yes | — |
targets[].hidden[].asset.id | string | Yes | — |
targets[].hidden[].asset.kind | enum | Yes | One of: "photo", "floor_plan", "brochure", "video", "tour", "document", "logo", "captions". |
targets[].hidden[].asset.pageCount | integer | null | Yes | — |
targets[].hidden[].asset.previewUrl | string | null | Yes | — |
targets[].hidden[].asset.sizeBytes | integer | Yes | — |
targets[].hidden[].asset.status | enum | Yes | One of: "uploading", "ready", "failed". |
targets[].hidden[].asset.tags | array<string> | Yes | — |
targets[].hidden[].asset.thumbUrl | string | null | Yes | — |
targets[].hidden[].asset.title | string | Yes | — |
targets[].hidden[].asset.tourUrl | string | null | Yes | — |
targets[].hidden[].asset.updatedAt | string (date-time) | Yes | — |
targets[].hidden[].asset.url | string | null | Yes | — |
targets[].hidden[].asset.width | integer | null | Yes | — |
targets[].hidden[].hideLinkId | string | Yes | — |
targets[].hidden[].linkId | string | Yes | — |
targets[].items | array<object> | Yes | — |
targets[].items[].asset | Asset | Yes | — |
targets[].items[].asset.altText | string | Yes | — |
targets[].items[].asset.archivedAt | string (date-time) | null | Yes | — |
targets[].items[].asset.canEdit | boolean | Yes | — |
targets[].items[].asset.caption | string | Yes | — |
targets[].items[].asset.contentType | string | null | Yes | — |
targets[].items[].asset.createdAt | string (date-time) | Yes | — |
targets[].items[].asset.floorPlan | object | null | Yes | — |
targets[].items[].asset.groupId | string | null | Yes | — |
targets[].items[].asset.groupName | string | null | Yes | — |
targets[].items[].asset.height | integer | null | Yes | — |
targets[].items[].asset.id | string | Yes | — |
targets[].items[].asset.kind | enum | Yes | One of: "photo", "floor_plan", "brochure", "video", "tour", "document", "logo", "captions". |
targets[].items[].asset.pageCount | integer | null | Yes | — |
targets[].items[].asset.previewUrl | string | null | Yes | — |
targets[].items[].asset.sizeBytes | integer | Yes | — |
targets[].items[].asset.status | enum | Yes | One of: "uploading", "ready", "failed". |
targets[].items[].asset.tags | array<string> | Yes | — |
targets[].items[].asset.thumbUrl | string | null | Yes | — |
targets[].items[].asset.title | string | Yes | — |
targets[].items[].asset.tourUrl | string | null | Yes | — |
targets[].items[].asset.updatedAt | string (date-time) | Yes | — |
targets[].items[].asset.url | string | null | Yes | — |
targets[].items[].asset.width | integer | null | Yes | — |
targets[].items[].inherited | boolean | Yes | — |
targets[].items[].linkId | string | Yes | — |
targets[].items[].replaces | string | null | Yes | — |
targets[].key | string | Yes | — |
targets[].label | string | Yes | — |
targets[].replaced | array<object> | Yes | — |
targets[].replaced[].asset | Asset | Yes | — |
targets[].replaced[].asset.altText | string | Yes | — |
targets[].replaced[].asset.archivedAt | string (date-time) | null | Yes | — |
targets[].replaced[].asset.canEdit | boolean | Yes | — |
targets[].replaced[].asset.caption | string | Yes | — |
targets[].replaced[].asset.contentType | string | null | Yes | — |
targets[].replaced[].asset.createdAt | string (date-time) | Yes | — |
targets[].replaced[].asset.floorPlan | object | null | Yes | — |
targets[].replaced[].asset.groupId | string | null | Yes | — |
targets[].replaced[].asset.groupName | string | null | Yes | — |
targets[].replaced[].asset.height | integer | null | Yes | — |
targets[].replaced[].asset.id | string | Yes | — |
targets[].replaced[].asset.kind | enum | Yes | One of: "photo", "floor_plan", "brochure", "video", "tour", "document", "logo", "captions". |
targets[].replaced[].asset.pageCount | integer | null | Yes | — |
targets[].replaced[].asset.previewUrl | string | null | Yes | — |
targets[].replaced[].asset.sizeBytes | integer | Yes | — |
targets[].replaced[].asset.status | enum | Yes | One of: "uploading", "ready", "failed". |
targets[].replaced[].asset.tags | array<string> | Yes | — |
targets[].replaced[].asset.thumbUrl | string | null | Yes | — |
targets[].replaced[].asset.title | string | Yes | — |
targets[].replaced[].asset.tourUrl | string | null | Yes | — |
targets[].replaced[].asset.updatedAt | string (date-time) | Yes | — |
targets[].replaced[].asset.url | string | null | Yes | — |
targets[].replaced[].asset.width | integer | null | Yes | — |
targets[].replaced[].byLinkId | string | Yes | — |
targets[].replaced[].linkId | string | Yes | — |
targets[].target | object | Yes | — |
targets[].target.kind | enum | Yes | One of: "location", "service", "option", "service_option", "special". |
targets[].target.optionId | string | null | Yes | Default: null. |
targets[].target.serviceId | string | null | Yes | Default: null. |
targets[].target.specialId | string | null | Yes | Default: null. |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/account/groups/{groupId}/media" \
-H "Authorization: Bearer $ACCESS_TOKEN"Every location the caller can see against the location in general, each service and each option: how many files each shows, by kind, and where something is missing#
GET /v1/account/media-matrix
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
columns | array<object> | Yes | — |
columns[].key | string | Yes | — |
columns[].label | string | Yes | — |
columns[].target | object | Yes | — |
columns[].target.kind | enum | Yes | One of: "location", "service", "option", "service_option", "special". |
columns[].target.optionId | string | null | Yes | Default: null. |
columns[].target.serviceId | string | null | Yes | Default: null. |
columns[].target.specialId | string | null | Yes | Default: null. |
gaps | number | Yes | — |
rows | array<object> | Yes | — |
rows[].cells | array<object | null> | Yes | — |
rows[].cells[].counts | map | Yes | — |
rows[].cells[].counts.{key} | number | No | Any key. |
rows[].cells[].gap | boolean | Yes | — |
rows[].cells[].own | number | Yes | — |
rows[].cells[].total | number | Yes | — |
rows[].groupId | string | Yes | — |
rows[].hasPriceBook | boolean | Yes | — |
rows[].name | string | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/account/media-matrix" \
-H "Authorization: Bearer $ACCESS_TOKEN"