| title | ZBD Widget |
|---|---|
| description | Embed a hosted cashout experience so your users can withdraw earned balances to bank accounts, Cash App, and more. |
The ZBD Widget is an embeddable iframe that handles the full cashout flow for your users — identity verification (KYC), bank account linking (Plaid), and ACH payouts. Your backend handles user creation, session minting, and balance funding; the widget handles everything else.
Before integrating:
- Make sure you already have a ZBD Developer Dashboard account and a project.
- Copy the project API key from the project's API section.
- Open the Widget tab in the Developer Dashboard to configure sandbox balance and webhook settings.
- If the Widget tab is not available yet, contact ZBD support to enable it for your project.
After that, fund the sandbox account before you try to cash out.
To get sandbox running quickly, start with the sandbox guide:
- Create a sandbox user.
- Fund the sandbox user.
- Create a widget session.
- Embed the returned
widget_urlin your frontend. - Listen for widget events and webhook deliveries.
1. Create User POST /api/v1/widget/users (your server → ZBD API)
2. Fund User POST /api/v1/widget/users/fund (your server → ZBD API)
3. Deplete User POST /api/v1/widget/users/deplete (your server → ZBD API)
4. Get Balance GET /api/v1/widget/users/{userId}/balance (your server → ZBD API)
5. Create Session POST /api/v1/widget/users/session (your server → ZBD API)
6. Embed Widget <iframe src="{widget_url}" /> (your frontend)
7. Listen for Events window.addEventListener("message", ...) (your frontend)
Use POST /api/v1/widget/users/deplete when your server needs to debit points back from a widget user's point balance.
The ZBD Widget emits browser events to your frontend and server webhooks to your backend.
Handle iframe callbacks in your frontend. Process signed backend webhook deliveries.Widget endpoints use two auth patterns:
| Context | Auth | Header |
|---|---|---|
| Your server → ZBD | Publisher API key | apikey: YOUR_API_KEY |
| Widget iframe → ZBD | Session JWT (automatic) | Authorization: Bearer {session_token} |
Never expose your publisher API key in the browser. Steps 1–3 must happen on your server.
After creating a session, load the returned widget_url in your client. Your backend should create the session; your game or web client only receives the widget_url.
```csharp
using UnityEngine;
public class ZbdWidgetLauncher : MonoBehaviour
{
[SerializeField] private GameObject webViewContainer;
public void OpenWidget(string widgetUrl)
{
// Replace this with your Unity WebView package API.
var webView = webViewContainer.GetComponent<IWebView>();
webView.LoadUrl(widgetUrl);
webView.SetVisible(true);
}
}
public interface IWebView
{
void LoadUrl(string url);
void SetVisible(bool visible);
}
```
```cpp
#include "Components/WebBrowser.h"
void UCashoutScreen::OpenZbdWidget(const FString& WidgetUrl)
{
if (ZbdWidgetBrowser)
{
ZbdWidgetBrowser->LoadURL(WidgetUrl);
}
}
```
Pass these as URL query parameters on the widget URL:
| Parameter | Required | Description |
|---|---|---|
session_token |
Yes | JWT from Create Session |
flow |
No | cashout (default), kyc, add-method |
theme |
No | zbd-default, zbd-light |
embed |
No | true for chrome-less mode (no header/footer) |
component |
No | balance, history, method-picker for standalone components |