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.

Private beta. Production access is rolling out by phase — Wyoming and Delaware open first. The API surface below is stable. Join the waitlist for access.
Base URL: 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.

HTTP header
Authorization: Bearer sk_live_your_api_key_here
API keys are only shown once on creation. Store them securely. Prefix 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

bash
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

bash
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)

Node.js SDK
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.

.env
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

POST /v1/agents

Register a new agent and receive an API key. One agent can own multiple companies.

ParameterTypeDescription
name optionalstringHuman-readable name for the agent
model optionalstringModel identifier, e.g. "anthropic/claude-opus-4-6"
owner_email optionalstringEmail of the human who runs this agent (for compliance notices)
operator_name optionalstringFull legal name of the human operator (informational)
metadata optionalobjectArbitrary key-value metadata

Companies

POST /v1/companies

Form a new legal entity. Kicks off the full formation pipeline asynchronously.

ParameterTypeDescription
agent_id requiredstringID of the agent operating the company (agt_...)
name requiredstringCompany name. Must end in "LLC" or "L.L.C."
entity_type requiredenum"llc"
jurisdiction requiredstringTwo-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 requiredstringFull 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 optionalstringEmail address of the member (used for compliance notices)
purpose optionalstringCompany purpose. Defaults to "any lawful purpose".
metadata optionalobjectArbitrary metadata stored with the company
IRS responsible party: The IRS requires a natural person with an SSN or ITIN on every EIN application (Form SS-4). 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 /v1/companies/:id

Get full company details including documents, bank account, and recent events.

GET /v1/companies

List all companies for the authenticated agent. Supports ?status=active filter and ?limit=20 pagination.

Bank Accounts

POST /v1/companies/:id/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.

Bank accounts are opened via Bewind's master KYB relationship. No additional KYC is required per company.

Documents

GET /v1/companies/:id/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 /v1/companies/:id/documents/:docId/download

Get a presigned download URL (valid 15 minutes) for a specific document.

{ "url": "https://s3.amazonaws.com/...", "expires_in": 900 }

Compliance

GET /v1/companies/:id/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

POST /v1/companies/:id/domains

Register a domain for a company. Available as soon as the company is filed.

ParameterTypeDescription
domain requiredstringThe domain to register, e.g. acmewidget.com
registrar optionalenumvercel (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:

GET /v1/companies/:id/domains/:domainId/privacy-policy

Returns the full privacy policy text, tailored to the LLC's state of formation. Host it at https://yourdomain.com/privacy.

GET /v1/companies/:id/domains

List all registered domains for a company.

Privacy policies are generated automatically — no configuration needed. Each policy is tailored to the company's entity type and jurisdiction.

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.

In simulation mode (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.
POST /v1/companies/:id/mailboxes

Provision a new email address for a company. In simulation mode, returns a fake mailbox immediately.

ParameterTypeDescription
username requiredstringThe local part of the email address (e.g. contact, agent, hello). Lowercase alphanumeric, dots, hyphens, and underscores.
domain optionalstringCustom 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"
  }
}
GET /v1/companies/:id/mailboxes

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 /v1/companies/:id/mailboxes/:mailboxId

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.

POST /v1/webhooks
{
  "url": "https://your-agent.com/hooks/bewind",
  "events": ["company.active", "company.dissolved"],
  "secret": "optional_custom_secret"
}

Verifying signatures

Node.js
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

company.created
company.filing_submitted
company.filed
company.ein_pending
company.ein_issued
company.bank_account_pending
company.bank_account_opened
domain.registered
company.active
company.suspended
company.dissolved
compliance.annual_report_due
compliance.franchise_tax_due

Node.js SDK

npm install @bewind/sdk
Full example
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
Python
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:

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.

JurisdictionStatuteAnnual reportStatus
Wyoming (WY)W.S. § 17-15-101 et seq.$60 on anniversary monthprivate 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. statesroadmap (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.

bewind's KYB is done once per API customer — not once per company. Forming many companies requires no additional KYC beyond the initial API signup.