API reference
Sharing
/ v1/ sharing/ resources/ :rnWhat you hold on a resource and where it comes from (you). If you may share it, also who has access (each grant with its rev, preset, limits and whether the owner organization's policy blocks it), its links, invitations to addresses with no account, and the owner organization's policy. No access, or no such resource, is 404.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
rnA resource's name,
<app>:<type>:<id>(vehicles:vehicle:veh_…), URL-encoded (vehicles%3Avehicle%3Aveh_…). The owner's space is read from the stored resource, never from the name.
Errors
403Sharing isn't available to the phone assistant.403Sharing is changed by you, not by the assistant.403Name the chat's space in x-si-org: an organisation or personal.403You aren't a member of that organisation.403Sharing needs a signed-in person or an organisation's key.403Missing scope sharing:read
curl 'https://api.cactive.com.au/v1/sharing/resources/{rn}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
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?: ("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
}[]
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?: ("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
}[]
policy: null | {
externalSharing: "off" | "accounts" | "links"
allowedDomains: string[]
linkMaxDays: null | number
}
}/ v1/ sharing/ resources/ :rn/ grantsShares a resource with a person (by user id or email address), group, circle, organization or key: a preset or a list of capabilities, and optionally notBefore, expiresAt, a weekly schedule, params, assistants, approval and a message. You can give no more than you hold. 201 with { kind: "grant" } (pending when the person must accept) or, for an address with no account, { kind: "invitation" }, which becomes a pending grant when they sign up. 403 external_sharing_off when the owner organization's policy refuses it, 403 capability_not_held_to_grant for more than you hold, 429 past the daily limit.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
rnA resource's name,
<app>:<type>:<id>(vehicles:vehicle:veh_…), URL-encoded (vehicles%3Avehicle%3Aveh_…). The owner's space is read from the stored resource, never from the name.
Request body
principalobject | objectrequiredpresetstringUp to 32 characters.
capabilitiesstring[]1–32 items. Each up to 32 characters.
notBeforeinteger> 0.
expiresAtinteger> 0.
scheduleobjectschedule.tzstringrequired1–64 characters.
schedule.windows(object | object)[]required1–8 items.
paramsobjectKeys up to 32 characters. Values: string (up to 64 characters), number or boolean.
assistantsbooleanapprovalstring[]Up to 32 items. Each up to 32 characters.
includeGuestsbooleanmessagestringUp to 500 characters.
notifyboolean
Also checked: Unknown fields are rejected.
Errors
403Sharing isn't available to the phone assistant.403Sharing is changed by you, not by the assistant.403Name the chat's space in x-si-org: an organisation or personal.403You aren't a member of that organisation.403Sharing needs a signed-in person or an organisation's key.403Missing scope sharing:write
curl -X POST 'https://api.cactive.com.au/v1/sharing/resources/{rn}/grants' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"principal": {}
}'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/ sharing/ resources/ :rn/ grants/ :principalChanges a grant made directly: send the rev you read and the fields to change (null clears notBefore, expiresAt, schedule, params and approval; naming preset replaces the capabilities and settings). The result is held to the same rules as a new grant. 409 stale (with the grant as it is now) when someone changed it first. ?source= picks one when a principal holds several.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
rnA resource's name,
<app>:<type>:<id>(vehicles:vehicle:veh_…), URL-encoded (vehicles%3Avehicle%3Aveh_…). The owner's space is read from the stored resource, never from the name.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.
Query parameters
sourcestringUp to 80 characters.
Request body
revintegerrequired≥ 1.
presetstringUp to 32 characters.
capabilitiesstring[]1–32 items. Each up to 32 characters.
notBeforeintegeror null> 0.
expiresAtintegeror null> 0.
scheduleobjector nullschedule.tzstringrequired1–64 characters.
schedule.windows(object | object)[]required1–8 items.
paramsobjector nullKeys up to 32 characters. Values: string (up to 64 characters), number or boolean.
assistantsbooleanapprovalstring[]or nullUp to 32 items. Each up to 32 characters.
includeGuestsbooleannotifyboolean
Also checked: Unknown fields are rejected.
Errors
403Sharing isn't available to the phone assistant.403Sharing is changed by you, not by the assistant.403Name the chat's space in x-si-org: an organisation or personal.403You aren't a member of that organisation.403Sharing needs a signed-in person or an organisation's key.403Missing scope sharing:write
curl -X PATCH 'https://api.cactive.com.au/v1/sharing/resources/{rn}/grants/{principal}' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"rev": 1
}'Response 200
{
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/ sharing/ resources/ :rn/ grants/ :principalEnds a grant, or withdraws an invitation, for those who may share the resource, and for the grantee leaving. ?source= picks one when a principal holds several; ?rev= makes it conditional (409 stale). The person is told unless ?notify=false. 204.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
rnA resource's name,
<app>:<type>:<id>(vehicles:vehicle:veh_…), URL-encoded (vehicles%3Avehicle%3Aveh_…). The owner's space is read from the stored resource, never from the name.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.
Query parameters
sourcestringUp to 80 characters.
revinteger≥ 1. Coerced from a string.
notify"true" | "false"
Errors
403Sharing isn't available to the phone assistant.403Sharing is changed by you, not by the assistant.403Name the chat's space in x-si-org: an organisation or personal.403You aren't a member of that organisation.403Sharing needs a signed-in person or an organisation's key.403Missing scope sharing:write
curl -X DELETE 'https://api.cactive.com.au/v1/sharing/resources/{rn}/grants/{principal}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 204 with no body
/ v1/ sharing/ resources/ :rn/ grants/ :principal/ pausePauses a grant made directly: { until } (epoch seconds in the future, or forever until it is resumed), with an optional rev. Paused, it gives only what stays on outside a schedule (a car's name and status, not where it is or whether it moves; a person's location gives nothing), and the grantee gets no notice; their requests answer 403 paused. For whoever may change the grant. Audited as share.pause.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
rnA resource's name,
<app>:<type>:<id>(vehicles:vehicle:veh_…), URL-encoded (vehicles%3Avehicle%3Aveh_…). The owner's space is read from the stored resource, never from the name.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
untilinteger | "forever"required> 0, ≤ 253402300799.
revinteger≥ 1.
Also checked: Unknown fields are rejected.
Errors
403Sharing isn't available to the phone assistant.403Sharing is changed by you, not by the assistant.403Name the chat's space in x-si-org: an organisation or personal.403You aren't a member of that organisation.403Sharing needs a signed-in person or an organisation's key.403Missing scope sharing:write
curl -X PUT 'https://api.cactive.com.au/v1/sharing/resources/{rn}/grants/{principal}/pause' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"until": 1
}'Response 200
{
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/ sharing/ resources/ :rn/ grants/ :principal/ pauseResumes a paused grant at once. Audited as share.resume.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
rnA resource's name,
<app>:<type>:<id>(vehicles:vehicle:veh_…), URL-encoded (vehicles%3Avehicle%3Aveh_…). The owner's space is read from the stored resource, never from the name.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
403Sharing isn't available to the phone assistant.403Sharing is changed by you, not by the assistant.403Name the chat's space in x-si-org: an organisation or personal.403You aren't a member of that organisation.403Sharing needs a signed-in person or an organisation's key.403Missing scope sharing:write
curl -X DELETE 'https://api.cactive.com.au/v1/sharing/resources/{rn}/grants/{principal}/pause' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
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/ sharing/ resources/ :rn/ invitations/ :invitationIdWithdraws an invitation to an address with no account, by its id (the address never goes in a URL), for its maker, the owner and role holders. 204.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
rnA resource's name,
<app>:<type>:<id>(vehicles:vehicle:veh_…), URL-encoded (vehicles%3Avehicle%3Aveh_…). The owner's space is read from the stored resource, never from the name.invitationIdAn invitation's id (
gin_…), asGET /v1/sharing/resources/:rnlists it: a share waiting for an address with no account.
Errors
403Sharing isn't available to the phone assistant.403Sharing is changed by you, not by the assistant.403Name the chat's space in x-si-org: an organisation or personal.403You aren't a member of that organisation.403Sharing needs a signed-in person or an organisation's key.403Missing scope sharing:write
curl -X DELETE 'https://api.cactive.com.au/v1/sharing/resources/{rn}/invitations/{invitationId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 204 with no body
/ v1/ sharing/ resources/ :rn/ linksMakes a link to a resource: an audience (anyone, signed_in, or org for the owner organization's members), a preset or capabilities the type lets a link carry, an expiresAt within the longest the type allows, and an optional password. 201 with the link and its url, which is shown once and cannot be read again.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
rnA resource's name,
<app>:<type>:<id>(vehicles:vehicle:veh_…), URL-encoded (vehicles%3Avehicle%3Aveh_…). The owner's space is read from the stored resource, never from the name.
Request body
audience"anyone" | "signed_in" | "org"requiredpresetstringUp to 32 characters.
capabilitiesstring[]1–32 items. Each up to 32 characters.
expiresAtinteger> 0.
passwordstringUp to 128 characters.
Also checked: Unknown fields are rejected.
Errors
403Sharing isn't available to the phone assistant.403Sharing is changed by you, not by the assistant.403Name the chat's space in x-si-org: an organisation or personal.403You aren't a member of that organisation.403Sharing needs a signed-in person or an organisation's key.403Missing scope sharing:write
curl -X POST 'https://api.cactive.com.au/v1/sharing/resources/{rn}/links' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"audience": "anyone"
}'Response 201
{
link: {
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
}
url: string
}/ v1/ sharing/ links/ :linkIdEnds a link and the access it gave. The person who made it, or anyone who may share the resource. 204; a link that isn't there (or isn't yours to see) is 404.
- 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
403Sharing isn't available to the phone assistant.403Sharing is changed by you, not by the assistant.403Name the chat's space in x-si-org: an organisation or personal.403You aren't a member of that organisation.403Sharing needs a signed-in person or an organisation's key.403Missing scope sharing:write
curl -X DELETE 'https://api.cactive.com.au/v1/sharing/links/{linkId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 204 with no body
/ v1/ sharing/ resources/ :rn/ checkWhether a person (principal=user:usr_…) holds a capability on the resource and where it comes from, for those who may share it and for holders of tenant:read in the owner organization. Nothing is audited: it is a question, not a use.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
rnA resource's name,
<app>:<type>:<id>(vehicles:vehicle:veh_…), URL-encoded (vehicles%3Avehicle%3Aveh_…). The owner's space is read from the stored resource, never from the name.
Query parameters
principalstringrequired1–140 characters.
capabilitystringrequired1–32 characters.
Errors
403Sharing isn't available to the phone assistant.403Sharing is changed by you, not by the assistant.403Name the chat's space in x-si-org: an organisation or personal.403You aren't a member of that organisation.403Sharing needs a signed-in person or an organisation's key.403Missing scope sharing:read
curl 'https://api.cactive.com.au/v1/sharing/resources/{rn}/check?principal=example&capability=example' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
allowed: boolean
status: number
code: null | string
reason: null | string
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?: ("sun" | "mon" | "tue" | "wed" | "thu" | "fri" | "sat")[]
from: string
to: string
dates?: string[]
}[]
}
approval?: string[]
assistants?: boolean
paused?: true
}[]
}/ v1/ me/ sharing/ outWhat you share from your Personal space: the grants (newest first, paged by cursor) and, on the first page, your links.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Query parameters
cursorstringUp to 2,000 characters.
limitinteger1–100. Coerced from a string.
Errors
403Sharing isn't available to the phone assistant.403Sharing is changed by you, not by the assistant.403Name the chat's space in x-si-org: an organisation or personal.403You aren't a member of that organisation.403Sharing needs a signed-in person or an organisation's key.403Missing scope sharing:read
curl 'https://api.cactive.com.au/v1/me/sharing/out' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
grants: {
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
}[]
links: {
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
}[]
cursor: null | string
}/ v1/ me/ sharing/ outWhat you share from your Personal space: the grants (newest first, paged by cursor) and, on the first page, your links.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Query parameters
cursorstringUp to 2,000 characters.
limitinteger1–100. Coerced from a string.
Errors
403Sharing isn't available to the phone assistant.403Sharing is changed by you, not by the assistant.403Name the chat's space in x-si-org: an organisation or personal.403You aren't a member of that organisation.403Sharing needs a signed-in person or an organisation's key.403Missing scope sharing:read
curl 'https://api.cactive.com.au/v1/me/sharing/out' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
grants: {
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
}[]
links: {
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
}[]
cursor: null | string
}