API Reference

activities

12 endpoints across 2 paths

  • /api/v1/activities
  • /api/v1/organizations

/api/v1/activities

GET/api/v1/activities/{activity_slug}

Get Activity

Get an activity by slug (or uuid, until v1 is frozen).

Readable by any caller holding activity:read: an activity carries no draft or withdrawn state, so there is nothing about it to withhold, and shareable activity links depend on it.

Path parameters

activity_slug*string

Query parameters

default_backendstring

default: "primary"

Responses

200Successful Response
FieldTypeDescription
requires_ticketboolean

Whether the ticket gate is on: entry needs a valid ticket from `ticket_template_uuid`. A switch beside the ticket, so the gate can be turned off and on again without losing which ticket it checks. It cannot be on with no ticket named

default: false

ticket_template_uuidstring | null

The reward template whose valid tickets the gate accepts, or null for none named

required_entitlementstring | null

The membership entitlement a person needs to enter at all: `member` for any active membership, a tier's own key for that capability, or null for anyone

max_attendeesinteger | null

How many seats there are, or null for uncapped. A ticket issued for the session takes a seat, and a walk-in takes one when admitted

≥ 1

enforces_checkin_windowboolean

Whether the start and end times refuse a tap outside them (a ticketed event: you cannot check into last night's concert) or only describe when it was meant to happen (attendance tracking, where refusing a late arrival records nothing and no record reads as not having come)

default: true

allow_reentryboolean

Whether a repeat tap by someone already admitted re-admits them (a recurring-access door) or is refused as already here (an event)

default: false

admits_frozen_cardsboolean

Whether a card its holder or issuer has frozen is still admitted. False refuses it as `card_frozen`: freezing usually means the card is lost, and whoever found it would enter as its owner. True admits it and flags the presence with `disputed_reason: card_frozen` for the organizer to keep or void, for a door where a card frozen by mistake should not hold anyone up. Either way the owner can check in with another identifier

default: false

uuid*string
slug*string
name*string
descriptionstring | null
organization_uuid*string
image_file_uuidstring | null
image_file_urlstring | null
website_urlstring | null
additional_dataobject | null
created_at*string (date-time)
updated_atstring (date-time) | null
start_timestring (date-time) | null
end_timestring (date-time) | null
is_session_checkin_openboolean

The master switch: while false, every session of the activity is closed to check-in, whatever its own switch says

default: true

cancelled_atstring (date-time) | null

When it was cancelled, or null. A cancelled session admits nobody and takes no new seats, and is kept rather than deleted because its attendance and tickets are a record

timezonestring | null
401Authentication failed
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

403Insufficient permissions
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

404Resource not found
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

422Validation error
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

Example request

curl -X GET "https://api.davi.social/api/v1/activities/{activity_slug}" \
  -H "Authorization: Bearer <token>"
PATCH/api/v1/activities/{activity_slug}

Update Activity

Update an activity. Only the fields sent change.

The activity's settings (ticket gate, entitlement, capacity, window, re-entry) are the defaults a new session is created with. Changing them changes no existing session unless apply_to_upcoming_sessions is set, in which case the settings this request changes are applied to every session of the activity that has not finished, and sessions_updated says how many that was. A finished session is never changed.

The ticket gate cannot be on without a ticket named, on the activity or on any session the change reaches; such a request answers 400 and changes nothing.

Requires an org-scoped token for the activity's organization.

Path parameters

activity_slug*string

Query parameters

default_backendstring

default: "primary"

Request body*application/json

FieldTypeDescription
requires_ticketboolean | null

Whether the ticket gate is on: entry needs a valid ticket from `ticket_template_uuid`. A switch beside the ticket, so the gate can be turned off and on again without losing which ticket it checks. It cannot be on with no ticket named

ticket_template_uuidstring | string (uuid) | null

The reward template whose valid tickets the gate accepts, or null for none named

required_entitlementstring | null

The membership entitlement a person needs to enter at all: `member` for any active membership, a tier's own key for that capability, or null for anyone

max_attendeesinteger | null

How many seats there are, or null for uncapped. A ticket issued for the session takes a seat, and a walk-in takes one when admitted

≥ 1

enforces_checkin_windowboolean | null

Whether the start and end times refuse a tap outside them (a ticketed event: you cannot check into last night's concert) or only describe when it was meant to happen (attendance tracking, where refusing a late arrival records nothing and no record reads as not having come)

allow_reentryboolean | null

Whether a repeat tap by someone already admitted re-admits them (a recurring-access door) or is refused as already here (an event)

admits_frozen_cardsboolean | null

Whether a card its holder or issuer has frozen is still admitted. False refuses it as `card_frozen`: freezing usually means the card is lost, and whoever found it would enter as its owner. True admits it and flags the presence with `disputed_reason: card_frozen` for the organizer to keep or void, for a door where a card frozen by mistake should not hold anyone up. Either way the owner can check in with another identifier

apply_to_upcoming_sessionsboolean

Also apply the settings this request changes to every session of the activity that has not finished. A finished session is never changed: its attendance was recorded under the settings it had

default: false

confirm_stranding_holdersboolean

Go ahead with changing the ticket of a session people already hold it for. Without it such a change answers `409 stranding_holders`: the holders are left with no seat and no way in

default: false

namestring | null

Name of the activity

descriptionstring | null

Description of the activity

image_file_uuidstring | string (uuid) | null

UUID of the image file associated with the activity

website_urlstring | null

Website URL for the activity

additional_dataobject | null

Additional JSON data for the activity

start_timestring (date-time) | null

Activity start time (for check-in validation)

end_timestring (date-time) | null

Activity end time (for check-in validation)

is_session_checkin_openboolean | null

Master switch for session check-in (False = all session check-ins closed)

timezonestring | null

IANA zone this activity's sessions run in, e.g. `Asia/Manila`, overriding the organization's. Times are always stored and returned in UTC; this says which wall clock they were set against. Null inherits the organization's zone, which is the usual case — set this only for an activity that runs somewhere else

Responses

200Successful Response
FieldTypeDescription
requires_ticketboolean

Whether the ticket gate is on: entry needs a valid ticket from `ticket_template_uuid`. A switch beside the ticket, so the gate can be turned off and on again without losing which ticket it checks. It cannot be on with no ticket named

default: false

ticket_template_uuidstring | null

The reward template whose valid tickets the gate accepts, or null for none named

required_entitlementstring | null

The membership entitlement a person needs to enter at all: `member` for any active membership, a tier's own key for that capability, or null for anyone

max_attendeesinteger | null

How many seats there are, or null for uncapped. A ticket issued for the session takes a seat, and a walk-in takes one when admitted

≥ 1

enforces_checkin_windowboolean

Whether the start and end times refuse a tap outside them (a ticketed event: you cannot check into last night's concert) or only describe when it was meant to happen (attendance tracking, where refusing a late arrival records nothing and no record reads as not having come)

default: true

allow_reentryboolean

Whether a repeat tap by someone already admitted re-admits them (a recurring-access door) or is refused as already here (an event)

default: false

admits_frozen_cardsboolean

Whether a card its holder or issuer has frozen is still admitted. False refuses it as `card_frozen`: freezing usually means the card is lost, and whoever found it would enter as its owner. True admits it and flags the presence with `disputed_reason: card_frozen` for the organizer to keep or void, for a door where a card frozen by mistake should not hold anyone up. Either way the owner can check in with another identifier

default: false

uuid*string
slug*string
name*string
descriptionstring | null
organization_uuid*string
image_file_uuidstring | null
image_file_urlstring | null
website_urlstring | null
additional_dataobject | null
created_at*string (date-time)
updated_atstring (date-time) | null
start_timestring (date-time) | null
end_timestring (date-time) | null
is_session_checkin_openboolean

The master switch: while false, every session of the activity is closed to check-in, whatever its own switch says

default: true

cancelled_atstring (date-time) | null

When it was cancelled, or null. A cancelled session admits nobody and takes no new seats, and is kept rather than deleted because its attendance and tickets are a record

timezonestring | null
sessions_updatedinteger | null

How many upcoming sessions took the changed settings, when `apply_to_upcoming_sessions` was set; null when it was not

400Invalid request
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

401Authentication failed
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

403Insufficient permissions
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

404Resource not found
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

422Validation error
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

Example request

curl -X PATCH "https://api.davi.social/api/v1/activities/{activity_slug}" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{ /* request body */ }'
DELETE/api/v1/activities/{activity_slug}

Delete Activity

Delete an activity nobody has attended.

An activity anyone has attended, at a session or against the activity itself, answers 409 has_attendance; one with a session whose ticket has been issued answers 409 has_tickets, and one with rewards scoped to it 409 has_rewards: people may hold them. Cancel it instead. One with a session that a session outside it requires attending first answers 409 has_dependents.

Requires an org-scoped token for the activity's organization.

Path parameters

activity_slug*string

Query parameters

default_backendstring

default: "primary"

Responses

200Successful Response
FieldTypeDescription
message*string

Success or status message

401Authentication failed
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

403Insufficient permissions
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

404Resource not found
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

422Validation error
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

Example request

curl -X DELETE "https://api.davi.social/api/v1/activities/{activity_slug}" \
  -H "Authorization: Bearer <token>"
GET/api/v1/activities/{activity_slug}/attendees

List Activity Attendees

List all attendees across all sessions of an activity.

Path parameters

activity_slug*string

Query parameters

include_proofboolean

Include proof transaction info in response

default: false

default_backendstring

default: "primary"

pageinteger

default: 1 · ≥ 1

page_sizeinteger

default: 20 · ≥ 1 · ≤ 100

sort_bystring | null
sort_orderstring

default: "asc"

Responses

200Successful Response
FieldTypeDescription
total_items*integer

Total number of items available

total_pages*integer

Total number of pages available

current_page*integer

Current page number

items*ActivityAttendeeResponse[]

List of items on the current page

array items · ActivityAttendeeResponse

FieldTypeDescription
uuid*string
activity_uuidstring | null

Denormalized from the session, so it is null for an attendee of a session that stands alone

session_uuidstring | null
wallet_address*string
user_uuidstring | null
status*enum
sourceenum

Who produced the record: `door` (admitted at a door), `self` (the person checked themselves in) or `operator` (a correction)

default: "door"

recorded_by_user_uuidstring | null

The operator who last changed the record, for `operator` rows

reasonstring | null

Why an operator recorded or voided it

disputed_reasonstring | null

For a presence a door recorded offline that the server would have refused, why: one of the `/admit` `blocked_reason` values, or `ticket_required`, or `ledger_unavailable` when its ticket could not be checked. The presence stands until an operator keeps it (recording it `attended` clears this) or voids it

registered_at*string (date-time)
attended_atstring (date-time) | null
last_admitted_atstring (date-time) | null

The latest admission: the check-in, then each re-entry where the session allows re-entry

additional_dataobject | null
created_at*string (date-time)
updated_atstring (date-time) | null
usernamestring | null
display_namestring | null
avatar_urlstring | null
proof_tx_idstring | null
proof_statusstring | null
proof_verifiedboolean | null
proof_tx_hashstring | null
proof_amountnumber | null
401Authentication failed
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

403Insufficient permissions
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

422Validation error
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

Example request

curl -X GET "https://api.davi.social/api/v1/activities/{activity_slug}/attendees" \
  -H "Authorization: Bearer <token>"
POST/api/v1/activities/{activity_slug}/cancellation

Cancel Activity

Cancel an activity, closing every session under it and keeping the record.

Its sessions admit nobody while it is cancelled, whatever their own switches say; their attendance, tickets and reports stay.

Requires an org-scoped token for the activity's organization.

Path parameters

activity_slug*string

Query parameters

default_backendstring

default: "primary"

Responses

200The activity, cancelled
FieldTypeDescription
requires_ticketboolean

Whether the ticket gate is on: entry needs a valid ticket from `ticket_template_uuid`. A switch beside the ticket, so the gate can be turned off and on again without losing which ticket it checks. It cannot be on with no ticket named

default: false

ticket_template_uuidstring | null

The reward template whose valid tickets the gate accepts, or null for none named

required_entitlementstring | null

The membership entitlement a person needs to enter at all: `member` for any active membership, a tier's own key for that capability, or null for anyone

max_attendeesinteger | null

How many seats there are, or null for uncapped. A ticket issued for the session takes a seat, and a walk-in takes one when admitted

≥ 1

enforces_checkin_windowboolean

Whether the start and end times refuse a tap outside them (a ticketed event: you cannot check into last night's concert) or only describe when it was meant to happen (attendance tracking, where refusing a late arrival records nothing and no record reads as not having come)

default: true

allow_reentryboolean

Whether a repeat tap by someone already admitted re-admits them (a recurring-access door) or is refused as already here (an event)

default: false

admits_frozen_cardsboolean

Whether a card its holder or issuer has frozen is still admitted. False refuses it as `card_frozen`: freezing usually means the card is lost, and whoever found it would enter as its owner. True admits it and flags the presence with `disputed_reason: card_frozen` for the organizer to keep or void, for a door where a card frozen by mistake should not hold anyone up. Either way the owner can check in with another identifier

default: false

uuid*string
slug*string
name*string
descriptionstring | null
organization_uuid*string
image_file_uuidstring | null
image_file_urlstring | null
website_urlstring | null
additional_dataobject | null
created_at*string (date-time)
updated_atstring (date-time) | null
start_timestring (date-time) | null
end_timestring (date-time) | null
is_session_checkin_openboolean

The master switch: while false, every session of the activity is closed to check-in, whatever its own switch says

default: true

cancelled_atstring (date-time) | null

When it was cancelled, or null. A cancelled session admits nobody and takes no new seats, and is kept rather than deleted because its attendance and tickets are a record

timezonestring | null
400Invalid request
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

401Authentication failed
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

403Insufficient permissions
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

404Resource not found
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

422Validation error
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

Example request

curl -X POST "https://api.davi.social/api/v1/activities/{activity_slug}/cancellation" \
  -H "Authorization: Bearer <token>"
DELETE/api/v1/activities/{activity_slug}/cancellation

Reinstate Activity

Reinstate a cancelled activity. Its sessions' own switches decide again.

Requires an org-scoped token for the activity's organization.

Path parameters

activity_slug*string

Query parameters

default_backendstring

default: "primary"

Responses

200The activity, reinstated
FieldTypeDescription
requires_ticketboolean

Whether the ticket gate is on: entry needs a valid ticket from `ticket_template_uuid`. A switch beside the ticket, so the gate can be turned off and on again without losing which ticket it checks. It cannot be on with no ticket named

default: false

ticket_template_uuidstring | null

The reward template whose valid tickets the gate accepts, or null for none named

required_entitlementstring | null

The membership entitlement a person needs to enter at all: `member` for any active membership, a tier's own key for that capability, or null for anyone

max_attendeesinteger | null

How many seats there are, or null for uncapped. A ticket issued for the session takes a seat, and a walk-in takes one when admitted

≥ 1

enforces_checkin_windowboolean

Whether the start and end times refuse a tap outside them (a ticketed event: you cannot check into last night's concert) or only describe when it was meant to happen (attendance tracking, where refusing a late arrival records nothing and no record reads as not having come)

default: true

allow_reentryboolean

Whether a repeat tap by someone already admitted re-admits them (a recurring-access door) or is refused as already here (an event)

default: false

admits_frozen_cardsboolean

Whether a card its holder or issuer has frozen is still admitted. False refuses it as `card_frozen`: freezing usually means the card is lost, and whoever found it would enter as its owner. True admits it and flags the presence with `disputed_reason: card_frozen` for the organizer to keep or void, for a door where a card frozen by mistake should not hold anyone up. Either way the owner can check in with another identifier

default: false

uuid*string
slug*string
name*string
descriptionstring | null
organization_uuid*string
image_file_uuidstring | null
image_file_urlstring | null
website_urlstring | null
additional_dataobject | null
created_at*string (date-time)
updated_atstring (date-time) | null
start_timestring (date-time) | null
end_timestring (date-time) | null
is_session_checkin_openboolean

The master switch: while false, every session of the activity is closed to check-in, whatever its own switch says

default: true

cancelled_atstring (date-time) | null

When it was cancelled, or null. A cancelled session admits nobody and takes no new seats, and is kept rather than deleted because its attendance and tickets are a record

timezonestring | null
400Invalid request
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

401Authentication failed
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

403Insufficient permissions
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

404Resource not found
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

422Validation error
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

Example request

curl -X DELETE "https://api.davi.social/api/v1/activities/{activity_slug}/cancellation" \
  -H "Authorization: Bearer <token>"
GET/api/v1/activities/{activity_slug}/sessions

List Sessions

List all sessions for an activity.

Path parameters

activity_slug*string

Query parameters

default_backendstring

default: "primary"

pageinteger

default: 1 · ≥ 1

page_sizeinteger

default: 20 · ≥ 1 · ≤ 100

sort_bystring | null
sort_orderstring

default: "asc"

Responses

200Successful Response
FieldTypeDescription
total_items*integer

Total number of items available

total_pages*integer

Total number of pages available

current_page*integer

Current page number

items*SessionResponse[]

List of items on the current page

array items · SessionResponse

FieldTypeDescription
requires_ticketboolean

Whether the ticket gate is on: entry needs a valid ticket from `ticket_template_uuid`. A switch beside the ticket, so the gate can be turned off and on again without losing which ticket it checks. It cannot be on with no ticket named

default: false

ticket_template_uuidstring | null

The reward template whose valid tickets the gate accepts, or null for none named

required_entitlementstring | null

The membership entitlement a person needs to enter at all: `member` for any active membership, a tier's own key for that capability, or null for anyone

max_attendeesinteger | null

How many seats there are, or null for uncapped. A ticket issued for the session takes a seat, and a walk-in takes one when admitted

≥ 1

enforces_checkin_windowboolean

Whether the start and end times refuse a tap outside them (a ticketed event: you cannot check into last night's concert) or only describe when it was meant to happen (attendance tracking, where refusing a late arrival records nothing and no record reads as not having come)

default: true

allow_reentryboolean

Whether a repeat tap by someone already admitted re-admits them (a recurring-access door) or is refused as already here (an event)

default: false

admits_frozen_cardsboolean

Whether a card its holder or issuer has frozen is still admitted. False refuses it as `card_frozen`: freezing usually means the card is lost, and whoever found it would enter as its owner. True admits it and flags the presence with `disputed_reason: card_frozen` for the organizer to keep or void, for a door where a card frozen by mistake should not hold anyone up. Either way the owner can check in with another identifier

default: false

uuid*string
slug*string
activity_uuidstring | null

The activity this session is filed under, or null for one that stands alone. An activity groups sessions; the organization owns them, so a session without one is complete rather than orphaned

name*string
descriptionstring | null
start_time*string (date-time)
end_time*string (date-time)
is_checkin_openboolean

default: true

cancelled_atstring (date-time) | null

When it was cancelled, or null. A cancelled session admits nobody and takes no new seats, and is kept rather than deleted because its attendance and tickets are a record

required_prior_session_uuidstring | null
series_uuidstring | null

The schedule this session was created as part of, or null for one created on its own

sequence_number*integer
created_at*string (date-time)
updated_atstring (date-time) | null
401Authentication failed
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

403Insufficient permissions
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

422Validation error
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

Example request

curl -X GET "https://api.davi.social/api/v1/activities/{activity_slug}/sessions" \
  -H "Authorization: Bearer <token>"
POST/api/v1/activities/{activity_slug}/sessions

Create Session

Create a session of an activity.

The session starts with the activity's settings, and any setting the request names replaces that one. From then on the settings are the session's own: editing the activity later does not change them unless that edit asks to.

Requires an org-scoped token for the activity's organization.

Path parameters

activity_slug*string

Query parameters

default_backendstring

default: "primary"

Request body*application/json

FieldTypeDescription
requires_ticketboolean | null

Whether the ticket gate is on: entry needs a valid ticket from `ticket_template_uuid`. A switch beside the ticket, so the gate can be turned off and on again without losing which ticket it checks. It cannot be on with no ticket named

ticket_template_uuidstring | string (uuid) | null

The reward template whose valid tickets the gate accepts, or null for none named

required_entitlementstring | null

The membership entitlement a person needs to enter at all: `member` for any active membership, a tier's own key for that capability, or null for anyone

max_attendeesinteger | null

How many seats there are, or null for uncapped. A ticket issued for the session takes a seat, and a walk-in takes one when admitted

≥ 1

enforces_checkin_windowboolean | null

Whether the start and end times refuse a tap outside them (a ticketed event: you cannot check into last night's concert) or only describe when it was meant to happen (attendance tracking, where refusing a late arrival records nothing and no record reads as not having come)

allow_reentryboolean | null

Whether a repeat tap by someone already admitted re-admits them (a recurring-access door) or is refused as already here (an event)

admits_frozen_cardsboolean | null

Whether a card its holder or issuer has frozen is still admitted. False refuses it as `card_frozen`: freezing usually means the card is lost, and whoever found it would enter as its owner. True admits it and flags the presence with `disputed_reason: card_frozen` for the organizer to keep or void, for a door where a card frozen by mistake should not hold anyone up. Either way the owner can check in with another identifier

name*string

Name of the session (e.g., 'Day 1 - Morning')

descriptionstring | null

Session description

start_time*string (date-time)

Session start time

end_time*string (date-time)

Session end time

is_checkin_openboolean

Manual toggle for check-in

default: true

required_prior_session_uuidstring | string (uuid) | null

Another session of the same activity that must have been attended before this one admits anyone. None = no such gate

Responses

200Successful Response
FieldTypeDescription
requires_ticketboolean

Whether the ticket gate is on: entry needs a valid ticket from `ticket_template_uuid`. A switch beside the ticket, so the gate can be turned off and on again without losing which ticket it checks. It cannot be on with no ticket named

default: false

ticket_template_uuidstring | null

The reward template whose valid tickets the gate accepts, or null for none named

required_entitlementstring | null

The membership entitlement a person needs to enter at all: `member` for any active membership, a tier's own key for that capability, or null for anyone

max_attendeesinteger | null

How many seats there are, or null for uncapped. A ticket issued for the session takes a seat, and a walk-in takes one when admitted

≥ 1

enforces_checkin_windowboolean

Whether the start and end times refuse a tap outside them (a ticketed event: you cannot check into last night's concert) or only describe when it was meant to happen (attendance tracking, where refusing a late arrival records nothing and no record reads as not having come)

default: true

allow_reentryboolean

Whether a repeat tap by someone already admitted re-admits them (a recurring-access door) or is refused as already here (an event)

default: false

admits_frozen_cardsboolean

Whether a card its holder or issuer has frozen is still admitted. False refuses it as `card_frozen`: freezing usually means the card is lost, and whoever found it would enter as its owner. True admits it and flags the presence with `disputed_reason: card_frozen` for the organizer to keep or void, for a door where a card frozen by mistake should not hold anyone up. Either way the owner can check in with another identifier

default: false

uuid*string
slug*string
activity_uuidstring | null

The activity this session is filed under, or null for one that stands alone. An activity groups sessions; the organization owns them, so a session without one is complete rather than orphaned

name*string
descriptionstring | null
start_time*string (date-time)
end_time*string (date-time)
is_checkin_openboolean

default: true

cancelled_atstring (date-time) | null

When it was cancelled, or null. A cancelled session admits nobody and takes no new seats, and is kept rather than deleted because its attendance and tickets are a record

required_prior_session_uuidstring | null
series_uuidstring | null

The schedule this session was created as part of, or null for one created on its own

sequence_number*integer
created_at*string (date-time)
updated_atstring (date-time) | null
400Invalid request
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

401Authentication failed
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

403Insufficient permissions
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

409Resource already exists
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

422Validation error
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

Example request

curl -X POST "https://api.davi.social/api/v1/activities/{activity_slug}/sessions" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{ /* request body */ }'
GET/api/v1/activities/{activity_slug}/sessions/{session_slug}

Get Session

Get a specific session.

Path parameters

activity_slug*string
session_slug*string

Query parameters

default_backendstring

default: "primary"

Responses

200Successful Response
FieldTypeDescription
requires_ticketboolean

Whether the ticket gate is on: entry needs a valid ticket from `ticket_template_uuid`. A switch beside the ticket, so the gate can be turned off and on again without losing which ticket it checks. It cannot be on with no ticket named

default: false

ticket_template_uuidstring | null

The reward template whose valid tickets the gate accepts, or null for none named

required_entitlementstring | null

The membership entitlement a person needs to enter at all: `member` for any active membership, a tier's own key for that capability, or null for anyone

max_attendeesinteger | null

How many seats there are, or null for uncapped. A ticket issued for the session takes a seat, and a walk-in takes one when admitted

≥ 1

enforces_checkin_windowboolean

Whether the start and end times refuse a tap outside them (a ticketed event: you cannot check into last night's concert) or only describe when it was meant to happen (attendance tracking, where refusing a late arrival records nothing and no record reads as not having come)

default: true

allow_reentryboolean

Whether a repeat tap by someone already admitted re-admits them (a recurring-access door) or is refused as already here (an event)

default: false

admits_frozen_cardsboolean

Whether a card its holder or issuer has frozen is still admitted. False refuses it as `card_frozen`: freezing usually means the card is lost, and whoever found it would enter as its owner. True admits it and flags the presence with `disputed_reason: card_frozen` for the organizer to keep or void, for a door where a card frozen by mistake should not hold anyone up. Either way the owner can check in with another identifier

default: false

uuid*string
slug*string
activity_uuidstring | null

The activity this session is filed under, or null for one that stands alone. An activity groups sessions; the organization owns them, so a session without one is complete rather than orphaned

name*string
descriptionstring | null
start_time*string (date-time)
end_time*string (date-time)
is_checkin_openboolean

default: true

cancelled_atstring (date-time) | null

When it was cancelled, or null. A cancelled session admits nobody and takes no new seats, and is kept rather than deleted because its attendance and tickets are a record

required_prior_session_uuidstring | null
series_uuidstring | null

The schedule this session was created as part of, or null for one created on its own

sequence_number*integer
created_at*string (date-time)
updated_atstring (date-time) | null
401Authentication failed
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

403Insufficient permissions
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

404Resource not found
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

422Validation error
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

Example request

curl -X GET "https://api.davi.social/api/v1/activities/{activity_slug}/sessions/{session_slug}" \
  -H "Authorization: Bearer <token>"
POST/api/v1/activities/{activity_slug}/sessions/batch

Create Sessions Batch

Create many of an activity's sessions at once.

For a schedule rather than an event: a course that meets daily, a workspace that opens every weekday, a conference with parallel tracks. Creating those one at a time means re-entering the capacity, ticket and entitlement settings for each, which is where they drift apart.

Each occurrence carries only its name and its times. Everything else in the request applies to all of them: the activity's settings, with any the request names on top. A session that needs its own capacity or its own gate is one to create singly and adjust.

Recurrence is expanded by the caller. The request takes the dates, not a rule, so cancelling one meeting is deleting one session rather than maintaining an exception list.

The sessions are grouped as a schedule, returned as series, which is how they are edited together afterwards — raising a capacity across a term is one request against the schedule rather than one per meeting. Each session stays an ordinary row: the schedule groups them, it does not own them.

Atomic: an occurrence whose end_time is not after its start_time, or a batch over 200 occurrences, is refused before anything is written — a partly-created schedule is harder to repair than a rejected one.

Sessions are numbered continuing from the activity's existing highest sequence, in the order given. Requires an org-scoped token for the activity's organization.

Charged to the expensive rate-limit bucket, once per call rather than per occurrence — so a full schedule costs one slot, and the 200 cap is what bounds a single request.

Path parameters

activity_slug*string

Query parameters

default_backendstring

default: "primary"

Request body*application/json

FieldTypeDescription
requires_ticketboolean | null

Whether the ticket gate is on: entry needs a valid ticket from `ticket_template_uuid`. A switch beside the ticket, so the gate can be turned off and on again without losing which ticket it checks. It cannot be on with no ticket named

ticket_template_uuidstring | string (uuid) | null

The reward template whose valid tickets the gate accepts, or null for none named

required_entitlementstring | null

The membership entitlement a person needs to enter at all: `member` for any active membership, a tier's own key for that capability, or null for anyone

max_attendeesinteger | null

How many seats there are, or null for uncapped. A ticket issued for the session takes a seat, and a walk-in takes one when admitted

≥ 1

enforces_checkin_windowboolean | null

Whether the start and end times refuse a tap outside them (a ticketed event: you cannot check into last night's concert) or only describe when it was meant to happen (attendance tracking, where refusing a late arrival records nothing and no record reads as not having come)

allow_reentryboolean | null

Whether a repeat tap by someone already admitted re-admits them (a recurring-access door) or is refused as already here (an event)

admits_frozen_cardsboolean | null

Whether a card its holder or issuer has frozen is still admitted. False refuses it as `card_frozen`: freezing usually means the card is lost, and whoever found it would enter as its owner. True admits it and flags the presence with `disputed_reason: card_frozen` for the organizer to keep or void, for a door where a card frozen by mistake should not hold anyone up. Either way the owner can check in with another identifier

series_namestring | null

What to call the schedule these sessions form, e.g. `Math 101`. The sessions keep their own dated names; this is the group they are edited as afterwards. Defaults to the first occurrence's name

occurrences*SessionOccurrence[]

The sessions to create, each with its own name and times

array items · SessionOccurrence

FieldTypeDescription
name*string

Name of the session (e.g., 'Week 3 - Tue')

start_time*string (date-time)

Session start time

end_time*string (date-time)

Session end time

descriptionstring | null

Session description, applied to every occurrence

is_checkin_openboolean

Manual toggle for check-in

default: true

Responses

200The sessions created, in the order they were given
FieldTypeDescription
sessionsSessionResponse[]

The sessions created, in the order the occurrences were given

array items · SessionResponse

FieldTypeDescription
requires_ticketboolean

Whether the ticket gate is on: entry needs a valid ticket from `ticket_template_uuid`. A switch beside the ticket, so the gate can be turned off and on again without losing which ticket it checks. It cannot be on with no ticket named

default: false

ticket_template_uuidstring | null

The reward template whose valid tickets the gate accepts, or null for none named

required_entitlementstring | null

The membership entitlement a person needs to enter at all: `member` for any active membership, a tier's own key for that capability, or null for anyone

max_attendeesinteger | null

How many seats there are, or null for uncapped. A ticket issued for the session takes a seat, and a walk-in takes one when admitted

≥ 1

enforces_checkin_windowboolean

Whether the start and end times refuse a tap outside them (a ticketed event: you cannot check into last night's concert) or only describe when it was meant to happen (attendance tracking, where refusing a late arrival records nothing and no record reads as not having come)

default: true

allow_reentryboolean

Whether a repeat tap by someone already admitted re-admits them (a recurring-access door) or is refused as already here (an event)

default: false

admits_frozen_cardsboolean

Whether a card its holder or issuer has frozen is still admitted. False refuses it as `card_frozen`: freezing usually means the card is lost, and whoever found it would enter as its owner. True admits it and flags the presence with `disputed_reason: card_frozen` for the organizer to keep or void, for a door where a card frozen by mistake should not hold anyone up. Either way the owner can check in with another identifier

default: false

uuid*string
slug*string
activity_uuidstring | null

The activity this session is filed under, or null for one that stands alone. An activity groups sessions; the organization owns them, so a session without one is complete rather than orphaned

name*string
descriptionstring | null
start_time*string (date-time)
end_time*string (date-time)
is_checkin_openboolean

default: true

cancelled_atstring (date-time) | null

When it was cancelled, or null. A cancelled session admits nobody and takes no new seats, and is kept rather than deleted because its attendance and tickets are a record

required_prior_session_uuidstring | null
series_uuidstring | null

The schedule this session was created as part of, or null for one created on its own

sequence_number*integer
created_at*string (date-time)
updated_atstring (date-time) | null
series*SessionSeriesResponse

The schedule they were created as, which is how they are edited together afterwards

object · SessionSeriesResponse

FieldTypeDescription
uuid*string
activity_uuid*string
name*string
session_count*integer

How many sessions the schedule has

upcoming_count*integer

How many of them have not finished yet — the number a bulk edit would reach

first_start_timestring (date-time) | null

When the earliest session begins. Null if the schedule is empty

last_start_timestring (date-time) | null

When the latest session begins. Null if the schedule is empty

created_at*string (date-time)
updated_atstring (date-time) | null
400Invalid request
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

401Authentication failed
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

403Insufficient permissions
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

409Resource already exists
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

422Validation error
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

Example request

curl -X POST "https://api.davi.social/api/v1/activities/{activity_slug}/sessions/batch" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{ /* request body */ }'

/api/v1/organizations

GET/api/v1/organizations/{organization_slug}/activities

List Organization Activities

List all activities for an organization.

Path parameters

organization_slug*string

Query parameters

default_backendstring

default: "primary"

pageinteger

default: 1 · ≥ 1

page_sizeinteger

default: 20 · ≥ 1 · ≤ 100

sort_bystring | null
sort_orderstring

default: "asc"

Responses

200Successful Response
FieldTypeDescription
total_items*integer

Total number of items available

total_pages*integer

Total number of pages available

current_page*integer

Current page number

items*ActivityResponse[]

List of items on the current page

array items · ActivityResponse

FieldTypeDescription
requires_ticketboolean

Whether the ticket gate is on: entry needs a valid ticket from `ticket_template_uuid`. A switch beside the ticket, so the gate can be turned off and on again without losing which ticket it checks. It cannot be on with no ticket named

default: false

ticket_template_uuidstring | null

The reward template whose valid tickets the gate accepts, or null for none named

required_entitlementstring | null

The membership entitlement a person needs to enter at all: `member` for any active membership, a tier's own key for that capability, or null for anyone

max_attendeesinteger | null

How many seats there are, or null for uncapped. A ticket issued for the session takes a seat, and a walk-in takes one when admitted

≥ 1

enforces_checkin_windowboolean

Whether the start and end times refuse a tap outside them (a ticketed event: you cannot check into last night's concert) or only describe when it was meant to happen (attendance tracking, where refusing a late arrival records nothing and no record reads as not having come)

default: true

allow_reentryboolean

Whether a repeat tap by someone already admitted re-admits them (a recurring-access door) or is refused as already here (an event)

default: false

admits_frozen_cardsboolean

Whether a card its holder or issuer has frozen is still admitted. False refuses it as `card_frozen`: freezing usually means the card is lost, and whoever found it would enter as its owner. True admits it and flags the presence with `disputed_reason: card_frozen` for the organizer to keep or void, for a door where a card frozen by mistake should not hold anyone up. Either way the owner can check in with another identifier

default: false

uuid*string
slug*string
name*string
descriptionstring | null
organization_uuid*string
image_file_uuidstring | null
image_file_urlstring | null
website_urlstring | null
additional_dataobject | null
created_at*string (date-time)
updated_atstring (date-time) | null
start_timestring (date-time) | null
end_timestring (date-time) | null
is_session_checkin_openboolean

The master switch: while false, every session of the activity is closed to check-in, whatever its own switch says

default: true

cancelled_atstring (date-time) | null

When it was cancelled, or null. A cancelled session admits nobody and takes no new seats, and is kept rather than deleted because its attendance and tickets are a record

timezonestring | null
401Authentication failed
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

403Insufficient permissions
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

422Validation error
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

Example request

curl -X GET "https://api.davi.social/api/v1/organizations/{organization_slug}/activities" \
  -H "Authorization: Bearer <token>"
POST/api/v1/organizations/{organization_slug}/activities

Create Activity

Create a new activity for an organization.

Requires an org-scoped token for the target organization.

Path parameters

organization_slug*string

Query parameters

default_backendstring

default: "primary"

Request body*application/json

FieldTypeDescription
requires_ticketboolean

Whether the ticket gate is on: entry needs a valid ticket from `ticket_template_uuid`. A switch beside the ticket, so the gate can be turned off and on again without losing which ticket it checks. It cannot be on with no ticket named

default: false

ticket_template_uuidstring | string (uuid) | null

The reward template whose valid tickets the gate accepts, or null for none named

required_entitlementstring | null

The membership entitlement a person needs to enter at all: `member` for any active membership, a tier's own key for that capability, or null for anyone

max_attendeesinteger | null

How many seats there are, or null for uncapped. A ticket issued for the session takes a seat, and a walk-in takes one when admitted

≥ 1

enforces_checkin_windowboolean

Whether the start and end times refuse a tap outside them (a ticketed event: you cannot check into last night's concert) or only describe when it was meant to happen (attendance tracking, where refusing a late arrival records nothing and no record reads as not having come)

default: true

allow_reentryboolean

Whether a repeat tap by someone already admitted re-admits them (a recurring-access door) or is refused as already here (an event)

default: false

admits_frozen_cardsboolean

Whether a card its holder or issuer has frozen is still admitted. False refuses it as `card_frozen`: freezing usually means the card is lost, and whoever found it would enter as its owner. True admits it and flags the presence with `disputed_reason: card_frozen` for the organizer to keep or void, for a door where a card frozen by mistake should not hold anyone up. Either way the owner can check in with another identifier

default: false

name*string

Name of the activity

description*string

Description of the activity

image_file_uuidstring | string (uuid) | null

UUID of the image file associated with the activity

website_urlstring | null

Website URL for the activity

additional_dataobject | null

Additional JSON data for the activity

start_timestring (date-time) | null

Activity start time (for check-in validation)

end_timestring (date-time) | null

Activity end time (for check-in validation)

is_session_checkin_openboolean

Master switch for session check-in (False = all session check-ins closed)

default: true

timezonestring | null

IANA zone this activity's sessions run in, e.g. `Asia/Manila`, overriding the organization's. Times are always stored and returned in UTC; this says which wall clock they were set against. Null inherits the organization's zone, which is the usual case — set this only for an activity that runs somewhere else

Responses

200Successful Response
FieldTypeDescription
requires_ticketboolean

Whether the ticket gate is on: entry needs a valid ticket from `ticket_template_uuid`. A switch beside the ticket, so the gate can be turned off and on again without losing which ticket it checks. It cannot be on with no ticket named

default: false

ticket_template_uuidstring | null

The reward template whose valid tickets the gate accepts, or null for none named

required_entitlementstring | null

The membership entitlement a person needs to enter at all: `member` for any active membership, a tier's own key for that capability, or null for anyone

max_attendeesinteger | null

How many seats there are, or null for uncapped. A ticket issued for the session takes a seat, and a walk-in takes one when admitted

≥ 1

enforces_checkin_windowboolean

Whether the start and end times refuse a tap outside them (a ticketed event: you cannot check into last night's concert) or only describe when it was meant to happen (attendance tracking, where refusing a late arrival records nothing and no record reads as not having come)

default: true

allow_reentryboolean

Whether a repeat tap by someone already admitted re-admits them (a recurring-access door) or is refused as already here (an event)

default: false

admits_frozen_cardsboolean

Whether a card its holder or issuer has frozen is still admitted. False refuses it as `card_frozen`: freezing usually means the card is lost, and whoever found it would enter as its owner. True admits it and flags the presence with `disputed_reason: card_frozen` for the organizer to keep or void, for a door where a card frozen by mistake should not hold anyone up. Either way the owner can check in with another identifier

default: false

uuid*string
slug*string
name*string
descriptionstring | null
organization_uuid*string
image_file_uuidstring | null
image_file_urlstring | null
website_urlstring | null
additional_dataobject | null
created_at*string (date-time)
updated_atstring (date-time) | null
start_timestring (date-time) | null
end_timestring (date-time) | null
is_session_checkin_openboolean

The master switch: while false, every session of the activity is closed to check-in, whatever its own switch says

default: true

cancelled_atstring (date-time) | null

When it was cancelled, or null. A cancelled session admits nobody and takes no new seats, and is kept rather than deleted because its attendance and tickets are a record

timezonestring | null
400Invalid request
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

401Authentication failed
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

403Insufficient permissions
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

409Resource already exists
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

422Validation error
FieldTypeDescription
errors*object

Map of field names to error messages. Use '_root' for form-level errors.

message*string

Human-readable error summary

codestring | null

Machine-readable error code

detailsobject | null

What the refusal is about, where it is something you can act on — the amount and currency owed on a `402`, the entitlement a tier did not grant on a `403`. Values are typed as the error carries them, so read a figure from here rather than from `errors`, whose values are always the copy a form shows against a field.

Example request

curl -X POST "https://api.davi.social/api/v1/organizations/{organization_slug}/activities" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{ /* request body */ }'