Skip to main content
Zapier is available by invitation and remains private. Make is also available by invitation while its public directory review is pending. For invitation access and church setup, see Platform, Access and Integrations.
Automation connections use dedicated keys created in Platform > Developers. Send the full secret as X-API-Key. These keys are different from the public church API key used by member applications. Keys are bound to a church, have explicit scopes, and can expire or be revoked. The issuing staff member’s current permissions also limit delegated access. The production API base URL is https://api.thefaithapp.com/api/automation/v1. All paths below are relative to that base unless shown in full. Send Accept: application/json; JSON writes also use Content-Type: application/json. The church is selected by the key. Do not send a church ID to switch tenants. The church’s plan must include Platform Integrations.

Verify a Connection

GET /auth returns HTTP 200 for an active connection:
This endpoint does not require a trigger or action scope. An expired or revoked key returns 401; a church plan without Platform Integrations returns 403. Successful authenticated requests update the key’s last-used timestamp.

Browse People, Groups, and Events

These read-only endpoints provide IDs and names for workflow selectors: Each endpoint accepts the same optional query parameters: Results are sorted by name or event title, with up to 100 records per page. Soft-deleted records are excluded. The events list is a selector, so a listed event is not a guarantee that registration is available. Registration rules are checked when an action runs. For example, GET /options/members?search=Example&page=1 returns HTTP 200:
The same response shape applies to all three endpoints. Unknown resource paths return 404; a missing effective scope returns 403; invalid query parameters return 422.

Connection and Triggers

Supported trigger types are member.created, visitor.created, giving.received, event.registration.created, prayer.request.created, volunteer.assignment.accepted, volunteer.assignment.declined, and form.submitted. Trigger access requires triggers:read and the corresponding members:read, visitors:read, giving:read, events:read, prayer:read, volunteers:read, or forms:read scope. Polling returns an array in data. Each event has a stable id for provider deduplication and a numeric cursor_id. Without since_id, results are newest first. With since_id, results are ascending after that cursor. Advance the cursor only after durable processing. limit is at most 100. Events remain available for the configured retention window, 30 days by default; polling is not a full historical export. The list response also contains meta.next_cursor (the largest returned numeric cursor, or null for an empty list) and meta.retention_days (integer). For example:
The optional event_id query parameter accepts one UUID and filters this same list response to that retained event. Use it with type for a fixed-path readback request; a missing or foreign event returns an empty data array. Malformed identifiers return 422. Make uses this form so incoming webhook values never become part of its request path. Create a REST hook with this body:
The response contains data.id and data.signing_secret. Store the secret securely and verify webhook signatures. Repeated subscriptions for the same key, event type, and target reuse the existing subscription. Targets must pass the public HTTPS address checks. Revoking a key stops its subscriptions and pending deliveries. The native Make connector uses its dedicated webhook URL and fetches the canonical event through authenticated event readback before processing it. Keep that URL private and deduplicate external workflow steps by event ID. Authenticated readback does not prevent an exposed URL from replaying a known event. Generic webhook receivers should verify the signed body as described above. Prayer and form events omit private text and answers. Giving events omit donor identity. Keep event identifiers when retrying and deduplicate at the receiver.

Trigger Payload Contracts

All eight trigger types use this common event envelope. The tables below describe the fields inside its data object; they are not additional top-level fields. Examples on this page are illustrative, not customer records. A webhook delivery contains id, type, created_at, and data. GET /events/{uuid} returns that event inside {"data": {...}}, without a cursor_id. Polling and the fixed-path GET /events?type=...&event_id=... readback return a list, with cursor_id on each event. The automation event UUID is different from data.event_id, which identifies a church event. Treat each payload as the snapshot recorded when the event was published. Zapier’s instant triggers use the event UUID and signed snapshot. Their setup samples remove only the list-specific cursor_id so they match live webhook results. The numeric cursor remains available to direct API polling clients.

New Member: member.created

Requires triggers:read and members:read. Published when a person is created in a church or assigned to a destination church. Later profile edits do not replace the original snapshot.

New Visitor: visitor.created

Requires triggers:read and visitors:read. Recorded contact details alone are not consent to send messages. Filter a welcome workflow on the relevant consent value.

Donation Received: giving.received

Requires triggers:read and giving:read. Published for settled general gifts and outreach donations marked donated. The source value distinguishes two payload variants; source-specific fields are absent from the other variant. For example, the data object for a general gift is:
Donor names, email addresses, member IDs, and payment credentials are excluded. This trigger is a received-gift snapshot, not a stream of subsequent refunds or disputes.

New Event Registration: event.registration.created

Requires triggers:read and events:read. Registrant identity, contact details, and registration notes are excluded.

New Prayer Request: prayer.request.created

Requires triggers:read and prayer:read. This is a metadata-only trigger. The payload excludes names, member IDs, prayer text, and pastoral notes, including for requests that are not anonymous.

Serving Assignment Accepted: volunteer.assignment.accepted

Requires triggers:read and volunteers:read. Published when the assignment has a recorded response time and the status is confirmed.

Serving Assignment Declined: volunteer.assignment.declined

Requires triggers:read and volunteers:read. Published when the assignment has a recorded response time and the status is declined. Serving response payloads exclude private leader notes and instructions.

Form Submitted: form.submitted

Requires triggers:read and forms:read. Published when a submission has a recorded submission time and is not marked as spam. Answers, attachments, member identities, and care information are excluded.

Actions and Retry Safety

Use POST /api/automation/v1/actions/{action} with JSON input and an Idempotency-Key header. The key must contain 1–200 printable ASCII characters without spaces or other whitespace and stay the same for every retry of that source event and action. The native connectors also offer Return Success. Both versions return {"id":"thefaithapp-return-success","success":true} without changing church records or creating an automation action run. Neither uses a backend action endpoint or requires an action scope. Zapier’s publication version 1.0.4 and Make require the selected church connection and check it with read-only GET /api/automation/v1/auth. They return success only after HTTP 200, without exposing the authentication response or key. This check can update the key’s last-used metadata. Neither version confirms that another action would succeed. The private Zapier version 1.0.3 returns success locally without checking authentication. For example:
person.upsert creates new people with the automation source. When updating an existing person by member ID or matching email, it preserves their original source. Email matching is case-insensitive within the key’s church. Retries with identical input return the saved response with Idempotency-Replayed: true. Reusing a key with changed input returns 409. A request already processing also returns 409; do not use a new key to bypass it. The claim is scoped to the church, credential, and action. External email and SMS providers may accept a message before a network failure prevents confirmation. Such actions are marked review_required and replay their saved failure rather than sending again. Review the provider outcome before intentionally submitting a new request. A new idempotency key is a new action and can create a duplicate. Message actions use the church’s existing channel configuration. Email honors recorded opt-outs; SMS requires confirmed consent. Visitor welcome workflows should filter on recorded email consent before sending follow-up. Event registrations respect capacity, deadline, occurrence, and registration settings. Resource IDs must belong to the key’s church.

Action Request and Response Contracts

All five endpoints below require X-API-Key, an Idempotency-Key header, and a JSON body. The source ID belongs in the header, not in the JSON body. Successful requests return HTTP 200 with this envelope:
run_id is the UUID of the saved automation action run. The fields inside data depend on the action as documented below. An idempotent replay returns the original saved result and original HTTP status, with Idempotency-Replayed: true. Optional fields may be omitted or sent as null unless a conditional requirement is listed. Required numeric resource IDs are integers of at least 1 and must belong to the key’s church. These endpoints do not accept a church override or an arbitrary recipient email/phone.

Create or Update Person: POST /actions/person.upsert

Required scope: people:write. Without a member ID, a matching email updates that person; otherwise a new person is created if the church has member capacity. Updating a person’s email to one already used by someone else in the church returns 422. Omitting email or phone on an ID-based update preserves that value; supplying null clears it. New people use the automation source; updates preserve the original source.

Add Person Tag: POST /actions/person.tag

Required scope: people:write. Whitespace is trimmed and collapsed. Matching an existing tag is case-insensitive and returns it without adding a duplicate. A person can have up to 20 tags; adding a new tag at that limit returns 422.

Add Person to Group: POST /actions/group.add_member

Required scope: groups:write. An existing active membership is returned unchanged. A new membership uses the member role and does not opt the person into the group directory.

Create Event Registration: POST /actions/event.register

Required scope: events:write. Use an explicit occurrence date for predictable recurring-event workflows. The event must support built-in registration and its deadline must not have passed. Capacity and waitlist settings apply. Existing uncancelled registration for the same person and occurrence is returned unchanged. A cancelled registration can be reopened with the new input. A paid registration can return payment_status: "pending"; this action does not charge the person or complete payment. Paid registration requires the church’s Stripe connection to be ready. Read the returned status before treating the person as registered or paid.

Send Message: POST /actions/message.send

Required scope: messages:send. The issuing staff member must also retain the permission for the selected channel. In-app messages create a notification for the selected person. Email requires a valid recorded recipient, an active church email provider, a valid sender, and no recorded subscriber opt-out. SMS requires a recorded phone number and a subscribed SMS record with confirmed opt-in. Email/SMS actions make real external sends through the church’s provider. An email/SMS success does not prove that the person read or received the message. Ambiguous provider failures return 502 with a saved action run that needs review; use the retry guidance above before starting a new send.

Make an API Call

Make’s Make an API call module uses the selected connection and the production Automation API. Enter a relative path such as /v1/auth or /v1/events, and put filters in Query string. For an action request, map the stable Source event ID; the module sends it as Idempotency-Key. The optional Headers input accepts only X-Request-ID and X-Correlation-ID for request tracing. The connection supplies X-API-Key, Accept, and the JSON Content-Type; these and Idempotency-Key cannot be overridden through Headers. The output contains Body, Status code, and a Headers collection limited to Content-Type and Retry-After when present. Other response headers, including cookies and authentication or credential values, are excluded from the module’s mapped output. Log sanitization is separate from this restriction on scenario bundles. Use Retry-After to guide retries when the API rate-limits a request.

Errors and Diagnostics

Error responses contain message. Validation failures can also contain errors, whose keys identify invalid fields and whose values are arrays of messages. Once an action run has been claimed, its response includes run_id; authentication, scope, and initial input-validation failures can occur before a run exists. An empty GET /events?event_id=... list is HTTP 200 when the UUID does not match a retained event for the requested type and church. Direct GET /events/{uuid} readback returns 404 for a missing, foreign, or expired event. Do not automatically retry a review_required message action as a new request. Integration administrators can review recent action runs in Developers and webhook attempts in webhook diagnostics. Private provider invite links are configured per deployment; an account or local app definition alone does not make a provider app available to churches.