API Reference
activities
12 endpoints across 2 paths
- /api/v1/activities
- /api/v1/organizations
/api/v1/activities
/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_backend | string | default: "primary" |
Responses
| Field | Type | Description |
|---|---|---|
| requires_ticket | boolean | 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_uuid | string | null | The reward template whose valid tickets the gate accepts, or null for none named |
| required_entitlement | string | 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_attendees | integer | 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_window | boolean | 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_reentry | boolean | 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_cards | boolean | 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 | |
| description | string | null | |
| organization_uuid* | string | |
| image_file_uuid | string | null | |
| image_file_url | string | null | |
| website_url | string | null | |
| additional_data | object | null | |
| created_at* | string (date-time) | |
| updated_at | string (date-time) | null | |
| start_time | string (date-time) | null | |
| end_time | string (date-time) | null | |
| is_session_checkin_open | boolean | The master switch: while false, every session of the activity is closed to check-in, whatever its own switch says default: true |
| cancelled_at | string (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 |
| timezone | string | null |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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>"/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_backend | string | default: "primary" |
Request body*application/json
| Field | Type | Description |
|---|---|---|
| requires_ticket | boolean | 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_uuid | string | string (uuid) | null | The reward template whose valid tickets the gate accepts, or null for none named |
| required_entitlement | string | 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_attendees | integer | 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_window | boolean | 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_reentry | boolean | 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_cards | boolean | 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_sessions | boolean | 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_holders | boolean | 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 |
| name | string | null | Name of the activity |
| description | string | null | Description of the activity |
| image_file_uuid | string | string (uuid) | null | UUID of the image file associated with the activity |
| website_url | string | null | Website URL for the activity |
| additional_data | object | null | Additional JSON data for the activity |
| start_time | string (date-time) | null | Activity start time (for check-in validation) |
| end_time | string (date-time) | null | Activity end time (for check-in validation) |
| is_session_checkin_open | boolean | null | Master switch for session check-in (False = all session check-ins closed) |
| timezone | string | 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
| Field | Type | Description |
|---|---|---|
| requires_ticket | boolean | 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_uuid | string | null | The reward template whose valid tickets the gate accepts, or null for none named |
| required_entitlement | string | 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_attendees | integer | 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_window | boolean | 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_reentry | boolean | 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_cards | boolean | 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 | |
| description | string | null | |
| organization_uuid* | string | |
| image_file_uuid | string | null | |
| image_file_url | string | null | |
| website_url | string | null | |
| additional_data | object | null | |
| created_at* | string (date-time) | |
| updated_at | string (date-time) | null | |
| start_time | string (date-time) | null | |
| end_time | string (date-time) | null | |
| is_session_checkin_open | boolean | The master switch: while false, every session of the activity is closed to check-in, whatever its own switch says default: true |
| cancelled_at | string (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 |
| timezone | string | null | |
| sessions_updated | integer | null | How many upcoming sessions took the changed settings, when `apply_to_upcoming_sessions` was set; null when it was not |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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 */ }'/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_backend | string | default: "primary" |
Responses
| Field | Type | Description |
|---|---|---|
| message* | string | Success or status message |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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>"/api/v1/activities/{activity_slug}/attendeesList Activity Attendees
List all attendees across all sessions of an activity.
Path parameters
| activity_slug* | string |
Query parameters
| include_proof | boolean | Include proof transaction info in response default: false |
| default_backend | string | default: "primary" |
| page | integer | default: 1 · ≥ 1 |
| page_size | integer | default: 20 · ≥ 1 · ≤ 100 |
| sort_by | string | null | |
| sort_order | string | default: "asc" |
Responses
| Field | Type | Description | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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>"/api/v1/activities/{activity_slug}/cancellationCancel 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_backend | string | default: "primary" |
Responses
| Field | Type | Description |
|---|---|---|
| requires_ticket | boolean | 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_uuid | string | null | The reward template whose valid tickets the gate accepts, or null for none named |
| required_entitlement | string | 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_attendees | integer | 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_window | boolean | 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_reentry | boolean | 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_cards | boolean | 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 | |
| description | string | null | |
| organization_uuid* | string | |
| image_file_uuid | string | null | |
| image_file_url | string | null | |
| website_url | string | null | |
| additional_data | object | null | |
| created_at* | string (date-time) | |
| updated_at | string (date-time) | null | |
| start_time | string (date-time) | null | |
| end_time | string (date-time) | null | |
| is_session_checkin_open | boolean | The master switch: while false, every session of the activity is closed to check-in, whatever its own switch says default: true |
| cancelled_at | string (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 |
| timezone | string | null |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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>"/api/v1/activities/{activity_slug}/cancellationReinstate 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_backend | string | default: "primary" |
Responses
| Field | Type | Description |
|---|---|---|
| requires_ticket | boolean | 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_uuid | string | null | The reward template whose valid tickets the gate accepts, or null for none named |
| required_entitlement | string | 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_attendees | integer | 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_window | boolean | 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_reentry | boolean | 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_cards | boolean | 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 | |
| description | string | null | |
| organization_uuid* | string | |
| image_file_uuid | string | null | |
| image_file_url | string | null | |
| website_url | string | null | |
| additional_data | object | null | |
| created_at* | string (date-time) | |
| updated_at | string (date-time) | null | |
| start_time | string (date-time) | null | |
| end_time | string (date-time) | null | |
| is_session_checkin_open | boolean | The master switch: while false, every session of the activity is closed to check-in, whatever its own switch says default: true |
| cancelled_at | string (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 |
| timezone | string | null |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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>"/api/v1/activities/{activity_slug}/sessionsList Sessions
List all sessions for an activity.
Path parameters
| activity_slug* | string |
Query parameters
| default_backend | string | default: "primary" |
| page | integer | default: 1 · ≥ 1 |
| page_size | integer | default: 20 · ≥ 1 · ≤ 100 |
| sort_by | string | null | |
| sort_order | string | default: "asc" |
Responses
| Field | Type | Description | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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>"/api/v1/activities/{activity_slug}/sessionsCreate 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_backend | string | default: "primary" |
Request body*application/json
| Field | Type | Description |
|---|---|---|
| requires_ticket | boolean | 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_uuid | string | string (uuid) | null | The reward template whose valid tickets the gate accepts, or null for none named |
| required_entitlement | string | 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_attendees | integer | 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_window | boolean | 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_reentry | boolean | 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_cards | boolean | 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') |
| description | string | null | Session description |
| start_time* | string (date-time) | Session start time |
| end_time* | string (date-time) | Session end time |
| is_checkin_open | boolean | Manual toggle for check-in default: true |
| required_prior_session_uuid | string | string (uuid) | null | Another session of the same activity that must have been attended before this one admits anyone. None = no such gate |
Responses
| Field | Type | Description |
|---|---|---|
| requires_ticket | boolean | 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_uuid | string | null | The reward template whose valid tickets the gate accepts, or null for none named |
| required_entitlement | string | 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_attendees | integer | 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_window | boolean | 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_reentry | boolean | 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_cards | boolean | 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_uuid | string | 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 | |
| description | string | null | |
| start_time* | string (date-time) | |
| end_time* | string (date-time) | |
| is_checkin_open | boolean | default: true |
| cancelled_at | string (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_uuid | string | null | |
| series_uuid | string | 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_at | string (date-time) | null |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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 */ }'/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_backend | string | default: "primary" |
Responses
| Field | Type | Description |
|---|---|---|
| requires_ticket | boolean | 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_uuid | string | null | The reward template whose valid tickets the gate accepts, or null for none named |
| required_entitlement | string | 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_attendees | integer | 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_window | boolean | 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_reentry | boolean | 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_cards | boolean | 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_uuid | string | 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 | |
| description | string | null | |
| start_time* | string (date-time) | |
| end_time* | string (date-time) | |
| is_checkin_open | boolean | default: true |
| cancelled_at | string (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_uuid | string | null | |
| series_uuid | string | 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_at | string (date-time) | null |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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>"/api/v1/activities/{activity_slug}/sessions/batchCreate 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_backend | string | default: "primary" |
Request body*application/json
| Field | Type | Description | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| requires_ticket | boolean | 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_uuid | string | string (uuid) | null | The reward template whose valid tickets the gate accepts, or null for none named | ||||||||||||
| required_entitlement | string | 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_attendees | integer | 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_window | boolean | 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_reentry | boolean | 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_cards | boolean | 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_name | string | 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
| ||||||||||||||
| description | string | null | Session description, applied to every occurrence | ||||||||||||
| is_checkin_open | boolean | Manual toggle for check-in default: true | ||||||||||||
Responses
| Field | Type | Description | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| sessions | SessionResponse[] | The sessions created, in the order the occurrences were given | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
array items · SessionResponse
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| series* | SessionSeriesResponse | The schedule they were created as, which is how they are edited together afterwards | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
object · SessionSeriesResponse
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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
/api/v1/organizations/{organization_slug}/activitiesList Organization Activities
List all activities for an organization.
Path parameters
| organization_slug* | string |
Query parameters
| default_backend | string | default: "primary" |
| page | integer | default: 1 · ≥ 1 |
| page_size | integer | default: 20 · ≥ 1 · ≤ 100 |
| sort_by | string | null | |
| sort_order | string | default: "asc" |
Responses
| Field | Type | Description | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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>"/api/v1/organizations/{organization_slug}/activitiesCreate 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_backend | string | default: "primary" |
Request body*application/json
| Field | Type | Description |
|---|---|---|
| requires_ticket | boolean | 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_uuid | string | string (uuid) | null | The reward template whose valid tickets the gate accepts, or null for none named |
| required_entitlement | string | 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_attendees | integer | 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_window | boolean | 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_reentry | boolean | 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_cards | boolean | 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_uuid | string | string (uuid) | null | UUID of the image file associated with the activity |
| website_url | string | null | Website URL for the activity |
| additional_data | object | null | Additional JSON data for the activity |
| start_time | string (date-time) | null | Activity start time (for check-in validation) |
| end_time | string (date-time) | null | Activity end time (for check-in validation) |
| is_session_checkin_open | boolean | Master switch for session check-in (False = all session check-ins closed) default: true |
| timezone | string | 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
| Field | Type | Description |
|---|---|---|
| requires_ticket | boolean | 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_uuid | string | null | The reward template whose valid tickets the gate accepts, or null for none named |
| required_entitlement | string | 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_attendees | integer | 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_window | boolean | 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_reentry | boolean | 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_cards | boolean | 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 | |
| description | string | null | |
| organization_uuid* | string | |
| image_file_uuid | string | null | |
| image_file_url | string | null | |
| website_url | string | null | |
| additional_data | object | null | |
| created_at* | string (date-time) | |
| updated_at | string (date-time) | null | |
| start_time | string (date-time) | null | |
| end_time | string (date-time) | null | |
| is_session_checkin_open | boolean | The master switch: while false, every session of the activity is closed to check-in, whatever its own switch says default: true |
| cancelled_at | string (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 |
| timezone | string | null |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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. |
| Field | Type | Description |
|---|---|---|
| errors* | object | Map of field names to error messages. Use '_root' for form-level errors. |
| message* | string | Human-readable error summary |
| code | string | null | Machine-readable error code |
| details | object | 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 */ }'