Backer gifting API
The API for sending money to a 529
One integration reaches 68 of the 95 giftable 529 plans. Collect a card or bank payment, route it to the beneficiary's plan, and get a webhook when it settles.
POST /v2/oauth/token
{ "grantType": "client_credentials",
"clientId": "…", "clientSecret": "…" }
→ { "accessToken": "…", "expiresIn": 3600 }
GET /v2/contribution-fees
?accountId=…&customerId=…&paymentMethodType=card
&amountInCents=2500&platformFeeInCents=199
→ { "processingFeeInCents": 75,
"platformFeeInCents": 199, "totalAmountInCents": 2774 }
POST /v2/contributions
{ "accountId": "…", "amountInCents": 2500,
"platformFeeInCents": 199,
"clientContributionId": "gift_8f2c",
"funding": { "type": "customer",
"customerId": "…", "paymentMethodId": "…" } }
→ { "transactionId": "ebb7d76d-…", "status": "processing", … }
WEBHOOK transaction.settled
{ "type": "transaction.settled", "resourceType": "transaction",
"resourceId": "ebb7d76d-…",
"data": { "accountId": "…", "status": "settled" } } POST /v2/oauth/token
{ "grantType": "client_credentials",
"clientId": "…",
"clientSecret": "…" }
→ { "accessToken": "…",
"expiresIn": 3600 }
GET /v2/contribution-fees
?accountId=…
&customerId=…
&paymentMethodType=card
&amountInCents=2500
&platformFeeInCents=199
→ { "processingFeeInCents": 75,
"platformFeeInCents": 199,
"totalAmountInCents": 2774 }
POST /v2/contributions
{ "accountId": "…",
"amountInCents": 2500,
"platformFeeInCents": 199,
"clientContributionId":
"gift_8f2c",
"funding": {
"type": "customer",
"customerId": "…",
"paymentMethodId": "…" } }
→ { "transactionId": "ebb7d76d-…",
"status": "processing", … }
WEBHOOK transaction.settled
{ "type": "transaction.settled",
"resourceType": "transaction",
"resourceId": "ebb7d76d-…",
"data": { "accountId": "…",
"status": "settled" } } Use cases
What you can build
-
Gifting inside your product
A registry, a wallet, or a brokerage app lets a giver fund a child’s 529 without leaving.
-
Link an existing 529
Validate an account number against the plan or the broker that holds it, then contribute to it.
-
Integrated enrollment
Open a new 529 account in your flow on Backer-hosted pages and get the outcome by webhook.
Available to approved partners
The flow
How a gift moves
-
Create a customer
One
POST /v2/customersper giver, keyed by your ownclientCustomerId. -
Collect a payment method on a hosted page
The page is Backer-hosted, so card data and bank credentials never touch your servers. Bank accounts verify instantly through Plaid.
-
Quote the fees
GET /v2/contribution-feesreturns the processing fee, your platform fee, and the total the giver will be charged. -
Create the contribution
POST /v2/contributionswith your ownclientContributionId. A duplicate id returns 409, so a retry can never charge twice. -
Backer settles it to the plan
Funds are collected and dispatched to the 529 plan, and
transaction.settledarrives at your webhook.
A contribution can be canceled within one hour of creation. Card refunds and ACH returns come back as webhooks.
POST /v2/customers
{ "clientCustomerId": "usr_31ab", "firstName": "Maya",
"lastName": "Lee", "email": "maya@example.com" }
→ { "customerId": "7579429d-…",
"clientCustomerId": "usr_31ab", … }
POST /v2/customers/7579429d-…/add-payment-method-sessions
{ "successUrl": "https://yourapp.com/success",
"cancelUrl": "https://yourapp.com/cancel",
"type": "card", "platformFeeInCents": 199,
"metadata": "<base64>" }
→ { "url": "https://backer.com/white-label
/add-payment-method?token=…" }
# the giver returns to successUrl with the saved method
?paymentMethodId=3611f5f2-…&metadata=<base64> POST /v2/customers
{ "clientCustomerId": "usr_31ab",
"firstName": "Maya",
"lastName": "Lee",
"email": "maya@example.com" }
→ { "customerId": "7579429d-…",
"clientCustomerId": "usr_31ab",
… }
POST /v2/customers/7579429d-…
/add-payment-method-sessions
{ "successUrl":
"https://yourapp.com/success",
"cancelUrl":
"https://yourapp.com/cancel",
"type": "card",
"platformFeeInCents": 199,
"metadata": "<base64>" }
→ { "url":
"https://backer.com/white-label
/add-payment-method?token=…" }
# the giver returns to successUrl
# with the saved method
?paymentMethodId=3611f5f2-…
&metadata=<base64> Coverage
One integration, 68 plans
The plans a gift can reach today, by state. Coverage has more than doubled in the last six months; ask us about a plan you need.
-
68
529 plans a gift can reach today
-
72%
of the 95 giftable 529 plans
-
41
states, plus the District of Columbia
Covered plans
- Alaska T. Rowe Price 529
- Arizona AZ529, Arizona's Education Savings Plan, Fidelity
- Arizona The Goldman Sachs 529 Plan
- Arkansas Arkansas Brighter Future Advisor Plan
- Arkansas Arkansas Brighter Future Direct Plan
- California ScholarShare 529
- Colorado CollegeInvest Direct Portfolio College Savings Plan
- Colorado Scholars Choice Education Savings Plan
- Colorado Smart Choice College Savings Plan
- Colorado Stable Value Plus College Savings Plan
- Connecticut CHET Advisor 529 Plan
- Connecticut Connecticut Higher Education Trust (CHET)
- Delaware DE529 Education Savings Plan
- Florida Florida Investment 529 Plan
- Florida Florida Prepaid 529 Plan
- Georgia Path2College 529 Plan
- Hawaii HI529 – Hawaii's College Savings Program
- Idaho IDeal – Idaho Education Savings Program
- Indiana Indiana529 Advisor Savings Plan
- Indiana Indiana529 Direct Savings Plan
- Iowa ISave 529
- Kansas Quest529 Education Savings Plan
- Kansas Schwab 529 Education Savings Plan
- Kentucky KY Saves 529
- Maine NextGen 529 -- Client Connect Series
- Massachusetts U.Fund College Investing Plan
- Michigan MI 529 Advisor Plan
- Michigan Michigan Education Savings Program (MESP)
- Minnesota Minnesota College Savings Plan
- Missouri MOST - Missouri's 529 Education Plan (Direct-sold)
- Montana Achieve Montana
- Nebraska Bloomwell 529 Education Savings Plan
- Nebraska NEST Advisor College Savings Plan
- Nebraska NEST Direct College Savings Plan
- Nevada Future Path 529 Plan
- Nevada The Vanguard 529 College Savings Plan
- Nevada Victory Capital 529 Education Savings Plan
- New Hampshire Fidelity Advisor 529 Plan
- New Hampshire UNIQUE College Investing Plan
- New Jersey Franklin Templeton 529 College Savings Plan
- New Jersey NJBEST 529 College Savings Plan
- New Mexico Scholar's Edge
- New Mexico The Education Plan
- New York New York's 529 Advisor-Guided College Savings Program
- New York New York's 529 College Savings Program -- Direct Plan
- North Carolina North Carolina's National College Savings Program
- North Dakota College SAVE (Advisor)
- North Dakota College SAVE (Direct)
- Ohio Ohio’s 529 Plan, CollegeAdvantage
- Oklahoma Oklahoma 529
- Oklahoma Oklahoma Dream 529 Plan
- Oregon Embark
- Oregon MFS 529 Savings Plan
- Pennsylvania PA 529 Guaranteed Savings Plan
- Pennsylvania PA 529 Investment Plan
- Rhode Island CollegeBound 529 (Advisor-Sold)
- Rhode Island CollegeBound Saver (Direct-Sold)
- Tennessee TNStars College Savings 529 Program
- Texas LoneStar 529 Plan
- Texas Texas College Savings Plan
- Utah my529
- Vermont VT529
- Virginia Invest529
- Washington DC DC College Savings Plan
- West Virginia SMART529 Select
- West Virginia SMART529 WV Direct College Savings Plan
- West Virginia The Hartford SMART529
- Wisconsin Edvest 529
Reference
Endpoints
Plain HTTPS and JSON with camelCase keys, version 2026-07-27.
- Base URL
-
https://backer.com/restapi/v2 - Sandbox
- Provisioned with your credentials
- Authentication
- OAuth2 client credentials; bearer tokens expire after
expiresInseconds (3,600 in the sandbox example) - Rate limit
- 300 requests per minute per partner with burst allowance of 20 requests per second
The full OpenAPI 3.1 document comes with access.
Authentication
| Method | Path | Summary |
|---|---|---|
| POST | /v2/oauth/token | Exchange credentials for a bearer access token |
Customers
| Method | Path | Summary |
|---|---|---|
| POST | /v2/customers | Register a customer with Backer |
| GET | /v2/customers | Get a customer by clientCustomerId |
| GET | /v2/customers/{customerId} | Get a customer by Backer customer id |
| POST | /v2/customers/{customerId} | Update a customer's details |
| POST | /v2/customers/{customerId}/status | Activate, deactivate, or put a customer on hold |
Payment methods
| Method | Path | Summary |
|---|---|---|
| POST | /v2/customers/{customerId}/add-payment-method-sessions | Create a signed URL to the hosted payment-method page |
| GET | /v2/customers/{customerId}/payment-methods | List saved payment methods for a customer |
| GET | /v2/customers/{customerId}/payment-methods/{paymentMethodId} | Get a saved payment method by id |
| DELETE | /v2/customers/{customerId}/payment-methods/{paymentMethodId} | Delete a saved payment method |
Plans and brokers
| Method | Path | Summary |
|---|---|---|
| GET | /v2/plans | List 529 plans |
| GET | /v2/brokers | List brokerage partners |
Accounts
| Method | Path | Summary |
|---|---|---|
| POST | /v2/customers/{customerId}/validate-account-number | Validate a 529 account number |
| POST | /v2/customers/{customerId}/link-account | Create an account backed by an existing 529 account |
| GET | /v2/accounts/{accountId}/details | Get a linked 529 account by id |
| POST | /v2/accounts/{accountId} | Update linked 529 account details |
| POST | /v2/accounts/{accountId}/status | Activate or deactivate a linked 529 account |
| GET | /v2/contribution-limits | Get 529 contribution limits for a linked account |
Contributions and transactions
| Method | Path | Summary |
|---|---|---|
| GET | /v2/contribution-fees | Quote fees for a prospective contribution |
| POST | /v2/contributions | Submit a contribution |
| GET | /v2/transactions/{transactionId} | Get a transaction by id |
| GET | /v2/transactions | Get a transaction by clientContributionId |
| GET | /v2/accounts/{accountId}/transactions | List transactions for an account |
| POST | /v2/transactions/{transactionId}/cancel | Cancel a contribution transaction |
Webhooks
| Method | Path | Summary |
|---|---|---|
| POST | /v2/webhook-subscription | Update the partner's webhook subscription |
Enrollment
Documented for approved partners
Events
Webhooks
Backer posts an event to your endpoint when a contribution settles, fails, or is refunded. Every delivery is signed.
-
transaction.settledContribution settled to the 529 plan -
transaction.failedContribution failed -
transaction.refund_initiatedRefund initiated for a contribution -
transaction.refundedRefund settled for a contribution -
transaction.refund_failedRefund failed for a contribution
enrollment.completed and enrollment.failed are documented for approved partners.
WEBHOOK transaction.settled
{ "id": "eb6b75db-…", "type": "transaction.settled",
"createdAt": "2026-05-13T22:57:58Z",
"resourceType": "transaction", "resourceId": "f98e1ce6-…",
"data": { "accountId": "78198e5c-…", "status": "settled" } }
WEBHOOK transaction.failed
{ "id": "6f6f063e-…", "type": "transaction.failed",
"createdAt": "2026-05-14T21:56:06Z",
"resourceType": "transaction", "resourceId": "b76699b6-…",
"data": { "accountId": "f2c690b0-…", "status": "failed",
"failureDetails": { "phase": "funding",
"category": "funding_ach_failure",
"code": "other_ach_return",
"failedAt": "2026-05-14T21:56:06Z",
"message": "Payment failed" } } } WEBHOOK transaction.settled
{ "id": "eb6b75db-…",
"type": "transaction.settled",
"createdAt":
"2026-05-13T22:57:58Z",
"resourceType": "transaction",
"resourceId": "f98e1ce6-…",
"data": {
"accountId": "78198e5c-…",
"status": "settled" } }
WEBHOOK transaction.failed
{ "id": "6f6f063e-…",
"type": "transaction.failed",
"createdAt":
"2026-05-14T21:56:06Z",
"resourceType": "transaction",
"resourceId": "b76699b6-…",
"data": {
"accountId": "f2c690b0-…",
"status": "failed",
"failureDetails": {
"phase": "funding",
"category":
"funding_ach_failure",
"code": "other_ach_return",
"failedAt":
"2026-05-14T21:56:06Z",
"message": "Payment failed"
} } } Verifying a delivery
Every delivery carries a Webhook-Signature header of the form
t=<unix timestamp>, v1=<signature>, where the signature is the hex HMAC-SHA256
of <timestamp>.<raw request body> keyed with your subscription secret. Reject a
delivery whose timestamp is more than five minutes old, compare signatures in constant time, and use the
Webhook-Id header to deduplicate: deliveries are retried with exponential backoff, up to 20
attempts.
Subscribing
Set the destination URL, the event list, and the signing secret with
POST /v2/webhook-subscription. One subscription per partner; every environment gets its own
credentials, so the sandbox can point at a staging endpoint.
Testing
Sandbox and testing
-
A sandbox comes with access
The sandbox speaks the same API and returns the same shapes; credentials and its base URL are provisioned when access is granted.
-
Force an outcome
On a sandbox contribution, an
X-Backer-Simulateheader forces the result. It takessettled,card_declined,ach_insufficient_funds,invalid_account_number,plan_not_available,refund_succeeded,refund_card_expired, orrefund_account_closed. -
Hosted page timing
A payment-method session URL must be opened within 10 minutes. Once on the page, the giver has 30 minutes; after that they are sent to your cancel URL.
For agents
Built for agents
-
Every page has a markdown twin
This page is also served as plain markdown at
/developers.md, and every page links its twin withrel="alternate". -
The reference is complete
Every public endpoint, its summary, and the webhook events are on this page and in its markdown twin.
-
/llms.txt indexes it all
An index of the site for assistants and crawlers, with the full text of every page in one file at
/llms-full.txt.
One line for an agent
Read https://backer.com/developers.md, then request access at partnerships@backer.com. Trust
Security and compliance
-
Hosted pages
Card data and bank credentials are entered on Backer-hosted pages, so they stay out of your systems. You hold a paymentMethodId, never the details behind it.
-
Money movement
A contribution can be canceled within one hour of creation: an ACH pull is stopped before it runs, and a card charge is refunded. Refunds and returns report back as webhooks, so your records never drift from ours.
-
Who you are integrating with
Backer is the tradename of Principly, Inc., an SEC-registered investment adviser and technology/administrative-services provider. Backer is not a broker-dealer, municipal advisor, or fiduciary to any plan. The API and the Backer-hosted gifting pages process contributions; they do not provide investment advice.
faq
Questions? We’ve got answers.
Through Backer’s gifting API: create a customer, collect a payment method on a Backer-hosted page, quote the fees, then create a contribution against the beneficiary’s account. Backer routes the funds to the plan and sends a webhook when the contribution settles.
68 of the 95 giftable 529 plans today, listed above by state. Coverage has more than doubled in the last six months and grows monthly; ask us about a plan you need.
Not self-serve. Tell us what you are building and we provision a sandbox and credentials; production access follows a short review, because Backer processes contributions on your users’ behalf.
Fees are quoted per contribution before it is created: a processing fee that depends on the payment method, plus the platform fee you set with platformFeeInCents (the consumer site’s default is $1.99 per gift). Partner pricing is scoped to each program.
Cards, digital wallets, and ACH bank transfers, collected on Backer-hosted pages so card data and bank credentials never touch your systems. Limits differ by method and are returned by GET /v2/contribution-limits.
Within one hour of creation, through POST /v2/transactions/{transactionId}/cancel. An ACH pull is stopped; a card payment is refunded, and the refund reports back as webhooks.
Payment methods are tokenized and stored by Backer’s payment processor; you reference them by paymentMethodId and never see the details behind it.
Yes, for approved partners: Backer’s integrated enrollment runs on hosted pages and reports back with webhooks. Ask us.
Not yet. The API is plain HTTPS and JSON, the OpenAPI spec comes with access, and every page here has a markdown twin, so agents and code generators work from it directly.
Backer is the tradename of Principly, Inc., an SEC-registered investment adviser and technology/administrative-services provider. Backer is not a broker-dealer, municipal advisor, or fiduciary to any plan.
We back what matters most
One home for the whole village behind a kid – parents, grandparents, godparents, friends.