curl --request POST \
--url 'https://app.floral.so/api/v1/workspaces/acme-nordic/summaries/168/approve' \
--header 'Authorization: Bearer $FLORAL_TOKEN' \
--header 'Idempotency-Key: approveSummaryV1-20260816-001' \
--header 'If-Match: "v1.c3VtbWFyeS0xNjgtMw"' \
--header 'Content-Type: application/json' \
--data '{
"appointmentDate": "2026-08-18T09:00:00.000Z",
"content": {
"hvadBlevAftalt": {
"aftaler": [
{
"aftale": "Confirm the launch plan at the next meeting.",
"ansvarlig": "Customer team",
"deadline": "Before the next meeting"
}
]
},
"hvadBlevDroeftet": {
"emner": [
{
"beskrivelse": "The teams reviewed delivery capacity and launch sequencing.",
"emne": "Launch planning",
"rejstAf": "fælles"
}
]
},
"opsummering": "The teams aligned on launch milestones and ownership.",
"titel": "Quarterly planning",
"todos": {
"opgaver": [
{
"ansvarlig": "Customer team",
"deadline": "Friday",
"opgave": "Confirm the implementation owner.",
"prioritet": "høj"
}
]
}
}
}'const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
'If-Match': '<if-match>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({})
};
fetch('https://app.floral.so/api/v1/workspaces/{workspaceSlug}/summaries/{id}/approve', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"summary": {
"appointmentDate": "2026-08-18T09:00:00.000Z",
"appointmentSubject": "Quarterly planning",
"company": {
"id": 42,
"name": "Acme Nordic",
"organizationNumber": "12345678"
},
"content": {
"context": [],
"hvadBlevAftalt": {
"aftaler": [
{
"aftale": "Confirm the launch plan at the next meeting.",
"ansvarlig": "Customer team",
"deadline": "Before the next meeting"
}
]
},
"hvadBlevDroeftet": {
"emner": [
{
"beskrivelse": "The teams reviewed delivery capacity and launch sequencing.",
"emne": "Launch planning",
"rejstAf": "fælles"
}
]
},
"opsummering": "The teams aligned on launch milestones and ownership.",
"titel": "Quarterly planning",
"todos": {
"opgaver": [
{
"ansvarlig": "Customer team",
"deadline": "Friday",
"opgave": "Confirm the implementation owner.",
"prioritet": "høj"
}
]
}
},
"createdAt": "2026-08-15T10:00:00.000Z",
"durationSec": 2700,
"evidenceAudience": "CUSTOMER",
"id": 168,
"internalNotes": null,
"name": "Quarterly planning",
"status": "APPROVED",
"updatedAt": "2026-08-15T10:30:00.000Z",
"version": "v1.c3VtbWFyeS0xNjgtMw"
}
}{
"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": "VERSION_CONFLICT",
"message": "The resource changed since it was read.",
"requestId": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "PRECONDITION_REQUIRED",
"message": "If-Match is required for this operation.",
"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"
}
}Approve a summary
Approve a caller-created summary that is waiting for approval, optionally replacing public structured content and appointment time.
curl --request POST \
--url 'https://app.floral.so/api/v1/workspaces/acme-nordic/summaries/168/approve' \
--header 'Authorization: Bearer $FLORAL_TOKEN' \
--header 'Idempotency-Key: approveSummaryV1-20260816-001' \
--header 'If-Match: "v1.c3VtbWFyeS0xNjgtMw"' \
--header 'Content-Type: application/json' \
--data '{
"appointmentDate": "2026-08-18T09:00:00.000Z",
"content": {
"hvadBlevAftalt": {
"aftaler": [
{
"aftale": "Confirm the launch plan at the next meeting.",
"ansvarlig": "Customer team",
"deadline": "Before the next meeting"
}
]
},
"hvadBlevDroeftet": {
"emner": [
{
"beskrivelse": "The teams reviewed delivery capacity and launch sequencing.",
"emne": "Launch planning",
"rejstAf": "fælles"
}
]
},
"opsummering": "The teams aligned on launch milestones and ownership.",
"titel": "Quarterly planning",
"todos": {
"opgaver": [
{
"ansvarlig": "Customer team",
"deadline": "Friday",
"opgave": "Confirm the implementation owner.",
"prioritet": "høj"
}
]
}
}
}'const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
'If-Match': '<if-match>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({})
};
fetch('https://app.floral.so/api/v1/workspaces/{workspaceSlug}/summaries/{id}/approve', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"summary": {
"appointmentDate": "2026-08-18T09:00:00.000Z",
"appointmentSubject": "Quarterly planning",
"company": {
"id": 42,
"name": "Acme Nordic",
"organizationNumber": "12345678"
},
"content": {
"context": [],
"hvadBlevAftalt": {
"aftaler": [
{
"aftale": "Confirm the launch plan at the next meeting.",
"ansvarlig": "Customer team",
"deadline": "Before the next meeting"
}
]
},
"hvadBlevDroeftet": {
"emner": [
{
"beskrivelse": "The teams reviewed delivery capacity and launch sequencing.",
"emne": "Launch planning",
"rejstAf": "fælles"
}
]
},
"opsummering": "The teams aligned on launch milestones and ownership.",
"titel": "Quarterly planning",
"todos": {
"opgaver": [
{
"ansvarlig": "Customer team",
"deadline": "Friday",
"opgave": "Confirm the implementation owner.",
"prioritet": "høj"
}
]
}
},
"createdAt": "2026-08-15T10:00:00.000Z",
"durationSec": 2700,
"evidenceAudience": "CUSTOMER",
"id": 168,
"internalNotes": null,
"name": "Quarterly planning",
"status": "APPROVED",
"updatedAt": "2026-08-15T10:30:00.000Z",
"version": "v1.c3VtbWFyeS0xNjgtMw"
}
}{
"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": "VERSION_CONFLICT",
"message": "The resource changed since it was read.",
"requestId": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "PRECONDITION_REQUIRED",
"message": "If-Match is required for this operation.",
"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 - 255Strong ETag from the latest detail or mutation response. A stale value returns 412 VERSION_CONFLICT.
^"(?:[^"\\]|\\.)*"$Path Parameters
Slug of the workspace pinned to the credential.
1 - 100^[a-z0-9]+(?:-[a-z0-9]+)*$Stable numeric resource ID.
x >= 1Body
Optional edited structured content and appointment timestamp. Omit the body to approve the current values. Maximum 65536 bytes.
^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$Show child attributes
Show child attributes
Response
Summary approved
Show child attributes
Show child attributes
