Proxiant API
Build integrations, automate workflows, and connect Proxiant to your existing systems. Our REST API gives you full programmatic access to jobs, clients, attempts, affidavits, and more.
Quickstart
Get up and running in three steps. You'll have live data in under two minutes.
Generate an API key
Go to Settings → API → New Key. Give it a name, select the scopes your integration needs, and copy it — it's only shown once.
Make your first request
Pass your key in the Authorization header on every request:
curl https://api.proxiant.co/v1/jobs \ -H "Authorization: Bearer prx_live_xxxxxxxxxxxx" \ -H "Content-Type: application/json"
Receive a paginated response
The response envelope wraps your data with metadata for pagination:
{ "data": [ { "id": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d", "job_number": "FH-2025-04812", "status": "in_progress", "recipient_name": "James R. Thornton" } ], "meta": { "page": 1, "per_page": 50, "total": 243 } }
Base URL & Versioning
All API requests use this base URL:
https://api.proxiant.co/v1
The current version is v1. We follow a conservative versioning policy:
- Breaking changes — increment the version (v1 → v2). You get advance notice and a migration guide.
- Non-breaking additions — new fields, new endpoints, new event types — are added without a version bump.
Authentication
The Proxiant API uses bearer token authentication. Include your API key in the Authorization header of every request. Keys are firm-scoped — a key can only access data belonging to the firm it was created for.
Authorization: Bearer prx_live_xxxxxxxxxxxxxxxxxxxx
Keys use the prefix prx_live_ for production. Sandbox keys (fh_test_) are coming soon. See the Authentication reference for full details on key management, permission scopes, and security best practices.
Request Format
A few conventions apply to all requests and responses:
| Convention | Details |
|---|---|
| Content-Type | All requests with a body must include Content-Type: application/json |
| Response format | All responses are JSON, always wrapped in a data envelope |
| Dates & timestamps | ISO 8601 format: 2025-04-16T14:30:00Z |
| IDs | UUID v4 strings, e.g. 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d |
| Null vs. absent | Optional fields not set are returned as null, not omitted |
| Boolean | JSON true / false, never strings |
Pagination
All list endpoints are paginated. Use page and per_page query parameters to navigate through results. The default page size is 50; the maximum is 100.
# Fetch page 3, 25 results per page curl "https://api.proxiant.co/v1/jobs?page=3&per_page=25" \ -H "Authorization: Bearer prx_live_xxxxxxxxxxxx"
Every paginated response includes a meta object:
{ "data": [ /* ... results ... */ ], "meta": { "page": 3, "per_page": 25, "total": 243 // total records matching your filters } }
To detect the last page: (page - 1) * per_page + data.length >= total, or when data is empty.
Errors
Errors follow a consistent envelope. The HTTP status code communicates the category; the error.code field gives the specific machine-readable reason.
{ "error": { "code": "unprocessable", "message": "Validation failed", "details": { "recipient_name": ["can't be blank"], "service_address.zip": ["is invalid"] } } }
| Status | Code | Meaning |
|---|---|---|
| 400 | bad_request | Invalid request body or query parameters |
| 401 | unauthorized | Missing or invalid API key |
| 403 | forbidden | Valid key but insufficient scope for this action |
| 404 | not_found | Resource doesn't exist or is outside your firm's scope |
| 409 | conflict | Duplicate or conflicting operation (e.g., already exists) |
| 422 | unprocessable | Validation failed — details contains field-level errors |
| 429 | rate_limited | Exceeded 1,000 requests/minute for this key |
| 500 | server_error | Something went wrong on our end — retry with backoff |
Rate Limits
Each API key is limited to 1,000 requests per minute. Rate limit state is included on every response:
| Header | Description |
|---|---|
| X-RateLimit-Limit | Maximum requests allowed per minute (always 1000) |
| X-RateLimit-Remaining | Requests remaining in the current window |
| X-RateLimit-Reset | Unix timestamp when the window resets |
When you exceed the limit, you receive a 429 rate_limited response. Wait until X-RateLimit-Reset before retrying. For bulk operations, consider adding a small delay between batches to stay well under the limit.
Resources
The API is organized around these primary resources. Each has its own reference page with full endpoint documentation, parameter tables, and example requests and responses.
| Resource | Description | Key Endpoints |
|---|---|---|
| Jobs | Service jobs — the core work unit in Proxiant | GET /jobs · POST /jobs · GET /jobs/:id · PATCH /jobs/:id |
| Attempts | Individual service attempts against a job | GET /jobs/:id/attempts · POST /jobs/:id/attempts |
| Clients | Law firm and client records | GET /clients · POST /clients · PATCH /clients/:id |
| Courts | Court records (read-only) | GET /courts · GET /courts/:id |
| Invoices | Client invoices and billing records | GET /invoices · GET /invoices/:id |
| Affidavits | Generated affidavits of service | GET /affidavits · GET /affidavits/:id/download |
| Webhooks | Event subscriptions for real-time notifications | GET /webhooks · POST /webhooks · DELETE /webhooks/:id |