Skip to main content

API Reference

The Point REST API allows you to programmatically access and manage your investment data. This reference covers authentication, endpoints, request/response formats, and error handling.

API Access

API access requires a dedicated API client to be configured by your administrator. Contact support@pointgroup.io to request API access.

Base URL

https://[your-org].pointgroup.io/api/v1

Authentication

Point's API uses OAuth 2.0 Client Credentials flow.

Getting an Access Token

POST https://[your-org].pointgroup.io/auth/token
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials
&client_id=YOUR_CLIENT_ID
&client_secret=YOUR_CLIENT_SECRET
&scope=api.read

Response:

{
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "Bearer",
"expires_in": 3600,
"scope": "api.read"
}

Using the Token

Include the token in the Authorization header of every API request:

GET /api/v1/portfolios
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...

Tokens expire after 1 hour. Request a new token before it expires.


Portfolios

List Portfolios

GET /api/v1/portfolios

Query Parameters:

ParameterTypeDescription
statusstringFilter by status: active, inactive, archived
clientIdstringFilter by client ID
currencystringFilter by base currency (ISO 4217)
pageintegerPage number (default: 1)
pageSizeintegerResults per page (default: 50, max: 200)

Response:

{
"data": [
{
"id": "port_abc123",
"name": "Smith Family Office GBP",
"code": "SFO-GBP-001",
"clientId": "client_xyz789",
"baseCurrency": "GBP",
"type": "composite",
"status": "active",
"totalValue": 12500000.0,
"latestValuationDate": "2026-02-17",
"createdAt": "2024-01-15T09:00:00Z",
"updatedAt": "2026-02-17T18:30:00Z"
}
],
"pagination": {
"page": 1,
"pageSize": 50,
"totalItems": 127,
"totalPages": 3
}
}

Get Portfolio

GET /api/v1/portfolios/{portfolioId}

Get Portfolio Holdings

GET /api/v1/portfolios/{portfolioId}/holdings

Query Parameters:

ParameterTypeDescription
datestringValuation date (ISO 8601, default: latest)
lookThroughbooleanApply fund look-throughs (default: false)

Securities

List Securities

GET /api/v1/securities

Get Security

GET /api/v1/securities/{securityId}

Get Security Prices

GET /api/v1/securities/{securityId}/prices

Query Parameters:

ParameterTypeDescription
fromstringStart date (ISO 8601)
tostringEnd date (ISO 8601)
typestringPrice type: close, mid, bid, ask, nav

Transactions

List Transactions

GET /api/v1/transactions

Query Parameters:

ParameterTypeDescription
portfolioIdstringFilter by portfolio
securityIdstringFilter by security
fromstringStart date
tostringEnd date
typestringTransaction type
statusstringpending, settled, failed, cancelled

Rate Limits

TierRequests per MinuteRequests per Day
Standard6010,000
Premium300100,000

Rate limit headers are included in every response:

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 45
X-RateLimit-Reset: 1708272000

Error Codes

HTTP StatusError CodeDescription
400INVALID_REQUESTRequest is malformed or missing required fields
401UNAUTHORIZEDMissing or invalid access token
403FORBIDDENValid token but insufficient permissions
404NOT_FOUNDThe requested resource does not exist
409CONFLICTResource already exists (e.g., duplicate code)
422VALIDATION_ERRORRequest data failed validation
429RATE_LIMIT_EXCEEDEDToo many requests
500INTERNAL_ERRORUnexpected server error
503SERVICE_UNAVAILABLEPlatform is temporarily unavailable

Error Response Format:

{
"error": {
"code": "VALIDATION_ERROR",
"message": "The 'baseCurrency' field is required.",
"details": [
{
"field": "baseCurrency",
"message": "This field is required."
}
],
"requestId": "req_abc123xyz"
}
}

Include the requestId when contacting support about an error.