API Overview
Signals provides a full REST API with auto-generated OpenAPI documentation and token authentication.
Overview
Signals is API-first — every capability available in the web UI is also accessible programmatically through the REST API. The API uses JSON over HTTPS with bearer token authentication via Laravel Sanctum.
API Documentation
Full interactive API documentation is auto-generated from the codebase using Scramble. It includes every endpoint, request/response schema, and a Try It console for testing requests directly in the browser.
Base URL
All API endpoints are prefixed with /api/v1/. Your full base URL is:
{your-app-url}/api/v1/
Authentication
API requests are authenticated with Bearer tokens issued via Laravel Sanctum. Include the token in the Authorization header:
curl -H "Authorization: Bearer {your-token}" \
{your-app-url}/api/v1/users
Tokens are scoped with abilities that control which endpoints they can access. A request will be rejected with a 403 response if the token lacks the required ability.
See Authentication for full details on creating tokens, available abilities, and rate limiting.
Response Format
Single resources are wrapped in a singular key, collections in a plural key with pagination metadata:
{
"opportunity": {
"id": 1,
"subject": "Summer Festival 2026"
}
}
{
"opportunities": [
{ "id": 1, "subject": "Summer Festival 2026" }
],
"meta": {
"total": 47,
"per_page": 20,
"page": 1
}
}
Filtering
Signals supports Ransack-compatible query syntax for filtering collections:
?q[subject_cont]=festival&q[status_eq]=confirmed
| Predicate | Meaning |
|---|---|
_eq |
Equals |
_not_eq |
Not equals |
_lt / _lteq |
Less than / less than or equal |
_gt / _gteq |
Greater than / greater than or equal |
_cont / _not_cont |
Contains / does not contain |
_start / _end |
Starts with / ends with |
_null / _not_null |
Is null / is not null |
_present / _blank |
Not null and not empty / null or empty |
_in / _not_in |
In list / not in list |
_true / _false |
Boolean true / false |
Sorting
Sort collections by a single field with the sort parameter. Prefix with - for descending order:
?sort=created_at (ascending)
?sort=-created_at (descending)
Each endpoint defines which fields are sortable. Sorting on unsupported fields is silently ignored.
Pagination
Collections use offset-based pagination. Defaults to 20 items per page, maximum 100:
?page=2&per_page=20
Includes
Load related resources with the include parameter:
?include=items,costs
Errors
Errors follow Laravel's standard validation format:
{
"message": "The subject field is required.",
"errors": {
"subject": ["The subject field is required."]
}
}
Note: The API is under active development. Refer to the interactive API documentation for the most up-to-date list of available endpoints.