How to authenticate against the AppBO REST API, request the right scopes, and read and write core resources from your own code.
Bring your stack to a call and we will connect it, test every field in both directions, and hand it over documented.
Book a callThe REST API is the programmatic surface for almost everything an AppBO account holds: contacts and their custom fields, conversations and messages, opportunities and pipelines, calendars and appointments, forms and their submissions, workflows, and the sub-account structure an agency uses to keep clients separate. On one side of the connection sits your own code. A backend service, a nightly job, a mobile app, an internal admin tool, or a data pipeline. On the other side sits a single account, or a set of accounts authorized together under one agency-level app installation.
You reach for the API when the behavior you need cannot be expressed as a workflow step or a native connector. Typical cases: your product of record is an external system and AppBO must mirror it; you need to backfill thousands of historical records; you want conversation history inside your own support console; you need to compute something (a score, an eligibility check, a pricing tier) in your own code and write the result back onto the contact so that BO's automations can branch on it.
The API is also the substrate under every other integration in this library. Automation platforms, outbound webhooks and custom code embeds all end up calling the same endpoints with the same tokens and the same limits, so the authentication and error-handling habits you build here carry over directly. Treat the published API reference as the source of truth for exact paths, field names and scope identifiers, and treat this guide as the shape of the work rather than a substitute for it.
Authorization header, a JSON Accept header, and the API version header the reference specifies. Omitting the version header is a common cause of responses that look subtly wrong.429 and 5xx responses, and log the request identifier the platform returns so support conversations have something to anchor on.401 (token broken), sustained 429 (you are over budget), and on refresh failures: those are silent until something user-visible breaks.Scenario: an external onboarding app owns the customer record, and AppBO must mirror each new customer so that the nurture automation can run.
201 with the new contact identifier. The worker writes that identifier back onto its own customer row, which becomes the join key for every later update.Upgraded stage.The API enforces both a burst limit and a longer-window quota, and exceeding either returns 429. Check the current published figures in the API reference rather than hard-coding a number from a blog post, and read the rate-limit headers on live responses. They are the authoritative view of your remaining budget. Design for the budget: batch where an endpoint supports it, cache account metadata that rarely changes, and prefer webhooks over polling.
Assume no automatic request de-duplication unless the reference documents an idempotency mechanism for the endpoint you are calling. A create call that times out may well have succeeded, so a blind retry is how you get duplicate contacts. The safe pattern is search-then-create, or keep your own external identifier on a custom field and look it up before writing. Retry only on 429 and 5xx; a 4xx other than 429 will fail identically forever.
Custom fields are referenced by identifier, not by the label you see in the UI, and renaming a field in the UI does not change its identifier. Fetch the field definitions for the account at startup and map by identifier. Beware type coercion: a dropdown field will reject a value outside its option set, dates want the format the reference states, and phone numbers are best sent in E.164 so that de-duplication and messaging both behave.
Accounts differ in how aggressively they merge on email or phone. Do not rely on the platform to de-duplicate for you. Pick one key, enforce it on your side, and store the platform's contact identifier the moment you receive it.
Test against a dedicated test sub-account rather than a production one, and keep separate credentials per environment. The sharp edge is that a test account with live workflows and a connected phone number will send real messages to whatever number you typed into a fixture.
Access tokens are short-lived and refresh tokens can be revoked when a user disconnects the app, changes their password, or the installation is removed. Treat a refresh failure as a re-authorization event that needs a human, not as a transient error to retry forever, and alert on it, because otherwise the integration simply goes quiet.
403 only on the one endpoint you call rarely.We wire the integration, map the fields, test both directions and hand it over with the SOPs your team needs to run it.
Book a call