API reference
Photos
/ v1/ hooks/ photos/ links/ :tokenWhat a Photos link opens: its title, how many photos, whether locations are kept and downloads allowed, or that it needs its password. No authentication; the visit is in the owner's log.
- Auth
- None.
Path parameters
tokenA secret from a link: an issue automation rule's incoming-webhook token (shown once when issued), a map's share link, a notification recipient's confirm and unsubscribe link, a Drive public link (
/l/<token>), a Vehicles drive's share link, or a Mirage interaction's token (itk_…, sent with the interaction, good for 15 minutes), or the token in the link to a file of a message Mirage sent to Discord, or a Marketing link's sealed token (a tracked click, the open pixel, unsubscribe and the preference centre, a double opt-in confirmation); or a Food recipe's public link (/r/<token>) or a household's calendar feed.
curl 'https://api.cactive.com.au/v1/hooks/photos/links/{token}'Response 200
{
needsPassword: true
} | {
needsPassword: false
title: string
count: number
keepLocation: boolean
download: boolean
expiresAt?: number
owner?: string
}/ v1/ hooks/ photos/ links/ :token/ unlockChecks a link's password and answers a 12-hour grant (send it as x-si-link-grant). 10 wrong passwords per link per 15 minutes lock it. No authentication.
- Auth
- None.
Path parameters
tokenA secret from a link: an issue automation rule's incoming-webhook token (shown once when issued), a map's share link, a notification recipient's confirm and unsubscribe link, a Drive public link (
/l/<token>), a Vehicles drive's share link, or a Mirage interaction's token (itk_…, sent with the interaction, good for 15 minutes), or the token in the link to a file of a message Mirage sent to Discord, or a Marketing link's sealed token (a tracked click, the open pixel, unsubscribe and the preference centre, a double opt-in confirmation); or a Food recipe's public link (/r/<token>) or a household's calendar feed.
Request body
passwordstringrequired1–200 characters.
curl -X POST 'https://api.cactive.com.au/v1/hooks/photos/links/{token}/unlock' \
-H 'Content-Type: application/json' \
-d '{
"password": "example"
}'Response 200
{
grant: string
expiresAt: number
}/ v1/ hooks/ photos/ links/ :token/ photosThe link's photos (thumbnails), oldest first, in pages.
- Auth
- None.
Path parameters
tokenA secret from a link: an issue automation rule's incoming-webhook token (shown once when issued), a map's share link, a notification recipient's confirm and unsubscribe link, a Drive public link (
/l/<token>), a Vehicles drive's share link, or a Mirage interaction's token (itk_…, sent with the interaction, good for 15 minutes), or the token in the link to a file of a message Mirage sent to Discord, or a Marketing link's sealed token (a tracked click, the open pixel, unsubscribe and the preference centre, a double opt-in confirmation); or a Food recipe's public link (/r/<token>) or a household's calendar feed.
Query parameters
cursorstringUp to 2,000 characters.
curl 'https://api.cactive.com.au/v1/hooks/photos/links/{token}/photos'Response 200
{
title: string
photos: {
photoId: string
kind: "raw" | "video" | "live" | "photo"
name: string
takenAt: number
width?: number
height?: number
duration?: number
thumbUrl?: string
location?: {
lat: number
lon: number
}
}[]
cursor?: string
}/ v1/ hooks/ photos/ links/ :token/ photos/ :photoIdOne photo through the link: its preview (and video), or the original when downloads are on (download=1).
- Auth
- None.
Path parameters
tokenA secret from a link: an issue automation rule's incoming-webhook token (shown once when issued), a map's share link, a notification recipient's confirm and unsubscribe link, a Drive public link (
/l/<token>), a Vehicles drive's share link, or a Mirage interaction's token (itk_…, sent with the interaction, good for 15 minutes), or the token in the link to a file of a message Mirage sent to Discord, or a Marketing link's sealed token (a tracked click, the open pixel, unsubscribe and the preference centre, a double opt-in confirmation); or a Food recipe's public link (/r/<token>) or a household's calendar feed.photoIdPhoto id: the photo's file in Drive (
fil_…).
Query parameters
download"0" | "1"
curl 'https://api.cactive.com.au/v1/hooks/photos/links/{token}/photos/{photoId}'Response 200
{
name: string
previewUrl?: string
videoUrl?: string
motionUrl?: string
downloadUrl?: string
location?: {
lat: number
lon: number
}
}/ v1/ hooks/ photos/ links/ :token/ archivesA ZIP of everything in the link (when downloads are on).
- Auth
- None.
Path parameters
tokenA secret from a link: an issue automation rule's incoming-webhook token (shown once when issued), a map's share link, a notification recipient's confirm and unsubscribe link, a Drive public link (
/l/<token>), a Vehicles drive's share link, or a Mirage interaction's token (itk_…, sent with the interaction, good for 15 minutes), or the token in the link to a file of a message Mirage sent to Discord, or a Marketing link's sealed token (a tracked click, the open pixel, unsubscribe and the preference centre, a double opt-in confirmation); or a Food recipe's public link (/r/<token>) or a household's calendar feed.
curl -X POST 'https://api.cactive.com.au/v1/hooks/photos/links/{token}/archives'Response 202
{
archive: {
archiveId: string
status: "queued" | "building" | "ready" | "failed"
name: string
files: number
bytes: number
url?: string
error?: string
left?: {
what: string
count: number
}[]
}
}/ v1/ hooks/ photos/ links/ :token/ archives/ :archiveIdA link's ZIP: its status, and a one-hour download link once ready. No authentication.
- Auth
- None.
Path parameters
tokenA secret from a link: an issue automation rule's incoming-webhook token (shown once when issued), a map's share link, a notification recipient's confirm and unsubscribe link, a Drive public link (
/l/<token>), a Vehicles drive's share link, or a Mirage interaction's token (itk_…, sent with the interaction, good for 15 minutes), or the token in the link to a file of a message Mirage sent to Discord, or a Marketing link's sealed token (a tracked click, the open pixel, unsubscribe and the preference centre, a double opt-in confirmation); or a Food recipe's public link (/r/<token>) or a household's calendar feed.archiveIdZIP download id (
zip_…).
curl 'https://api.cactive.com.au/v1/hooks/photos/links/{token}/archives/{archiveId}'Response 200
{
archive: {
archiveId: string
status: "queued" | "building" | "ready" | "failed"
name: string
files: number
bytes: number
url?: string
error?: string
left?: {
what: string
count: number
}[]
}
}/ v1/ me/ photos/ libraryThe library: its settings, storage (shared with Drive's personal space) and counts. Made on first use.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl 'https://api.cactive.com.au/v1/me/photos/library' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
library: {
driveId: string
settings: {
ai: {
faces: boolean
objects: boolean
memories: boolean
}
keepLocation: boolean
vehicles: boolean
}
usage: {
bytes: number
files: number
limit: number
}
counts: {
photos: number
favourites: number
albums: number
archive: number
trash: number
}
}
}/ v1/ me/ photos/ settingsOpt-in features (faces, objects and text, memories: nothing runs while off), whether new links keep locations, and whether Vehicles may suggest photos for the person's own cars' drives (vehicles, on until turned off; vehiclesNoticed closes the note that it's on; docs/vehicles/drive-media.md).
- Auth
- A person's token or an API key, as Authorization: Bearer.
Request body
aiobjectai.facesbooleanai.objectsbooleanai.memoriesbooleankeepLocationbooleanvehiclesbooleanvehiclesNoticedtrue
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl -X PATCH 'https://api.cactive.com.au/v1/me/photos/settings' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"ai": {
"faces": true,
"objects": true,
"memories": true
},
"keepLocation": true,
"vehicles": true
}'Response 200
{
library: {
driveId: string
settings: {
ai: {
faces: boolean
objects: boolean
memories: boolean
}
keepLocation: boolean
vehicles: boolean
}
usage: {
bytes: number
files: number
limit: number
}
counts: {
photos: number
favourites: number
albums: number
archive: number
trash: number
}
}
}/ v1/ me/ photos/ daysPhotos per local day on the timeline (newest first), for the scrubber and the grid's layout.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl 'https://api.cactive.com.au/v1/me/photos/days' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
days: {
day: string
count: number
}[]
}/ v1/ me/ photos/ timelineTimeline photos taken between from and to (ms), newest first.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Query parameters
cursorstringUp to 2,000 characters.
limitinteger1–500. Coerced from a string.
fromintegerCoerced from a string.
tointegerCoerced from a string.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl 'https://api.cactive.com.au/v1/me/photos/timeline' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
photos: {
photoId: string
kind: "raw" | "video" | "live" | "photo"
state: "main" | "archive" | "trash" | "motion"
name: string
mime: string
size: number
takenAt: number
day: string
width?: number
height?: number
duration?: number
codec?: string
favourite: boolean
thumbUrl?: string
located: boolean
pairId?: string
processed: boolean
trashedAt?: number
}[]
cursor?: string
}/ v1/ me/ photos/ lists/ :listFavourites, the archive or the trash, newest first.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
listfavourites,archiveortrash.
Query parameters
cursorstringUp to 2,000 characters.
limitinteger1–500. Coerced from a string.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl 'https://api.cactive.com.au/v1/me/photos/lists/{list}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
photos: {
photoId: string
kind: "raw" | "video" | "live" | "photo"
state: "main" | "archive" | "trash" | "motion"
name: string
mime: string
size: number
takenAt: number
day: string
width?: number
height?: number
duration?: number
codec?: string
favourite: boolean
thumbUrl?: string
located: boolean
pairId?: string
processed: boolean
trashedAt?: number
}[]
cursor?: string
}/ v1/ me/ photos/ trash/ emptyDeletes everything in the trash for good (the files from Drive too).
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl -X POST 'https://api.cactive.com.au/v1/me/photos/trash/empty' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
deleted: number
}/ v1/ me/ photos/ photos/ batchSeveral photos by id (the map's pins, a selection), in the order asked.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Request body
photoIdsstring[]required1–200 items. Each 3–64 characters.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl -X POST 'https://api.cactive.com.au/v1/me/photos/photos/batch' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"photoIds": [
"example"
]
}'Response 200
{
photos: {
photoId: string
kind: "raw" | "video" | "live" | "photo"
state: "main" | "archive" | "trash" | "motion"
name: string
mime: string
size: number
takenAt: number
day: string
width?: number
height?: number
duration?: number
codec?: string
favourite: boolean
thumbUrl?: string
located: boolean
pairId?: string
processed: boolean
trashedAt?: number
}[]
}/ v1/ me/ photos/ photos/ stateFavourite, unfavourite, archive, unarchive, move to the trash, restore or delete forever (trashed photos only).
- Auth
- A person's token or an API key, as Authorization: Bearer.
Request body
photoIdsstring[]required1–500 items. Each 3–64 characters.
action"favourite" | "unfavourite" | "archive" | "unarchive" | "trash" | "restore" | "delete"required
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl -X POST 'https://api.cactive.com.au/v1/me/photos/photos/state' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"photoIds": [
"example"
],
"action": "favourite"
}'Response 200
{
changed: string[]
}/ v1/ me/ photos/ photos/ :photoIdA photo's details: when (and from where that's known) and where it was taken, camera, size, description, albums, and one-hour links to show it (and a Live Photo's video). Logged as opened.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
photoIdPhoto id: the photo's file in Drive (
fil_…).
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl 'https://api.cactive.com.au/v1/me/photos/photos/{photoId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
photo: {
photoId: string
kind: "raw" | "video" | "live" | "photo"
state: "main" | "archive" | "trash" | "motion"
name: string
mime: string
size: number
takenAt: number
day: string
width?: number
height?: number
duration?: number
codec?: string
favourite: boolean
thumbUrl?: string
located: boolean
pairId?: string
processed: boolean
trashedAt?: number
description?: string
location?: {
lat: number
lon: number
altitude?: number
from: "file" | "edit" | "sidecar"
}
camera?: {
make?: string
model?: string
lens?: string
exposure?: string
fNumber?: number
iso?: number
focal?: number
}
takenFrom: "file" | "client" | "edit" | "added" | "sidecar"
local?: string
offset?: number
source: "mcp" | "agent" | "drive" | "phone" | "edited" | "web" | "shortcut" | "takeout" | "picker" | "mirage"
addedAt: number
displayUrl?: string
motionUrl?: string
albums: {
albumId: string
title: string
}[]
versions: number
}
}/ v1/ me/ photos/ photos/ :photoIdDescription, capture time (takenAt, ms; null goes back to the file's) and location (null removes it; "file" goes back to the file's).
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
photoIdPhoto id: the photo's file in Drive (
fil_…).
Request body
descriptionstringor nullUp to 2,000 characters.
favouritebooleantakenAtintegeror nulllocationobject | null | "file"
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl -X PATCH 'https://api.cactive.com.au/v1/me/photos/photos/{photoId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"description": "example",
"favourite": true,
"takenAt": 1
}'Response 200
{
photo: {
photoId: string
kind: "raw" | "video" | "live" | "photo"
state: "main" | "archive" | "trash" | "motion"
name: string
mime: string
size: number
takenAt: number
day: string
width?: number
height?: number
duration?: number
codec?: string
favourite: boolean
thumbUrl?: string
located: boolean
pairId?: string
processed: boolean
trashedAt?: number
description?: string
location?: {
lat: number
lon: number
altitude?: number
from: "file" | "edit" | "sidecar"
}
camera?: {
make?: string
model?: string
lens?: string
exposure?: string
fNumber?: number
iso?: number
focal?: number
}
takenFrom: "file" | "client" | "edit" | "added" | "sidecar"
local?: string
offset?: number
source: "mcp" | "agent" | "drive" | "phone" | "edited" | "web" | "shortcut" | "takeout" | "picker" | "mirage"
addedAt: number
displayUrl?: string
motionUrl?: string
albums: {
albumId: string
title: string
}[]
versions: number
}
}/ v1/ me/ photos/ photos/ :photoId/ originalA one-hour link to the original (inline=1 to show it; motion=1 for a Live Photo's video). transcode=1 with inline=1, for a video the browser can't play: its preview transcode, pending while it's made, or the original with unplayable.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
photoIdPhoto id: the photo's file in Drive (
fil_…).
Query parameters
inline"0" | "1"motion"0" | "1"transcode"0" | "1"
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl 'https://api.cactive.com.au/v1/me/photos/photos/{photoId}/original' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
url: string
name: string
mime: string
size?: number
expiresIn: number
transcoded?: boolean
unplayable?: boolean
pending?: undefined
} | {
pending: true
name: string
mime: string
url?: undefined
}
| {
url: string
name: string
mime: string
size?: number
expiresIn: number
}/ v1/ me/ photos/ photos/ :photoId/ posterA video's poster frame, made in the browser (JPEG or WebP, base64, up to 1 MB).
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
photoIdPhoto id: the photo's file in Drive (
fil_…).
Request body
imagestringrequired10–1,400,000 characters.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl -X PUT 'https://api.cactive.com.au/v1/me/photos/photos/{photoId}/poster' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"image": "example"
}'Response 200
{
photo: {
photoId: string
kind: "raw" | "video" | "live" | "photo"
state: "main" | "archive" | "trash" | "motion"
name: string
mime: string
size: number
takenAt: number
day: string
width?: number
height?: number
duration?: number
codec?: string
favourite: boolean
thumbUrl?: string
located: boolean
pairId?: string
processed: boolean
trashedAt?: number
}
}/ v1/ me/ photos/ searchSearch by when (from/to, ms), where (a box: south,west,north,east; or near=lat,lon with km), words in names and descriptions, type and favourites.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Query parameters
cursorstringUp to 2,000 characters.
limitinteger1–500. Coerced from a string.
fromintegerCoerced from a string.
tointegerCoerced from a string.
bboxstringUp to 100 characters.
nearstringUp to 60 characters.
kmnumber0.1–5000. Coerced from a string.
qstringUp to 200 characters.
type"photo" | "video" | "live" | "raw"favourite"0" | "1"archived"0" | "1"
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl 'https://api.cactive.com.au/v1/me/photos/search' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
photos: {
photoId: string
kind: "raw" | "video" | "live" | "photo"
state: "main" | "archive" | "trash" | "motion"
name: string
mime: string
size: number
takenAt: number
day: string
width?: number
height?: number
duration?: number
codec?: string
favourite: boolean
thumbUrl?: string
located: boolean
pairId?: string
processed: boolean
trashedAt?: number
}[]
cursor?: string
total: number
truncated: boolean
}/ v1/ me/ photos/ mapEvery located photo as a point (id, latitude, longitude, time), for the map.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl 'https://api.cactive.com.au/v1/me/photos/map' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
points: [string, number, number, number][]
}/ v1/ me/ photos/ albumsYour albums, most recently changed first, with covers and how many links show each.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl 'https://api.cactive.com.au/v1/me/photos/albums' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
albums: {
albumId: string
title: string
description?: string
count: number
coverId?: string
coverUrl?: string
sort: "oldest" | "newest" | "added"
createdAt: number
updatedAt: number
links: number
sharedWith: number
keepLocation: boolean
}[]
}/ v1/ me/ photos/ albumsCreates an album, optionally with photos.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Request body
titlestringrequired1–200 characters.
descriptionstringUp to 2,000 characters.
photoIdsstring[]Up to 500 items. Each 3–64 characters.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl -X POST 'https://api.cactive.com.au/v1/me/photos/albums' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"title": "Example"
}'Response 201
{
album: {
albumId: string
title: string
description?: string
count: number
coverId?: string
coverUrl?: string
sort: "oldest" | "newest" | "added"
createdAt: number
updatedAt: number
links: number
sharedWith: number
keepLocation: boolean
}
}/ v1/ me/ photos/ albums/ :albumIdAn album and a page of its photos, in its sort order.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
albumIdAlbum id (
alb_…).
Query parameters
cursorstringUp to 2,000 characters.
limitinteger1–500. Coerced from a string.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl 'https://api.cactive.com.au/v1/me/photos/albums/{albumId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
album: {
albumId: string
title: string
description?: string
count: number
coverId?: string
coverUrl?: string
sort: "oldest" | "newest" | "added"
createdAt: number
updatedAt: number
links: number
sharedWith: number
keepLocation: boolean
}
photos: {
photoId: string
kind: "raw" | "video" | "live" | "photo"
state: "main" | "archive" | "trash" | "motion"
name: string
mime: string
size: number
takenAt: number
day: string
width?: number
height?: number
duration?: number
codec?: string
favourite: boolean
thumbUrl?: string
located: boolean
pairId?: string
processed: boolean
trashedAt?: number
}[]
cursor?: string
}/ v1/ me/ photos/ albums/ :albumIdRenames an album, changes its description, cover (a photo in it; null for the first) or order, and whether members of a shared album see where your own photos in it were taken (keepLocation).
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
albumIdAlbum id (
alb_…).
Request body
titlestring1–200 characters.
descriptionstringor nullUp to 2,000 characters.
coverIdstringor null3–64 characters.
sort"oldest" | "newest" | "added"keepLocationboolean
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl -X PATCH 'https://api.cactive.com.au/v1/me/photos/albums/{albumId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"title": "Example",
"description": "example",
"coverId": "<coverId>"
}'Response 200
{
album: {
albumId: string
title: string
description?: string
count: number
coverId?: string
coverUrl?: string
sort: "oldest" | "newest" | "added"
createdAt: number
updatedAt: number
links: number
sharedWith: number
keepLocation: boolean
}
}/ v1/ me/ photos/ albums/ :albumIdDeletes the album (its photos stay in the library) and turns off its links.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
albumIdAlbum id (
alb_…).
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl -X DELETE 'https://api.cactive.com.au/v1/me/photos/albums/{albumId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 204 with no body
/ v1/ me/ photos/ albums/ :albumId/ photosAdds photos to an album (up to 20,000 in one album). Ones already there stay.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
albumIdAlbum id (
alb_…).
Request body
photoIdsstring[]required1–500 items. Each 3–64 characters.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl -X POST 'https://api.cactive.com.au/v1/me/photos/albums/{albumId}/photos' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"photoIds": [
"example"
]
}'Response 200
{
album: {
albumId: string
title: string
description?: string
count: number
coverId?: string
coverUrl?: string
sort: "oldest" | "newest" | "added"
createdAt: number
updatedAt: number
links: number
sharedWith: number
keepLocation: boolean
}
}/ v1/ me/ photos/ albums/ :albumId/ photos/ removeTakes photos out of an album; they stay in the library.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
albumIdAlbum id (
alb_…).
Request body
photoIdsstring[]required1–500 items. Each 3–64 characters.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl -X POST 'https://api.cactive.com.au/v1/me/photos/albums/{albumId}/photos/remove' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"photoIds": [
"example"
]
}'Response 200
{
album: {
albumId: string
title: string
description?: string
count: number
coverId?: string
coverUrl?: string
sort: "oldest" | "newest" | "added"
createdAt: number
updatedAt: number
links: number
sharedWith: number
keepLocation: boolean
}
}/ v1/ me/ photos/ albums/ :albumId/ sharingWho an album is shared with (the sharing service's view), whom its owner can choose (their organisations, groups and circles), and its location setting.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
albumIdAlbum id (
alb_…).
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.403Shared albums are for the person signed in.403Sharing isn't available to the phone assistant.403Sharing is changed by you, not by the assistant.403Missing scope sharing:read
curl 'https://api.cactive.com.au/v1/me/photos/albums/{albumId}/sharing' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
sharing: {
resource: string
type: string
app: string
label: string
owner: {
spaceId: string
kind: "org" | "personal"
name: null | string
you: boolean
}
you: {
capabilities: string[]
via: {
kind: "role" | "owner" | "container"
detail?: string
capabilities: string[]
} | {
kind: "link" | "grant"
resource: string
inherited: boolean
principal: string
source: string
preset?: string
capabilities: string[]
params?: {
[key: string]: boolean | string | number
}
notBefore?: number
expiresAt?: number
schedule?: {
tz: string
windows: {
days?: object
from: string
to: string
dates?: object
}[]
}
approval?: string[]
assistants?: boolean
paused?: true
}[]
canShare: boolean
}
grants: null | {
resource: string
principal: string
kind: "user" | "key" | "org" | "link" | "group" | "circle"
name: null | string
email: null | string
deleted: boolean
source: string
status: "active" | "pending"
capabilities: string[]
preset: null | string
notBefore: null | number
expiresAt: null | number
schedule: null | {
tz: string
windows: {
days?: object
from: string
to: string
dates?: object
}[]
}
params: null | {
[key: string]: boolean | string | number
}
assistants: boolean
approval: string[]
includeGuests: boolean
external: boolean
blocked: null | string
acceptBy: null | number
pausedUntil: null | number
grantedBy: {
id: string
name: null | string
}
createdAt: string
updatedAt: string
rev: number
}[]
links: null | {
linkId: string
resource: string
audience: "org" | "anyone" | "signed_in"
capabilities: string[]
preset: null | string
expiresAt: null | number
passwordProtected: boolean
blocked: null | string
createdBy: {
id: string
name: null | string
}
createdAt: string
}[]
invitations: null | {
invitationId: string
principal: string
email: string
capabilities: string[]
preset: null | string
notBefore: null | number
expiresAt: null | number
schedule: null | {
tz: string
windows: {
days?: object
from: string
to: string
dates?: object
}[]
}
params: null | {
[key: string]: boolean | string | number
}
assistants: boolean
approval: string[]
offerEnds: number
invitedBy: {
id: string
name: null | string
}
createdAt: string
}[]
policy: null | {
externalSharing: "off" | "accounts" | "links"
allowedDomains: string[]
linkMaxDays: null | number
}
}
choices: {
orgs: {
orgId: string
name: string
}[]
groups: {
teamId: string
name: string
orgId: string
orgName: string
}[]
circles: {
circleId: string
name: string
}[]
}
keepLocation: boolean
}/ v1/ me/ photos/ albums/ :albumId/ sharingShares it with one of the owner's organisations, a group or circle they're in, or a person by address (who accepts first): Viewer or Contributor.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
albumIdAlbum id (
alb_…).
Request body
toobject | objectrequiredpreset"viewer" | "contributor"requiredmessagestringUp to 500 characters.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.403Shared albums are for the person signed in.403Sharing isn't available to the phone assistant.403Sharing is changed by you, not by the assistant.403Missing scope sharing:write
curl -X POST 'https://api.cactive.com.au/v1/me/photos/albums/{albumId}/sharing' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"to": {},
"preset": "viewer"
}'Response 201
{
kind: "grant"
grant: {
resource: string
principal: string
kind: "user" | "key" | "org" | "link" | "group" | "circle"
name: null | string
email: null | string
deleted: boolean
source: string
status: "active" | "pending"
capabilities: string[]
preset: null | string
notBefore: null | number
expiresAt: null | number
schedule: null | {
tz: string
windows: {
days?: ("sun" | "mon" | "tue" | "wed" | "thu" | "fri" | "sat")[]
from: string
to: string
dates?: string[]
}[]
}
params: null | {
[key: string]: boolean | string | number
}
assistants: boolean
approval: string[]
includeGuests: boolean
external: boolean
blocked: null | string
acceptBy: null | number
pausedUntil: null | number
grantedBy: {
id: string
name: null | string
}
createdAt: string
updatedAt: string
rev: number
}
} | {
kind: "invitation"
invitation: {
invitationId: string
principal: string
email: string
capabilities: string[]
preset: null | string
notBefore: null | number
expiresAt: null | number
schedule: null | {
tz: string
windows: {
days?: ("sun" | "mon" | "tue" | "wed" | "thu" | "fri" | "sat")[]
from: string
to: string
dates?: string[]
}[]
}
params: null | {
[key: string]: boolean | string | number
}
assistants: boolean
approval: string[]
offerEnds: number
invitedBy: {
id: string
name: null | string
}
createdAt: string
}
}/ v1/ me/ photos/ albums/ :albumId/ sharing/ :principalMakes someone you shared an album with a Viewer or a Contributor (rev from the album's sharing). A viewer keeps the photos they added.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
albumIdAlbum id (
alb_…).principalWho a grant is to, URL-encoded:
user:usr_…,group:team_…,circle:cir_…,org:org_…orkey:key_…. An invitation to an address with no account is named by itsinvitationId, never its address.
Request body
preset"viewer" | "contributor"requiredrevintegerrequired≥ 0.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.403Shared albums are for the person signed in.403Sharing isn't available to the phone assistant.403Sharing is changed by you, not by the assistant.403Missing scope sharing:write
curl -X PATCH 'https://api.cactive.com.au/v1/me/photos/albums/{albumId}/sharing/{principal}' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"preset": "viewer",
"rev": 1
}'Response 200
{
grant: {
resource: string
principal: string
kind: "user" | "key" | "org" | "link" | "group" | "circle"
name: null | string
email: null | string
deleted: boolean
source: string
status: "active" | "pending"
capabilities: string[]
preset: null | string
notBefore: null | number
expiresAt: null | number
schedule: null | {
tz: string
windows: {
days?: ("sun" | "mon" | "tue" | "wed" | "thu" | "fri" | "sat")[]
from: string
to: string
dates?: string[]
}[]
}
params: null | {
[key: string]: boolean | string | number
}
assistants: boolean
approval: string[]
includeGuests: boolean
external: boolean
blocked: null | string
acceptBy: null | number
pausedUntil: null | number
grantedBy: {
id: string
name: null | string
}
createdAt: string
updatedAt: string
rev: number
}
}/ v1/ me/ photos/ albums/ :albumId/ sharing/ :principalEnds a share (or withdraws an invitation, by its gin_ id) at once; whoever no longer sees the album has their photos taken out.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
albumIdAlbum id (
alb_…).principalWho a grant is to, URL-encoded:
user:usr_…,group:team_…,circle:cir_…,org:org_…orkey:key_…. An invitation to an address with no account is named by itsinvitationId, never its address.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.403Shared albums are for the person signed in.403Sharing isn't available to the phone assistant.403Sharing is changed by you, not by the assistant.403Missing scope sharing:write
curl -X DELETE 'https://api.cactive.com.au/v1/me/photos/albums/{albumId}/sharing/{principal}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
removed: number
}/ v1/ me/ photos/ partnerPartner sharing (docs/photos.md → Partner sharing): whom the library is shared with, its settings, and partners' libraries shared with the person.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.403Shared albums are for the person signed in.403Sharing isn't available to the phone assistant.403Sharing is changed by you, not by the assistant.403Missing scope sharing:read
curl 'https://api.cactive.com.au/v1/me/photos/partner' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
sharing: {
resource: string
type: string
app: string
label: string
owner: {
spaceId: string
kind: "org" | "personal"
name: null | string
you: boolean
}
you: {
capabilities: string[]
via: {
kind: "role" | "owner" | "container"
detail?: string
capabilities: string[]
} | {
kind: "link" | "grant"
resource: string
inherited: boolean
principal: string
source: string
preset?: string
capabilities: string[]
params?: {
[key: string]: boolean | string | number
}
notBefore?: number
expiresAt?: number
schedule?: {
tz: string
windows: {
days?: object
from: string
to: string
dates?: object
}[]
}
approval?: string[]
assistants?: boolean
paused?: true
}[]
canShare: boolean
}
grants: null | {
resource: string
principal: string
kind: "user" | "key" | "org" | "link" | "group" | "circle"
name: null | string
email: null | string
deleted: boolean
source: string
status: "active" | "pending"
capabilities: string[]
preset: null | string
notBefore: null | number
expiresAt: null | number
schedule: null | {
tz: string
windows: {
days?: object
from: string
to: string
dates?: object
}[]
}
params: null | {
[key: string]: boolean | string | number
}
assistants: boolean
approval: string[]
includeGuests: boolean
external: boolean
blocked: null | string
acceptBy: null | number
pausedUntil: null | number
grantedBy: {
id: string
name: null | string
}
createdAt: string
updatedAt: string
rev: number
}[]
links: null | {
linkId: string
resource: string
audience: "org" | "anyone" | "signed_in"
capabilities: string[]
preset: null | string
expiresAt: null | number
passwordProtected: boolean
blocked: null | string
createdBy: {
id: string
name: null | string
}
createdAt: string
}[]
invitations: null | {
invitationId: string
principal: string
email: string
capabilities: string[]
preset: null | string
notBefore: null | number
expiresAt: null | number
schedule: null | {
tz: string
windows: {
days?: object
from: string
to: string
dates?: object
}[]
}
params: null | {
[key: string]: boolean | string | number
}
assistants: boolean
approval: string[]
offerEnds: number
invitedBy: {
id: string
name: null | string
}
createdAt: string
}[]
policy: null | {
externalSharing: "off" | "accounts" | "links"
allowedDomains: string[]
linkMaxDays: null | number
}
}
since?: number
keepLocation: boolean
libraries: {
owner: {
userId: string
name: null | string
}
since?: number
}[]
offers: {
key: string
owner: {
userId: string
name: null | string
}
acceptBy: number
}[]
}/ v1/ me/ photos/ partnerOffers the library to one person by address (they accept first); refused while a partner, an offer or an invitation exists.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Request body
emailstringrequiredUp to 254 characters. Email address.
sinceintegeror null-10000000000000–10000000000000.
keepLocationboolean
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.403Shared albums are for the person signed in.403Sharing isn't available to the phone assistant.403Sharing is changed by you, not by the assistant.403Missing scope sharing:write
curl -X POST 'https://api.cactive.com.au/v1/me/photos/partner' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"email": "person@example.com"
}'Response 201
{
kind: "grant"
grant: {
resource: string
principal: string
kind: "user" | "key" | "org" | "link" | "group" | "circle"
name: null | string
email: null | string
deleted: boolean
source: string
status: "active" | "pending"
capabilities: string[]
preset: null | string
notBefore: null | number
expiresAt: null | number
schedule: null | {
tz: string
windows: {
days?: ("sun" | "mon" | "tue" | "wed" | "thu" | "fri" | "sat")[]
from: string
to: string
dates?: string[]
}[]
}
params: null | {
[key: string]: boolean | string | number
}
assistants: boolean
approval: string[]
includeGuests: boolean
external: boolean
blocked: null | string
acceptBy: null | number
pausedUntil: null | number
grantedBy: {
id: string
name: null | string
}
createdAt: string
updatedAt: string
rev: number
}
} | {
kind: "invitation"
invitation: {
invitationId: string
principal: string
email: string
capabilities: string[]
preset: null | string
notBefore: null | number
expiresAt: null | number
schedule: null | {
tz: string
windows: {
days?: ("sun" | "mon" | "tue" | "wed" | "thu" | "fri" | "sat")[]
from: string
to: string
dates?: string[]
}[]
}
params: null | {
[key: string]: boolean | string | number
}
assistants: boolean
approval: string[]
offerEnds: number
invitedBy: {
id: string
name: null | string
}
createdAt: string
}
}/ v1/ me/ photos/ partnerFrom when the partner sees photos (null: all) and whether they see where they were taken.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Request body
sinceintegeror null-10000000000000–10000000000000.
keepLocationboolean
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.403Shared albums are for the person signed in.403Sharing isn't available to the phone assistant.403Sharing is changed by you, not by the assistant.403Missing scope sharing:write
curl -X PATCH 'https://api.cactive.com.au/v1/me/photos/partner' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"since": 1,
"keepLocation": true
}'Response 200
{
keepLocation: boolean
since?: number
}/ v1/ me/ photos/ partnerEnds partner sharing at once (the partner, an offer or an invitation).
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.403Shared albums are for the person signed in.403Sharing isn't available to the phone assistant.403Sharing is changed by you, not by the assistant.403Missing scope sharing:write
curl -X DELETE 'https://api.cactive.com.au/v1/me/photos/partner' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
stopped: number
}/ v1/ me/ photos/ partners/ :userIdA page of a partner's library, newest first (5-minute links, no metadata; locations only if the owner shows them).
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
userIdA member's user id (
usr_…).
Query parameters
cursorstringUp to 2,000 characters.
limitinteger1–500. Coerced from a string.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.403Shared albums are for the person signed in.403Sharing isn't available to the phone assistant.403Sharing is changed by you, not by the assistant.403Missing scope sharing:read
curl 'https://api.cactive.com.au/v1/me/photos/partners/{userId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
owner: {
userId: string
name: null | string
}
since?: number
photos: {
photoId: string
kind: "raw" | "video" | "live" | "photo"
name: string
takenAt: number
width?: number
height?: number
duration?: number
thumbUrl?: string
location?: {
lat: number
lon: number
}
}[]
cursor?: string
}/ v1/ me/ photos/ partners/ :userId/ photos/ :photoIdOne of a partner's photos: its preview or video, and the original with download=1 (cleaned unless locations show).
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
userIdA member's user id (
usr_…).photoIdPhoto id: the photo's file in Drive (
fil_…).
Query parameters
download"0" | "1"
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.403Shared albums are for the person signed in.403Sharing isn't available to the phone assistant.403Sharing is changed by you, not by the assistant.403Missing scope sharing:read
curl 'https://api.cactive.com.au/v1/me/photos/partners/{userId}/photos/{photoId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
name: string
previewUrl?: string
videoUrl?: string
motionUrl?: string
downloadUrl?: string
location?: {
lat: number
lon: number
}
}/ v1/ me/ photos/ partners/ :userId/ leaveThe partner stops seeing the library.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
userIdA member's user id (
usr_…).
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.403Shared albums are for the person signed in.403Sharing isn't available to the phone assistant.403Sharing is changed by you, not by the assistant.403Missing scope sharing:write
curl -X POST 'https://api.cactive.com.au/v1/me/photos/partners/{userId}/leave' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
left: true
}/ v1/ me/ photos/ linksLinks anyone can open: albums and chosen photos.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl 'https://api.cactive.com.au/v1/me/photos/links' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
links: {
linkId: string
url: string
albumId?: string
photoCount?: number
title: string
keepLocation: boolean
download: boolean
expiresAt?: number
hasPassword: boolean
visits: number
lastVisitAt?: number
createdAt: number
}[]
}/ v1/ me/ photos/ linksA link to an album or to chosen photos: view only, locations removed unless keepLocation, optional expiry and password.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Request body
albumIdstring3–64 characters.
photoIdsstring[]1–500 items. Each 3–64 characters.
titlestringUp to 200 characters.
keepLocationbooleandownloadbooleanexpiresAtinteger> 0.
passwordstring4–200 characters.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl -X POST 'https://api.cactive.com.au/v1/me/photos/links' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"albumId": "<albumId>",
"photoIds": [
"example"
],
"title": "Example"
}'Response 201
{
link: {
linkId: string
url: string
albumId?: string
photoCount?: number
title: string
keepLocation: boolean
download: boolean
expiresAt?: number
hasPassword: boolean
visits: number
lastVisitAt?: number
createdAt: number
}
}/ v1/ me/ photos/ links/ :linkIdChanges a link: password null removes it; rotate makes a new address (the old one stops working).
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
linkIdLink id (
ilk_…for issue links,irl_…for remote links,plk_…for Photos links,lnk_…for sharing links and a drive's share links: not the link's secret).
Request body
titlestringUp to 200 characters.
keepLocationbooleandownloadbooleanexpiresAtintegeror null> 0.
passwordstringor null4–200 characters.
rotateboolean
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl -X PATCH 'https://api.cactive.com.au/v1/me/photos/links/{linkId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"title": "Example",
"keepLocation": true,
"download": true
}'Response 200
{
link: {
linkId: string
url: string
albumId?: string
photoCount?: number
title: string
keepLocation: boolean
download: boolean
expiresAt?: number
hasPassword: boolean
visits: number
lastVisitAt?: number
createdAt: number
}
}/ v1/ me/ photos/ links/ :linkIdTurns a link off: it stops working at once.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
linkIdLink id (
ilk_…for issue links,irl_…for remote links,plk_…for Photos links,lnk_…for sharing links and a drive's share links: not the link's secret).
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl -X DELETE 'https://api.cactive.com.au/v1/me/photos/links/{linkId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 204 with no body
/ v1/ me/ photos/ uploads/ checkWhich of these SHA-256 hashes are already in the library (skip uploading them).
- Auth
- A person's token or an API key, as Authorization: Bearer.
Request body
hashesstring[]required1–1,000 items. Each matches
^[0-9a-f]{64}$.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.403This token can't do that (it needs photos:upload).
curl -X POST 'https://api.cactive.com.au/v1/me/photos/uploads/check' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"hashes": [
"example"
]
}'Response 200
{
existing: {
[key: string]: string
}
}/ v1/ me/ photos/ uploadsStarts an upload into the library: answers Drive's part links (PUT each part, then complete), or duplicate with the photo when sha256 is already there. singlePart (iPhone Shortcuts) sends the whole file to one link; its size may then be left out.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Request body
namestringrequired1–255 characters.
extstringUp to 10 characters.
sizeinteger≥ 0.
mimestringUp to 200 characters.
sha256stringMatches
^[0-9a-f]{64}$.takenAtintegeralbumIdstring3–64 characters.
pairWithstring3–64 characters.
singlePartbooleansource"web" | "shortcut" | "agent" | "edited" | "phone"
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.403This token can't do that (it needs photos:upload).
curl -X POST 'https://api.cactive.com.au/v1/me/photos/uploads' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"name": "Example"
}'Response 201
{
duplicate: false
uploadId: string
itemId: string
partSize: number
partCount: number
urls: {
[key: number]: string
}
contentType: string
name: string
} | {
duplicate: true
photo: {
photoId: string
kind: "raw" | "video" | "live" | "photo"
state: "main" | "archive" | "trash" | "motion"
name: string
mime: string
size: number
takenAt: number
day: string
width?: number
height?: number
duration?: number
codec?: string
favourite: boolean
thumbUrl?: string
located: boolean
pairId?: string
processed: boolean
trashedAt?: number
}
}/ v1/ me/ photos/ uploads/ :uploadId/ partsLinks for more parts of an upload (an hour each).
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
uploadIdUpload id (
dup_…), from starting the upload.
Request body
partNumbersinteger[]required1–100 items. Each 1–10000.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.403This token can't do that (it needs photos:upload).
curl -X POST 'https://api.cactive.com.au/v1/me/photos/uploads/{uploadId}/parts' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"partNumbers": [
1
]
}'Response 200
{
urls: {
[key: number]: string
}
expiresIn: number
}/ v1/ me/ photos/ uploads/ :uploadIdThe parts already stored (resuming).
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
uploadIdUpload id (
dup_…), from starting the upload.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.403This token can't do that (it needs photos:upload).
curl 'https://api.cactive.com.au/v1/me/photos/uploads/{uploadId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
uploadId: string
name: string
size: number
partSize: number
partCount: number
parts: {
partNumber: number
size?: number
}[]
expiresAt: number
}/ v1/ me/ photos/ uploads/ :uploadId/ completeFinishes an upload: the photo (details and previews follow in the background), or the one it duplicates.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
uploadIdUpload id (
dup_…), from starting the upload.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.403This token can't do that (it needs photos:upload).
curl -X POST 'https://api.cactive.com.au/v1/me/photos/uploads/{uploadId}/complete' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
photo: {
photoId: string
kind: "raw" | "video" | "live" | "photo"
state: "main" | "archive" | "trash" | "motion"
name: string
mime: string
size: number
takenAt: number
day: string
width?: number
height?: number
duration?: number
codec?: string
favourite: boolean
thumbUrl?: string
located: boolean
pairId?: string
processed: boolean
trashedAt?: number
}
duplicate: boolean
}/ v1/ me/ photos/ uploads/ :uploadIdAbandons an upload and the parts it stored.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
uploadIdUpload id (
dup_…), from starting the upload.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.403This token can't do that (it needs photos:upload).
curl -X DELETE 'https://api.cactive.com.au/v1/me/photos/uploads/{uploadId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 204 with no body
/ v1/ me/ photos/ importsGoogle Takeout imports, newest first.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl 'https://api.cactive.com.au/v1/me/photos/imports' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
imports: {
importId: string
status: "queued" | "canceled" | "done" | "failed" | "running" | "uploading"
files: {
name: string
size: number
format: "zip" | "tgz"
from: "upload" | "drive"
uploaded: boolean
}[]
entries: number
processed: number
imported: number
duplicates: number
skipped: number
failed: number
albums: number
bytes: number
error?: string
problems: string[]
createdAt: number
startedAt?: number
finishedAt?: number
}[]
}/ v1/ me/ photos/ importsA Takeout import: archives to upload (files: name and size of each .zip or .tgz; answers an upload per file) or archives already in Drive (driveItemIds, personal files). Start it once they're uploaded.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Request body
filesobject[]1–100 items.
files[].namestringrequired1–255 characters.
files[].sizeintegerrequired1–107374182400.
driveItemIdsstring[]1–100 items. Each 3–64 characters.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl -X POST 'https://api.cactive.com.au/v1/me/photos/imports' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"files": [
{
"name": "Example",
"size": 1
}
],
"driveItemIds": [
"example"
]
}'Response 201
{
import: {
importId: string
status: "queued" | "canceled" | "done" | "failed" | "running" | "uploading"
files: {
name: string
size: number
format: "zip" | "tgz"
from: "upload" | "drive"
uploaded: boolean
}[]
entries: number
processed: number
imported: number
duplicates: number
skipped: number
failed: number
albums: number
bytes: number
error?: string
problems: string[]
createdAt: number
startedAt?: number
finishedAt?: number
}
uploads: {
index: number
partSize: number
partCount: number
urls?: {
[key: number]: string
}
parts?: {
partNumber: number
size?: number
}[]
}[]
}/ v1/ me/ photos/ imports/ :importIdAn import with the parts each of its uploads has stored (resuming).
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
importIdTakeout import id (
imp_…); underme/fooda Food import (fim_…); undervehiclesan import of a car's history (vim_…), as the imports list gives it.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl 'https://api.cactive.com.au/v1/me/photos/imports/{importId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
import: {
importId: string
status: "queued" | "canceled" | "done" | "failed" | "running" | "uploading"
files: {
name: string
size: number
format: "zip" | "tgz"
from: "upload" | "drive"
uploaded: boolean
}[]
entries: number
processed: number
imported: number
duplicates: number
skipped: number
failed: number
albums: number
bytes: number
error?: string
problems: string[]
createdAt: number
startedAt?: number
finishedAt?: number
}
uploads: {
index: number
partSize: number
partCount: number
urls?: {
[key: number]: string
}
parts?: {
partNumber: number
size?: number
}[]
}[]
}/ v1/ me/ photos/ imports/ :importId/ files/ :index/ partsLinks for the parts of one archive's upload (index: its place in files).
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
importIdTakeout import id (
imp_…); underme/fooda Food import (fim_…); undervehiclesan import of a car's history (vim_…), as the imports list gives it.indexThe attachment's position in the message, from 0; or a Takeout archive's place in its import's
files.
Request body
partNumbersinteger[]required1–100 items. Each 1–10000.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl -X POST 'https://api.cactive.com.au/v1/me/photos/imports/{importId}/files/{index}/parts' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"partNumbers": [
1
]
}'Response 200
{
urls: {
[key: number]: string
}
expiresIn: number
}/ v1/ me/ photos/ imports/ :importId/ startCompletes the archives' uploads and starts importing (in the background; re-imports skip what's there).
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
importIdTakeout import id (
imp_…); underme/fooda Food import (fim_…); undervehiclesan import of a car's history (vim_…), as the imports list gives it.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl -X POST 'https://api.cactive.com.au/v1/me/photos/imports/{importId}/start' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
import: {
importId: string
status: "queued" | "canceled" | "done" | "failed" | "running" | "uploading"
files: {
name: string
size: number
format: "zip" | "tgz"
from: "upload" | "drive"
uploaded: boolean
}[]
entries: number
processed: number
imported: number
duplicates: number
skipped: number
failed: number
albums: number
bytes: number
error?: string
problems: string[]
createdAt: number
startedAt?: number
finishedAt?: number
}
}/ v1/ me/ photos/ imports/ :importId/ cancelStops an import; what it imported stays.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
importIdTakeout import id (
imp_…); underme/fooda Food import (fim_…); undervehiclesan import of a car's history (vim_…), as the imports list gives it.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl -X POST 'https://api.cactive.com.au/v1/me/photos/imports/{importId}/cancel' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
import: {
importId: string
status: "queued" | "canceled" | "done" | "failed" | "running" | "uploading"
files: {
name: string
size: number
format: "zip" | "tgz"
from: "upload" | "drive"
uploaded: boolean
}[]
entries: number
processed: number
imported: number
duplicates: number
skipped: number
failed: number
albums: number
bytes: number
error?: string
problems: string[]
createdAt: number
startedAt?: number
finishedAt?: number
}
}/ v1/ me/ photos/ imports/ :importIdRemoves a finished, failed or canceled import (and its uploaded archives). Imported photos stay.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
importIdTakeout import id (
imp_…); underme/fooda Food import (fim_…); undervehiclesan import of a car's history (vim_…), as the imports list gives it.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl -X DELETE 'https://api.cactive.com.au/v1/me/photos/imports/{importId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 204 with no body
/ v1/ me/ photos/ tokensPersonal tokens for uploading (iPhone Shortcut, Mac sync) and reading (MCP).
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl 'https://api.cactive.com.au/v1/me/photos/tokens' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
tokens: {
tokenId: string
name: string
scopes: ("photos:upload" | "photos:read")[]
createdAt: number
lastUsedAt?: number
expiresAt?: number
}[]
}/ v1/ me/ photos/ tokensMakes a token; its secret is in the answer only.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Request body
namestringrequired1–100 characters.
scopes("photos:upload" | "photos:read")[]requiredAt least 1 item.
expiresAtinteger> 0.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl -X POST 'https://api.cactive.com.au/v1/me/photos/tokens' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"name": "Example",
"scopes": [
"photos:upload"
]
}'Response 201
{
token: {
tokenId: string
name: string
scopes: ("photos:upload" | "photos:read")[]
createdAt: number
lastUsedAt?: number
expiresAt?: number
}
secret: string
}/ v1/ me/ photos/ tokens/ :tokenIdRemoves a photo token: it stops working at once.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
tokenIdPhoto token id (
pht_…), not the token itself.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl -X DELETE 'https://api.cactive.com.au/v1/me/photos/tokens/{tokenId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 204 with no body
/ v1/ me/ photos/ exportsFull exports of the library: ZIPs of every original with an index of dates, places, albums and descriptions.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl 'https://api.cactive.com.au/v1/me/photos/exports' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
exports: {
exportId: string
status: "queued" | "ready" | "failed"
files: number
bytes: number
createdAt: number
expiresAt: number
archives: {
archiveId: string
name: string
status: string
files: number
bytes: number
url?: string
}[]
}[]
}/ v1/ me/ photos/ exportsStarts a full export of the library (originals as ZIPs of up to 10,000 files and 10 GB, with photos.json and albums.json). Ask for it until it's ready.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl -X POST 'https://api.cactive.com.au/v1/me/photos/exports' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 202
{
export: {
exportId: string
status: "queued" | "ready" | "failed"
files: number
bytes: number
createdAt: number
expiresAt: number
archives: {
archiveId: string
name: string
status: string
files: number
bytes: number
url?: string
}[]
}
}/ v1/ me/ photos/ exports/ :exportIdAn export with each ZIP's status and its download link (a day) once ready.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
exportIdAn export's id (
pex_…for Photos,oex_…for an organization).
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl 'https://api.cactive.com.au/v1/me/photos/exports/{exportId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
export: {
exportId: string
status: "queued" | "ready" | "failed"
files: number
bytes: number
createdAt: number
expiresAt: number
archives: {
archiveId: string
name: string
status: string
files: number
bytes: number
url?: string
}[]
}
}/ v1/ me/ photos/ logThe owner's personal log: every change and access (theirs, their tokens', link visitors').
- Auth
- A person's token or an API key, as Authorization: Bearer.
Query parameters
cursorstringUp to 2,000 characters.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl 'https://api.cactive.com.au/v1/me/photos/log' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
events: {
activityId: string
action: string
actorId: string
actorLabel?: string
at: number
detail: {
[key: string]: unknown
}
}[]
cursor?: string
}/ v1/ me/ photos/ accessWho can see what: links, tokens, and any of the library's files shared through Drive.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403Caity can look at your photos but not change them.403This token can't do that (it needs photos:read).403Photos are only for the person signed in, or their own photo token.
curl 'https://api.cactive.com.au/v1/me/photos/access' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
links: {
linkId: string
url: string
albumId?: string
photoCount?: number
title: string
keepLocation: boolean
download: boolean
expiresAt?: number
hasPassword: boolean
visits: number
lastVisitAt?: number
createdAt: number
}[]
tokens: {
tokenId: string
name: string
scopes: ("photos:upload" | "photos:read")[]
createdAt: number
lastUsedAt?: number
expiresAt?: number
}[]
partner: null | {
name: null | string
pending: boolean
}
driveShares: {
itemId: string
name: string
principalId: string
role: string
}[]
driveLinks: {
itemId: string
name: string
}[]
}