1
Your users

Formation runs against an account, and on a platform every user has one. This is what the program looks like once it is running.

4/5 registered

You create each of these once, with a POST /accounts when the user signs up. Forming a company is a second call against that id.

Marcus is the only live row. He maps to this demo's sandbox account biz_hMI9nMwxmq3TOE and forming against him sends a real request.

Every stage after that begins when somebody pays $500, which the sandbox cannot do, so the other four are drawn from the documented shapes rather than live data.

2
Their company

Its legal name, what kind of entity it is, which state registers it, and where it lives.

3
Their founders

Every member of your user's company, their share, and which one signs for the filing.

100% of 100
4
The application

One call from your server, against your user's account. No draft to create first, no session to open.

POST/accounts/biz_hMI9nMwxmq3TOE/form_company
{
  "business_name": "Ridgemont Detailing",
  "entity_type": "llc",
  "entity_suffix": "LLC",
  "formation_state": "WY",
  "business_type": "brick_and_mortar",
  "industry_group": "automotive",
  "industry_type": "car_wash",
  "use_registered_agent": true,
  "founders": [
    {
      "first_name": "Marcus",
      "last_name": "Webb",
      "email": "marcus@ridgemont.example",
      "phone": "+12125550100",
      "is_primary": true,
      "date_of_birth": "1990-04-12",
      "ownership_percentage": 100,
      "address": {
        "line1": "907 Ridgemont Dr",
        "city": "Austin",
        "state": "TX",
        "postal_code": "78704",
        "country": "US"
      }
    }
  ]
}

Junk means a broken email, a phone that is not E.164, a founder born in 2024, and a postal code of ZZZZZ. Whop takes all four.

5
What came back

Whop answers with one sentence at a time, so a broken application takes as many round trips as it has mistakes.

Nothing sent yet. The panel above holds the exact request.

6
Hand it to your user

You do not pay for the formation. You pass the checkout on, and the filing starts when they settle it.

This is where checkout would open.

In production the response carries a Whop checkout link for $500. You show it to your user, and once they pay it the filing is real: state registration, EIN, Articles of Organization, the lot.

Nobody can pay here, because this demo runs on Whop's sandbox and the sandbox cannot form companies. Everything above this line was a real API call.

What production answers with
{
  "checkout_url": "https://whop.com/checkout/ch_xxxxxxxxxxxxxxx/",
  "checkout_session_id": "ch_xxxxxxxxxxxxxxx",
  "total": 50000,
  "currency": "usd"
}

total is in cents, and it is a flat fee: $400 for the formation plus $100 for the first year of registered agent. Read it off the response rather than hardcoding it, because it has moved once already.

Then you track it on their account
  1. 1draft
    Where the application sits until your user pays.
  2. 2processing
    Paid. Whop files with the state and applies for the EIN.
  3. 3filed
    The state has the paperwork. Documents start appearing.
  4. 4completed
    Registered, EIN issued, Articles of Organization downloadable.

Read company_formation when you retrieve their account, or listen for account.updated rather than polling every user you have.