Skip to content
FolioSign inStart your trial

Docs · Build

Webhook event catalogue

Every event Folio sends to a webhook endpoint, with its fields, privacy class and a complete example body. Generated from the API.

57 events, payload version 2026-12-01. Subscribe an endpoint to any of them, or to * for all. Receiving, verifying and replaying them is in webhooks. Ignore fields you do not recognise: events gain fields without a new version.

The delivered body

Every delivery is one event. data.object is the full resource as it was when the event happened; data.previous_attributes appears on updates. The event id is the same on every retry and endpoint; the webhook-id header identifies one delivery.

Fields of the event envelope
FieldTypeDescription
actor requiredobject | nullThe team member who caused the event, null when a person did not (jobs, automations, Folio).
id requiredstringThe team member id.
object requiredenum: userAlways user.
api_version requiredstringThe event schema version.
churchobjectThe church the event is about. Sent to partner endpoints.
id requiredstringThe church id.
name requiredstringThe church name.
object requiredenum: churchAlways church.
slug requiredstringThe church web address.
created requiredstring (date-time)When the event happened.
data requiredobjectThe event payload.
object requiredobjectThe full resource as it was when the event happened, in the same shape the REST API returns it.
previous_attributesobjectOn update events, the earlier values of the fields that changed.
id requiredstringThe event id. The same on every retry and on every endpoint that receives the event; use it to deduplicate. The webhook-id header identifies one delivery.
livemode requiredbooleanFalse for sandbox churches, test keys and test events.
object requiredenum: eventAlways event.
ordering_keystringA stable key per church; events with the same key are best processed in order.
partnerobjectThe partner that receives the event.
id requiredstringThe partner church id.
request requiredobject | nullThe API request that caused the event, null when Folio caused it.
id requiredstringThe request id, the same value as the request_id in API responses.
idempotency_key requiredstring | nullThe Idempotency-Key the caller sent, if any.
testbooleanTrue on events sent from the test button or the test endpoint.
type requiredstringThe event type from the catalogue.
Example event
{
  "actor": null,
  "api_version": "2026-12-01",
  "created": "2026-10-13T09:12:10Z",
  "data": {
    "object": {
      "approval_kind": "human",
      "approved_at": "2026-10-13T09:00:00Z",
      "church": "Grace Place",
      "created_at": "2026-10-13T09:12:10Z",
      "failure_reason": "",
      "id": "note_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
      "model_id": "gemini-2.5-pro",
      "needs_person_reason": "",
      "object": "note",
      "prompt_version": "notes.v14",
      "published_at": "2026-10-13T09:12:10Z",
      "returned_reason": "",
      "row_version": 5,
      "sections": [
        {
          "body": "Paul reminds us that nothing in our hardest seasons is wasted.",
          "h": "Called by purpose"
        }
      ],
      "share_path": "/s/romans-8-nothing-can-separate-us",
      "share_slug": "romans-8-nothing-can-separate-us",
      "speaker": "Pastor Ada Okafor",
      "speaker_evidence": "",
      "speaker_inferred": false,
      "status": "published",
      "summary": "God works all things together for good for those who love him.",
      "teaching": {
        "id": "tch_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
        "name": "Romans 8: Nothing can separate us",
        "object": "teaching",
        "recorded_at": "2026-10-11T10:00:00Z",
        "speaker": "Pastor Ada Okafor",
        "title": "Romans 8: Nothing can separate us"
      },
      "updated_at": "2026-10-13T09:12:10Z",
      "version": 3,
      "warnings": []
    },
    "previous_attributes": {
      "status": "draft"
    }
  },
  "id": "evt_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
  "livemode": false,
  "object": "event",
  "request": {
    "id": "req_5f3c9a1e7b2d4c68a0e1f2d3c4b5a697",
    "idempotency_key": null
  },
  "type": "note.published"
}

Privacy classes

Each event is marked with what it carries, so you can subscribe each endpoint to only what it needs. Carries content events carry what the REST read of the same resource returns. events carry ids, kinds, states and times only. events carry facts about the church, its keys and connections. Financial data events carry amounts in minor units and at most a card brand and last four digits. No event carries a secret, key value or token.

Verify the signature

Verify every delivery before you trust it. The signed content is <webhook-id>.<webhook-timestamp>.<raw body> and the signature is its base64 HMAC-SHA256. The key is the whole whsec_ secret string as bytes, not base64-decoded. The webhook-signature header holds one or two space-separated v1,<signature> values, two while a rotated secret overlaps: accept the request if any one matches. Compare in constant time, hash the raw body bytes rather than a re-serialised object, and reject a webhook-timestamp more than five minutes from your clock.

SECRET='whsec_...'
ID='msg_01JC8M2X9R5V0K4T7E3Q6B1ZDN'; TS='1793541609'
printf '%s.%s.%s' "$ID" "$TS" "$(cat body.json)" | openssl dgst -sha256 -hmac "$SECRET" -binary | base64
jq -r '[.id, .type, .ordering_key, .data.object.id] | @tsv' body.json

Ordering, retries and replay

  • Deduplicate on the event id (evt_…). It is the same on every retry, on every endpoint and on a replay. The webhook-id header (msg_…) names one delivery: a retry reuses it and a replay gets a new one.
  • Deliveries about one church share an ordering_key, the church id, on partner endpoints. Sort by created within a key. Different churches have no order relative to each other, and a retry can arrive after a later event, so fetch the current state with the API when order matters.
  • Answer with any 2xx within the timeout and do the work afterwards. Any other answer, or a timeout, is retried on a backoff, and webhook-will-retry-after on a failed attempt gives the next delay in seconds. folio-attempt counts attempts.
  • An endpoint that fails 20 times in a row is disabled with disabled_reason consecutive_failures. Enable it again after you fix the receiver. A body over 256 KB is not sent and the delivery fails with payload too large.
  • Every attempt, with your receiver’s status, latency and the first 2 KB of its answer, is kept for 30 days. Replay a delivery with POST /v1/webhook-endpoints/{endpoint}/deliveries/{delivery}/replay. The replay carries the original event, unchanged.

Deletion and purged events

partner.church.deleted is sent twice for one church. The first has data.object.deletion.stage set to scheduled when deletion is requested, while the church can still cancel it. The second has purged once its data is removed, and carries only the summary captured before removal: no teachings, notes or people. Treat purged as the signal to delete what you hold for that church. The two share neither an event id nor an ordering guarantee beyond created.

Events by group

Teachings (5)

  • teaching.created Carries contentA teaching was added by upload, link, YouTube, Drive or a finished live service.
  • teaching.ready Carries contentA teaching finished processing and is searchable.
  • teaching.failed Carries contentA teaching could not be processed.
  • teaching.retired Carries contentA teaching was deleted from the library. The object is its last state.
  • transcript.ready Carries contentA transcript was stored and selected for a teaching.
Example: teaching.created
Example teaching.created body
{
  "actor": null,
  "api_version": "2026-12-01",
  "created": "2026-10-13T09:12:10Z",
  "data": {
    "object": {
      "created_at": "2026-10-13T09:12:10Z",
      "duration_seconds": 2412,
      "failure_reason": "",
      "guest_affiliation": "",
      "id": "tch_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
      "is_guest": false,
      "name": "Romans 8: Nothing can separate us",
      "object": "teaching",
      "passage": "Romans 8:31-39",
      "possible_duplicate_of": {
        "id": "tch_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9099",
        "reason": "same recording length and transcript",
        "title": "Romans 8: Nothing can separate us"
      },
      "progress": {
        "current": {
          "finished_at": "2026-10-13T09:12:10Z",
          "key": "transcribe",
          "label": "Transcribing",
          "note": "",
          "started_at": "2026-10-13T09:12:10Z",
          "state": "done"
        },
        "needs_decision": false,
        "steps": [
          {
            "finished_at": "2026-10-13T09:12:10Z",
            "key": "transcribe",
            "label": "Transcribing",
            "note": "",
            "started_at": "2026-10-13T09:12:10Z",
            "state": "done"
          }
        ]
      },
      "recorded_at": "2026-10-11T10:00:00Z",
      "series": "Romans",
      "source": {
        "id": "src_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
        "kind": "upload",
        "name": "Sunday uploads",
        "object": "source"
      },
      "speaker": "Pastor Ada Okafor",
      "speaker_evidence": "",
      "speaker_inferred": false,
      "status": "ready",
      "status_note": "",
      "title": "Romans 8: Nothing can separate us",
      "transcript_changed": false
    }
  },
  "id": "evt_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
  "livemode": false,
  "object": "event",
  "request": {
    "id": "req_5f3c9a1e7b2d4c68a0e1f2d3c4b5a697",
    "idempotency_key": null
  },
  "type": "teaching.created"
}

Notes (7)

  • note.draft_created Carries contentA draft note was generated from a transcript.
  • note.updated Carries contentA draft or in-review note was edited and a new version was saved.
  • note.review_requested Carries contentA note was sent for review.
  • note.approved Carries contentA note was approved, by a person or automatically. approval_kind says which.
  • note.returned Carries contentA reviewer sent a note back to its author with a reason. returned_reason carries it.
  • note.published Carries contentA note was published to its share page.
  • note.superseded Carries contentA note was replaced and its share page was unpublished.
Example: note.draft_created
Example note.draft_created body
{
  "actor": null,
  "api_version": "2026-12-01",
  "created": "2026-10-13T09:12:10Z",
  "data": {
    "object": {
      "approval_kind": "human",
      "approved_at": "2026-10-13T09:00:00Z",
      "church": "Grace Place",
      "created_at": "2026-10-13T09:12:10Z",
      "failure_reason": "",
      "id": "note_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
      "model_id": "gemini-2.5-pro",
      "needs_person_reason": "",
      "object": "note",
      "prompt_version": "notes.v14",
      "published_at": "2026-10-13T09:12:10Z",
      "returned_reason": "",
      "row_version": 5,
      "sections": [
        {
          "body": "Paul reminds us that nothing in our hardest seasons is wasted.",
          "h": "Called by purpose"
        }
      ],
      "share_path": "/s/romans-8-nothing-can-separate-us",
      "share_slug": "romans-8-nothing-can-separate-us",
      "speaker": "Pastor Ada Okafor",
      "speaker_evidence": "",
      "speaker_inferred": false,
      "status": "published",
      "summary": "God works all things together for good for those who love him.",
      "teaching": {
        "id": "tch_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
        "name": "Romans 8: Nothing can separate us",
        "object": "teaching",
        "recorded_at": "2026-10-11T10:00:00Z",
        "speaker": "Pastor Ada Okafor",
        "title": "Romans 8: Nothing can separate us"
      },
      "updated_at": "2026-10-13T09:12:10Z",
      "version": 3,
      "warnings": []
    }
  },
  "id": "evt_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
  "livemode": false,
  "object": "event",
  "request": {
    "id": "req_5f3c9a1e7b2d4c68a0e1f2d3c4b5a697",
    "idempotency_key": null
  },
  "type": "note.draft_created"
}

Outputs (4)

  • output.created Carries contentA devotional, blog post, newsletter or study guide was generated for the first time.
  • output.published Carries contentAn output moved to published.
  • output.unpublished Carries contentA published output was taken back to review. Remove it from wherever you posted it. stale_reason says why when the source changed.
  • output.stale Carries contentThe note an output was written from changed, was returned or was replaced, so the output may no longer match it. stale_reason says which.
Example: output.created
Example output.created body
{
  "actor": null,
  "api_version": "2026-12-01",
  "created": "2026-10-13T09:12:10Z",
  "data": {
    "object": {
      "body_md": "The Spirit leads gently, and we follow.",
      "changes_requested": false,
      "id": "out_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
      "kind": "devotional",
      "language": "en",
      "meta": {
        "subject": "Walk in step with the Spirit"
      },
      "model_id": "gemini-2.5-pro",
      "note": {
        "id": "note_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
        "object": "note",
        "status": "approved"
      },
      "note_id": "note_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
      "object": "output",
      "prompt_version": "outputs.v9",
      "review_comment": "",
      "row_version": 4,
      "sections": [
        {
          "body": "The Spirit leads gently, and we follow.",
          "heading": "Reflection",
          "key": "reflection"
        }
      ],
      "source_note_id": "note_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
      "source_version": 3,
      "stale": false,
      "stale_acknowledged": false,
      "stale_reason": "",
      "status": "published",
      "status_detail": "",
      "teaching": {
        "id": "tch_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
        "name": "Romans 8: Nothing can separate us",
        "object": "teaching",
        "recorded_at": "2026-10-11T10:00:00Z",
        "speaker": "Pastor Ada Okafor",
        "title": "Romans 8: Nothing can separate us"
      },
      "teaching_id": "tch_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
      "title": "Walk in step with the Spirit",
      "updated_at": "2026-10-13T09:12:10Z",
      "verses": [
        {
          "ref": "Romans 8:14",
          "status": "verified"
        }
      ],
      "warnings": [],
      "word_count": 412
    }
  },
  "id": "evt_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
  "livemode": false,
  "object": "event",
  "request": {
    "id": "req_5f3c9a1e7b2d4c68a0e1f2d3c4b5a697",
    "idempotency_key": null
  },
  "type": "output.created"
}

Scripture (2)

  • scripture.indexed Carries contentThe scripture references in an approved note were found and linked to verses.
  • scripture.tension_detected Carries contentA new teaching point seems to pull against earlier teaching on the same verse and needs a person to look.
Example: scripture.indexed
Example scripture.indexed body
{
  "actor": null,
  "api_version": "2026-12-01",
  "created": "2026-10-13T09:12:10Z",
  "data": {
    "object": {
      "citation_count": 14,
      "created_at": "2026-10-13T09:12:10Z",
      "dropped_count": 1,
      "finished_at": "2026-10-13T09:12:10Z",
      "id": "ext_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
      "note": {
        "id": "note_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
        "object": "note",
        "status": "approved"
      },
      "object": "scripture_extraction",
      "status": "succeeded",
      "teaching": {
        "id": "tch_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
        "name": "Romans 8: Nothing can separate us",
        "object": "teaching",
        "recorded_at": "2026-10-11T10:00:00Z",
        "speaker": "Pastor Ada Okafor",
        "title": "Romans 8: Nothing can separate us"
      }
    }
  },
  "id": "evt_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
  "livemode": false,
  "object": "event",
  "request": {
    "id": "req_5f3c9a1e7b2d4c68a0e1f2d3c4b5a697",
    "idempotency_key": null
  },
  "type": "scripture.indexed"
}

Live (5)

  • live.started Carries contentA live stream began.
  • live.reconnecting Carries contentThe feed dropped and the stream is waiting for the encoder to return.
  • live.ended Carries contentA live stream ended, whether finished, stopped, idle, revoked or failed. status and end_reason say which.
  • live.stream.deleted Carries contentA finished live stream was deleted, with its captions, recordings and timeline. The teaching made from it is kept.
  • live.teaching_created Carries contentA finished live service became a teaching with its captions as the transcript. teaching points to it.
Example: live.started
Example live.started body
{
  "actor": null,
  "api_version": "2026-12-01",
  "created": "2026-10-13T09:12:10Z",
  "data": {
    "object": {
      "audio_ms": 2412000,
      "billed_ms": 2412000,
      "created_at": "2026-10-13T09:12:10Z",
      "end_reason": "finalized",
      "id": "live_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
      "language": "en",
      "last_seq": 1873,
      "object": "live_stream",
      "public_captions": true,
      "source": "main",
      "status": "ended",
      "status_transitions": {
        "deleted_at": "2026-10-13T09:12:10Z",
        "disconnected_at": "2026-10-13T08:41:00Z",
        "ended_at": "2026-10-13T09:12:10Z",
        "started_at": "2026-10-13T08:30:00Z"
      },
      "teaching": {
        "id": "tch_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
        "name": "Romans 8: Nothing can separate us",
        "object": "teaching",
        "recorded_at": "2026-10-11T10:00:00Z",
        "speaker": "Pastor Ada Okafor",
        "title": "Romans 8: Nothing can separate us"
      }
    },
    "previous_attributes": {
      "status": "created"
    }
  },
  "id": "evt_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
  "livemode": false,
  "object": "event",
  "request": {
    "id": "req_5f3c9a1e7b2d4c68a0e1f2d3c4b5a697",
    "idempotency_key": null
  },
  "type": "live.started"
}

Ask (1)

  • conversation.handoff_created A visitor or team member asked for a person to follow up on a conversation. The question and contact details are never included.
Example: conversation.handoff_created
Example conversation.handoff_created body
{
  "actor": null,
  "api_version": "2026-12-01",
  "created": "2026-10-13T09:12:10Z",
  "data": {
    "object": {
      "assigned_to": {
        "id": "usr_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
        "object": "user"
      },
      "conversation": {
        "id": "conv_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
        "object": "conversation",
        "surface": "widget"
      },
      "conversation_shared": false,
      "created_at": "2026-10-13T09:12:10Z",
      "id": "hof_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
      "kind": "pastor",
      "object": "handoff",
      "reachable_by": [
        "email"
      ],
      "status": "new",
      "surface": "widget"
    }
  },
  "id": "evt_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
  "livemode": false,
  "object": "event",
  "request": {
    "id": "req_5f3c9a1e7b2d4c68a0e1f2d3c4b5a697",
    "idempotency_key": null
  },
  "type": "conversation.handoff_created"
}

Care (1)

  • care.alert_created A care alert was raised. The message itself is never included; open the alert in Folio.
Example: care.alert_created
Example care.alert_created body
{
  "actor": null,
  "api_version": "2026-12-01",
  "created": "2026-10-13T09:12:10Z",
  "data": {
    "object": {
      "acknowledged_at": "2026-10-13T09:12:10Z",
      "assigned_to": {
        "id": "usr_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
        "object": "user"
      },
      "category": "suicide_self_harm",
      "created_at": "2026-10-13T09:12:10Z",
      "detection": "lexicon",
      "id": "car_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
      "object": "care_alert",
      "status": "open",
      "surface": "widget",
      "urgency": "high"
    }
  },
  "id": "evt_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
  "livemode": false,
  "object": "event",
  "request": {
    "id": "req_5f3c9a1e7b2d4c68a0e1f2d3c4b5a697",
    "idempotency_key": null
  },
  "type": "care.alert_created"
}

Audience (4)

Example: audience.subscriber_confirmed
Example audience.subscriber_confirmed body
{
  "actor": null,
  "api_version": "2026-12-01",
  "created": "2026-10-13T09:12:10Z",
  "data": {
    "object": {
      "channels": [
        {
          "channel": "email",
          "state": "active"
        }
      ],
      "confirmed_at": "2026-10-13T09:12:10Z",
      "created_at": "2026-10-13T09:12:10Z",
      "id": "sub_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
      "language": "en",
      "object": "subscriber",
      "source": "website",
      "status": "active",
      "unsubscribed_at": "2026-10-13T09:12:10Z"
    },
    "previous_attributes": {
      "status": "pending"
    }
  },
  "id": "evt_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
  "livemode": false,
  "object": "event",
  "request": {
    "id": "req_5f3c9a1e7b2d4c68a0e1f2d3c4b5a697",
    "idempotency_key": null
  },
  "type": "audience.subscriber_confirmed"
}

Billing (9)

Example: billing.subscription_started
Example billing.subscription_started body
{
  "actor": null,
  "api_version": "2026-12-01",
  "created": "2026-10-13T09:12:10Z",
  "data": {
    "object": {
      "cancel_at": "2026-11-13T09:12:10Z",
      "canceled_at": "2026-10-13T09:12:10Z",
      "church": {
        "id": "org_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
        "name": "Grace Place",
        "object": "church",
        "slug": "grace-place"
      },
      "created_at": "2026-10-13T09:12:10Z",
      "currency": "USD",
      "current_period": {
        "end": "2026-11-13T09:12:10Z",
        "start": "2026-10-13T09:12:10Z"
      },
      "id": "subs_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
      "interval": "month",
      "items": {
        "data": [
          {
            "description": "Church (month)",
            "object": "subscription_item",
            "price": {
              "amount_minor": 7900,
              "currency": "USD"
            },
            "quantity": 1
          }
        ],
        "has_more": false,
        "object": "list",
        "url": "/v1/billing"
      },
      "latest_invoice": {
        "id": "inv_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
        "number": "INV-0192F7A8-1A2B3C4D",
        "object": "invoice",
        "status": "paid"
      },
      "object": "subscription",
      "plan": {
        "id": "plan_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
        "key": "church",
        "name": "Church",
        "object": "plan"
      },
      "status": "active",
      "trial": {
        "days_left": 7,
        "ended_at": "2026-10-13T09:12:10Z",
        "ends_at": "2026-11-13T09:12:10Z",
        "kind": "trial",
        "outcome": "expired",
        "started_at": "2026-10-13T09:12:10Z"
      }
    }
  },
  "id": "evt_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
  "livemode": false,
  "object": "event",
  "request": {
    "id": "req_5f3c9a1e7b2d4c68a0e1f2d3c4b5a697",
    "idempotency_key": null
  },
  "type": "billing.subscription_started"
}

Members and team (4)

  • member.invited Someone was invited to the team. The address is not included.
  • member.joined Someone joined the team by accepting an invitation or through single sign-on provisioning.
  • member.removed A member was removed from the team. The object holds the role they had.
  • member.role_changed A member's role changed. previous_attributes.role is the role they had.
Example: member.invited
Example member.invited body
{
  "actor": null,
  "api_version": "2026-12-01",
  "created": "2026-10-13T09:12:10Z",
  "data": {
    "object": {
      "created_at": "2026-10-13T09:12:10Z",
      "expires_at": "2026-10-13T09:12:10Z",
      "id": "invt_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
      "invited_by": {
        "id": "usr_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
        "object": "user"
      },
      "object": "invitation",
      "role": "editor",
      "status": "pending"
    }
  },
  "id": "evt_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
  "livemode": false,
  "object": "event",
  "request": {
    "id": "req_5f3c9a1e7b2d4c68a0e1f2d3c4b5a697",
    "idempotency_key": null
  },
  "type": "member.invited"
}

API keys (2)

Example: api_key.created
Example api_key.created body
{
  "actor": null,
  "api_version": "2026-12-01",
  "created": "2026-10-13T09:12:10Z",
  "data": {
    "object": {
      "church": {
        "id": "org_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
        "name": "Grace Place",
        "object": "church",
        "slug": "grace-place"
      },
      "church_ids": [],
      "created_at": "2026-10-13T09:12:10Z",
      "created_by": {
        "id": "usr_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
        "object": "user"
      },
      "expires_at": "2026-11-13T09:12:10Z",
      "id": "key_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
      "last4": "a91c",
      "mode": "live",
      "name": "CRM sync",
      "object": "api_key",
      "partner": false,
      "prefix": "folio_live_3f9d",
      "rate_limit_per_minute": 600,
      "revoked_at": "2026-10-13T09:12:10Z",
      "scopes": [
        "teachings:read",
        "notes:read"
      ]
    }
  },
  "id": "evt_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
  "livemode": false,
  "object": "event",
  "request": {
    "id": "req_5f3c9a1e7b2d4c68a0e1f2d3c4b5a697",
    "idempotency_key": null
  },
  "type": "api_key.created"
}

Connections (2)

Example: connection.connected
Example connection.connected body
{
  "actor": null,
  "api_version": "2026-12-01",
  "created": "2026-10-13T09:12:10Z",
  "data": {
    "object": {
      "account": "default",
      "created_at": "2026-10-13T09:12:10Z",
      "id": "con_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
      "last_synced_at": "2026-10-13T09:12:10Z",
      "object": "connection",
      "provider": "gdrive",
      "scopes": [
        "drive.readonly"
      ],
      "status": "active"
    }
  },
  "id": "evt_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
  "livemode": false,
  "object": "event",
  "request": {
    "id": "req_5f3c9a1e7b2d4c68a0e1f2d3c4b5a697",
    "idempotency_key": null
  },
  "type": "connection.connected"
}

Access (1)

  • access.changed A source or feature was switched on or off for the church, by Folio or by the church's owner.
Example: access.changed
Example access.changed body
{
  "actor": null,
  "api_version": "2026-12-01",
  "created": "2026-10-13T09:12:10Z",
  "data": {
    "object": {
      "change": "enabled",
      "changed_by": "folio",
      "id": "acc_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
      "key": "source:vimeo",
      "object": "access_change",
      "occurred_at": "2026-10-13T09:12:10Z",
      "role": "editor"
    }
  },
  "id": "evt_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
  "livemode": false,
  "object": "event",
  "request": {
    "id": "req_5f3c9a1e7b2d4c68a0e1f2d3c4b5a697",
    "idempotency_key": null
  },
  "type": "access.changed"
}

Folio support access (3)

  • support.access_granted An owner let Folio support into the church for a limited time. The reason is not included.
  • support.access_entered A Folio support person entered the church under a grant. Sent on every entry. entry_number counts them.
  • support.access_revoked Support access ended because an owner revoked it or it reached its expiry. status says which.
Example: support.access_granted
Example support.access_granted body
{
  "actor": null,
  "api_version": "2026-12-01",
  "created": "2026-10-13T09:12:10Z",
  "data": {
    "object": {
      "created_at": "2026-10-13T09:12:10Z",
      "entry_number": 1,
      "expires_at": "2026-10-13T09:12:10Z",
      "first_entered_at": "2026-10-13T09:12:10Z",
      "granted_by": {
        "id": "usr_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
        "object": "user"
      },
      "id": "sup_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
      "include_ask": false,
      "object": "support_grant",
      "revoked_at": "2026-10-13T09:12:10Z",
      "scope": "read",
      "status": "active"
    }
  },
  "id": "evt_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
  "livemode": false,
  "object": "event",
  "request": {
    "id": "req_5f3c9a1e7b2d4c68a0e1f2d3c4b5a697",
    "idempotency_key": null
  },
  "type": "support.access_granted"
}

Partner (7)

Example: partner.church.created
Example partner.church.created body
{
  "actor": null,
  "api_version": "2026-12-01",
  "created": "2026-10-13T09:12:10Z",
  "data": {
    "object": {
      "country": "GB",
      "counts": {
        "members": 6,
        "published_notes": 96,
        "teachings": 148
      },
      "created_at": "2026-10-13T09:12:10Z",
      "deletion": {
        "purge_after": "2026-11-13T09:12:10Z",
        "requested_at": "2026-10-13T09:12:10Z",
        "stage": "scheduled"
      },
      "id": "org_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
      "name": "Grace Place",
      "object": "church",
      "plan": {
        "id": "plan_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
        "key": "church",
        "name": "Church",
        "object": "plan"
      },
      "sandbox": false,
      "slug": "grace-place",
      "status": "active",
      "subscription_status": "active",
      "suspended_at": "2026-10-13T09:12:10Z"
    }
  },
  "id": "evt_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
  "livemode": false,
  "object": "event",
  "request": {
    "id": "req_5f3c9a1e7b2d4c68a0e1f2d3c4b5a697",
    "idempotency_key": null
  },
  "type": "partner.church.created"
}

Shared objects

Objects that appear inside many events, such as a reference to a church or a teaching, are described once here.

church_ref
Shared schema church_ref
FieldTypeDescription
id requiredstringThe church id.
name requiredstringThe church name.
object requiredenum: churchAlways church.
slug requiredstringThe church web address.
conversation_ref
Shared schema conversation_ref
FieldTypeDescription
id requiredstringThe conversation id.
object requiredenum: conversationAlways conversation.
surface requiredstringWhere it happened: staff, widget or share.
invoice_line
Shared schema invoice_line
FieldTypeDescription
amount_minor requiredintegerThe line amount before tax in the smallest currency unit.
description requiredstringWhat was charged.
invoice_ref
Shared schema invoice_ref
FieldTypeDescription
id requiredstringThe invoice id.
number requiredstringThe invoice number.
object requiredenum: invoiceAlways invoice.
status requiredstringThe invoice status.
money
Shared schema money
FieldTypeDescription
amount_minor requiredintegerThe amount in the smallest currency unit, 7900 is 79.00.
currency requiredstringThe ISO 4217 currency code in upper case.
note_ref
Shared schema note_ref
FieldTypeDescription
id requiredstringThe note id.
object requiredenum: noteAlways note.
status requiredenum: draft | in_review | approved | published | superseded | failedThe note status.
output_ref
Shared schema output_ref
FieldTypeDescription
id requiredstringThe output id.
kind requiredenum: devotional | blog | newsletter | study_guideThe kind of output.
language requiredstringThe output language.
object requiredenum: outputAlways output.
status requiredenum: queued | failed | draft | in_review | approved | publishedThe output status.
payment_method_summary
Shared schema payment_method_summary
FieldTypeDescription
brand requiredstring | nullThe card brand, null when none is on file.
exp_month requiredinteger | nullThe expiry month, null when unknown.
exp_year requiredinteger | nullThe expiry year, null when unknown.
id requiredstringThe payment method id.
kind requiredstringcard, bank or wallet.
last4 requiredstring | nullThe last four digits, never the full number; null when none.
object requiredenum: payment_methodAlways payment_method.
plan_ref
Shared schema plan_ref
FieldTypeDescription
id requiredstringThe plan id.
key requiredstringThe plan key.
name requiredstringThe plan name.
object requiredenum: planAlways plan.
processing_step
Shared schema processing_step
FieldTypeDescription
finished_atstring (date-time)When the step finished.
key requiredstringThe step key.
label requiredstringThe step name shown to the team.
note requiredstringA short plain note about the step.
started_atstring (date-time)When the step began.
state requiredstringWhere the step stands: pending, active, waiting, decision, done, skipped or failed.
source_ref
Shared schema source_ref
FieldTypeDescription
id requiredstringThe source id.
kind requiredstringupload, link, youtube, drive or live.
name requiredstringThe source name.
object requiredenum: sourceAlways source.
subscription_ref
Shared schema subscription_ref
FieldTypeDescription
id requiredstringThe subscription id.
object requiredenum: subscriptionAlways subscription.
status requiredstringThe subscription status.
tax_line
Shared schema tax_line
FieldTypeDescription
amount_minor requiredintegerThe tax amount in the smallest currency unit.
inclusive requiredbooleanTrue when the price already included the tax.
jurisdiction requiredstringThe tax jurisdiction, empty when not recorded.
label requiredstringWhat the tax is called on the invoice.
rate_bps requiredintegerThe rate in basis points, 2000 is 20 percent; 0 for reverse charge or zero-rated.
tax_type requiredstringThe kind of tax: vat, gst, sales_tax and so on, empty when the provider calculated it.
treatment requiredstringcharge, reverse_charge, zero_rated or none.
teaching_ref
Shared schema teaching_ref
FieldTypeDescription
id requiredstringThe teaching id.
name requiredstringThe teaching title, as every reference object names itself.
object requiredenum: teachingAlways teaching.
recorded_at requiredstring (date-time) | nullWhen the teaching was recorded.
speaker requiredstringThe speaker, empty when unknown.
title requiredstringThe teaching title.
user_id_ref
Shared schema user_id_ref
FieldTypeDescription
id requiredstringThe team member id.
object requiredenum: userAlways user.
user_ref
Shared schema user_ref
FieldTypeDescription
id requiredstringThe team member id.
name requiredstringThe display name.
object requiredenum: userAlways user.

Verified against API version 0.0.0-dev. Generated from the live OpenAPI document.