Current section
Files
Jump to
Current section
Files
docs/API_USAGE_EXAMPLES.md
# Concord HTTP API Usage Examples
This document provides practical examples of using the Concord HTTP API with curl commands. Make sure the Concord server is running before trying these examples.
## Starting Concord Server
```bash
# Development mode (port 4000) - auth disabled by default
mix start
# Production mode with custom port - auth enabled by default
CONCORD_API_PORT=8080 CONCORD_API_IP=0.0.0.0 mix start
# Development mode with custom port
CONCORD_API_PORT=4002 mix start
```
> **Note**: By default, authentication is disabled in development mode and enabled in production mode. You can enable it in development by setting `auth_enabled: true` in `config/config.exs`.
## Authentication
Concord API supports two authentication methods:
### 1. Bearer Token Authentication
```bash
# First, create a token using the CLI
mix concord.cluster token create
# Output: Token created: gn8kZrvWDdYU2K83sQDnBgWM4XaclkWh56T3zAFULcE
# Use the token in API requests
export CONCORD_TOKEN="gn8kZrvWDdYU2K83sQDnBgWM4XaclkWh56T3zAFULcE"
curl -H "Authorization: Bearer $CONCORD_TOKEN" http://localhost:4000/api/v1/kv
```
### 2. API Key Authentication
```bash
# Use the same token with "api_" prefix as API key
export CONCORD_API_KEY="api_gn8kZrvWDdYU2K83sQDnBgWM4XaclkWh56T3zAFULcE"
curl -H "X-API-Key: $CONCORD_API_KEY" http://localhost:4000/api/v1/kv
```
## Basic CRUD Operations
### Health Check
```bash
curl http://localhost:4000/api/v1/health
```
**Response:**
```json
{
"status": "healthy",
"timestamp": "2025-10-21T12:47:27.231034Z",
"service": "concord-api"
}
```
### Store a Key-Value Pair
```bash
curl -X PUT \
-H "Authorization: Bearer $CONCORD_TOKEN" \
-H "Content-Type: application/json" \
-d '{"value": "Hello, Concord!"}' \
http://localhost:4000/api/v1/kv/greeting
```
**Response:**
```json
{
"status": "ok"
}
```
### Store a Key-Value Pair with TTL
```bash
curl -X PUT \
-H "Authorization: Bearer $CONCORD_TOKEN" \
-H "Content-Type: application/json" \
-d '{"value": "Expires in 1 hour", "ttl": 3600}' \
http://localhost:4000/api/v1/kv/temporary
```
### Retrieve a Value
```bash
curl -H "Authorization: Bearer $CONCORD_TOKEN" \
http://localhost:4000/api/v1/kv/greeting
```
**Response:**
```json
{
"status": "ok",
"data": {
"value": "Hello, Concord!"
}
}
```
### Retrieve a Value with TTL Information
```bash
curl -H "Authorization: Bearer $CONCORD_TOKEN" \
"http://localhost:4000/api/v1/kv/temporary?with_ttl=true"
```
**Response:**
```json
{
"status": "ok",
"data": {
"value": "Expires in 1 hour",
"ttl": 3595
}
}
```
### List All Keys
```bash
curl -H "Authorization: Bearer $CONCORD_TOKEN" \
http://localhost:4000/api/v1/kv
```
**Response:**
```json
{
"status": "ok",
"data": ["greeting", "temporary", "config"]
}
```
### Delete a Key
```bash
curl -X DELETE \
-H "Authorization: Bearer $CONCORD_TOKEN" \
http://localhost:4000/api/v1/kv/temporary
```
**Response:**
```json
{
"status": "ok"
}
```
## TTL Operations
### Get TTL for a Key
```bash
curl -H "Authorization: Bearer $CONCORD_TOKEN" \
http://localhost:4000/api/v1/kv/temporary/ttl
```
**Response:**
```json
{
"status": "ok",
"data": {
"ttl": 1800
}
}
```
### Extend TTL (Touch)
```bash
curl -X POST \
-H "Authorization: Bearer $CONCORD_TOKEN" \
-H "Content-Type: application/json" \
-d '{"ttl": 7200}' \
http://localhost:4000/api/v1/kv/temporary/touch
```
**Response:**
```json
{
"status": "ok"
}
```
## Bulk Operations
### Bulk Store Multiple Keys
```bash
curl -X POST \
-H "Authorization: Bearer $CONCORD_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"operations": [
{"key": "user:1", "value": {"name": "Alice", "age": 30}},
{"key": "user:2", "value": {"name": "Bob", "age": 25}, "ttl": 1800},
{"key": "config:app", "value": {"debug": true, "version": "1.0.0"}}
]
}' \
http://localhost:4000/api/v1/kv/bulk
```
**Response:**
```json
{
"status": "ok",
"data": [
{"key": "user:1", "status": "ok"},
{"key": "user:2", "status": "ok"},
{"key": "config:app", "status": "ok"}
]
}
```
### Bulk Retrieve Multiple Keys
```bash
curl -X POST \
-H "Authorization: Bearer $CONCORD_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"keys": ["user:1", "user:2", "nonexistent"],
"with_ttl": true
}' \
http://localhost:4000/api/v1/kv/bulk/get
```
**Response:**
```json
{
"status": "ok",
"data": {
"user:1": {
"status": "ok",
"value": {"name": "Alice", "age": 30}
},
"user:2": {
"status": "ok",
"value": {"name": "Bob", "age": 25},
"ttl": 1755
},
"nonexistent": {
"status": "error",
"error": "not_found"
}
}
}
```
### Bulk Delete Multiple Keys
```bash
curl -X POST \
-H "Authorization: Bearer $CONCORD_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"keys": ["user:1", "old:config"]
}' \
http://localhost:4000/api/v1/kv/bulk/delete
```
**Response:**
```json
{
"status": "ok",
"data": [
{"key": "user:1", "status": "ok"},
{"key": "old:config", "status": "error", "error": "not_found"}
]
}
```
### Bulk TTL Operations
```bash
curl -X POST \
-H "Authorization: Bearer $CONCORD_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"operations": [
{"key": "session:1", "ttl": 3600},
{"key": "session:2", "ttl": 7200}
]
}' \
http://localhost:4000/api/v1/kv/bulk/touch
```
**Response:**
```json
{
"status": "ok",
"data": [
{"key": "session:1", "status": "ok"},
{"key": "session:2", "status": "ok"}
]
}
```
## Cluster Administration
### Get Cluster Status
```bash
curl -H "Authorization: Bearer $CONCORD_TOKEN" \
http://localhost:4000/api/v1/status
```
**Response:**
```json
{
"status": "ok",
"data": {
"cluster": {
"name": "concord_cluster",
"nodes": [
{
"name": "concord@127.0.0.1",
"status": "leader",
"address": "127.0.0.1"
}
],
"leader": "concord@127.0.0.1"
},
"metrics": {
"keys_total": 42,
"operations_per_second": 15.2
}
}
}
```
## Error Handling Examples
### Invalid Key (Empty or Too Long)
```bash
curl -X PUT \
-H "Authorization: Bearer $CONCORD_TOKEN" \
-H "Content-Type: application/json" \
-d '{"value": "test"}' \
http://localhost:4000/api/v1/kv/
```
**Response (400):**
```json
{
"status": "error",
"error": {
"code": "INVALID_KEY",
"message": "Key cannot be empty and must be <= 1024 bytes"
}
}
```
### Missing Authentication
```bash
curl http://localhost:4000/api/v1/kv/test
```
**Response (401):**
```json
{
"status": "error",
"error": {
"code": "UNAUTHORIZED",
"message": "Authentication required"
}
}
```
### Key Not Found
```bash
curl -H "Authorization: Bearer $CONCORD_TOKEN" \
http://localhost:4000/api/v1/kv/nonexistent
```
**Response (404):**
```json
{
"status": "error",
"error": {
"code": "NOT_FOUND",
"message": "Key not found"
}
}
```
### Batch Too Large
```bash
# Create a batch with 501 operations (limit is 500)
curl -X POST \
-H "Authorization: Bearer $CONCORD_TOKEN" \
-H "Content-Type: application/json" \
-d '{"operations": [{"key": "test", "value": "data"}]}' \
http://localhost:4000/api/v1/kv/bulk
```
**Response (413):**
```json
{
"status": "error",
"error": {
"code": "BATCH_TOO_LARGE",
"message": "Batch size exceeds 500 operations limit"
}
}
```
## API Documentation
### Interactive Swagger UI
Open your browser and navigate to:
```
http://localhost:4000/api/docs
```
This provides an interactive API documentation interface where you can:
- Explore all available endpoints
- Test API calls directly from your browser
- View request/response schemas
- Download the OpenAPI specification
### OpenAPI Specification
Download the complete OpenAPI 3.0 specification:
```bash
curl http://localhost:4000/api/v1/openapi.json -o concord-openapi.json
```
## Advanced Usage Examples
### Configuration Management
```bash
# Store application configuration
curl -X PUT \
-H "Authorization: Bearer $CONCORD_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"value": {
"database": {
"host": "localhost",
"port": 5432,
"name": "myapp_prod"
},
"features": {
"new_ui": true,
"beta_features": false
},
"limits": {
"max_connections": 100,
"timeout": 30000
}
}
}' \
http://localhost:4000/api/v1/kv/config:production
# Retrieve configuration
curl -H "Authorization: Bearer $CONCORD_TOKEN" \
http://localhost:4000/api/v1/kv/config:production
```
### Session Management
```bash
# Create user session with 30-minute TTL
curl -X PUT \
-H "Authorization: Bearer $CONCORD_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"value": {
"user_id": 12345,
"username": "alice",
"role": "admin",
"last_activity": "2025-10-21T12:47:27Z"
},
"ttl": 1800
}' \
http://localhost:4000/api/v1/kv/session:abc123
# Extend session when user is active
curl -X POST \
-H "Authorization: Bearer $CONCORD_TOKEN" \
-H "Content-Type: application/json" \
-d '{"ttl": 1800}' \
http://localhost:4000/api/v1/kv/session:abc123/touch
# Check session TTL
curl -H "Authorization: Bearer $CONCORD_TOKEN" \
http://localhost:4000/api/v1/kv/session:abc123/ttl
```
### Feature Flags
```bash
# Set feature flags for different user segments
curl -X POST \
-H "Authorization: Bearer $CONCORD_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"operations": [
{"key": "feature:new_dashboard:enabled", "value": true},
{"key": "feature:beta_ui:enabled", "value": false},
{"key": "feature:advanced_search:users:premium", "value": true},
{"key": "feature:advanced_search:users:basic", "value": false}
]
}' \
http://localhost:4000/api/v1/kv/bulk
# Check feature flag for user
curl -H "Authorization: Bearer $CONCORD_TOKEN" \
http://localhost:4000/api/v1/kv/feature:new_dashboard:enabled
```
## Performance Tips
1. **Use Bulk Operations**: When handling multiple keys, use bulk endpoints to reduce network round trips.
2. **Batch Size Limits**: Keep bulk operations under 500 items per request for optimal performance.
3. **TTL Management**: Set appropriate TTL values to automatically clean up expired data.
4. **Connection Reuse**: Use HTTP keep-alive connections for better performance.
5. **Compression**: For large payloads, consider using HTTP compression.
## Integration Examples
### Python Example
```python
import requests
import json
# Configuration
BASE_URL = "http://localhost:4000/api/v1"
TOKEN = "your-concord-token"
headers = {
"Authorization": f"Bearer {TOKEN}",
"Content-Type": "application/json"
}
# Store data
response = requests.put(
f"{BASE_URL}/kv/python:example",
headers=headers,
json={"value": {"message": "Hello from Python!", "version": 3.9}}
)
# Retrieve data
response = requests.get(f"{BASE_URL}/kv/python:example", headers=headers)
data = response.json()
print(f"Status: {data['status']}")
print(f"Value: {data['data']['value']}")
```
### JavaScript Example
```javascript
const BASE_URL = 'http://localhost:4000/api/v1';
const TOKEN = 'your-concord-token';
const headers = {
'Authorization': `Bearer ${TOKEN}`,
'Content-Type': 'application/json'
};
// Store data
async function storeData(key, value) {
const response = await fetch(`${BASE_URL}/kv/${key}`, {
method: 'PUT',
headers,
body: JSON.stringify({ value })
});
return response.json();
}
// Retrieve data
async function getData(key) {
const response = await fetch(`${BASE_URL}/kv/${key}`, {
method: 'GET',
headers
});
return response.json();
}
// Usage
storeData('js:example', { message: 'Hello from JavaScript!' })
.then(() => getData('js:example'))
.then(result => console.log(result));
```
### Go Example
```go
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
const (
BaseURL = "http://localhost:4000/api/v1"
Token = "your-concord-token"
)
func main() {
client := &http.Client{}
// Store data
data := map[string]interface{}{
"value": map[string]string{
"message": "Hello from Go!",
"lang": "golang",
},
}
jsonData, _ := json.Marshal(data)
req, _ := http.NewRequest("PUT", BaseURL+"/kv/go:example", bytes.NewBuffer(jsonData))
req.Header.Set("Authorization", "Bearer "+Token)
req.Header.Set("Content-Type", "application/json")
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
fmt.Printf("Status: %d\n", resp.StatusCode)
}
```
## Monitoring and Debugging
### Check API Response Times
```bash
# Use curl with timing info
curl -w "@curl-format.txt" \
-H "Authorization: Bearer $CONCORD_TOKEN" \
http://localhost:4000/api/v1/kv/test
```
Create `curl-format.txt`:
```
time_namelookup: %{time_namelookup}\n
time_connect: %{time_connect}\n
time_appconnect: %{time_appconnect}\n
time_pretransfer: %{time_pretransfer}\n
time_redirect: %{time_redirect}\n
time_starttransfer: %{time_starttransfer}\n
----------\n
time_total: %{time_total}\n
```
### Monitor Cluster Health
```bash
# Continuous monitoring
while true; do
echo "=== $(date) ==="
curl -s -H "Authorization: Bearer $CONCORD_TOKEN" \
http://localhost:4000/api/v1/status | jq '.data.cluster'
echo ""
sleep 5
done
```
This comprehensive guide should help you get started with the Concord HTTP API. For more detailed information about specific endpoints, refer to the interactive Swagger UI at `http://localhost:4000/api/docs`.