Skip to main content
Source: Cross-reference guide — endpoint paths verified against equa-server/modules/api/src/endpoints/

SDK Guide

The Equa API is a standard REST API that can be consumed from any HTTP client. This guide covers common patterns using the browser fetch API.

Setup

All requests go to the Equa API base URL:
const API_BASE = 'https://api.equa.cc/v1'
Every request must include credentials: 'include' so the session cookie is sent automatically.

Helper Function

A reusable API helper simplifies repeated patterns:
async function equaApi(path, options = {}) {
  const url = `${API_BASE}${path}`
  const response = await fetch(url, {
    credentials: 'include',
    headers: {
      'Content-Type': 'application/json',
      ...options.headers,
    },
    ...options,
  })

  if (!response.ok) {
    const error = await response.json().catch(() => ({ error: response.statusText }))
    throw new Error(error.error || `HTTP ${response.status}`)
  }

  return response.json()
}

Authentication

Login

const user = await equaApi('/user/login', {
  method: 'POST',
  body: JSON.stringify({
    email: 'user@example.com',
    password: 'your-password',
  }),
})

console.log('Logged in as:', user.email)

Google OAuth Login

const user = await equaApi('/user/google-auth', {
  method: 'POST',
  body: JSON.stringify({
    token: googleIdToken,
  }),
})
Magic link endpoints (/user/magic-link and /user/magic-link/verify) are implemented in the auth module but not yet registered as REST endpoints. This example shows the planned usage.
// Step 1: Request magic link (planned)
await equaApi('/user/magic-link', {
  method: 'POST',
  body: JSON.stringify({ email: 'user@example.com' }),
})

// Step 2: Verify token from the email link (planned)
const user = await equaApi('/user/magic-link/verify', {
  method: 'POST',
  body: JSON.stringify({ token: tokenFromEmail }),
})

Get Current User

const currentUser = await equaApi('/user/current')

Logout

await equaApi('/user/logout', { method: 'POST' })

Organizations

List Organizations

const orgs = await equaApi('/organization')

Get Organization Details

const org = await equaApi(`/organization/${orgId}`)

Create Organization

const newOrg = await equaApi('/organization', {
  method: 'POST',
  body: JSON.stringify({
    name: 'My Company',
    type: 'corporation',
  }),
})

Cap Table

List Shareholdings

const shareholdings = await equaApi(`/organization/${orgId}/shareholding`)

Create a Shareholding

const shareholding = await equaApi(`/organization/${orgId}/shareholding`, {
  method: 'POST',
  body: JSON.stringify({
    member: memberId,
    security: securityId,
    shares: 10000,
    issueDate: '2025-01-15',
  }),
})

Get Securities

const securities = await equaApi(`/organization/${orgId}/security`)

Members

List Organization Members

const members = await equaApi(`/organization/${orgId}/member`)

Invite Members

await equaApi(`/organization/${orgId}/member/invite`, {
  method: 'POST',
  body: JSON.stringify({
    emails: ['alice@example.com', 'bob@example.com'],
  }),
})

Documents (Data Room)

List Documents

const docs = await equaApi(`/organization/${orgId}/document`)

Upload a Document

const formData = new FormData()
formData.append('file', fileInput.files[0])

const response = await fetch(`${API_BASE}/organization/${orgId}/document`, {
  method: 'POST',
  credentials: 'include',
  body: formData,
  // Do not set Content-Type header; the browser sets it with the boundary
})

Download a Document

const response = await fetch(
  `${API_BASE}/organization/${orgId}/document/${docId}/content`,
  { credentials: 'include' }
)
const blob = await response.blob()

Billing

Get Products

const products = await equaApi('/billing/product')

Get Organization Subscriptions

const subs = await equaApi(`/organization/${orgId}/subscription`)

Agent (Equanaut)

Chat with the Agent

const response = await equaApi('/agent/chat', {
  method: 'POST',
  body: JSON.stringify({
    organization: orgId,
    message: 'How many shareholders does this company have?',
    conversationId: conversationId,
  }),
})

Error Handling

See Error Codes for the complete list of status codes. A common pattern:
try {
  const data = await equaApi('/organization')
  // handle success
} catch (err) {
  if (err.message.includes('401')) {
    // Session expired, redirect to login
  } else {
    // Display error to user
    console.error('API error:', err.message)
  }
}