bewind API
bewind lets AI agents form and operate real U.S. LLCs via API, in the state of your choice. A human member is always named on the record — fully in control and legally responsible. Everything else — formation, EIN, banking, compliance — runs from the CLI.
https://api.bewind.co/v1
Authentication
All API requests require a Bearer token. Get your API key when you register an agent via POST /v1/agents.
Authorization: Bearer sk_live_your_api_key_here
sk_live_ for production, sk_test_ for sandbox.
Quickstart
Register your agent, get an API key, and form an LLC in three steps.
Step 1 — Register your agent
curl -X POST https://api.bewind.co/v1/agents \
-H "Content-Type: application/json" \
-d '{
"name": "My Agent",
"owner_email": "[email protected]"
}'
{
"id": "agt_4kx9m2p8n1qr",
"name": "My Agent",
"api_key": "sk_live_ak_9f2x...",
"api_key_prefix": "sk_live_ak_9",
"created_at": "2026-03-13T10:00:00Z"
}
Step 2 — Form an LLC
curl -X POST https://api.bewind.co/v1/companies \
-H "Authorization: Bearer sk_live_ak_9f2x..." \
-H "Content-Type: application/json" \
-d '{
"agent_id": "agt_4kx9m2p8n1qr",
"name": "Acme Widget LLC",
"entity_type": "llc",
"jurisdiction": "WY",
"member_name": "Jane Smith",
"member_email": "[email protected]",
"purpose": "Software development and API services"
}'
{
"id": "co_8mf2xp9k",
"name": "Acme Widget LLC",
"entity_type": "llc",
"status": "pending",
"jurisdiction": "WY",
"member_name": "Jane Smith",
"created_at": "2026-03-13T10:00:00Z",
"estimated_active_at": "2026-03-20T10:00:00Z",
"_links": {
"self": "/v1/companies/co_8mf2xp9k",
"documents": "/v1/companies/co_8mf2xp9k/documents",
"events": "/v1/companies/co_8mf2xp9k/events",
"compliance": "/v1/companies/co_8mf2xp9k/compliance"
}
}
Step 3 — Poll for active status (or use context updates)
import { Bewind } from '@bewind/sdk';
const client = new Bewind({ apiKey: process.env.BEWIND_API_KEY });
// Wait for company to become active (polls with exponential backoff)
const company = await client.companies.waitForActive('co_8mf2xp9k');
console.log(company.status); // "active"
console.log(company.ein); // "82-4821039"
console.log(company.bank_account); // { account_number_last4: "4521", ... }
console.log(company.state_file_number); // "WY-2026-4821"
Simulation mode
In development, set FORMATION_SIMULATION_MODE=true to run the full formation pipeline with simulated delays instead of real state filings and IRS submissions.
FORMATION_SIMULATION_MODE=true
FORMATION_SIM_FILE_DELAY_MS=2000 # 2s simulated filing
FORMATION_SIM_EIN_DELAY_MS=3000 # 3s simulated EIN
FORMATION_SIM_BANK_DELAY_MS=1500 # 1.5s simulated bank account
Simulation mode generates fake state file numbers (e.g. WY-SIM-..., DE-SIM-...), EINs, and bank account numbers. All other API behavior is identical to production.
Agents
Register a new agent and receive an API key. One agent can own multiple companies.
| Parameter | Type | Description |
|---|---|---|
| name optional | string | Human-readable name for the agent |
| model optional | string | Model identifier, e.g. "anthropic/claude-opus-4-6" |
| owner_email optional | string | Email of the human who runs this agent (for compliance notices) |
| operator_name optional | string | Full legal name of the human operator (informational) |
| metadata optional | object | Arbitrary key-value metadata |
Companies
Form a new legal entity. Kicks off the full formation pipeline asynchronously.
| Parameter | Type | Description |
|---|---|---|
| agent_id required | string | ID of the agent operating the company (agt_...) |
| name required | string | Company name. Must end in "LLC" or "L.L.C." |
| entity_type required | enum | "llc" |
| jurisdiction required | string | Two-letter US state code where the LLC will be formed (e.g. "WY", "DE"). Must be a currently supported state — see Supported states. |
| member_name required | string | Full legal name of the human member who owns and is responsible for this LLC. Filed in the Articles of Organization and used as the IRS responsible party on Form SS-4. |
| member_email optional | string | Email address of the member (used for compliance notices) |
| purpose optional | string | Company purpose. Defaults to "any lawful purpose". |
| metadata optional | object | Arbitrary metadata stored with the company |
member_name is filed as that person. SSN/ITIN is never stored by Bewind — it is collected securely out-of-band during onboarding.
Company status flow
pending → filing_submitted → filed → ein_pending → ein_issued → bank_pending → bank_opened → active
↓
suspended / dissolved
Get full company details including documents, bank account, and recent events.
List all companies for the authenticated agent. Supports ?status=active filter and ?limit=20 pagination.
Bank Accounts
Trigger bank account opening. Only available when the company's status is ein_issued or active. Returns 202 Accepted — the account opens asynchronously and delivers a company.bank_account_opened context update when ready.
Documents
List all documents for a company. Filter with ?type=articles_of_organization.
Document types: articles_of_organization, operating_agreement, ein_letter, boi_filing, annual_report, dissolution
Get a presigned download URL (valid 15 minutes) for a specific document.
{ "url": "https://s3.amazonaws.com/...", "expires_in": 900 }
Compliance
Annual report status, franchise tax amounts, and BOI filing status for a company.
{
"company_id": "co_8mf2xp9k",
"ein": "82-4821039",
"boi_status": "filed",
"boi_filed_at": "2026-03-13T10:05:00Z",
"annual_report": {
"due_date": "2027-03-01",
"status": "upcoming",
"filed_at": null,
"amount_due": 60
},
"franchise_tax": {
"due_date": "2027-03-01",
"status": "upcoming",
"estimated_amount": 0
}
}
Domains & Privacy
Register a domain for a company. Available as soon as the company is filed.
| Parameter | Type | Description |
|---|---|---|
| domain required | string | The domain to register, e.g. acmewidget.com |
| registrar optional | enum | vercel (default) or cloudflare |
{
"id": "dom_7kx2mp9n",
"company_id": "co_8mf2xp9k",
"domain": "acmewidget.com",
"registrar": "vercel",
"status": "active",
"nameservers": ["ns1.vercel-dns.com", "ns2.vercel-dns.com"],
"privacy_policy_url": "https://acmewidget.com/privacy",
"registered_at": "2026-03-13T10:05:00Z",
"expires_at": "2027-03-13T10:05:00Z",
"auto_renew": true
}
A GDPR/CCPA-compliant privacy policy is automatically generated and stored as a document on every domain registration. Retrieve it with:
Returns the full privacy policy text, tailored to the LLC's state of formation. Host it at https://yourdomain.com/privacy.
List all registered domains for a company.
Email & Communications
bewind automatically provisions a professional email address for every company. Agents can send and receive email under the company's own domain (e.g. [email protected]) via the bewind API from day one.
FORMATION_SIMULATION_MODE=true), email provisioning returns fake mailbox data. In production, bewind handles the underlying mail infrastructure — you don't need to configure a provider directly.
Provision a new email address for a company. In simulation mode, returns a fake mailbox immediately.
| Parameter | Type | Description |
|---|---|---|
| username required | string | The local part of the email address (e.g. contact, agent, hello). Lowercase alphanumeric, dots, hyphens, and underscores. |
| domain optional | string | Custom domain to use (e.g. acmewidget.com). If omitted, bewind's default managed domain is used. |
{
"id": "mb_4kx9m2p8n1qr",
"company_id": "co_8mf2xp9k",
"username": "contact",
"domain": "acmewidget.com",
"full_address": "[email protected]",
"status": "active",
"created_at": "2026-03-13T10:05:00Z",
"_links": {
"self": "/v1/companies/co_8mf2xp9k/mailboxes/mb_4kx9m2p8n1qr",
"company": "/v1/companies/co_8mf2xp9k"
}
}
List all mailboxes provisioned for a company.
{
"data": [
{
"id": "mb_4kx9m2p8n1qr",
"company_id": "co_8mf2xp9k",
"username": "contact",
"domain": "acmewidget.com",
"full_address": "[email protected]",
"status": "active",
"created_at": "2026-03-13T10:05:00Z"
}
],
"count": 1
}
Delete a mailbox. The mailbox status is set to deleted and the underlying mailbox is torn down. This action is irreversible.
{
"message": "Mailbox deleted",
"mailbox_id": "mb_4kx9m2p8n1qr",
"company_id": "co_8mf2xp9k"
}
Context Updates
bewind pushes signed context update events for all company lifecycle transitions, so your agent's state stays current without polling. Subscribe to specific events or use * for all.
{
"url": "https://your-agent.com/hooks/bewind",
"events": ["company.active", "company.dissolved"],
"secret": "optional_custom_secret"
}
Verifying signatures
import { createHmac } from 'crypto';
function verifyWebhook(body: string, signature: string, secret: string): boolean {
const expected = 'sha256=' + createHmac('sha256', secret).update(body).digest('hex');
return signature === expected;
}
// In your handler:
const sig = req.headers['x-bewind-signature'];
const valid = verifyWebhook(req.rawBody, sig, process.env.BEWIND_WEBHOOK_SECRET);
Event types
Node.js SDK
npm install @bewind/sdk
import { Bewind } from '@bewind/sdk';
const client = new Bewind({
apiKey: process.env.BEWIND_API_KEY,
});
// Register the agent (once)
const agent = await client.agents.create({
name: 'My AI Agent',
});
// Form an LLC
const company = await client.companies.create({
agent_id: agent.id,
name: 'Acme Widget LLC',
entity_type: 'llc',
jurisdiction: 'WY',
member_name: 'Jane Smith',
member_email: '[email protected]',
purpose: 'Software development and API services',
});
console.log(`Forming ${company.name}... status: ${company.status}`);
// Wait for active (polls every 15s)
const active = await client.companies.waitForActive(company.id);
console.log(`✓ Active! EIN: ${active.ein}`);
console.log(`✓ Bank: ****${active.bank_account?.account_number_last4}`);
// Get compliance status
const compliance = await client.companies.getCompliance(company.id);
console.log(`Annual report due: ${compliance.annual_report.due_date}`);
Python SDK
pip install bewind
from bewind import Bewind
import os
client = Bewind(api_key=os.environ["BEWIND_API_KEY"])
company = client.companies.create(
agent_id="agt_4kx9m2p8n1qr",
name="Acme Widget LLC",
jurisdiction="WY",
member_name="Jane Smith",
member_email="[email protected]",
)
# Wait for active status
active = client.companies.wait_for_active(company.id)
print(f"Active! EIN: {active.ein}")
The LLC
bewind forms standard member-managed U.S. LLCs in the state of your choice. Every LLC bewind forms has the same three properties:
- A human owns it. The person named in
member_nameis the legal member of the LLC and is fully responsible for it. This name appears on the Articles of Organization, Form SS-4 (EIN application), and the FinCEN BOI report. - The agent operates it. The AI agent interacts with the company via the bewind API. The agent has no legal standing in the entity itself.
- bewind is the registered agent. bewind is the company's registered agent in the state of formation — required by every U.S. state.
Supported states
You can pass any two-letter US state code as jurisdiction. Wyoming and Delaware are the launch jurisdictions for the private beta; additional states roll out as we bring on filing-agent and registered-agent coverage and confirm flat pricing covers our cost. States not yet on this list will return jurisdiction_unsupported.
| Jurisdiction | Statute | Annual report | Status |
|---|---|---|---|
Wyoming (WY) | W.S. § 17-15-101 et seq. | $60 on anniversary month | private beta (Phase 0) |
Delaware (DE) | 6 Del. C. § 18-101 et seq. | $300 franchise tax (June 1) | private beta (Phase 0) |
| All other U.S. states | — | — | roadmap (Phase 1, 2027) |
IRS responsible party
The IRS requires a natural person with an SSN or ITIN as the "responsible party" on every EIN application (Form SS-4). The member_name you provide is used for this purpose. SSN/ITIN is never stored by bewind — it is collected securely out-of-band during the EIN application process.
FinCEN BOI
Under the Corporate Transparency Act, the beneficial owner of the LLC must be reported to FinCEN. The human member is the beneficial owner. bewind handles the BOI filing on your behalf as part of the formation pipeline.