REST APIv1.0

Archstone API

Programmatic access to your fund data. Query portfolio companies, LPs, deals, metrics, and capital calls with a simple REST API. Authenticate with API keys and get JSON responses.

OpenAPI Spec

Authentication

All API requests require authentication via a Bearer token in the Authorization header. Generate API keys from your dashboard settings.

Header format
Authorization: Bearer arch_live_xxxxxxxxxxxx

API Key Types

PrefixEnvironmentUsage
arch_live_ProductionFull access to live fund data. Use in server-side applications.
arch_test_Test/SandboxRead-only access to sandbox data. Safe for development.

Request Format

All requests should include the following headers:

httpAuthorization: Bearer arch_live_xxxxxxxxxxxx
Content-Type: application/json
Accept: application/json
Keep your API keys secret. Do not expose them in client-side code or public repositories. Use environment variables and server-side requests only.

Quick Start

Get started in seconds. Replace YOUR_API_KEY with your actual key.

cURL
bashcurl -H "Authorization: Bearer YOUR_API_KEY" \
  https://archstone.app/api/v1/portfolio
JavaScript
javascriptconst response = await fetch("https://archstone.app/api/v1/portfolio", {
  headers: {
    "Authorization": "Bearer YOUR_API_KEY",
  },
});
const { data, meta } = await response.json();
console.log(data); // Array of portfolio companies
Python
pythonimport requests

response = requests.get(
    "https://archstone.app/api/v1/portfolio",
    headers={"Authorization": "Bearer YOUR_API_KEY"},
)
data = response.json()
print(data["data"])  # List of portfolio companies
Base URL
https://archstone.app/api/v1

Auth

Manage API keys, validate tokens, and check permissions.

GET/auth/validate

Validate API key

Example Request

bashcurl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://archstone.app/api/v1/auth/validate"

Example Response

{
  "valid": true,
  "key_id": "key_abc123",
  "fund_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "permissions": [
    "read",
    "write"
  ],
  "created_at": "2025-06-01T00:00:00Z",
  "last_used_at": "2026-03-21T14:30:00Z"
}

Fund

Retrieve details about your fund including thesis, fees, and terms.

GET/fund

Get fund details

Example Request

bashcurl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://archstone.app/api/v1/fund"

Example Response

{
  "data": {
    "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
    "name": "Archstone Fund I",
    "target_size": 25000000,
    "thesis": "Early-stage B2B SaaS in North America",
    "sectors": [
      "SaaS",
      "Fintech"
    ],
    "stages": [
      "Pre-Seed",
      "Seed"
    ],
    "management_fee": 2,
    "carried_interest": 20,
    "hurdle_rate": 8,
    "status": "active",
    "created_at": "2025-01-15T00:00:00Z"
  }
}

Portfolio

List and filter portfolio companies with latest metrics snapshots.

GET/portfolio

List portfolio companies

Parameters

NameTypeInDescription
pageintegerqueryPage number(default: 1)
per_pageintegerqueryResults per page (max 100)(default: 25)
sortstringqueryField name to sort by
orderstringquerySort order: "asc" or "desc"(default: "desc")
idstringqueryFetch a single company by UUID
statusstringqueryFilter by status (active, exited, written_off)
sectorstringqueryFilter by sector
stagestringqueryFilter by stage

Example Request

bashcurl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://archstone.app/api/v1/portfolio"

Example Response

{
  "data": [
    {
      "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "name": "Acme Corp",
      "sector": "SaaS",
      "stage": "Seed",
      "investment_amount": 500000,
      "current_valuation": 12000000,
      "status": "active",
      "latest_metrics": {
        "period": "2025-Q4",
        "arr": 2400000,
        "mrr": 200000,
        "burn_rate": 150000,
        "runway_months": 18
      }
    }
  ],
  "meta": {
    "total": 12,
    "page": 1,
    "per_page": 25,
    "total_pages": 1
  }
}

LPs

Manage your limited partner directory and commitment data.

GET/lps

List LPs

Parameters

NameTypeInDescription
pageintegerqueryPage number(default: 1)
per_pageintegerqueryResults per page (max 100)(default: 25)
sortstringqueryField name to sort by
orderstringquerySort order: "asc" or "desc"(default: "desc")
idstringqueryFetch a single LP by UUID
statusstringqueryFilter by commitment_status
lp_typestringqueryFilter by LP type

Example Request

bashcurl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://archstone.app/api/v1/lps"

Example Response

{
  "data": [
    {
      "id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
      "name": "Jane Smith",
      "organization": "Smith Family Office",
      "lp_type": "Individual",
      "commitment_amount": 1000000,
      "commitment_status": "committed"
    }
  ],
  "meta": {
    "total": 8,
    "page": 1,
    "per_page": 25,
    "total_pages": 1
  }
}

Deals

Access your deal pipeline with filtering by stage, sector, and more.

GET/deals

List deals

Parameters

NameTypeInDescription
pageintegerqueryPage number(default: 1)
per_pageintegerqueryResults per page (max 100)(default: 25)
sortstringqueryField name to sort by
orderstringquerySort order: "asc" or "desc"(default: "desc")
idstringqueryFetch a single deal by UUID
pipeline_stagestringqueryFilter by pipeline stage
sectorstringqueryFilter by sector
stagestringqueryFilter by company stage

Example Request

bashcurl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://archstone.app/api/v1/deals"

Example Response

{
  "data": [
    {
      "id": "c3d4e5f6-a7b8-9012-cdef-123456789012",
      "company_name": "NewCo AI",
      "sector": "AI/ML",
      "stage": "Pre-Seed",
      "pipeline_stage": "due_diligence",
      "check_size": 250000,
      "valuation": 8000000,
      "score": 85
    }
  ],
  "meta": {
    "total": 24,
    "page": 1,
    "per_page": 25,
    "total_pages": 1
  }
}

Metrics

Query aggregate portfolio metrics and per-company performance data.

GET/metrics

Get portfolio metrics

Parameters

NameTypeInDescription
company_idstringqueryFilter to a specific portfolio company UUID
periodstringqueryFilter by period (e.g. 2025-Q4)

Example Request

bashcurl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://archstone.app/api/v1/metrics"

Example Response

{
  "data": {
    "summary": {
      "total_companies": 12,
      "active_companies": 10,
      "total_invested": 6500000,
      "current_portfolio_value": 42000000,
      "tvpi": 6.46,
      "aggregate_arr": 28000000,
      "aggregate_mrr": 2333333,
      "avg_burn_rate": 180000
    },
    "metrics": [
      {
        "company_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
        "period": "2025-Q4",
        "arr": 2400000,
        "mrr": 200000,
        "burn_rate": 150000,
        "runway_months": 18
      }
    ]
  },
  "meta": {
    "total_metrics": 48,
    "companies_with_metrics": 10
  }
}

Capital Calls

List capital calls with status and payment tracking.

GET/capital-calls

List capital calls

Parameters

NameTypeInDescription
pageintegerqueryPage number(default: 1)
per_pageintegerqueryResults per page (max 100)(default: 25)
sortstringqueryField name to sort by
orderstringquerySort order: "asc" or "desc"(default: "desc")
idstringqueryFetch a single capital call by UUID
statusstringqueryFilter by status (pending, completed, cancelled)

Example Request

bashcurl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://archstone.app/api/v1/capital-calls"

Example Response

{
  "data": [
    {
      "id": "d4e5f6a7-b8c9-0123-defa-234567890123",
      "fund_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
      "amount": 500000,
      "due_date": "2025-12-15",
      "status": "pending",
      "paid_amount": 0
    }
  ],
  "meta": {
    "total": 3,
    "page": 1,
    "per_page": 25,
    "total_pages": 1
  }
}

Documents

Upload, list, and share data room documents with analytics.

GET/documents

List documents

Parameters

NameTypeInDescription
pageintegerqueryPage number(default: 1)
per_pageintegerqueryResults per page (max 100)(default: 25)
sortstringqueryField name to sort by
orderstringquerySort order: "asc" or "desc"(default: "desc")
folderstringqueryFilter by folder name
file_typestringqueryFilter by MIME type (e.g. application/pdf)

Example Request

bashcurl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://archstone.app/api/v1/documents"

Example Response

{
  "data": [
    {
      "id": "e5f6a7b8-c9d0-1234-efab-345678901234",
      "name": "Q4 2025 LP Report.pdf",
      "folder": "LP Reports",
      "file_type": "application/pdf",
      "file_size": 2456789,
      "uploaded_by": "user-uuid",
      "created_at": "2025-12-20T10:00:00Z"
    }
  ],
  "meta": {
    "total": 47,
    "page": 1,
    "per_page": 25,
    "total_pages": 2
  }
}

AI

Interact with Archie AI for fund intelligence and automated workflows.

POST/ai/generate

Generate AI response

Parameters

NameTypeInDescription
messagestringbodyThe prompt or question for Archie
contextstringbodyOptional page context (e.g. 'portfolio', 'deals')

Example Request

bashcurl -X POST "https://archstone.app/api/v1/ai/generate" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "message": "Summarize my portfolio"
}'

Example Response

{
  "message": "Here is a summary of your portfolio performance for Q4 2025...",
  "model": "claude-sonnet-4-20250514",
  "tokens_used": 1250,
  "tools_used": [
    "query_fund_data",
    "portfolio_summary"
  ]
}

Rate Limits

API requests are rate limited to ensure fair usage and platform stability.

PlanRate LimitBurst
Starter60 requests / minute10 requests / second
Pro300 requests / minute30 requests / second

Rate limit headers are included in every response:

X-RateLimit-Limit — max requests per window
X-RateLimit-Remaining — requests remaining
X-RateLimit-Reset — UTC epoch seconds until reset

Handling Rate Limits

When you exceed the rate limit, the API responds with a 429 status. Implement exponential backoff to handle this gracefully:

javascriptasync function fetchWithRetry(url, options, maxRetries = 3) {
  for (let i = 0; i < maxRetries; i++) {
    const res = await fetch(url, options);
    if (res.status === 429) {
      const resetAt = res.headers.get("X-RateLimit-Reset");
      const waitMs = resetAt
        ? Math.max(0, Number(resetAt) * 1000 - Date.now())
        : Math.pow(2, i) * 1000;
      await new Promise(r => setTimeout(r, waitMs));
      continue;
    }
    return res;
  }
  throw new Error("Rate limit exceeded after retries");
}

Error Codes

All errors return a consistent JSON body with an error field.

json{
  "error": "Unauthorized — invalid or missing API key",
  "status": 401,
  "request_id": "req_abc123def456"
}

Every error response includes an error string, the HTTP status code, and a unique request_id for debugging. Include the request_id when contacting support.

StatusTitleDescription
400Bad RequestInvalid query parameters or request body.
401UnauthorizedMissing or invalid API key.
403ForbiddenAPI key does not have permission for this resource.
404Not FoundThe requested resource does not exist.
429Too Many RequestsRate limit exceeded. Wait and retry.
500Internal Server ErrorSomething went wrong on our end.