Offering Manager API
The Bitbond Offering Manager Platform provides a public REST API under /api/public that allows you to integrate investor-facing flows into your own applications. You can retrieve offering details, create and manage investor orders, track abandoned checkouts, process payments (SEPA/wire bank transfer, card via https://www.checkout.com, stablecoin), integrate identity verification, manage investor profiles and multi-chain wallets, export or erase investor data (GDPR), and unsubscribe from activation emails. The API follows RESTful conventions and returns JSON responses.
Integration with issuer management APIs (for creating offerings, documents, discount tiers, and administrative workflows) is available under /api/* and requires a tenant API key or session JWT. Refer to the Public API Reference for details.
Public API Base URL
All public endpoints are available under:
https://om.bitbond.com/api/publicTenants are identified by a subdomain slug passed as a query parameter or URL path segment (for example, /invest/acme-gmbh/my-offering). There are no tenant-specific domains like acme.om.bitbond.com.
Authentication
Investor-facing endpoints under /api/public follow two patterns:
Public endpoints (such as retrieving offering details and token metadata) require no authentication.
Protected endpoints (orders, payments, KYC, profile, checkout-intent, GDPR export/erase) require a Privy ID token. Include it in the
Authorizationheader:Authorization: Bearer <PRIVY_ID_TOKEN>Requests without a valid token receive a
401 Unauthorizedresponse.
Issuer integration endpoints under /api/* require either:
A tenant API key (Enterprise plan) generated in Settings > API Access, or
A session JWT obtained via the authentication endpoints.
API Documentation (OpenAPI/Swagger)
The full, interactive API reference is available as the Public API Reference. This portal provides:
A complete list of all available endpoints.
Request and response schemas for each endpoint.
The ability to try out API calls directly from the browser.
Authentication setup instructions.
Available Endpoints
Offerings
GET /offerings/:slug?subdomain=<tenant_subdomain> Retrieve offering details, live fundraising totals, payment configuration, and investor wallet policy.
Query parameter:
subdomain(required): the tenant’s subdomain
Successful response includes:
Core offering fields (
slug,name,description,funding_target,hard_cap, etc.)documents: array of{ id, display_name, requires_agreement }discount_tiers: array of{ id, min_amount, max_amount, discount_pct, label }liveStats: current totals and progress against fundraising targetstenantBankDetails:bankName,accountHolderName,iban,bic
paymentConfig:hasCheckoutCom(boolean)checkoutComPublicKey(string ornull)hasEvmCrypto(boolean)hasCustodian(boolean)custodianProvider(string)acceptedTokens(array of stablecoin symbols)acceptedChains(array of supported blockchain IDs)
investorWalletPolicy(string): one ofbyo_only,investor_choice,custodial_only
Error cases:
400 Bad Requestifsubdomainis missing.403 Forbiddenif the investor’s country (viaCF-IPCountryheader) is blocked for this offering.404 Not Foundif the tenant or offering is not found, or the offering is not active.
Documents
GET /documents/:docId/download Download an offering document (PDF) for an active or closed offering. Returns the PDF inline with:
Content-Disposition: inline; filename="<display_name>.pdf"Content-Type: application/pdf
Token Info
GET /token-info?chain=<chain_id>&address=<contract_address> Lookup on-chain token metadata (name, symbol, decimals) for supported networks.
Query parameters:
chain(required): the network IDaddress(required): the token contract address
Successful response:
{ name, symbol, decimals }
Error responses may include:
400 Bad Requestfor missing or invalid parameters404 Not Foundif the token or chain is unknown429 Too Many Requestswhen rate limitingError payload with
errorandkindfields for diagnostics
Order Management
POST /orders Create a new investor order. Requires a Privy ID token.
Request body:
offeringId(string, required)fiatAmount(number, required)tokenAmount(number, required)paymentMethod(string, one ofbank_transfer,checkout_com,stablecoin, required)walletAddress(string, optional)walletChainType(string, optional)cryptoNetwork(string, optional)agreedDocumentIds(array of document IDs, optional)investorProfile(object, optional) — to collect or update KYC/AML details
Returns
201 Createdwith:order: the newly created order objectbankDetails(forbank_transferpayments)cryptoDepositAddress(for stablecoin or on-chain payments)
GET /orders/investor/portfolio?subdomain=<tenant_subdomain> Retrieve the authenticated investor’s orders for a tenant.
Query parameter:
subdomain(string, required)
Response:
orders: array of order objects, each including:cancellationDeadlinecanCancel(boolean)
walletAddress(string ornull): the investor’s primary EVM addresswallets: map of chain types to addresses ({ [chainType]: address })
GET /orders/:referenceCode Retrieve details for a single order by its reference code. Response includes:
All order fields
cancellationDeadlinecanCancel(boolean)
POST /orders/:id/cancel Cancel a pending order within its allowed cancellation window. Returns the updated order or an error if the window has passed.
Checkout Intent
POST /checkout-intent Track or update an abandoned checkout intent for the authenticated investor. Requires a Privy ID token.
Request body:
offeringId(string, required)fiatAmount(number, optional) — last-entered amountlastSeenStep(string, required) — identifier of the last UI step viewed
Successful response:
{ id: string }: the checkout intent identifier
Error cases:
401 Unauthorizedif missing or invalid Privy token404 Not Foundif the offering is not active500 Internal Server Erroron failure to save the intent
Payment Processing
GET /payments/checkout-config?subdomain=<tenant_subdomain> Retrieve the tenant’s Checkout.com public key configuration. No authentication required.
Query parameter:
subdomain(required)
Response:
publicKey(string ornull)configured(boolean)
POST /payments/checkout-session Create a Checkout.com payment session for a pending order. Requires a Privy ID token.
Request body:
orderId(string, required)
Returns:
sessionIdsessionTokenpublicKey
POST /payments/checkout-pay Complete a card payment via Checkout.com using a Frames.js card token. Requires a Privy ID token.
Request body:
orderId(string, required)cardToken(string, required)
Returns the payment result or error details.
KYC Workflow
Configure your preferred identity verification provider in Settings:
Sumsub: https://sumsub.com
Blockpass: https://www.blockpass.org
Endpoints:
POST /kyc/init Initialize a KYC session for an offering. Requires a Privy ID token.
Request body:
offeringId(string, required)investorType(individualorinstitutional, defaults toindividual)
Returns provider-specific tokens or SDK configuration:
For Sumsub:
{ provider: "sumsub", sdkToken, levelName }For Blockpass: provider response with redirect or widget parameters
GET /kyc/status Poll the status of the authenticated investor’s verification. Requires a Privy ID token.
Response:
kyc_status(none,pending,approved,rejected, etc.)kyc_record_id(string ornull)
Investor Profile & Wallets
GET /investor/profile Fetch the authenticated investor’s profile. Requires a Privy ID token.
Response:
profile: object containing personal and company fields (name, email, address, investor type, etc.),kyc_status,kyc_record_idwallets: map of chain types to{ address, source }(supportsevm,solana,stellar,xrpl)walletList: array of{ chain_type, address, source }sorted by precedencewalletHistory: audit trail entries with{ id, wallet_address, chain_type, set_at, replaced_at }hasConfirmedOrder(boolean)
PATCH /investor/profile Add, update, or remove a wallet address. Requires a Privy ID token.
Request body:
walletAddress(string ornull, required)chainType(one ofevm,solana,stellar,xrpl; defaults toevm)
Response:
message: status messagewalletAddresschainType
Error cases:
400 Bad Requestif the wallet address is invalid for the chosen chain404 Not Foundif the user is not found
GDPR
GET /investor/gdpr/export Export the authenticated investor’s data as JSON. Requires a Privy ID token. Response: A JSON object containing the investor’s profile, orders, wallets, KYC records, and audit logs.
POST /investor/gdpr/erase Request erasure of the authenticated investor’s personal data. Requires a Privy ID token. Response:
204 No Contenton success
Activation Emails
GET /activation-emails/unsubscribe?tenant=<tenant_id>&token=<token> Unsubscribe the specified tenant from activation emails. Returns an HTML confirmation page.
GET /unsubscribe-activation?tenant=<tenant_id>&token=<token> Alias of the unsubscribe endpoint for backward compatibility.
Common Use Cases
Build a custom investor UI powered by offering data, documents, and live stats.
Integrate investor data, order statuses, or payment sessions with CRM or accounting tools.
Automate workflows: programmatic order creation, KYC initiation, wallet management.
Support on-chain stablecoin deposits alongside traditional payment rails.
Provide investor self-service data export or erasure to comply with GDPR.
Allow workspace administrators to unsubscribe from activation emails via a simple link.
API Scope
The public API covers all investor-facing flows, including offering discovery, order management, checkout intents, payment sessions, KYC initiation, wallet management, GDPR export/erase, and activation-email unsubscribe. It does not include administrative operations (use the admin panel for user and tenant management, offering configuration, team settings, and audit exports).
For the complete request and schema reference, see the Public API Reference.
Last updated
Was this helpful?