Business Account API: provisioning, OAuth, and the resource map

This is the proposed v1 Business Account API (status: proposed, flagged for engineering confirmation; Live API today and the Business Account API roadmap maps it to the live /api/thirdparty endpoints). Everything the five Get Started steps and every product do in Brand Control Center would be available as an API, so a Business Account could be created, configured, launched, and operated programmatically, by the owner's own stack, by a partner or aggregator acting for many accounts, or by an AI agent. Base URL https://api.begenuin.com/v1; JSON in and out; every write returns the resulting resource and, where a confirmation is normally required, a proposal you approve with one call.

Getting access to a Business Account

WhoHowScope
The account owner or a teammateAPI key from Settings → Developers (sandbox at sign-up, live at launch), scoped to the account and the key holder's role (see Invite your team and assign roles)One Business Account
A partner, aggregator, or platform acting for many accountsOAuth 2.0 client credentials: POST /oauth/token with client_id, client_secret, scope, and the account_id to act on; tokens expire in 1 hourEvery account that granted the client access (see Partner and reseller program)
A new customer provisioned by a partnerPOST /accounts creates the Business Account, the first brand, and a sandbox key, and returns the owner's verification link; POST /accounts/{accountId}/brands:import adds brands in bulkThe created account
An AI buyer agentAdCP endpoints with a buyer key (see AdCP: make your inventory discoverable to AI buyer agents)Marketplace only

Scopes: account:read, account:write, brand:read, brand:write, content:write, network:write, members:write, partners:write, monetize:write, reports:read, octo:act. A key or token never exceeds the role it was issued for; octo:act lets an integration raise proposals but not approve them unless it also holds the matching write scope.

cURL
bash
curl -X POST https://api.begenuin.com/v1/oauth/token \
  -d client_id=$CLIENT_ID -d client_secret=$CLIENT_SECRET \
  -d account_id=acc_123 -d scope="brand:write network:write reports:read"

curl -X POST https://api.begenuin.com/v1/accounts \
  -H "Authorization: Bearer $PARTNER_TOKEN" \
  -d '{"company":"Northwind Health","brand":"Northwind Wellness","companyType":"consumer-services","ownerEmail":"owner@northwindhealth.example"}'

Resource map by product

Business Account & access (see Business Account API: provisioning, OAuth, and the resource map)

CallPurpose
POST /oauth/tokenExchange client credentials for an access token scoped to a Business Account
POST /accountsCreate a Business Account (company, first brand, company type, owner email); returns the verification link and a sandbox key
GET /accounts/{accountId}Read the Business Account: plan, brands, roles, verification state
PATCH /accounts/{accountId}Update company name, type, billing contact, legal entity
GET /accounts/{accountId}/keysList sandbox and live API keys and their scopes
POST /accounts/{accountId}/keysIssue a key with a role scope (sandbox or live)
POST /keys/{keyId}:rotateRotate a key; the old key keeps working for 24 hours
GET /accounts/{accountId}/teamList teammates, roles, and brand scopes
POST /accounts/{accountId}/team/invitationsInvite a teammate with a role and the brands it is scoped to
PATCH /team/{memberId}Change a role, re-scope brands, require two-factor, or remove
GET /accounts/{accountId}/auditAudit log of every change by user and time

Brands, kit, properties & context (see Business Account API: provisioning, OAuth, and the resource map)

CallPurpose
GET /accounts/{accountId}/brandsList brands in the Business Account
POST /accounts/{accountId}/brandsCreate a brand (publisher property, client, product line) under the account
POST /accounts/{accountId}/brands:importBulk-create brands from a CSV or a list (aggregators: one per property or client)
GET /brands/{brandId}/kitRead the brand kit: logos, colors, typeface, voice, description
POST /brands/{brandId}/kit:sampleSample the kit from a URL (homepage, app listing) and return it rendered for review
PUT /brands/{brandId}/kitApprove or edit the kit; applies to every player, email, and listing
GET /brands/{brandId}/propertiesDomains, subdomains, and apps that belong to the brand, with verification state
POST /brands/{brandId}/propertiesAdd a domain or app; returns the DNS TXT and meta-tag verification lines
POST /properties/{propertyId}:verifyTrigger verification (DNS, meta tag, or first SDK call)
GET /brands/{brandId}/sourcesContent sources: RSS, YouTube, TikTok, Instagram, Drive, catalog feed, with read schedule
POST /brands/{brandId}/sourcesConnect a content source with a read schedule
GET /brands/{brandId}/contextBrand context: crawl status, guidelines, audience notes, catalog, partner rules, policies, technical notes, legal
PUT /brands/{brandId}/contextAdd or replace a context section (guidelines, audience, policies, technical notes, legal paper)
POST /brands/{brandId}/context:crawlStart or re-run the website crawler across verified properties

Network & grid (see Network: what it does and where to start)

CallPurpose
GET /brands/{brandId}/networkNetwork model (Owned, Extended, Commerce, Retail), listing state, and what it switches on
PUT /brands/{brandId}/networkChoose or change the network model
GET /brands/{brandId}/page-typesPage types on the Hierarchical Grid per property
GET /brands/{brandId}/placementsPlacements with size, allowed experiences, context, and placementId
POST /brands/{brandId}/placementsRegister a placement on a page type
POST /brands/{brandId}/placements:importImport the grid from an ad server's ad units or an inventory map
POST /brands/{brandId}/placements:publishApprove and publish the grid; issues placementIds

Onsite placements & players (see Onsite: what it does and where to start)

CallPurpose
PUT /placements/{placementId}/experiencesAllowed player experiences per placement (Shorts, Shoppable, Community, Live)
GET /placements/{placementId}/embedEmbed snippet for the placement (Web SDK attributes pre-filled)
PUT /placements/{placementId}/settingsPlayer controls, feed settings, sticky mini-player, keywords, mode
GET /placements/{placementId}/feedServer-side render of the ranked feed for a page context (SSR and native apps)
POST /placements/{placementId}/experimentsCreate an experiment or holdout on a placement

Content, communities & Studio (see Studio: what it does and where to start)

CallPurpose
GET /brands/{brandId}/communitiesCommunities with their groups, tags, visibility, and member counts
POST /brands/{brandId}/communitiesCreate a community (or accept the proposed one) with groups and tags
PATCH /communities/{communityId}Rename, merge, change visibility, guidelines, or tags
POST /communities/{communityId}/groupsAdd a group with its keywords, topics, and categories
POST /brands/{brandId}/videos:importImport videos from a source, URL list, or upload session
GET /brands/{brandId}/videosVideos with community, group, tags, and classification confidence
POST /videos/{videoId}:classifyRe-run classification or set community, group, keywords, topics, categories
POST /videos/{videoId}/clipsStudio: generate clips from long-form, with captions, titles, and covers
POST /brands/{brandId}/studio/jobsStudio job: catalog product videos, text-to-video explainers, adaptation per platform, live-to-clips
GET /brands/{brandId}/hubThe content hub: address, sections, launch checklist state
POST /brands/{brandId}/hub:launchLaunch the hub on a Genuin address or a verified domain; issues the live key
POST /communities/{communityId}/postsPost a video or a creator post into a group
PUT /brands/{brandId}/syndicationPlatform permissions and the posting cadence per platform
POST /posts/{postId}:scheduleSchedule, hold, or edit a syndicated post

Feeds & distribution (see Network: what it does and where to start)

CallPurpose
GET /brands/{brandId}/feedsDistribution feeds with dimension, value, where they may run, and what wraps them
POST /brands/{brandId}/feedsCreate a feed by keyword, category, brand, or page context
POST /feeds/{feedId}:distributeApprove where a feed may run and what wraps it; starts distribution
GET /feeds/{feedId}/reachExpected and actual reach across the 7,000+ apps and sites
GET /network/directoryThe network directory: brands, properties, and placements open to partners
PUT /brands/{brandId}/network/listingHow your network appears in the directory
POST /brands/{brandId}/acceptancesAccept partner content into your placements under your rules
POST /brands/{brandId}/destinationsCreate an Extended O&O or Generative Destination on a Genuin domain

Members, creators & subscriptions (see Controls: what it does and where to start)

CallPurpose
POST /sessionsAuto login token exchange: your signed user token for a Genuin session
PUT /brands/{brandId}/authAuto login provider, claims passed, consent behaviour, member-only communities
GET /brands/{brandId}/creatorsCreators, hosts, and contributors with tier and groups
POST /brands/{brandId}/creators:inviteInvite creators with a tier and the groups they may post into
POST /brands/{brandId}/questsCreate a Quest: brief, deadline, reward, target group
GET /brands/{brandId}/tiersMember tiers (Free and paid) with price, interval, trial, and unlocks
POST /brands/{brandId}/tiersCreate or edit a tier: name, price, interval, trial, promo, unlocks, cap
POST /brands/{brandId}/tiers:publishApprove and publish tiers; paid tiers go live when payouts are verified
GET /brands/{brandId}/membersMember roster with tier, status, renewal date, and source
POST /brands/{brandId}/members:importImport members from CSV, CRM, loyalty, or subscriber file onto a tier
PATCH /members/{memberId}Move a member between tiers, comp, pause, or cancel
GET /brands/{brandId}/subscriptionsActive, trialing, past-due, and cancelled subscriptions

Moderation, guidelines & brand safety (see Controls: what it does and where to start)

CallPurpose
GET /brands/{brandId}/moderationModeration baseline, reviewer roles, SLA
PUT /brands/{brandId}/moderationSet the baseline (Standard or Strict) and the queue owners
GET /brands/{brandId}/moderation/queueItems waiting for a human decision
POST /moderation/{itemId}:decideApprove, remove, or escalate a queued item; appeals use the same call
PUT /brands/{brandId}/guidelinesCommunity guidelines and appeal policy
PUT /brands/{brandId}/brand-safetyGARM-aligned brand safety profile and competitive exclusions
PUT /brands/{brandId}/blocklistsKeyword, topic, advertiser, and domain blocklists
GET /accounts/{accountId}/rolesAccount roles, community roles, and creator tiers with their permissions
PUT /accounts/{accountId}/securityTwo-factor requirement and SSO for BCC

Partners & demand (see Monetize: what it does and where to start)

CallPurpose
GET /brands/{brandId}/partnersBrand, demand, publisher, and data partners with classification and edge
POST /brands/{brandId}/partners:inviteInvite a partner with direction, permissions, groups, and split or price
POST /partner-requests/{requestId}:decideAccept or decline an incoming partner request
PUT /partners/{partnerId}/edgeChange a partner's permissions, groups, or economics
POST /brands/{brandId}/sponsorshipsPaid Partner Post or Takeover: offer, budget, CPM, dates, placements
GET /brands/{brandId}/demand-sourcesDemand sources (Genuin network, partners, programmatic, commerce, subscriptions) and their state
POST /demand-sources/{sourceId}:activateSwitch a demand source on (or off) in order
PUT /brands/{brandId}/ad-serverGenuin Ad Server or partner ad server connection, floors, and yield rules

Plans, agreements, payouts & revenue (see Monetize: what it does and where to start)

CallPurpose
GET /plansPlans, pricing tiers, add-ons, and revenue-share schedule
PUT /accounts/{accountId}/planChoose or change the plan
GET /accounts/{accountId}/walletCredits, cash balance, usage, and invoices
POST /accounts/{accountId}/agreementsDraft the agreement for the model (revenue share, platform, managed, commerce, buyer)
POST /agreements/{agreementId}:sendRoute the agreement to the signer; status moves to awaiting signature
GET /agreements/{agreementId}Agreement status, terms, and the executed copy
GET /brands/{brandId}/seller-filesads.txt, app-ads.txt, and sellers.json lines per domain and app, with verification state
POST /brands/{brandId}/seller-files:verifyRe-crawl and validate seller files
PUT /accounts/{accountId}/payoutsPayout details and calendar (entered by the owner; verified before paid tiers and demand go live)
POST /brands/{brandId}/linkoutsDynamic in-video linkouts and affiliate programs attached to videos or groups
GET /creators/{creatorId}/walletCreator Wallet: earnings, share, payout status
GET /accounts/{accountId}/invoicesInvoices and usage statements

Marketplace, packages & AdCP (see Marketplace: what it does and where to start)

CallPurpose
POST /brands/{brandId}/packagesBuild a package from placements, feeds, and capabilities with a forecast
POST /packages/{packageId}/listingsList a package on the Marketplace (and AdCP)
GET /packages/{packageId}/forecastOutcome forecast block: reach, eCPM lift, revenue range
GET /marketplace/listingsBuyer side: search listings by vertical, persona, journey, placement style
POST /media-buysBuyer side: buy a package or a Paid Partner Post
GET /adcp/productsAdCP get_products for AI buyer agents
POST /adcp/media-buysAdCP create_media_buy

Offsite tags, identity & attribution (see Offsite: what it does and where to start)

CallPurpose
POST /brands/{brandId}/tagsGenerate an offsite tag: VAST, JavaScript display, dynamic feed, audience extension
GET /tags/{tagId}Tag URL, macros, consent passthrough, and creative preview
POST /conversionsServer-side conversion API for attribution postbacks
PUT /brands/{brandId}/identityID graph settings: hashed identifiers, consent, channels
POST /brands/{brandId}/creativesTurn community content into ad creative for a media plan

Octo, proposals & autonomy (see Octo: what it does and where to start)

CallPurpose
POST /octo/askAsk a question about the account in plain language; answers with the article and the setting
POST /octo/actAsk for a change; returns a proposal to approve
GET /brands/{brandId}/proposalsPending proposals with what they change and why
POST /proposals/{proposalId}:approveApprove, edit, or decline a proposal (the confirmation step in every article)
PUT /brands/{brandId}/autonomyPer change kind: ask every time, do and report, or off
POST /octo/resolveGenerative commerce routing: resolve intent at serve time to a catalog, partner, or assistant surface
POST /support/threadsOpen a support thread; Octo answers first and brings in a person when needed

Reports & intelligence (see Octo: what it does and where to start)

CallPurpose
GET /reports/engagementWatch time, completion, lift, cohorts by placement, feed, community
GET /reports/revenueRevenue by placement, partner, source, tier; payouts and creator shares
GET /reports/attributionClosed-loop commerce, conversion forecasts, offsite attribution
GET /reports/marginRevenue per impression and net margin on ad spend
GET /reports/distributionSyndication and network distribution by platform, partner, feed
GET /reports/relevanceRelevance OS dashboard data
GET /brands/{brandId}/segmentsAudience segments from onsite, offsite, and offline signals
POST /brands/{brandId}/segmentsDefine a segment from signals and cohorts
POST /intelligence/signalsIntelligence SDK: send your own signals into the graph under consent

Webhooks, SDK sessions & billing (see Webhooks and events)

CallPurpose
POST /accounts/{accountId}/webhooksSubscribe to events (proposal.created, placement.published, member.subscribed, revenue.posted, moderation.flagged, …)
GET /eventsEvent catalog and delivery log with retries
GET /statusPlatform status and incident feed
GET /changelogAPI and SDK versions and deprecations
GET /glossaryGlossary terms as JSON (also served as llms.txt)
PUT /accounts/{accountId}/privacyData residency, retention, consent defaults, DSAR endpoint
GET /sdk/configRuntime configuration the Web and mobile SDKs fetch on init (placements, experiences, kit)

Conventions

  • Ids are prefixed (acc_, brd_, plc_, cmt_, vid_, fd_, mbr_, prt_, agr_, prp_); list calls page with cursor and limit; filters are query parameters.
  • Writes that BCC would ask you to confirm return 202 with a proposal object; POST /proposals/{proposalId}:approve applies it, :decline discards it, and a brand's autonomy setting (see Octo Autonomy and Approvals) can auto-approve a kind of change.
  • Every change emits a webhook event (see Webhooks and events): proposal.created, placement.published, hub.launched, member.subscribed, partner.accepted, agreement.signed, revenue.posted, moderation.flagged.
  • Rate limits: 600 requests per minute per key or token, report queries 60 per minute; X-RateLimit-Remaining on every response. Errors are JSON with code, message, docs_url.
  • SDKs: the proposed @genuin/sdk (Node) and genuin (Python) server SDKs would wrap every call above with the same names used in the API & SDK block of each article; on the client, the live Web SDK 2.0.6 (see Embed the Genuin Web SDK on your website), iOS and Android SDKs 2.1.5 (see Integrate the Genuin iOS SDK and Integrate the Genuin Android SDK), React Native 3.0.3 (see Integrate the Genuin SDK with React Native apps), and Flutter (see Integrate the Genuin SDK with Flutter apps) already render the player and sign members in.

API & SDK

Access: the calls in the table are the proposed Business Account API (see Business Account API: provisioning, OAuth, and the resource map), authenticated with a key scoped to the account and a role or an OAuth client acting for it; every confirmation in this article becomes a proposal you can approve by API (POST /proposals/{proposalId}:approve). Live today, the server API under /api/thirdparty authenticates with a gn-access-token (see Generate an access token), and Live API today and the Business Account API roadmap maps what is live to what is proposed.

CallPurpose
POST /oauth/tokenExchange client credentials for an access token scoped to a Business Account
POST /accountsCreate a Business Account (company, first brand, company type, owner email); returns the verification link and a sandbox key
GET /accounts/{accountId}Read the Business Account: plan, brands, roles, verification state
POST /accounts/{accountId}/brands:importBulk-create brands from a CSV or a list (aggregators: one per property or client)
POST /accounts/{accountId}/keysIssue a key with a role scope (sandbox or live)
POST /accounts/{accountId}/team/invitationsInvite a teammate with a role and the brands it is scoped to
POST /accounts/{accountId}/webhooksSubscribe to events (proposal.created, placement.published, member.subscribed, revenue.posted, moderation.flagged, …)
js
js
// proposed server SDK (Business Account API)
import { Genuin } from '@genuin/sdk';
const genuin = new Genuin({ apiKey: process.env.GENUIN_KEY });
await genuin.auth.token({ clientId, clientSecret, accountId, scope });
await genuin.accounts.create({ company, brand, companyType, ownerEmail });
await genuin.accounts.get(accountId);

Live today: Generate an access token · Environments, credentials, and test data · Embed the Genuin Web SDK on your website · Integrate the Genuin iOS SDK.

SDKs: Web SDK 2.0.6 (see Embed the Genuin Web SDK on your website), iOS SDK 2.1.5 (see Integrate the Genuin iOS SDK), Android SDK 2.1.5 (see Integrate the Genuin Android SDK), React Native 3.0.3 (see Integrate the Genuin SDK with React Native apps), and Flutter (see Integrate the Genuin SDK with Flutter apps) render Genuin and sign members in; the Node (@genuin/sdk) and Python (genuin) server SDKs are proposed with Business Account API: provisioning, OAuth, and the resource map.

TRUST AND COMPLIANCE

© 2026 Genuin Inc.

Genuin Footer