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.
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:
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:
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 itsdata 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:
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
UsePOST /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 requireX-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 containmessage. 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.