curl --request POST \
--url 'https://app.floral.so/api/v1/workspaces/acme-nordic/events/42/attendance' \
--header 'Authorization: Bearer $FLORAL_TOKEN' \
--header 'Idempotency-Key: markEventAttendanceV1-20260816-001' \
--header 'Content-Type: application/json' \
--data '{
"participantIds": [
"0f8b6c1e-3a52-4d6e-9b7a-2c4e5f6a7b8c",
"5d2e8a41-7c3b-4f90-8e16-a9b0c1d2e3f4"
],
"state": "ATTENDED"
}'const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
participantIds: ['0f8b6c1e-3a52-4d6e-9b7a-2c4e5f6a7b8c', '5d2e8a41-7c3b-4f90-8e16-a9b0c1d2e3f4'],
state: 'ATTENDED'
})
};
fetch('https://app.floral.so/api/v1/workspaces/{workspaceSlug}/events/{eventId}/attendance', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"attendance": {
"changedParticipantIds": [
"0f8b6c1e-3a52-4d6e-9b7a-2c4e5f6a7b8c"
],
"state": "ATTENDED",
"unchangedParticipantIds": [
"5d2e8a41-7c3b-4f90-8e16-a9b0c1d2e3f4"
]
}
}{
"error": {
"code": "INVALID_INPUT",
"message": "The request contains invalid values.",
"requestId": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "UNAUTHENTICATED",
"message": "A valid bearer credential is required.",
"requestId": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "FORBIDDEN",
"message": "The credential does not grant this operation.",
"requestId": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "NOT_FOUND",
"message": "The resource was not found.",
"requestId": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "CONFLICT",
"message": "The requested change conflicts with the current resource state.",
"requestId": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "Too many requests. Retry shortly.",
"requestId": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "An unexpected error occurred.",
"requestId": "550e8400-e29b-41d4-a716-446655440000"
}
}Mark attendance
Mark up to 500 registered participants as attended, no-show, or unknown before attendance is finalised. All or nothing: an unknown participant ID refuses the batch with 404, and a waitlisted or cancelled participant, or a finalised event, with 409 INVALID_STATE.
curl --request POST \
--url 'https://app.floral.so/api/v1/workspaces/acme-nordic/events/42/attendance' \
--header 'Authorization: Bearer $FLORAL_TOKEN' \
--header 'Idempotency-Key: markEventAttendanceV1-20260816-001' \
--header 'Content-Type: application/json' \
--data '{
"participantIds": [
"0f8b6c1e-3a52-4d6e-9b7a-2c4e5f6a7b8c",
"5d2e8a41-7c3b-4f90-8e16-a9b0c1d2e3f4"
],
"state": "ATTENDED"
}'const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
participantIds: ['0f8b6c1e-3a52-4d6e-9b7a-2c4e5f6a7b8c', '5d2e8a41-7c3b-4f90-8e16-a9b0c1d2e3f4'],
state: 'ATTENDED'
})
};
fetch('https://app.floral.so/api/v1/workspaces/{workspaceSlug}/events/{eventId}/attendance', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"attendance": {
"changedParticipantIds": [
"0f8b6c1e-3a52-4d6e-9b7a-2c4e5f6a7b8c"
],
"state": "ATTENDED",
"unchangedParticipantIds": [
"5d2e8a41-7c3b-4f90-8e16-a9b0c1d2e3f4"
]
}
}{
"error": {
"code": "INVALID_INPUT",
"message": "The request contains invalid values.",
"requestId": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "UNAUTHENTICATED",
"message": "A valid bearer credential is required.",
"requestId": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "FORBIDDEN",
"message": "The credential does not grant this operation.",
"requestId": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "NOT_FOUND",
"message": "The resource was not found.",
"requestId": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "CONFLICT",
"message": "The requested change conflicts with the current resource state.",
"requestId": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "Too many requests. Retry shortly.",
"requestId": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "An unexpected error occurred.",
"requestId": "550e8400-e29b-41d4-a716-446655440000"
}
}Authorizations
Authenticate with a workspace-pinned Floral personal access token.
Headers
Optional caller-generated correlation ID. Floral returns the effective value in X-Request-ID.
1 - 128Required idempotency key. Exact retries of the same canonical request replay the original status, body, ETag, Location, and request ID for 24 hours.
1 - 255Path Parameters
Slug of the workspace pinned to the credential.
1 - 100^[a-z0-9]+(?:-[a-z0-9]+)*$Stable numeric event ID.
x >= 1Body
Unique participant IDs of this event and the target state. Maximum 65536 bytes.
1 - 500 elements^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$UNKNOWN, ATTENDED, NO_SHOW Response
Attendance marked
Show child attributes
Show child attributes
