743 lines
13 KiB
Markdown
743 lines
13 KiB
Markdown
# 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/v1
|
|
```
|
|
|
|
## Common Parameters
|
|
|
|
### Pagination
|
|
|
|
All list endpoints support pagination:
|
|
|
|
```http
|
|
GET /api/v1/resources?page=2&per_page=50
|
|
```
|
|
|
|
**Parameters:**
|
|
- `page` (integer) - Page number (default: 1)
|
|
- `per_page` (integer) - Items per page (default: 15, max: 100)
|
|
|
|
**Response includes:**
|
|
```json
|
|
{
|
|
"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:
|
|
|
|
```http
|
|
GET /api/v1/resources?status=active&created_after=2024-01-01
|
|
```
|
|
|
|
Common filters:
|
|
- `status` - Filter by status (varies by resource)
|
|
- `created_after` - ISO 8601 date
|
|
- `created_before` - ISO 8601 date
|
|
- `updated_after` - ISO 8601 date
|
|
- `updated_before` - ISO 8601 date
|
|
- `search` - Full-text search (if supported)
|
|
|
|
### Sorting
|
|
|
|
Sort results using the `sort` parameter:
|
|
|
|
```http
|
|
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:
|
|
|
|
```http
|
|
GET /api/v1/resources?fields=id,name,created_at
|
|
```
|
|
|
|
Reduces payload size and improves performance.
|
|
|
|
### Includes
|
|
|
|
Eager-load related resources:
|
|
|
|
```http
|
|
GET /api/v1/resources?include=owner,tags,metadata
|
|
```
|
|
|
|
Reduces 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:
|
|
|
|
```http
|
|
X-RateLimit-Limit: 10000
|
|
X-RateLimit-Remaining: 9847
|
|
X-RateLimit-Reset: 1640995200
|
|
```
|
|
|
|
When rate limit is exceeded, you'll receive a `429 Too Many Requests` response:
|
|
|
|
```json
|
|
{
|
|
"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:
|
|
|
|
```http
|
|
POST /api/v1/resources
|
|
Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000
|
|
```
|
|
|
|
If 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/resources
|
|
```
|
|
|
|
When 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:
|
|
|
|
```http
|
|
GET /api/v1/resources
|
|
X-Workspace-ID: 123
|
|
X-Namespace-ID: 456
|
|
```
|
|
|
|
Alternatively, use query parameters:
|
|
|
|
```http
|
|
GET /api/v1/resources?workspace_id=123&namespace_id=456
|
|
```
|
|
|
|
See [Namespaces & Entitlements](/security/namespaces) for details on multi-tenancy.
|
|
|
|
## Webhook Events
|
|
|
|
Configure webhooks to receive real-time notifications:
|
|
|
|
```http
|
|
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:**
|
|
```json
|
|
{
|
|
"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:
|
|
|
|
```http
|
|
X-Webhook-Signature: sha256=abc123...
|
|
X-Webhook-Timestamp: 1640995200
|
|
```
|
|
|
|
See [Webhook Security](/api/authentication#webhook-signatures) for signature verification.
|
|
|
|
## Error Handling
|
|
|
|
All errors follow a consistent format. See [Error Reference](/api/errors) for details.
|
|
|
|
**Example error response:**
|
|
|
|
```json
|
|
{
|
|
"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
|
|
|
|
```http
|
|
GET /api/v1/workspaces
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"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
|
|
|
|
```http
|
|
GET /api/v1/workspaces/{workspace_id}
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"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
|
|
|
|
```http
|
|
POST /api/v1/workspaces
|
|
```
|
|
|
|
**Request:**
|
|
```json
|
|
{
|
|
"name": "New Workspace",
|
|
"slug": "new-workspace",
|
|
"tier": "pro"
|
|
}
|
|
```
|
|
|
|
**Response:** `201 Created`
|
|
|
|
#### Update Workspace
|
|
|
|
```http
|
|
PATCH /api/v1/workspaces/{workspace_id}
|
|
```
|
|
|
|
**Request:**
|
|
```json
|
|
{
|
|
"name": "Updated Name",
|
|
"settings": {
|
|
"timezone": "Europe/London"
|
|
}
|
|
}
|
|
```
|
|
|
|
**Response:** `200 OK`
|
|
|
|
#### Delete Workspace
|
|
|
|
```http
|
|
DELETE /api/v1/workspaces/{workspace_id}
|
|
```
|
|
|
|
**Response:** `204 No Content`
|
|
|
|
### Namespace Endpoints
|
|
|
|
#### List Namespaces
|
|
|
|
```http
|
|
GET /api/v1/namespaces
|
|
```
|
|
|
|
**Query parameters:**
|
|
- `owner_type` - Filter by owner type (`User` or `Workspace`)
|
|
- `workspace_id` - Filter by workspace
|
|
- `is_active` - Filter by active status
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"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
|
|
|
|
```http
|
|
GET /api/v1/namespaces/{namespace_id}
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"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
|
|
|
|
```http
|
|
POST /api/v1/namespaces/{namespace_id}/entitlements/check
|
|
```
|
|
|
|
**Request:**
|
|
```json
|
|
{
|
|
"feature": "storage",
|
|
"quantity": 1073741824
|
|
}
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"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
|
|
|
|
```http
|
|
GET /api/v1/users
|
|
X-Workspace-ID: 123
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"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
|
|
|
|
```http
|
|
GET /api/v1/user
|
|
```
|
|
|
|
Returns the authenticated user.
|
|
|
|
#### Update User
|
|
|
|
```http
|
|
PATCH /api/v1/users/{user_id}
|
|
```
|
|
|
|
**Request:**
|
|
```json
|
|
{
|
|
"name": "Jane Doe",
|
|
"email": "jane@example.com"
|
|
}
|
|
```
|
|
|
|
### API Key Endpoints
|
|
|
|
#### List API Keys
|
|
|
|
```http
|
|
GET /api/v1/api-keys
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"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
|
|
|
|
```http
|
|
POST /api/v1/api-keys
|
|
```
|
|
|
|
**Request:**
|
|
```json
|
|
{
|
|
"name": "New API Key",
|
|
"scopes": ["read:all"],
|
|
"rate_limit_tier": "pro",
|
|
"expires_at": "2025-01-01T00:00:00Z"
|
|
}
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"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
|
|
|
|
```http
|
|
DELETE /api/v1/api-keys/{key_id}
|
|
```
|
|
|
|
**Response:** `204 No Content`
|
|
|
|
### Webhook Endpoints
|
|
|
|
#### List Webhooks
|
|
|
|
```http
|
|
GET /api/v1/webhooks
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"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
|
|
|
|
```http
|
|
POST /api/v1/webhooks
|
|
```
|
|
|
|
**Request:**
|
|
```json
|
|
{
|
|
"url": "https://your-app.com/webhooks",
|
|
"events": ["resource.created"],
|
|
"secret": "whsec_abc123..."
|
|
}
|
|
```
|
|
|
|
#### Test Webhook
|
|
|
|
```http
|
|
POST /api/v1/webhooks/{webhook_id}/test
|
|
```
|
|
|
|
Sends a test event to the webhook URL.
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"status_code": 200,
|
|
"response_time_ms": 145
|
|
}
|
|
```
|
|
|
|
#### Webhook Deliveries
|
|
|
|
```http
|
|
GET /api/v1/webhooks/{webhook_id}/deliveries
|
|
```
|
|
|
|
View delivery history and retry failed deliveries:
|
|
|
|
```json
|
|
{
|
|
"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:
|
|
|
|
```javascript
|
|
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:
|
|
|
|
```javascript
|
|
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:
|
|
|
|
```http
|
|
GET /api/v1/resources?fields=id,name,status
|
|
```
|
|
|
|
### 4. Batch Operations
|
|
|
|
When possible, use batch endpoints instead of multiple single requests:
|
|
|
|
```http
|
|
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:
|
|
|
|
```javascript
|
|
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:
|
|
|
|
```http
|
|
GET /api/v1/usage
|
|
```
|
|
|
|
Returns 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):**
|
|
|
|
```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/authentication) - API key management and authentication methods
|
|
- [Error Handling](/api/errors) - Error codes and debugging
|
|
- [Namespaces & Entitlements](/security/namespaces) - Multi-tenancy and feature access
|
|
- [Webhooks Guide](#webhook-events) - Setting up webhook endpoints
|
|
- [Rate Limiting](#rate-limiting) - Understanding rate limits and tiers
|