GuideGuides/Build with Synup/White-label platform
How do I build a white-label local marketing platform with the API?

How to Build a White-Label Local Marketing Platform

Build a multi-tenant white-label local marketing platform on the API, with client provisioning, team access, per-client summaries and scoped API keys.

At a glance

What this guide accomplishes
Stand up a multi-tenant platform where each of your customers is a client, provisioned, staffed and reported on through the API.
APIs used
Reference
ClientsTeamWorkspace
Prerequisites
  • An API key with write access
  • A plan that covers the clients and locations you will create
Typical use cases
  • An agency reselling local marketing under its own brand
  • A platform giving each customer their own workspace
  • Provisioning new customers without manual setup

Every customer sees their own branded product. Underneath, they are all clients in one account you own. That split is the whole idea of a white-label platform: your brand on the outside, one client per customer on the inside, each with its own locations, team, and reporting. The API hands you the tenancy model. The work left to you is provisioning, access, and roll-up.

The tenancy model

  1. WorkspaceGET /api/v1/workspace/summaryYour account, across all clients
  2. ClientPOST /api/v1/clientsOne per customer you onboard
  3. LocationsCreated under the client, the customer's own
  4. AccessTeam members you employ, plus the client's own login
Your workspace, your customers, their locations

A client is the tenant. Everything (locations, reviews, rank, analytics) hangs off a client id, so the whole platform is a matter of creating clients and reading their data back scoped by id.

Provision a customer

POST /api/v1/clients creates the tenant and returns its id, which you store against your own customer record. From there, create the customer's locations under that id, the same create-location flow as anywhere else. Provisioning a new customer is: create client, create their locations, kick off their Google connections, done.

curl -X POST https://ai.synup.com/api/v1/clients \
  -H "Authorization: Bearer $SYNUP_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "businessName": "Grove Street Dental Group" }'
const API = "https://ai.synup.com/api/v1";
const headers = {
  Authorization: `Bearer ${process.env.SYNUP_API_KEY}`,
  "Content-Type": "application/json",
};

async function onboardCustomer(businessName) {
  const res = await fetch(`${API}/clients`, { method: "POST", headers, body: JSON.stringify({ businessName }) });
  if (res.status === 422) throw new Error(`invalid client: ${(await res.json()).error}`);
  if (!res.ok) throw new Error(`${res.status}: ${(await res.json()).error}`);
  const { data } = await res.json();
  return data.clients[0].id; // store against your customer record, then create their locations
}
import os, requests

API = "https://ai.synup.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['SYNUP_API_KEY']}", "Content-Type": "application/json"}

def onboard_customer(business_name):
    r = requests.post(f"{API}/clients", headers=HEADERS, timeout=30, json={"businessName": business_name})
    if r.status_code == 422:
        raise ValueError(r.json()["error"])
    r.raise_for_status()
    return r.json()["data"]["clients"][0]["id"]

Give people access, two kinds

There are two access questions on a white-label platform, and they use different endpoints:

  • Your staff. People who work across clients (account managers, support) are team members. POST /api/v1/team/members invites one and GET /api/v1/team/members lists them with their role, status and last session. This is your internal org.
  • The customer. The business owner who logs in to see only their own client uses POST /api/v1/clients/{id}/invite, which invites them into their tenant. That is the "white-label login" your customer gets.

Keeping these separate is what makes the platform feel like each customer has their own product while your team sees across all of them.

Report per client and across the workspace

GET /api/v1/clients/summary is the one-call overview for a single tenant: its locations (with a verification breakdown), reviews (average rating and total) and seo (average rank and top-three percentage). It is exactly the header of a customer's dashboard.

curl "https://ai.synup.com/api/v1/clients/summary?clientId=CLIENT_ID" \
  -H "Authorization: Bearer $SYNUP_API_KEY"

GET /api/v1/workspace/summary is the level above: your whole account across every client, for your internal "how is the business doing" view.

Next

The cross-client operational view is the multi-location marketing dashboard. The feature set each tenant gets (listings, reviews, posts, analytics, rankings, AEO) is the local marketing guide, and reviews as a full module is the reputation platform guide.