API Documentation
Integrate external systems with Requester.pro using the Public REST API and webhooks.
Base URL: https://requester.pro/api/v1
Authentication
All API requests must include a valid API key in the Authorization header using the Bearer scheme. API keys are scoped to a single space and are available on the Business plan.
Authorization: Bearer rqp_a1b2c3d4e5f6...How to get an API key
- Navigate to your space settings
- Open the "API Keys" tab
- Click "Create API Key" and give it a descriptive name
- Copy the key immediately — it will not be shown again
Create Request
/api/v1/requestsCreate a new request in the space associated with the API key.
Request Body
{
"templateId": "tpl_abc123",
"fields": [
{ "fieldId": "field_1", "value": "Server is down" },
{ "fieldId": "field_2", "value": "high" }
],
"priority": "high",
"assignedToId": "user_xyz"
}| Field | Type | Required |
|---|---|---|
templateId | string | Yes |
fields | array<{ fieldId, value }> | Yes |
priority | string | No |
assignedToId | string | No |
Response 201
{
"data": {
"id": "req_def456",
"status": "todo",
"createdAt": "2024-01-15T10:30:00.000Z"
}
}Error Responses
401— Invalid or missing API key403— Template does not belong to this space422— Missing required template fields or invalid data429— Rate limit exceeded
List Requests
/api/v1/requestsRetrieve a paginated list of requests in the space. Supports filtering by status, template, assignee, and date range.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
status | string | Filter by status (todo, in_progress, done, closed) |
templateId | string | Filter by template ID |
assignedToId | string | Filter by assigned user ID |
createdAfter | ISO 8601 | Only requests created after this date |
createdBefore | ISO 8601 | Only requests created before this date |
page | number | Page number (default: 1) |
pageSize | number | Items per page (default: 20, max: 50) |
Response 200
{
"data": [
{
"id": "req_def456",
"templateId": "tpl_abc123",
"status": "in_progress",
"priority": "high",
"assignedToId": "user_xyz",
"createdAt": "2024-01-15T10:30:00.000Z",
"updatedAt": "2024-01-15T11:00:00.000Z"
}
],
"meta": {
"total": 42,
"page": 1,
"pageSize": 20,
"hasMore": true
}
}Get Request
/api/v1/requests/:idRetrieve the full details of a single request, including all field values.
Response 200
{
"data": {
"id": "req_def456",
"templateId": "tpl_abc123",
"status": "in_progress",
"priority": "high",
"assignedToId": "user_xyz",
"createdAt": "2024-01-15T10:30:00.000Z",
"updatedAt": "2024-01-15T11:00:00.000Z",
"fieldValues": [
{ "fieldId": "field_1", "name": "Description", "value": "Server is down" },
{ "fieldId": "field_2", "name": "Category", "value": "high" }
]
}
}Error Responses
401— Invalid or missing API key404— Request not found or belongs to a different space429— Rate limit exceeded
Update Request Status
/api/v1/requests/:id/statusUpdate the status of an existing request. Only valid status transitions are accepted.
Request Body
{
"status": "in_progress"
}Valid Status Transitions
| From | To |
|---|---|
todo | in_progress |
in_progress | done |
done | closed |
| Any status | todo |
Response 200
{
"data": {
"id": "req_def456",
"status": "in_progress",
"previousStatus": "todo",
"updatedAt": "2024-01-15T11:00:00.000Z"
}
}Error Responses
401— Invalid or missing API key404— Request not found or belongs to a different space422— Invalid status transition (response includes allowed transitions)429— Rate limit exceeded
Webhooks
Webhooks allow you to receive real-time HTTP POST notifications when events occur in your space. Configure webhook endpoints in your space settings (Business plan required).
Event Types
request_created— A new request was createdrequest_status_changed— A request status was updatedrequest_assigned— A request was assigned or reassignedrequest_closed— A request was closed
Payload Format
{
"id": "del_abc123",
"type": "request_status_changed",
"timestamp": "2024-01-15T10:30:00.000Z",
"space": {
"id": "space_xyz",
"slug": "engineering"
},
"data": {
"requestId": "req_def456",
"templateId": "tpl_abc123",
"status": "in_progress",
"previousStatus": "todo",
"assignedToId": "user_xyz",
"updatedAt": "2024-01-15T10:30:00.000Z"
}
}Signature Verification
If you configured a secret for your webhook endpoint, each delivery includes an X-Requester-Signature-256 header. Verify it using HMAC-SHA256:
import crypto from 'crypto';
function verifySignature(payload: string, secret: string, signature: string): boolean {
const expected = 'sha256=' + crypto
.createHmac('sha256', secret)
.update(payload, 'utf8')
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}
// Usage in your webhook handler:
const signature = req.headers['x-requester-signature-256'];
const isValid = verifySignature(rawBody, yourSecret, signature);Retry Behavior
Failed deliveries (non-2xx response or timeout after 10s) are retried with exponential backoff:
| Attempt | Delay |
|---|---|
| 1 | 1 second |
| 2 | 4 seconds |
| 3 | 16 seconds |
| 4 | 64 seconds |
| 5 | 256 seconds |
After 5 failed attempts, the delivery is marked as failed. Check the delivery log in space settings to troubleshoot.
Rate Limiting
The Public API enforces rate limits to ensure fair usage and system stability.
- 60 requests per minute per API key
- 429 responses include a Retry-After header indicating seconds until the next request is allowed
429 Response Example
{
"error": {
"code": "RATE_LIMITED",
"message": "Too many requests. Please retry after the specified duration."
}
}Implement exponential backoff in your client when receiving 429 responses. Each API key has an independent rate limit.