Planning Center API Reference for Developers

Planning Center API: Quick Reference
The Planning Center API gives you programmatic access to Calendar, Check-Ins, Giving, Groups, People, and Services data. It runs on JSON:API 1.0 at api.planningcenteronline.com, which means consistent resource shapes, predictable pagination, and standard error formats across every endpoint.
Two authentication paths cover most use cases. OAuth 2.0 handles user-delegated access, when your app acts on behalf of a specific Planning Center user. Personal Access Tokens work for server automation like nightly syncs, ETL jobs, or anything that runs without a human in the loop.
Quick reference table for core products and primary endpoints
| Product | Primary Use Case | Most Frequently Accessed Endpoints |
|---|---|---|
| People | Membership and contact management | /people/v2/people, /people/v2/people/:id |
| Services | Plans, teams, and schedules | /services/v2/plans, /services/v2/people, /services/v2/items |
| Registrations | Event signup and ticketing | /registrations/v2/events, /registrations/v2/registrations |
| Giving | Donations, batches, and funds | /giving/v2/donations, /giving/v2/people |
| Check-Ins | Attendance and group workflows | /check_ins/v2/check_ins, /check_ins/v2/labels |
| Calendar | Event scheduling and occurrences | /calendar/v2/events, /calendar/v2/occurrences |
Authentication summary and quick choices
- OAuth 2.0 is required when your app needs to act as a Planning Center user and access scoped resources on their behalf.
- Personal Access Tokens suit server-to-server workflows like nightly syncs or ETL jobs.
Practical orientation points
- Use Link headers for pagination instead of guessing offsets.
- Prefer sparse fieldsets and include parameters to reduce payload sizes.
- Respect rate limit headers and implement exponential backoff when receiving 429 responses.
Cross references to other sections
- For step-by-step setup, see the Authentication Methods and Security Best Practices section.
- For payload shapes and relationship handling, consult Core Endpoints and Resource Models.
- For real-time updates choose Webhooks and Real-Time Event Handling and pair webhooks with REST calls to reconcile missing data.
Short decision guide
- Need user consent or per-user scopes? Choose OAuth 2.0.
- Need reliable server automation? Choose Personal Access Token.
- Need near real-time updates? Use webhooks plus REST reconciliation.
Planning Center API combines structured JSON:API resources with familiar OAuth and token patterns so developers can pick the integration approach that best matches their architecture and operational needs.
Table of Contents
- Authentication Methods and Security Best Practices
- Core Endpoints and Resource Models
- Webhooks and Real-Time Event Handling
- Rate Limits and Error Handling Strategies
- Integration Patterns and No-Code Implementation Options
- Troubleshooting Guide and Frequently Asked Questions
Authentication Methods and Security Best Practices
The Planning Center API gives you two authentication paths, and picking the right one comes down to what your integration actually needs. OAuth 2.0 handles delegated user access: your app acting on behalf of a real person. Personal Access Tokens work for server automation where no user is involved. This section walks through both, plus how to keep your credentials safe and how to call the People endpoint once you're ready.
First things first: register your application in the Developer Center and record the Client ID and Client Secret securely. The Client Secret is not public information; treat it like a password. Configure your redirect URI to match exactly what you'll send during authorization. Getting this right prevents redirect mismatch attacks and keeps the token exchange predictable.

The diagram above maps out the full OAuth flow step by step. You can use it to confirm that your redirect URIs line up with your deployment environments, verify the scopes your app requests, and think through your consent screen before writing any code.
How OAuth 2.0 Works in Practice
The flow breaks down into five steps:
- You redirect the user to Planning Center's authorization endpoint with your Client ID, redirect URI, and requested scopes.
- The user grants consent, and Planning Center returns an authorization code to your redirect URI.
- Your backend exchanges that code for an access token and a refresh token, using your Client Secret to authenticate.
- Store both tokens securely and pass the access token as a Bearer token on every API request.
- Before the access token expires, use the refresh token to get a new one, so the user doesn't have to reauthorize.
Key OAuth Security Tips
- Store Client Secrets and tokens in environment variables or a secrets manager. Never commit them to source control. This is basic, but it's the mistake that shows up in security incidents more than anything else.
- Rotate keys on a schedule and revoke compromised tokens immediately. Don't wait around if something looks off.
- Limit scopes to only what your app needs. If you're just reading people data, don't request write access "just in case." This reduces the blast radius if a token leaks.
Personal Access Tokens for Server Automation
Personal Access Tokens (PATs) work well for cron jobs, ETL pipelines, and background processes with no user involved. They act like a long-lived bearer token tied to an account, and they're simpler to set up than OAuth.
- Use PATs for internal tools that don't require user consent.
- Store PATs in an encrypted secret store and restrict access to only the deploy pipelines and runtime environments that actually need them.
Practical Code Examples
Here's what calling the People endpoint actually looks like with a Bearer token in hand:
1) cURL example
curl -H "Authorization: Bearer YOUR_TOKEN"
"https://api.planningcenteronline.com/people/v2/people?per_page=10"
2) Node.js fetch example
const res = await fetch("https://api.planningcenteronline.com/people/v2/people?per_page=10", {
headers: { "Authorization": Bearer ${process.env.PLANNING_CENTER_TOKEN} }
});
const data = await res.json();
3) Python requests example
import os, requests token = os.getenv("PLANNING_CENTER_TOKEN") r = requests.get("https://api.planningcenteronline.com/people/v2/people?per_page=10", headers={"Authorization": f"Bearer {token}"}) r.raise_for_status() print(r.json())
Security Operational Practices
- Use a secrets manager or your platform's encrypted variables to store tokens and Client Secrets. Don't keep them in config files or hardcoded anywhere.
- Implement automated rotation and test the revocation flow in staging before you need it in production.
- Monitor token usage and tie tokens to specific service accounts when you can. It makes auditing far easier when something looks wrong.
Rate Limits and Token Interaction
A few things that trip people up:
- Authentication tokens do not exempt requests from rate limits. Every request counts, authenticated or not.
- See the Rate Limits and Error Handling section for how to parse rate-limit headers and implement exponential backoff.
- Design callers to reuse access tokens across requests rather than generating new ones each time. And back off on 429 responses; aggressive retry loops will get your app throttled harder.
Cross-References and Next Steps
- For a deeper dive into secrets storage and rotation, check out our guide to API key management.
- If you're building webhook-driven architectures that complement OAuth or PAT usage, the Webhooks and Real-Time Event Handling section covers that pattern.
Best practice takeaway: Use the least privileged auth method that meets your needs, keep secrets out of source control, and automate rotation and monitoring. That's the whole game.
Core Endpoints and Resource Models
The Planning Center API groups data into product boundaries that map to real workflows. Once you understand this, the REST surface becomes predictable and you can build integrations without constantly checking the docs.
People handles membership and contact records. The resource model centers on the person object with related addresses, phones, and contact methods hanging off it.
Canonical endpoints you'll hit most:
- GET /people/v2/people
- GET /people/v2/people/:id
- GET /people/v2/people/:id/relationships
Responses follow JSON:API format with a top-level data array containing objects that have id, type, attributes, and relationships. Use sparse fieldsets to grab only what you need. Your payloads get smaller and your API costs drop.
For example, a basic paginated GET looks like:
GET https://api.planningcenteronline.com/people/v2/people?offset=0&per_page=25- Check the
Linkheader fornextandprevnavigation links
Pagination here is explicit, which means it's safe to automate. No surprises.
Services Resource Model
Services covers plans, items, and team assignments for events and volunteer scheduling. The endpoints you'll use:
- GET /services/v2/plans
- GET /services/v2/people
- GET /services/v2/items
A plan resource carries attributes for date and status, plus nested relationships to items and plan people. The trick for efficient queries: include related resources in one request instead of making dozens of small ones.
Practical tips:
- Use
include=plan_people,itemsto pull team members and items together - Shrink responses with
fields[plans]=id,date,statuswhen you don't need everything
Fetch related resources with include whenever you're rendering consolidated data for a UI or running a bulk sync. Fewer round trips, faster results.
Registrations Resource Model
Registrations handles events, ticket types, and signups for activities. Core endpoints:
- GET /registrations/v2/events
- GET /registrations/v2/registrations
Registration responses stick to the JSON:API pattern, with relationships linking registrants to events and tickets. A two-step sync pattern works well here:
- List events with
per_page=50 - For each event, fetch registrations using offset pagination
This approach keeps you from missing records as event counts grow.
Common patterns to follow:
- Fetch events first, then batch registrations per event
- Use
include=personto skip separate People calls - Paginate registrations with
offsetandper_pageuntil theLinkheader has nonextrel
Giving Resource Model
Giving tracks donations, batches, funds, and pledges. Primary endpoints:
- GET /giving/v2/donations
- GET /giving/v2/people
Donation resources include attributes like amount_cents, donated_at, and payment_method, with relationships to people and batches. Use date filters and per_page to keep result windows manageable.
A numbered example for incremental sync:
GET /giving/v2/donations?per_page=100&donated_after=2025-01-01- Follow the
Linkheader to pull additional pages - Update local
last_synced_atto resume without overlap
Check‑Ins Resource Model
Check-Ins covers attendance and group workflows with resources like check_ins, labels, and locations. Useful endpoints:
- GET /check_ins/v2/check_ins
- GET /check_ins/v2/labels
Check‑Ins responses link to people and occurrences. If you're building anything near real-time, pair these endpoints with webhooks. You'll capture activity as it happens instead of polling every few minutes.
Relationship Handling and Efficient Fetching
Relationships follow JSON:API conventions with relationship objects that reference related resource IDs and types. Best practices:
- Use
includeto fetch related resources in the same request - Use sparse fieldsets to limit attributes for both primary and included resources
- Batch lookups by ID lists when
includecan't cover everything
Example include usage:
GET /people/v2/people?include=addresses,emails&per_page=50
Pagination and Link Header Navigation
Pagination uses offset and per_page parameters, with a Link header handling navigation. Look for links with rel values of next, prev, first, and last. When syncing large collections:
- Start with
per_page=100if allowed for better throughput - Follow the
nextrel from theLinkheader until there's nothing left - Persist offsets or last item timestamps to resume safely after failures
Practical JSON Examples and Cross-References
Code snippets should parse the top-level data, process included arrays, and map relationships by ID. For robust syncs:
- Reconcile using webhooks when available to cut down on polling
- Use the Webhooks and Real-Time Event Handling section to subscribe to People, Giving, and Check‑Ins events
- Pair webhooks with REST calls to fetch full resource shapes when payloads are minimal
Quick Lookup Table
| Product | Typical Includes | Best First Endpoint |
|---|---|---|
| People | addresses, phone_numbers | /people/v2/people |
| Services | plan_people, items | /services/v2/plans |
| Registrations | person, ticket_type | /registrations/v2/registrations |
| Giving | person, batch | /giving/v2/donations |
| Check‑Ins | person, occurrence | /check_ins/v2/check_ins |
Cross-Reference
See Webhooks and Real-Time Event Handling to wire webhooks to these endpoints for immediate synchronization and reduce polling pressure.
Webhooks and Real-Time Event Handling
Planning Center webhooks turn the API into a low-latency event source so you're not stuck polling every few minutes to stay current. They follow a subscribe, deliver, verify, and process flow that cuts down on API traffic and makes your integrations feel snappier.
This flowchart walks through the five-stage webhook lifecycle and shows how events move from Planning Center into your systems. It also highlights where signature verification and idempotent processing fit into a reliable integration pattern.
Subscription Model and Payload Format
You set up webhooks in the Developer Center by registering an endpoint and picking event topics like People or Giving. Events come in as JSON:API payloads with top-level data and included relationships for contextual lookup. The practical upside: you can process a small payload right away and pull full resource shapes from core endpoints only when you actually need them.
- Select topics for People, Giving, Check-Ins, Services, or Registrations.
- Receive POST requests with a signature header to validate authenticity.
- Payloads follow JSON:API conventions with
data,attributes, andrelationships.
"Always validate signatures before processing to avoid accepting forged events"
Signature Verification and Security
Verify the signature header using your webhook secret with HMAC SHA256 to confirm the sender is actually Planning Center. If verification fails, respond with 400 or 401 and log the event for manual review. This stops replay attacks and keeps unauthenticated events out of your pipeline.
Example Handler Patterns
- A JavaScript handler receives the POST, verifies the signature, parses the JSON:API body, and enqueues a message to RabbitMQ or SQS.
- A Python handler does the same steps and writes a compact sync task into a Postgres-backed queue for workers.
- Keep handlers small and fast; they should only validate and enqueue work.
- Push heavy reconciliation to background workers.
Retry Behavior and Idempotency
Planning Center retries deliveries on transient failures using an exponential backoff pattern. Design your handlers to be idempotent by using event IDs or resource versioning so duplicate deliveries don't cause inconsistent state. Store a processed event index or use upserts keyed by resource ID plus updated_at to achieve idempotency.
Numbered checklist for idempotent handlers:
- Record the incoming event ID and timestamp before processing.
- Skip processing if the event ID is already marked as handled.
- Use database upserts or message deduplication to avoid duplicate side effects.
Pairing Webhooks with Core Endpoints
Webhooks are signals, not full snapshots. When an event arrives without the attributes you need, fetch the authoritative resource via the appropriate core endpoint and merge the changes. This pairing keeps initial payload size small while still letting you build eventual consistency.
- On a People update webhook, fetch
/people/v2/people/:idwhen you need more fields. - On a Giving event, fetch donation details if the webhook payload is summary-only.
Failure Scenarios and Recovery
The common issues you'll run into are missed deliveries, duplicate events, and signature mismatches. For missed deliveries, rely on a periodic reconciliation job that scans core endpoints for recent changes. For signature mismatches, log the raw headers and body securely, alert the on-call engineer, and temporarily pause processing until the secret is rotated or corrected.
Tips for recovery:
- Implement exponential backoff with jitter when processing fails.
- Cross-reference with the Rate Limits and Error Handling section to log 429s and implement backoff.
- Keep a retry queue and manual replay mechanism for missed or failed events.
Read more about implementing real-time updates with no-code tools in our Webtwizz guide on real-time updates.
The screenshot shows the API Explorer announcement and how developers can test endpoints interactively. It underscores that testing webhooks and REST reconciliation in staging prevents surprises in production.
Rate Limits and Error Handling Strategies
Every Planning Center API integration hits a wall eventually. Usually it's a 429 or a 5xx that shows up at the worst possible moment. The difference between a sync that recovers gracefully and one that silently breaks comes down to how you handle these responses from the start.
Understanding Rate Limits
Planning Center enforces rate limits per account and per token. Every response includes headers that tell you exactly where you stand:
- X-RateLimit-Limit: your total quota
- X-RateLimit-Remaining: calls left in the current window
- X-RateLimit-Reset: when the window resets
Check these on every response. If you wait until you hit a 429 to start paying attention, you've already lost the window. Build your client to throttle proactively based on the remaining count, not reactively after the error.
Handling 429 Too Many Requests
A 429 means the server is telling you to slow down. Your integration should pause, back off, and try again later. The standard approach is exponential backoff with jitter: each retry waits longer than the last, with a random offset so multiple clients don't all retry at the same moment and create a thundering herd.
Here's what that looks like in practice:
Python example:
- Catch
requests.exceptions.HTTPError - On 429 or 5xx, retry with exponential backoff
- Add jitter and cap retries at a reasonable limit (5 to 7 attempts)
JavaScript example:
- Wrap
fetchcalls in a retry loop - Check
response.statusfor 429 and 5xx - Use a randomized delay between attempts
The key detail most people miss: without jitter, synchronized retries from multiple instances can make throttling worse, not better.
Pagination Patterns
Planning Center uses JSON:API pagination with offset and per_page parameters, plus Link header navigation. Start with per_page=100 where the endpoint allows it, then follow Link rel="next" until there's no next link.
This approach keeps you from overshooting result sets and avoids requesting pages that are already empty. It's more efficient than guessing at page counts or fetching everything in one oversized request.
Common HTTP Errors and What to Do
Each status code maps to a specific action. Memorize these; they'll save you hours of debugging:
- 400 Bad Request: malformed input. Log it and surface it for developer correction. Don't retry blindly.
- 401 Unauthorized: token is invalid or expired. Trigger a refresh or re-authentication flow.
- 403 Forbidden: missing scopes or insufficient permissions. Review what your app was granted and check the app role.
- 404 Not Found: ID mismatch or deleted resource. Treat this as non-retryable for that specific ID.
- 409 Conflict: concurrent updates. Resolve with version checks or retry with backoff.
- 429 Too Many Requests: throttle and apply exponential backoff with jitter.
- 5xx responses: server errors. Retry with exponential backoff, cap the retry count, and alert if the problem persists.
Key insight: Planning Center API error payloads follow JSON:API error objects with
detail,status, andsourcepointers. Parse these fields to build logs that actually tell you what went wrong.
Pagination Edge Cases
Real-world pagination isn't always clean. Watch for these:
- Overshooting result sets: If an offset returns an empty
dataarray but theLinkheader still includesnext, treat the empty page as end-of-data and stop paging. - Missing Link headers: Fall back to checking
datalength againstper_page. If you got fewer items than you asked for, you've reached the end. - Empty responses: Use idempotent resume logic. Persist last-synced timestamps instead of relying solely on offsets, so you can pick up where you left off without duplicating or skipping records.
Best Practices Checklist
- Inspect rate-limit headers on every response and throttle proactively.
- Implement exponential backoff with jitter for 429 and transient 5xx responses.
- Follow
Linkrel navigation for pagination and tuneper_pagefor throughput. - Parse JSON:API error objects to surface actionable fields in logs and alerts.
- Persist resume state using timestamps or last-seen IDs for graceful recovery.
Cross-Reference
For deeper recovery scenarios and step-by-step debugging, see the Troubleshooting Guide and Frequently Asked Questions section. It covers replay strategies, token troubleshooting, and reconciliation patterns for the harder-to-diagnose failures.
Integration Patterns and No-Code Implementation Options
This is where the API mechanics turn into things you can actually build. The patterns below aren't theoretical; they're shaped by what breaks in production and what holds up when your integration goes from prototype to something real people depend on.

The screenshot shows a no-code sync between Planning Center and Supabase, orchestrated by Webtwizz. You can see the webhook trigger, the field mapping layer, and how payloads land as rows in Supabase tables. That last piece matters; getting the data into your database in a shape your frontend can actually read is where most DIY integrations stall.
The patterns here cover syncing People records to an external CRM and syncing Services plans from scheduling tools. Each one breaks into three implementation tiers so you can pick what matches your team's size and skill set.
Syncing People Records Across Systems
Pattern summary
- People webhooks give you the signal; People endpoints give you the full resource.
- Store canonical IDs and
updated_attimestamps in the target system so upserts stay idempotent.
Implementation tiers
- Traditional code
- The official JavaScript SDK or Python client fetches
/people/v2/people/:id, then upserts into Postgres.
- The official JavaScript SDK or Python client fetches
- Lightweight script
- A cron job running
curlor a small Python script hits the People endpoint and does batch upserts.
- A cron job running
- No-code with Webtwizz
- A webhook listener maps JSON:API attributes into Supabase tables using natural-language prompts and field mappings.
- Traditional code
Practical example steps
- Subscribe to
People.createandPeople.updatewebhooks. - Verify signatures, enqueue event IDs to kill duplicates.
- If the payload is thin on fields, call
GET /people/v2/people/:idand merge. - Upsert into the target CRM keyed by
planning_center_person_id.
- Subscribe to
Best practice takeaway: Use event IDs and
updated_atto make every webhook processing operation idempotent.
Creating and Updating Services Plans from Scheduling Tools
Pattern summary
- Map scheduling tool events to Planning Center Services plans and items.
- Use
PATCHandPOSTagainst/services/v2/plansand the relatedplan_peopleendpoints.
Implementation tiers
- Traditional code
- SDK wrappers build JSON:API compliant bodies, validate responses into typed objects.
- Scripted adapter
- A scheduled script reads new events from the scheduler, transforms them into the Planning Center plan schema, then POSTs.
- No-code with Webtwizz
- Prompt Webtwizz to translate incoming event fields into plan attributes and call the API via built-in integration blocks.
- Traditional code
Practical example steps
- Transform start/end times and team assignments into the plan schema.
POSTto/services/v2/plans, then addplan_peopleand items as needed.- On updates,
PATCHthe plan and reconcile team member mappings.
Example Architecture for No-Code Sync Without a Custom Server
Components
- Webtwizz for orchestration and natural-language field mapping.
- Supabase as the canonical application database.
- Planning Center webhooks as the event source.
Flow overview
- Planning Center fires a webhook at the Webtwizz endpoint.
- Webtwizz verifies the signature and maps the payload to Supabase tables.
- For fields the webhook doesn't carry, Webtwizz issues API
GETcalls and wraps the responses into typed objects before writing to Supabase. - Supabase triggers serverless functions or notifications that push updates to downstream UIs.
Benefits and caveats
- Low maintenance and fast iteration with zero servers to manage.
- Watch your rate limits and build in retries; see the Troubleshooting Guide for the sync edge cases people actually hit.
SDKs, Community Libraries, and Response Wrapping
Recommended clients
- JavaScript community SDKs with typed response wrappers.
- Python libraries that return parsed JSON:API objects.
cURLfor quick checks and debugging.
Tips for building robust clients
- Wrap raw HTTP responses into typed objects or DTOs so downstream handling stays consistent.
- Surface rate-limit headers and error objects in your client so you can centralize backoff logic.
Quick Cross-References and Next Steps
- Edge cases and reconciliation patterns live in the Troubleshooting Guide and Frequently Asked Questions.
- For building integrations and an integration marketplace, see Webtwizz integrations and examples.
Two mistakes worth calling out: treating webhooks as complete snapshots and skipping canonical Planning Center IDs. Both will bite you when you try to reconcile records later.
Troubleshooting Guide and Frequently Asked Questions
Authentication failures usually come down to one of three things: a bad token, clock skew, or a missing redirect configuration. Start by checking that your client secret and client ID match what's in the Developer Center. If you're using OAuth 2.0, make sure the redirect URI is exact and that the authorization code exchange actually returns tokens.
Quick Checklist for Auth Errors
- Verify the token string is present and not truncated.
- Confirm system clocks are within a minute to avoid timestamped signature issues.
- For OAuth flows, ensure the authorization code is exchanged once and not replayed.
If a refresh token fails, rotate your keys and reauthorize the user account. That usually leads into the next common issue: missing scopes.
- Missing scopes block access to endpoints like
/giving/v2/donationsor/people/v2/people. - Fix: Re-request the minimum necessary scopes and reauthorize the user.
- Next step: Compare granted scopes in the token introspection or Developer Center.
Unexpected 404 responses generally fall into three buckets: wrong base path, deleted resource, or ID type mismatch. Confirm you're hitting api.planningcenteronline.com and that the path includes the correct product prefix like /people/v2 or /giving/v2.
Numbered Steps to Debug 404s
- Validate the resource ID exists in the UI and matches the numeric ID returned by list calls.
- Call the parent list endpoint to confirm the resource set contains the ID.
- If deleted, use reconciliation to restore or skip processing that ID.
Pagination overshoot happens when clients assume continuous pages instead of following Link headers. Use the Link header rel=next and stop when no next link exists.
- Practical fix: Parse the Link header and loop until
nextis absent. - Tip: Use
per_page=100where supported and persistlast_synced_atto resume.
Webhook signature mismatches point to a secret mismatch or an altered payload. Always compute HMAC SHA256 using the webhook secret and compare it to the signature header before processing anything.
Actionable Webhook Validation Steps
- Confirm the webhook secret stored in your environment matches the one in the Developer Center.
- Compute HMAC on the exact raw body bytes, not the parsed JSON.
- If the mismatch persists, rotate the secret and re-register endpoints.
Key takeaway: Always validate webhook signatures and log raw payloads securely for replay and debugging.
FAQ
Q: Which products support webhooks and how do I enable them? A: People, Giving, Check‑Ins, Services, and Registrations all support webhooks. Enable subscriptions in the Developer Center, choose your topics, and provide a verified endpoint. Then send a test event from the UI to validate signature verification.
Q: How can I test integrations in sandbox environments? A: Use a staging Planning Center account and a local tunnel tool to receive webhooks. Configure a tooling URL like an ngrok or cloud function endpoint, register it in the Developer Center, and run through the OAuth flow with a staging user.
Q: What should I do when endpoints return empty data sets?
A: Empty arrays usually mean you're past the end of pagination or your filters removed results. Check the Link header for next rel, verify your filters and date ranges, and use per_page to confirm you requested the expected window.
Q: Is API access included on free tiers? A: API access depends on the Planning Center product and account plan. Verify your account feature list in the admin UI or contact Planning Center support to confirm whether webhooks and API access are enabled for your plan.
Cross-Reference Tips
- Rate limit headers like X-RateLimit-Remaining should be monitored and used to throttle proactively.
- When you see a 429, apply exponential backoff with jitter and cap retries to 5 to 7 attempts.
Glossary
- JSON API: A standardized payload format that uses top-level
data,attributes, andrelationships. - OAuth 2.0: A delegated authorization protocol used to obtain access and refresh tokens for user-scoped access.
- Bearer Token: A token sent in the Authorization header using the Bearer scheme for authenticated requests.
- Webhook Event: A POST request from Planning Center carrying a JSON:API payload and a signature header for verification.
Mini Troubleshooting Checklist to Save Time
- Confirm base URL and API version prefixes.
- Validate tokens, scopes, and client credentials.
- Follow Link headers for pagination, not guessed offsets.
- Verify webhook secret and compute HMAC on the raw body.
- Monitor and respect rate limit headers and implement exponential backoff.
Example Recovery Steps When Things Break
- Reproduce the failure in staging using the same token and endpoint.
- Capture full request and response headers, focusing on Link and X-RateLimit headers.
- If webhook-related, log the raw payload and signature, rotate the secret, and re-register the endpoint if needed.
- Run a targeted reconciliation job using core endpoints to pick up missed changes.
This reference acts as a safety net so you can diagnose auth problems, scope issues, pagination edge cases, webhook mismatches, and empty responses with concrete remedial steps. If you still need a simpler integration path, consider combining webhooks with a no-code builder like Webtwizz to map payloads and orchestrate API calls without a custom server.
For a no-code approach that helps you wire up webhooks, map fields, and orchestrate Planning Center syncs quickly, try Webtwizz https://webtwizz.com
Last updated: July 31, 2026
Start building
Your idea, live in minutes.
Describe what you want. WebTwizz builds the real thing, then you click to change anything. No code needed.
Get started for free, no credit card needed.