botso.ai API

botso.ai API Documentation

REST API for enterprise, business, personal, teams, and clubs — partners and apps building on shared autonomous trading bots. Members buy pool tickets; stakes fund strategies with payments, payouts, and a transparent paper trail.

Version v1 Format JSON Base URL https://api.botso.ai/api

Overview

The botso.ai platform API is a Laravel REST service. The hostname is api.botso.ai; Laravel mounts all JSON routes under an /api prefix, so the client base URL is https://api.botso.ai/api and paths look like /v1/auth/login (full URL: https://api.botso.ai/api/v1/auth/login). Authentication uses Laravel Passport (OAuth2 bearer tokens).

Partner use cases: member and operator apps for enterprise, business, personal, teams, and clubs; ticketing integrations; treasury reporting; and custom dashboards. The API exposes the same contract used by the official client dashboard.
EnvironmentBase URL
Productionhttps://api.botso.ai/api

Core concepts

ConceptDescription
OrganizationTenant (enterprise, business, team, club, or personal). Users may belong to multiple orgs.
PoolShared bot group with ticket cap, funding target, and lifecycle (draftsimfundedlive).
TicketEqual share entitlement in a pool (not a payment rail). Status: active, pending, revoked.
Payment processorUpcoming checkout flow via ticketing / payment partners — same auth and users table.
Shared botFixed-strategy trading bot linked to a pool (SIM or LIVE).

Authentication

Password grant (user apps)

For SPAs and mobile apps where a user signs in with email and password.

POST /v1/auth/login Public + client_id

Issue a bearer token. User must have botso_access permission.

Request
POST /api/v1/auth/login
Content-Type: application/json

{
  "email": "admin@botso.ai",
  "password": "password",
  "client_id": "YOUR_OAUTH_CLIENT_ID"
}
Response 200
{
  "token_type": "Bearer",
  "access_token": "eyJ0eXAiOiJKV1QiLCJhbGc...",
  "expires_at": "2026-06-08 12:00:00",
  "scopes": ["botso:read"],
  "user": {
    "id": 1,
    "name": "Club Admin",
    "email": "admin@botso.ai",
    "permissions": ["botso_access", "botso_manage"],
    "organizations": [{ "id": 1, "name": "Demo Club", "slug": "botso-ai" }]
  }
}

Client credentials (machine-to-machine)

For server-side integrations and service accounts. Use the botso Service Client OAuth client.

POST /v1/auth/client-credentials client_id + secret
Request
{
  "client_id": "SERVICE_CLIENT_ID",
  "client_secret": "SERVICE_CLIENT_SECRET",
  "scope": "botso:read"
}

Session endpoints

GET/v1/auth/meBearer

Current user profile, roles, permissions, organizations.

PUT/v1/auth/profileBearer

Update name, phone, social handles.

PUT/v1/auth/profile/communicationBearer

Communication preferences.

POST/v1/auth/profile/verify-whatsappBearer

Verify phone on WhatsApp.

PUT/v1/auth/passwordBearer

Change password.

POST/v1/auth/logoutBearer

Revoke current access token.

Required headers

HeaderWhenExample
AuthorizationAll authenticated routesBearer <access_token>
X-Botso-OrganizationUser has multiple clubsbotso-ai
AcceptAlwaysapplication/json
Content-TypePOST/PUT/PATCH bodiesapplication/json

Organization resolution order: subdomain ({slug}.botso.ai) → X-Botso-Organization header → ?org= query → auto-select if user has one org.

Organizations

GET/v1/botso/organizations/minebotso_access

List organizations the authenticated user belongs to. No org header required.

GET/v1/botso/organizationsorg manage

Admin detail for the current organization (requires org context).

GET/v1/botso/users/search?q=org manage

Search users to add as pool members.

Self-serve private syndicates

Any authenticated member (botso_access) can create their own private organization and become its owner, then invite friends and sell tickets. Creation is gated on club-catalog product seat availability — when all seats are sold out, the UI shows the create button disabled and these endpoints refuse creation.

GET/v1/botso/syndicate-availabilitybotso_access

Club-channel products with free seat counts. No org header required.

Example response
{
  "can_create": true,
  "products": [
    {
      "id": 4,
      "slug": "club-the-dub",
      "title": "The Dub",
      "price": 300,
      "currency": "EUR",
      "available": 48,
      "inventory_cap": 50
    }
  ]
}
POST/v1/botso/organizationsbotso_access

Create a private syndicate org + first pool. Caller becomes org owner and pool owner. Requires a club product with available > 0. Minimum ticket_cap is 2. No org header required.

Request body
{
  "name": "Dublin lads pool",
  "product_id": 4,
  "ticket_cap": 4,
  "profit_target": 500,
  "description": "Optional"
}
Example response (201)
{
  "organization": {
    "id": 12,
    "slug": "dublin-lads-pool",
    "name": "Dublin lads pool",
    "role": "owner",
    "visibility": "private",
    "platform_fee_pct": 8,
    "org_commission_pct": 0
  },
  "pool": { "slug": "dublin-lads-pool", "type": "private_syndicate", "…" },
  "organizations": [ "…" ]
}

Dashboard deep link: https://dashboard.botso.ai/syndicates/create. After create, switch to the new org slug via X-Botso-Organization and use org-manage routes to invite members and assign tickets.

Shop products (desk & club catalogs)

Ticket products have a channel: desk (solo capital seats) or club (syndicate funding products). Availability is free inventory seats (ticketing_tickets.tck_avail = 0).

GET/v1/botso/shop-products?channel=club|deskbotso_access

Authenticated console catalog. Default channel is desk. Use channel=club for syndicate products.

GET/v1/shop/products?channel=club|deskpublic

Public shop catalog (same shape). Club products are typically priced ~50% above desk equivalents.

When a club pool reaches its funding target, one club-product seat is sold idempotently (payment_method: club_pool). Creating a syndicate or pool that references a sold-out product returns 422.

Pools — read (members & admins)

Requires botso_access and organization context. Members only see pools they belong to or hold tickets in.

GET/v1/botso/poolsbotso_access

List pools for current organization.

GET/v1/botso/pools/{slug}/detailbotso_access

Full pool detail including bots and settings.

GET/v1/botso/pools/{slug}/overviewbotso_access

Dashboard metrics: PnL, per-ticket payout, chart series.

GET/v1/botso/pools/{slug}/daily-pnlbotso_access

Daily pool PnL for charting — one point per trading day, no individual trade detail. Query: ?month=YYYY-MM (defaults to current month). Month is clamped to months with trading data from the pool's first record through today.

daily_pnl and month_total_pnl are gross bot realized PnL (before platform fees, tax, and per-ticket splits). cumulative_pnl is the running total within the selected month. Member earnings are lower — see /earnings.

Example response
{
  "has_financial_data": true,
  "month": "2026-06",
  "first_trade_date": "2026-06-06",
  "available_months": [
    { "value": "2026-06", "label": "June 2026" }
  ],
  "series": [
    { "date": "2026-06-06", "daily_pnl": 56.44, "cumulative_pnl": 56.44 },
    { "date": "2026-06-07", "daily_pnl": 116.29, "cumulative_pnl": 172.73 },
    { "date": "2026-06-08", "daily_pnl": 104.59, "cumulative_pnl": 277.32 }
  ],
  "point_count": 3,
  "month_total_pnl": 277.32,
  "pool": {
    "slug": "sim-trial",
    "name": "Trial Pool"
  }
}

When the pool has no financial data or primary bot, returns has_financial_data: false with empty series and available_months.

GET/v1/botso/pools/{slug}/membersbotso_access

Pool members and ticket holders.

GET/v1/botso/pools/{slug}/ticketsbotso_access

All tickets in pool.

GET/v1/botso/pools/{slug}/payoutsbotso_access

Payout history.

GET/v1/botso/pools/{slug}/earningsbotso_access

Member earnings. Optional ?user_id=.

PATCH/v1/botso/pools/{slug}/members/me/contact-sharingmember

Toggle contact sharing with other members.

GET/v1/botso/pools/{slug}/members/me/payment-preferencesmember
PATCH/v1/botso/pools/{slug}/members/me/payment-preferencesmember
GET/v1/botso/pools/{slug}/members/me/crypto-paymentsmember

Pools — manage (org admin)

Requires botso.org.manage — organization admin or owner, or platform botso_manage.

POST/v1/botso/poolsorg manage

Create a pool inside the current organization. Club orgs require product_id from the club catalog with available seats. Types: club, enterprise, private_syndicate.

Request body (club / syndicate)
{
  "name": "Summer Syndicate",
  "type": "club",
  "product_id": 4,
  "ticket_cap": 4,
  "profit_target": 500,
  "start_date": "2026-07-01",
  "end_date": "2026-12-31",
  "description": "Optional pool description"
}

Funding target and share price are derived from the product price ÷ ticket cap. Sold-out products return 422.

PATCH/v1/botso/pools/{slug}/settingsorg manage

Update entry mode, caps, dates, assignment flags.

GET/v1/botso/pools/{slug}/filling-poolorg manage

Active pool accepting new tickets.

POST/v1/botso/pools/{slug}/ticketsorg manage

Admin-assign one ticket. Auto-creates next pool when cap reached.

Request body
{
  "user_id": 42,
  "member_name": "Jane Smith",
  "target_pool_slug": "late90s-club",
  "entry_method": "ticketing",
  "payment_note": "FT-order-88421"
}

entry_method: admin | cash | transfer | revolut | ticketing | usdc

POST/v1/botso/pools/{slug}/membersorg manage

Add member to pool.

GET/v1/botso/pools/{slug}/club-usersorg manage

Club user directory.

POST/v1/botso/pools/{slug}/club-usersorg manage

Create club user account.

PUT/v1/botso/pools/{slug}/club-users/{userId}org manage
POST/v1/botso/pools/{slug}/club-users/{userId}/verify-whatsapporg manage
GET/v1/botso/audit-log?limit=100org manage

Organization audit trail.

Payment processor (coming soon)

Member ticket purchase will move to a dedicated payment processor integrated with the ticketing platform API. Partners and mobile apps will use the same OAuth login and users table — no separate auth system.

Planned flow: authenticated user → create checkout session → payment provider webhook → ticket issued with entry_method: "ticketing". Documentation for checkout and webhook endpoints will be added here when the processor ships.

Until then, club admins assign tickets via POST /v1/botso/pools/{slug}/tickets after off-platform payment, or record payments with POST .../payments.

Payments & funding

POST/v1/botso/pools/{slug}/fundorg manage

Record pooled capital transfer to activate shared bots.

Request body
{
  "amount": 500,
  "method": "transfer",
  "reference": "REV-2026-001"
}
GET/v1/botso/pools/{slug}/paymentsorg manage

List recorded payments.

POST/v1/botso/pools/{slug}/paymentsorg manage

Record off-platform payment (cash, Revolut, etc.).

Payouts & earnings

POST/v1/botso/pools/{slug}/payouts/settleorg manage

Settle a payout period for the pool.

POST/v1/botso/pools/{slug}/earnings/{userId}/allocateorg manage

Allocate earnings to a member.

POST/v1/botso/allocate-payouts/simbotso_manage

Platform: manual SIM payout allocation (LIVE via artisan CLI).

Notifications (Twilio & WhatsApp)

GET/v1/botso/organization/twilioorg manage
PUT/v1/botso/organization/twilioorg manage
PUT/v1/botso/organization/whatsapporg manage

Save WhatsApp Cloud API credentials for club alerts.

Analytics & trading (operator)

Requires botso_manage and user_management_access.

GET/v1/botso/pools/{slug}/botsoperator

Shared bots in pool with session PnL.

GET/v1/botso/pools/{slug}/history?limit=50operator

Recent closed trades.

GET/v1/botso/late90s/analyticsoperator

Summary, daily PnL series, recent trades. Query: session_name, days, limit.

Separate trading API

Operator trading endpoints at /v1/trading/* require scope trading:read.

Errors & status codes

CodeMeaning
401Missing or expired token — re-authenticate.
403Valid token but insufficient permission or wrong org.
404Pool or resource not found.
422Validation error — see errors object in body.
Validation error example
{
  "message": "Validation error.",
  "errors": {
    "entry_method": ["The selected entry method is invalid."]
  }
}