# Published Pre-IPO integration

> Discover published offerings and distinguish virtual Sandbox commitments from real reservations.

## What can a partner browse?

`GET /opportunities?type=PRE_IPO` includes published offering information with `PUBLISHED`, `LISTED` or `ALLOCATED` status, including Dangote when published. `catalogueSource` distinguishes `PUBLISHED` information from `SYNTHETIC` demos. Sandbox rows have `simulationOnly: true`. Neither publication nor Sandbox availability guarantees production allocation eligibility.

## How do we commit virtual funds?

Follow the [executable Pre-IPO recipe](/partners/docs/recipes/published-pre-ipo). Obtain an actual ID from the list, read `/opportunities/{id}`, check `subscriptionAvailable`, `subscriptionRestriction` and `minimumCommitmentUsd`, then submit `{ assetType: "PRE_IPO", assetId, amount }` to the Sandbox customer's subscribe endpoint with a stable `Idempotency-Key`.

The customer must already have sufficient virtual USD. IDs are canonical subscription identifiers; slugs are browsing aliases. No real shares, production reservations, customer wallets or offering funding totals change. Verify the resulting virtual holding, order and wallet, then replay the identical request to prove it cannot debit twice.

## What does admin handle?

`/admin/partners` tracks partner access and acceptance evidence. `/admin/pre-ipo` owns real published offering information and the actual offering lifecycle. Keep those controls distinct from virtual Sandbox commitments. Production eligibility, reservation and allocation require their separate reviewed workflow.

## What errors should we handle?

An unknown or unpublished offering returns 404. Wrong asset type, unavailable USD terms or a below-minimum virtual commitment are rejected. Display the returned restriction; do not invent FX or assume that a listed offering remains open for new real subscriptions.

See [API Reference](/partners/docs/api-reference), [acceptance](/partners/docs/integration-acceptance) and [errors](/partners/docs/errors).
