API Documentation
Integrate Achieved.io into your workflow. Access investor data, project analytics, documents, and communications through a simple REST API.
Getting Started
The Achieved.io API is built on REST principles. All requests use HTTPS, return JSON responses, and use standard HTTP status codes. The base URL for all API requests is:
https://api.achieved.io/api/v1HTTPS Only
All requests must use TLS 1.2+
JSON Format
Request and response bodies in JSON
Versioned
API version included in the URL path
Authentication
All API requests require an API key sent via the Authorization header using the Bearer scheme. You can generate and manage API keys from your Achieved.io dashboard.
1. Generate an API Key
Navigate to Settings → API Keys in your dashboard and click Create New Key. Store the key securely — it will only be shown once.
2. Include the Key in Requests
curl -X GET https://api.achieved.io/api/v1/investors \
-H "Authorization: Bearer ak_live_xxxxxxxxxxxx" \
-H "Content-Type: application/json"Security Notice: Never expose your API key in client-side code. Use environment variables and server-side requests to keep your key safe.
Retrieve a paginated list of investors associated with your organization. Supports filtering by status, type, and date range.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
page | integer | Optional | Page number (default: 1) |
limit | integer | Optional | Results per page (default: 25, max: 100) |
status | string | Optional | Filter by status: "active", "pending", "inactive" |
type | string | Optional | Investor type: "individual", "institutional" |
Response
{
"data": [
{
"id": "inv_8xK2mP9qL",
"name": "Jane Smith",
"email": "jane@example.com",
"type": "individual",
"status": "active",
"total_invested": 250000,
"currency": "USD",
"created_at": "2025-11-15T08:30:00Z"
}
],
"pagination": {
"page": 1,
"limit": 25,
"total": 142,
"total_pages": 6
}
}Retrieve all projects in your portfolio. Each project includes summary metrics, current status, and linked investor count.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
page | integer | Optional | Page number (default: 1) |
limit | integer | Optional | Results per page (default: 25, max: 100) |
status | string | Optional | Project status: "active", "completed", "pipeline" |
Response
{
"data": [
{
"id": "prj_4nR7wX2bK",
"name": "Riverside Development",
"status": "active",
"target_raise": 5000000,
"current_raise": 3250000,
"investor_count": 18,
"currency": "USD",
"asset_class": "real_estate",
"created_at": "2025-09-01T12:00:00Z"
}
],
"pagination": {
"page": 1,
"limit": 25,
"total": 8,
"total_pages": 1
}
}Upload a document and associate it with a project or investor. Supported formats: PDF, DOCX, XLSX. Max file size: 50 MB.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
file | binary | Required | The document file (multipart/form-data) |
project_id | string | Required | The project to attach the document to |
type | string | Required | "report", "agreement", "statement", "other" |
visibility | string | Optional | "private" (default) or "investor_visible" |
Request
curl -X POST https://api.achieved.io/api/v1/documents \
-H "Authorization: Bearer ak_live_xxxxxxxxxxxx" \
-F "file=@quarterly-report.pdf" \
-F "project_id=prj_4nR7wX2bK" \
-F "type=report" \
-F "visibility=investor_visible"Response
{
"id": "doc_9mT3vY8hQ",
"filename": "quarterly-report.pdf",
"size_bytes": 2458901,
"mime_type": "application/pdf",
"type": "report",
"project_id": "prj_4nR7wX2bK",
"visibility": "investor_visible",
"status": "processing",
"uploaded_at": "2026-03-20T14:22:00Z"
}Retrieve aggregated analytics across your portfolio including AUM, returns, investor growth, and project performance metrics.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
period | string | Optional | "7d", "30d", "90d", "1y", "all" (default: "30d") |
project_id | string | Optional | Filter analytics to a specific project |
metric | string | Optional | "aum", "returns", "investors", "all" (default: "all") |
Response
{
"period": "30d",
"metrics": {
"total_aum": 28500000,
"aum_change_pct": 4.2,
"total_investors": 142,
"new_investors": 8,
"active_projects": 6,
"avg_return_pct": 12.8,
"distributions_paid": 850000
},
"currency": "USD",
"generated_at": "2026-03-20T15:00:00Z"
}Send an email or in-app notification to a specific investor or a group of investors. Supports templates and custom HTML content.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
type | string | Required | "email", "in_app", "both" |
recipient_ids | string[] | Required | Array of investor IDs |
subject | string | Required | Message subject line |
body | string | Required | Message body (HTML or plain text) |
template_id | string | Optional | Use a predefined template instead of body |
Request
{
"type": "email",
"recipient_ids": ["inv_8xK2mP9qL", "inv_3bN5kR7wF"],
"subject": "Q4 2025 Portfolio Update",
"body": "<h1>Quarterly Update</h1><p>Dear Investor, ...</p>",
"template_id": null
}Response
{
"id": "comm_6pW1xZ4nM",
"type": "email",
"recipients_count": 2,
"status": "queued",
"scheduled_at": null,
"created_at": "2026-03-20T16:00:00Z"
}SDKs & Libraries
Get started quickly with our official SDKs. Install via your preferred package manager and initialize with your API key.
Node.js / TypeScript
npm install @achieved/sdkimport { AchievedClient } from "@achieved/sdk";
const client = new AchievedClient({
apiKey: process.env.ACHIEVED_API_KEY,
});
const investors = await client.investors.list({
status: "active",
limit: 50,
});Python
pip install achieved-sdkfrom achieved import AchievedClient
client = AchievedClient(
api_key=os.environ["ACHIEVED_API_KEY"]
)
investors = client.investors.list(
status="active",
limit=50,
)Rate Limits
API requests are rate-limited to ensure fair usage and platform stability. Limits are applied per API key.
| Plan | Requests / Minute | Requests / Day | Burst Limit |
|---|---|---|---|
| Starter | 60 | 10,000 | 10 req/s |
| Professional | 300 | 100,000 | 30 req/s |
| Enterprise | 1,000 | Unlimited | 100 req/s |
Rate Limit Headers
Every response includes headers to help you track your usage:
X-RateLimit-Limit: 300
X-RateLimit-Remaining: 297
X-RateLimit-Reset: 1711036800
Retry-After: 42When you exceed the rate limit, the API returns a 429 Too Many Requests response. Use the Retry-After header to determine when to retry.