API Endpoints Reference
Core PHP Framework provides RESTful APIs for programmatic access to platform resources. All endpoints follow consistent patterns for authentication, pagination, filtering, and error handling.
Base URL
https://your-domain.com/api/v1Common Parameters
Pagination
All list endpoints support pagination:
GET /api/v1/resources?page=2&per_page=50Parameters:
page(integer) - Page number (default: 1)per_page(integer) - Items per page (default: 15, max: 100)
Response includes:
{
"data": [...],
"meta": {
"current_page": 2,
"per_page": 50,
"total": 250,
"last_page": 5
},
"links": {
"first": "https://api.example.com/resources?page=1",
"last": "https://api.example.com/resources?page=5",
"prev": "https://api.example.com/resources?page=1",
"next": "https://api.example.com/resources?page=3"
}
}Filtering
Filter list results using query parameters:
GET /api/v1/resources?status=active&created_after=2024-01-01Common filters:
status- Filter by status (varies by resource)created_after- ISO 8601 datecreated_before- ISO 8601 dateupdated_after- ISO 8601 dateupdated_before- ISO 8601 datesearch- Full-text search (if supported)
Sorting
Sort results using the sort parameter:
GET /api/v1/resources?sort=-created_at,name- Prefix with
-for descending order - Default is ascending order
- Comma-separate multiple sort fields
Field Selection
Request specific fields only:
GET /api/v1/resources?fields=id,name,created_atReduces payload size and improves performance.
Includes
Eager-load related resources:
GET /api/v1/resources?include=owner,tags,metadataReduces number of API calls needed.
Rate Limiting
API requests are rate-limited based on your tier:
| Tier | Requests/Hour | Burst |
|---|---|---|
| Free | 1,000 | 50 |
| Pro | 10,000 | 200 |
| Business | 50,000 | 500 |
| Enterprise | Custom | Custom |
Rate limit headers included in every response:
X-RateLimit-Limit: 10000
X-RateLimit-Remaining: 9847
X-RateLimit-Reset: 1640995200When rate limit is exceeded, you'll receive a 429 Too Many Requests response:
{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded. Please retry after 3600 seconds.",
"retry_after": 3600
}
}Idempotency
POST, PATCH, PUT, and DELETE requests support idempotency keys to safely retry requests:
POST /api/v1/resources
Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000If the same idempotency key is used within 24 hours:
- Same status code and response body returned
- No duplicate resource created
- Safe to retry failed requests
Versioning
The API version is included in the URL path:
/api/v1/resourcesWhen breaking changes are introduced, a new version will be released (e.g., /api/v2/). Previous versions are supported for at least 12 months after deprecation notice.
Workspaces & Namespaces
Multi-tenant resources require workspace and/or namespace context:
GET /api/v1/resources
X-Workspace-ID: 123
X-Namespace-ID: 456Alternatively, use query parameters:
GET /api/v1/resources?workspace_id=123&namespace_id=456See Namespaces & Entitlements for details on multi-tenancy.
Webhook Events
Configure webhooks to receive real-time notifications:
POST /api/v1/webhooks
{
"url": "https://your-app.com/webhooks",
"events": ["resource.created", "resource.updated"],
"secret": "whsec_abc123..."
}Common events:
{resource}.created- Resource created{resource}.updated- Resource updated{resource}.deleted- Resource deleted
Webhook payload:
{
"id": "evt_1234567890",
"type": "resource.created",
"created_at": "2024-01-15T10:30:00Z",
"data": {
"object": {
"id": "res_abc123",
"type": "resource",
"attributes": {...}
}
}
}Webhook requests include HMAC-SHA256 signature in headers:
X-Webhook-Signature: sha256=abc123...
X-Webhook-Timestamp: 1640995200See Webhook Security for signature verification.
Error Handling
All errors follow a consistent format. See Error Reference for details.
Example error response:
{
"error": {
"code": "VALIDATION_ERROR",
"message": "Validation failed",
"details": {
"email": ["The email field is required."]
},
"request_id": "req_abc123"
}
}Resource Endpoints
Core Resources
The following resource types are available:
- Workspaces - Multi-tenant workspaces
- Namespaces - Service isolation contexts
- Users - User accounts
- API Keys - API authentication credentials
- Webhooks - Webhook endpoints
Workspace Endpoints
List Workspaces
GET /api/v1/workspacesResponse:
{
"data": [
{
"id": "wks_abc123",
"name": "Acme Corporation",
"slug": "acme-corp",
"tier": "business",
"created_at": "2024-01-01T00:00:00Z",
"updated_at": "2024-01-15T10:30:00Z"
}
]
}Get Workspace
GET /api/v1/workspaces/{workspace_id}Response:
{
"data": {
"id": "wks_abc123",
"name": "Acme Corporation",
"slug": "acme-corp",
"tier": "business",
"settings": {
"timezone": "UTC",
"locale": "en_GB"
},
"created_at": "2024-01-01T00:00:00Z",
"updated_at": "2024-01-15T10:30:00Z"
}
}Create Workspace
POST /api/v1/workspacesRequest:
{
"name": "New Workspace",
"slug": "new-workspace",
"tier": "pro"
}Response: 201 Created
Update Workspace
PATCH /api/v1/workspaces/{workspace_id}Request:
{
"name": "Updated Name",
"settings": {
"timezone": "Europe/London"
}
}Response: 200 OK
Delete Workspace
DELETE /api/v1/workspaces/{workspace_id}Response: 204 No Content
Namespace Endpoints
List Namespaces
GET /api/v1/namespacesQuery parameters:
owner_type- Filter by owner type (UserorWorkspace)workspace_id- Filter by workspaceis_active- Filter by active status
Response:
{
"data": [
{
"id": "ns_abc123",
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"name": "Personal Namespace",
"slug": "personal",
"owner_type": "User",
"owner_id": 42,
"workspace_id": null,
"is_default": true,
"is_active": true,
"created_at": "2024-01-01T00:00:00Z"
}
]
}Get Namespace
GET /api/v1/namespaces/{namespace_id}Response:
{
"data": {
"id": "ns_abc123",
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"name": "Client: Acme Corp",
"slug": "client-acme",
"owner_type": "Workspace",
"owner_id": 10,
"workspace_id": 10,
"packages": [
{
"id": "pkg_starter",
"name": "Starter Package",
"expires_at": null
}
],
"entitlements": {
"storage": {
"used": 1024000000,
"limit": 5368709120,
"unit": "bytes"
},
"api_calls": {
"used": 5430,
"limit": 10000,
"reset_at": "2024-02-01T00:00:00Z"
}
}
}
}Check Entitlement
POST /api/v1/namespaces/{namespace_id}/entitlements/checkRequest:
{
"feature": "storage",
"quantity": 1073741824
}Response:
{
"allowed": false,
"reason": "LIMIT_EXCEEDED",
"message": "Storage limit exceeded. Used: 1.00 GB, Available: 0.50 GB, Requested: 1.00 GB",
"current_usage": 1024000000,
"limit": 5368709120,
"available": 536870912
}User Endpoints
List Users
GET /api/v1/users
X-Workspace-ID: 123Response:
{
"data": [
{
"id": 1,
"name": "John Doe",
"email": "john@example.com",
"tier": "pro",
"email_verified_at": "2024-01-01T12:00:00Z",
"created_at": "2024-01-01T00:00:00Z"
}
]
}Get Current User
GET /api/v1/userReturns the authenticated user.
Update User
PATCH /api/v1/users/{user_id}Request:
{
"name": "Jane Doe",
"email": "jane@example.com"
}API Key Endpoints
List API Keys
GET /api/v1/api-keysResponse:
{
"data": [
{
"id": "key_abc123",
"name": "Production API Key",
"prefix": "sk_live_",
"last_used_at": "2024-01-15T10:30:00Z",
"expires_at": null,
"scopes": ["read:all", "write:resources"],
"rate_limit_tier": "business",
"created_at": "2024-01-01T00:00:00Z"
}
]
}Create API Key
POST /api/v1/api-keysRequest:
{
"name": "New API Key",
"scopes": ["read:all"],
"rate_limit_tier": "pro",
"expires_at": "2025-01-01T00:00:00Z"
}Response:
{
"data": {
"id": "key_abc123",
"name": "New API Key",
"key": "sk_live_abc123def456...",
"scopes": ["read:all"],
"created_at": "2024-01-15T10:30:00Z"
}
}⚠️ Important: The key field is only returned once during creation. Store it securely.
Revoke API Key
DELETE /api/v1/api-keys/{key_id}Response: 204 No Content
Webhook Endpoints
List Webhooks
GET /api/v1/webhooksResponse:
{
"data": [
{
"id": "wh_abc123",
"url": "https://your-app.com/webhooks",
"events": ["resource.created", "resource.updated"],
"is_active": true,
"created_at": "2024-01-01T00:00:00Z"
}
]
}Create Webhook
POST /api/v1/webhooksRequest:
{
"url": "https://your-app.com/webhooks",
"events": ["resource.created"],
"secret": "whsec_abc123..."
}Test Webhook
POST /api/v1/webhooks/{webhook_id}/testSends a test event to the webhook URL.
Response:
{
"success": true,
"status_code": 200,
"response_time_ms": 145
}Webhook Deliveries
GET /api/v1/webhooks/{webhook_id}/deliveriesView delivery history and retry failed deliveries:
{
"data": [
{
"id": "del_abc123",
"event_type": "resource.created",
"status": "success",
"status_code": 200,
"attempts": 1,
"delivered_at": "2024-01-15T10:30:00Z"
}
]
}Best Practices
1. Use Idempotency Keys
Always use idempotency keys for create/update operations:
const response = await fetch('/api/v1/resources', {
method: 'POST',
headers: {
'Idempotency-Key': crypto.randomUUID(),
'Authorization': `Bearer ${apiKey}`
},
body: JSON.stringify(data)
});2. Handle Rate Limits
Respect rate limit headers and implement exponential backoff:
async function apiRequest(url, options) {
const response = await fetch(url, options);
if (response.status === 429) {
const retryAfter = response.headers.get('X-RateLimit-Reset');
await sleep(retryAfter * 1000);
return apiRequest(url, options); // Retry
}
return response;
}3. Use Field Selection
Request only needed fields to reduce payload size:
GET /api/v1/resources?fields=id,name,status4. Batch Operations
When possible, use batch endpoints instead of multiple single requests:
POST /api/v1/resources/batch
{
"operations": [
{"action": "create", "data": {...}},
{"action": "update", "id": "res_123", "data": {...}}
]
}5. Verify Webhook Signatures
Always verify webhook signatures to ensure authenticity:
const crypto = require('crypto');
function verifyWebhook(payload, signature, secret) {
const hmac = crypto.createHmac('sha256', secret);
hmac.update(payload);
const expected = 'sha256=' + hmac.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}6. Store API Keys Securely
- Never commit API keys to version control
- Use environment variables or secrets management
- Rotate keys regularly
- Use separate keys for development/production
7. Monitor Usage
Track your API usage to avoid hitting rate limits:
GET /api/v1/usageReturns current usage statistics for your account.
SDKs & Libraries
Official SDKs available:
- PHP:
composer require core-php/sdk - JavaScript/Node.js:
npm install @core-php/sdk - Python:
pip install core-php-sdk
Example (PHP):
use CorePhp\SDK\Client;
$client = new Client('sk_live_abc123...');
$workspace = $client->workspaces->create([
'name' => 'My Workspace',
'tier' => 'pro',
]);
$namespaces = $client->namespaces->list([
'workspace_id' => $workspace->id,
]);Further Reading
- Authentication - API key management and authentication methods
- Error Handling - Error codes and debugging
- Namespaces & Entitlements - Multi-tenancy and feature access
- Webhooks Guide - Setting up webhook endpoints
- Rate Limiting - Understanding rate limits and tiers