API REFERENCE
API Reference
Integrate Proxae timestamp certification into your applications via our REST API.
Authentication
All API requests must include your API key in the X-API-Key header. Create keys in your account settings.
X-API-Key: pxe_your_api_key_here
Keep your API keys secret. Never expose them client-side.
Base URL
https://proxae.com/api/v1
Create a proof
/proofs
Submit a SHA-256 hash for Bitcoin blockchain timestamping. Content is never sent — only the hash is transmitted.
{
"content_hash": "e3b0c44298fc1c149afbf4c8996fb924...",
"title": "My document" // optional
}
| Field | Type | Description |
|---|---|---|
| content_hash | string | SHA-256 hash of the content (64 hex characters). Required. |
| title | string | Optional title for the proof. |
{
"proof_id": "550e8400-e29b-41d4-a716-446655440000"
}
Get a proof
/proofs/{id}
Returns the full details of a proof by its UUID.
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"content_hash": "e3b0c44298fc1c14...",
"status": "CONFIRMED",
"bitcoin_block": 850123,
"bitcoin_block_time": "2026-09-22T14:30:00Z",
"created_at": "2026-09-22T12:00:00Z"
}
Check status
/proofs/{id}/status
Lightweight endpoint to check whether a proof has been confirmed on the blockchain. Ideal for polling.
{
"id": "550e8400-...",
"status": "PENDING",
"has_ots": true,
"bitcoin_block": null,
"bitcoin_block_time": null
}
List proofs
/proofs
Returns a paginated list of all proofs associated with your account (25 per page).
Webhooks
Configure webhooks in your settings to receive HTTP notifications when your proofs change state. Proxae signs every request with HMAC-SHA256.
proof.confirmed
Sent when a proof is confirmed on the Bitcoin blockchain (typically 1-3h after creation).
{
"event": "proof.confirmed",
"data": {
"proof_id": "550e8400-...",
"content_hash": "e3b0c44298fc1c14...",
"status": "CONFIRMED",
"bitcoin_block": 850123,
"bitcoin_block_time": "2026-09-22T14:30:00Z"
},
"timestamp": "2026-09-22T15:00:00+00:00"
}
Signature verification
Every webhook request includes an X-Proxae-Signature header containing the HMAC-SHA256 of the request body, signed with your webhook secret.
X-Proxae-Signature: <HMAC-SHA256 hex digest> X-Proxae-Event: proof.confirmed Content-Type: application/json
$payload = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_PROXAE_SIGNATURE'];
$secret = 'your_webhook_secret';
$expected = hash_hmac('sha256', $payload, $secret);
if (! hash_equals($expected, $signature)) {
http_response_code(401);
exit('Invalid signature');
}
Webhook delivery log
Every webhook delivery attempt is logged. Check the history to diagnose failures or replay a missed webhook.
/webhook-deliveries
Returns a paginated list of all webhook deliveries for your account, most recent first.
{
"data": [{
"id": "a1b2c3d4-...",
"webhook_endpoint_id": "...",
"event": "proof.confirmed",
"payload": { "proof_id": "...", ... },
"status_code": 200,
"success": true,
"attempt": 1,
"created_at": "2026-09-22T15:00:00Z"
}],
...
}
/webhook-deliveries/{id}/replay
Replays a webhook by re-queuing it to your endpoint. Useful if your server was down during the initial delivery.
Rate limiting
API requests are rate-limited per key. The default rate limit is 120 requests per minute.
| Default | 120 req/min |
| Headers | X-RateLimit-Limit, X-RateLimit-Remaining |
Errors
| Code | Description |
|---|---|
| 401 | Missing or invalid API key. |
| 404 | Proof not found. |
| 422 | Invalid request data. |
| 429 | Rate limit exceeded. Try again later. |
Quick start
# Create a proof
curl -X POST https://proxae.com/api/v1/proofs \
-H "X-API-Key: pxe_your_key" \
-H "Content-Type: application/json" \
-d '{"content_hash": "e3b0c442...b855"}'
# Check status
curl https://proxae.com/api/v1/proofs/{proof_id}/status \
-H "X-API-Key: pxe_your_key"