API Reference

cards

7 endpoints across 2 paths

  • /api/v1/cards
  • /api/v1/organizations

/api/v1/cards

GET/api/v1/cards

List Cards

List the cards the caller holds.

Query parameters

identifierstring | null

Return only the card with exactly this identifier. How a caller turns a scanned card into the uuid the rest of this resource is addressed by.

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*CardResponse[]

List of items on the current page

array items · CardResponse

FieldTypeDescription
uuid*string
identifier*string
namestring | null
card_type*CardType
is_primaryboolean

default: false

is_frozen*boolean
organization_uuidstring | null
front_image_urlstring | null

Resolved front image: custom override > card model > None

back_image_urlstring | null

Back image from card model design

custom_front_image_urlstring | null

User's custom front image override (if set)

profile_page_uuidstring | null
card_model_uuidstring | null
membership_tier_uuidstring | null
card_modelCardModelSummaryResponse | null

object · CardModelSummaryResponse

FieldTypeDescription
uuid*string
name*string
front_image_urlstring | null
back_image_urlstring | null
is_active*boolean
membership_tierMembershipTierSummaryResponse | null

object · MembershipTierSummaryResponse

FieldTypeDescription
uuid*string
slug*string
name*string
descriptionstring | null

The tier in the organization's own words. Here rather than on a listing because a shelf of tiers is read to compare them and a paragraph on each is what stops that working — the detail belongs where somebody has already picked one.

price_centsinteger

Price per term in the minor units of `currency`; 0 is free

default: 0

currencystring

ISO 4217 code `price_cents` is denominated in

default: "PHP"

payment_intervalenum

default: "one_time"

image_urlstring | null

The tier's banner, where it has one

inclusionsstring[]

What the tier gets you, in the organization's own words. Presentational — nothing tests these; `entitlements` is what gates anything.

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/cards" \
  -H "Authorization: Bearer <token>"
GET/api/v1/cards/{card_uuid}

Get Card

Read one of the caller's cards.

A card the caller does not hold answers 404, the same as one that does not exist.

Path parameters

card_uuid*string

Responses

200Successful Response
FieldTypeDescription
uuid*string
identifier*string
namestring | null
card_type*CardType
is_primaryboolean

default: false

is_frozen*boolean
organization_uuidstring | null
front_image_urlstring | null

Resolved front image: custom override > card model > None

back_image_urlstring | null

Back image from card model design

custom_front_image_urlstring | null

User's custom front image override (if set)

profile_page_uuidstring | null
card_model_uuidstring | null
membership_tier_uuidstring | null
card_modelCardModelSummaryResponse | null

object · CardModelSummaryResponse

FieldTypeDescription
uuid*string
name*string
front_image_urlstring | null
back_image_urlstring | null
is_active*boolean
membership_tierMembershipTierSummaryResponse | null

object · MembershipTierSummaryResponse

FieldTypeDescription
uuid*string
slug*string
name*string
descriptionstring | null

The tier in the organization's own words. Here rather than on a listing because a shelf of tiers is read to compare them and a paragraph on each is what stops that working — the detail belongs where somebody has already picked one.

price_centsinteger

Price per term in the minor units of `currency`; 0 is free

default: 0

currencystring

ISO 4217 code `price_cents` is denominated in

default: "PHP"

payment_intervalenum

default: "one_time"

image_urlstring | null

The tier's banner, where it has one

inclusionsstring[]

What the tier gets you, in the organization's own words. Presentational — nothing tests these; `entitlements` is what gates anything.

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/cards/{card_uuid}" \
  -H "Authorization: Bearer <token>"

/api/v1/organizations

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

List Organization Cards

List the cards in the organization's inventory.

Path parameters

organization_slug*string

Query parameters

pageinteger

default: 1 · ≥ 1

page_sizeinteger

default: 20 · ≥ 1 · ≤ 100

sort_bystring | null
sort_orderstring

default: "desc"

identifierstring | null

Return only the card with exactly this identifier. How a caller turns a scanned card into the uuid the rest of this resource is addressed by.

searchstring | null

Return cards whose identifier contains this text. A search, not a lookup — use `identifier` for an exact match.

default_backendstring

default: "primary"

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*CardResponse[]

List of items on the current page

array items · CardResponse

FieldTypeDescription
uuid*string
identifier*string
namestring | null
card_type*CardType
is_primaryboolean

default: false

is_frozen*boolean
organization_uuidstring | null
front_image_urlstring | null

Resolved front image: custom override > card model > None

back_image_urlstring | null

Back image from card model design

custom_front_image_urlstring | null

User's custom front image override (if set)

profile_page_uuidstring | null
card_model_uuidstring | null
membership_tier_uuidstring | null
card_modelCardModelSummaryResponse | null

object · CardModelSummaryResponse

FieldTypeDescription
uuid*string
name*string
front_image_urlstring | null
back_image_urlstring | null
is_active*boolean
membership_tierMembershipTierSummaryResponse | null

object · MembershipTierSummaryResponse

FieldTypeDescription
uuid*string
slug*string
name*string
descriptionstring | null

The tier in the organization's own words. Here rather than on a listing because a shelf of tiers is read to compare them and a paragraph on each is what stops that working — the detail belongs where somebody has already picked one.

price_centsinteger

Price per term in the minor units of `currency`; 0 is free

default: 0

currencystring

ISO 4217 code `price_cents` is denominated in

default: "PHP"

payment_intervalenum

default: "one_time"

image_urlstring | null

The tier's banner, where it has one

inclusionsstring[]

What the tier gets you, in the organization's own words. Presentational — nothing tests these; `entitlements` is what gates anything.

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/organizations/{organization_slug}/cards" \
  -H "Authorization: Bearer <token>"
POST/api/v1/organizations/{organization_slug}/cards

Assign Organization Cards

Take manufactured cards into the organization's inventory.

Each identifier must already exist — cards are minted once by fulfillment, and an organization takes one rather than creating it. An identifier the platform never made is refused, which is what stops one tenant from claiming another's batch or blocking a range it does not own.

Partial success by design: one bad identifier in a batch does not reject the rest, and each failure comes back with its reason. Assigning a card the organization already holds is a no-op, so a retried batch is safe.

Charged to the expensive rate-limit bucket per card, not per call, because taking a card into inventory is the operation worth bounding — identifiers are readable off the object, so a large batch is a large number of attempts. A batch is capped at 20 for the same reason: the cap is the bucket, and a longer one could never be accepted. Taking a box of cards in is therefore paced rather than instant.

Path parameters

organization_slug*string

Query parameters

default_backendstring

default: "primary"

Request body*application/json

FieldTypeDescription
cards*AssignOrgCardRequest[]

Cards to take into inventory. Each card in the batch is charged against the rate limit separately

array items · AssignOrgCardRequest

FieldTypeDescription
identifier*string

The card's identifier, as manufactured. Must already exist in platform inventory: an organization takes a card, it does not mint one.

membership_tier_uuidstring | string (uuid) | null

Optional membership tier to auto-assign when card is claimed

membership_tier_uuidstring | string (uuid) | null

Default membership tier for all cards (can be overridden per card)

Responses

200Successful Response
FieldTypeDescription
assignedCardResponse[]

Cards now in the organization's inventory

array items · CardResponse

FieldTypeDescription
uuid*string
identifier*string
namestring | null
card_type*CardType
is_primaryboolean

default: false

is_frozen*boolean
organization_uuidstring | null
front_image_urlstring | null

Resolved front image: custom override > card model > None

back_image_urlstring | null

Back image from card model design

custom_front_image_urlstring | null

User's custom front image override (if set)

profile_page_uuidstring | null
card_model_uuidstring | null
membership_tier_uuidstring | null
card_modelCardModelSummaryResponse | null

object · CardModelSummaryResponse

FieldTypeDescription
uuid*string
name*string
front_image_urlstring | null
back_image_urlstring | null
is_active*boolean
membership_tierMembershipTierSummaryResponse | null

object · MembershipTierSummaryResponse

FieldTypeDescription
uuid*string
slug*string
name*string
descriptionstring | null

The tier in the organization's own words. Here rather than on a listing because a shelf of tiers is read to compare them and a paragraph on each is what stops that working — the detail belongs where somebody has already picked one.

price_centsinteger

Price per term in the minor units of `currency`; 0 is free

default: 0

currencystring

ISO 4217 code `price_cents` is denominated in

default: "PHP"

payment_intervalenum

default: "one_time"

image_urlstring | null

The tier's banner, where it has one

inclusionsstring[]

What the tier gets you, in the organization's own words. Presentational — nothing tests these; `entitlements` is what gates anything.

created_at*string (date-time)
updated_atstring (date-time) | null
failedobject[]

Cards that could not be assigned, each with the reason

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}/cards" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{ /* request body */ }'
GET/api/v1/organizations/{organization_slug}/cards/{card_uuid}

Get Organization Card

Read one card from the organization's inventory.

Path parameters

card_uuid*string
organization_slug*string

Query parameters

default_backendstring

default: "primary"

Responses

200Successful Response
FieldTypeDescription
uuid*string
identifier*string
namestring | null
card_type*CardType
is_primaryboolean

default: false

is_frozen*boolean
organization_uuidstring | null
front_image_urlstring | null

Resolved front image: custom override > card model > None

back_image_urlstring | null

Back image from card model design

custom_front_image_urlstring | null

User's custom front image override (if set)

profile_page_uuidstring | null
card_model_uuidstring | null
membership_tier_uuidstring | null
card_modelCardModelSummaryResponse | null

object · CardModelSummaryResponse

FieldTypeDescription
uuid*string
name*string
front_image_urlstring | null
back_image_urlstring | null
is_active*boolean
membership_tierMembershipTierSummaryResponse | null

object · MembershipTierSummaryResponse

FieldTypeDescription
uuid*string
slug*string
name*string
descriptionstring | null

The tier in the organization's own words. Here rather than on a listing because a shelf of tiers is read to compare them and a paragraph on each is what stops that working — the detail belongs where somebody has already picked one.

price_centsinteger

Price per term in the minor units of `currency`; 0 is free

default: 0

currencystring

ISO 4217 code `price_cents` is denominated in

default: "PHP"

payment_intervalenum

default: "one_time"

image_urlstring | null

The tier's banner, where it has one

inclusionsstring[]

What the tier gets you, in the organization's own words. Presentational — nothing tests these; `entitlements` is what gates anything.

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/organizations/{organization_slug}/cards/{card_uuid}" \
  -H "Authorization: Bearer <token>"
PATCH/api/v1/organizations/{organization_slug}/cards/{card_uuid}

Update Organization Card

Update a card in the organization's inventory.

Covers the card model, the membership tier assignment and the registry freeze. To remove a value, pass an empty string for that field.

The frozen flag here is the registry freeze and is dominant: a card frozen by its issuer stays frozen however its holder sets their own flag on PATCH /cards/{card_uuid}.

Takes both card:org:manage and card:org:freeze because freezing folded into this endpoint: the permission is checked per endpoint rather than per field, and no role separates the two scopes anyway.

Path parameters

card_uuid*string
organization_slug*string

Query parameters

default_backendstring

default: "primary"

Request body*application/json

FieldTypeDescription
namestring | string | null

Friendly name for the card. Set to empty string to remove.

max length 255

card_model_uuidstring | string | string (uuid) | null

UUID of the card model (design template) to assign. Set to empty string to remove.

membership_tier_uuidstring | string | string (uuid) | null

UUID of the membership tier to auto-assign when claimed. Set to empty string to remove.

frozenboolean | null

Whether the card is frozen. Freezing is a state the card is in, not an event: set it true or false and omit to leave it alone.

Responses

200Successful Response
FieldTypeDescription
uuid*string
identifier*string
namestring | null
card_type*CardType
is_primaryboolean

default: false

is_frozen*boolean
organization_uuidstring | null
front_image_urlstring | null

Resolved front image: custom override > card model > None

back_image_urlstring | null

Back image from card model design

custom_front_image_urlstring | null

User's custom front image override (if set)

profile_page_uuidstring | null
card_model_uuidstring | null
membership_tier_uuidstring | null
card_modelCardModelSummaryResponse | null

object · CardModelSummaryResponse

FieldTypeDescription
uuid*string
name*string
front_image_urlstring | null
back_image_urlstring | null
is_active*boolean
membership_tierMembershipTierSummaryResponse | null

object · MembershipTierSummaryResponse

FieldTypeDescription
uuid*string
slug*string
name*string
descriptionstring | null

The tier in the organization's own words. Here rather than on a listing because a shelf of tiers is read to compare them and a paragraph on each is what stops that working — the detail belongs where somebody has already picked one.

price_centsinteger

Price per term in the minor units of `currency`; 0 is free

default: 0

currencystring

ISO 4217 code `price_cents` is denominated in

default: "PHP"

payment_intervalenum

default: "one_time"

image_urlstring | null

The tier's banner, where it has one

inclusionsstring[]

What the tier gets you, in the organization's own words. Presentational — nothing tests these; `entitlements` is what gates anything.

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.

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/organizations/{organization_slug}/cards/{card_uuid}" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{ /* request body */ }'
DELETE/api/v1/organizations/{organization_slug}/cards/{card_uuid}

Release Organization Card

Give up a card, returning it to platform inventory.

The registry row survives: the identifier belongs to the physical object and outlives any organization holding it. What the organization gives up is the card's issuer and the tier it carried.

A card someone holds may be released, and the membership it was the basis for ends with it. The holder keeps the card — releasing it is not taking it back, and an organization has no reach into someone's wallet — but the tier it granted is no longer the organization's to grant, and a membership resting on a card the organization has given up is an entitlement outliving what justified it. A membership the holder has on any other basis — added by the organization, joined by themselves — is untouched either way.

keep_membership leaves it standing, for a release that is not a departure: retiring a run of cards, moving inventory back to the platform, honouring a term someone already paid for. It is the organization's call to make because the organization is the other party to that term — nobody else can say whether giving up the card was meant to end it. Ending is the default, since a membership nobody decided to keep should not outlast its basis by inaction.

A kept membership still records the released card as what authorized it. That is history rather than a live link: the basis says what enrolled someone, and the card is no longer the organization's to revoke through.

Ending one is notice, not an ending. The membership stays live and keeps granting for a week, and is retired when that runs out. Releasing the wrong card is a thing that happens in a console, and for those seven days it costs nothing: DELETE /organizations/{organization_slug}/memberships/{user_uuid}/ revocation calls it off, the member is never told, and nothing has to be put back because nothing was taken. After it, the membership is outside the roster and only .../memberships/{user_uuid}/restore reaches it.

revoke_immediately skips the week for a release that is not a mistake anyone will want back — a card reported stolen, an account being closed out. It is ignored when keep_membership is set, there being nothing to revoke.

Path parameters

card_uuid*string
organization_slug*string

Query parameters

keep_membershipboolean

Leave standing the membership this card was the basis for, instead of ending it with the release.

default: false

revoke_immediatelyboolean

End the membership at once instead of giving a week's notice in which the revocation can be called off. Ignored when `keep_membership` is set.

default: false

default_backendstring

default: "primary"

Responses

200Successful Response
FieldTypeDescription
uuid*string
identifier*string
namestring | null
card_type*CardType
is_primaryboolean

default: false

is_frozen*boolean
organization_uuidstring | null
front_image_urlstring | null

Resolved front image: custom override > card model > None

back_image_urlstring | null

Back image from card model design

custom_front_image_urlstring | null

User's custom front image override (if set)

profile_page_uuidstring | null
card_model_uuidstring | null
membership_tier_uuidstring | null
card_modelCardModelSummaryResponse | null

object · CardModelSummaryResponse

FieldTypeDescription
uuid*string
name*string
front_image_urlstring | null
back_image_urlstring | null
is_active*boolean
membership_tierMembershipTierSummaryResponse | null

object · MembershipTierSummaryResponse

FieldTypeDescription
uuid*string
slug*string
name*string
descriptionstring | null

The tier in the organization's own words. Here rather than on a listing because a shelf of tiers is read to compare them and a paragraph on each is what stops that working — the detail belongs where somebody has already picked one.

price_centsinteger

Price per term in the minor units of `currency`; 0 is free

default: 0

currencystring

ISO 4217 code `price_cents` is denominated in

default: "PHP"

payment_intervalenum

default: "one_time"

image_urlstring | null

The tier's banner, where it has one

inclusionsstring[]

What the tier gets you, in the organization's own words. Presentational — nothing tests these; `entitlements` is what gates anything.

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 DELETE "https://api.davi.social/api/v1/organizations/{organization_slug}/cards/{card_uuid}" \
  -H "Authorization: Bearer <token>"