API reference · v1
AQX Signal API
A read-only feed of qualified signals from the current AQX strategy. It returns signals only: no user, trade, or journal data. Signals are setups, not orders or advice.
Base URL
https://aqx.aquilasoftwares.comAuthentication
API access is enterprise only: a partner key is issued for enterprise accounts, and the trader plan does not include one. For access, see the Enterprise card under Pricing.
Every request needs your partner API key as a bearer token. Your AQX admin creates the key and shows it to you once. Keep it on your server; do not ship it in a browser or app.
Authorization: Bearer <api-key>A missing, unknown, or revoked key returns 401 with a WWW-Authenticate: Bearer header.
List signals
GET/api/v1/partner/signals
Qualified signals from the current strategy version, created or updated after since, ordered by updatedAt newest first (ties broken by id), at most 100 per page. Signals past their expiresAt are left out before the limit is applied, so a page is only short when there are no more signals.
| Query param | Required | Description |
|---|---|---|
since | No | ISO-8601 date (2026-09-30) or timestamp with Z or an offset (2026-09-30T08:00:00+08:00). Returns signals created or updated strictly after it. Omit to get the latest qualified signals. |
cursor | No | The nextCursor value from the previous page. Returns the page that follows it, with the same since. Do not send since with it. |
| Response field | Type | Description |
|---|---|---|
apiVersion | string | Always v1. |
since | string | null | The since bound this page was read with. |
limit | number | Page size, 100. |
count | number | Signals in this page. |
nextCursor | string | null | Send as cursor to get the next page. null when this is the last page. |
signals | Signal[] | See Signal fields below. |
To poll:
- Call with
sinceset to the value you saved last time (omit it on the first run). - While
nextCursoris not null, call again withcursorset to it. - Save the largest
updatedAtfrom all pages as the nextsince.
A signal updated while you page moves to the top of the order and is returned by your next poll.
curl -H "Authorization: Bearer $AQX_API_KEY" \
"https://aqx.aquilasoftwares.com/api/v1/partner/signals?since=2026-09-30T00:00:00Z"{
"apiVersion": "v1",
"since": "2026-09-30T00:00:00.000Z",
"limit": 100,
"count": 100,
"nextCursor": "eyJ1IjoiMjAyNi0wOS0zMF...",
"signals": [ { "id": "...", "symbol": "...", "side": "LONG", ... } ]
}curl -H "Authorization: Bearer $AQX_API_KEY" \
"https://aqx.aquilasoftwares.com/api/v1/partner/signals?cursor=eyJ1IjoiMjAyNi0wOS0zMF..."Get one signal
GET/api/v1/partner/signals/{id}
One signal by id, if it is still qualified and from the current strategy version. Otherwise 404.
curl -H "Authorization: Bearer $AQX_API_KEY" \
"https://aqx.aquilasoftwares.com/api/v1/partner/signals/<id>"{
"apiVersion": "v1",
"signal": { "id": "...", "symbol": "...", "side": "SHORT", ... }
}Signal fields
| Field | Type | Description |
|---|---|---|
id | string | Stable signal id. Use it with GET /api/v1/partner/signals/{id}. |
symbol | string | Instrument symbol, e.g. EUR/USD or XAU/USD. |
display | string | Human-readable instrument name. |
side | "LONG" | "SHORT" | Trade direction. |
setupType | string | Setup family that produced the signal. |
timeframe | string | Chart timeframe of the setup bar. |
entry | number | null | Entry price. |
stop | number | null | Stop-loss price. |
target | number | null | Take-profit price. |
riskReward | number | null | Reward divided by risk at the entry, stop, and target above. |
status | string | Always "QUALIFIED" in this feed. |
statusLabel | string | Display label for status. |
score | number | Confluence checklist score from 0 to 100. Not a probability. |
grade | string | Letter grade banded from the score. |
detectedAt | string (ISO-8601) | Open time of the setup bar. |
updatedAt | string (ISO-8601) | Last time the desk changed this signal. |
expiresAt | string (ISO-8601) | null | When the setup stops being valid. Do not act on it after this time. |
reason | string | null | Summary of rejection or expiry reasons. Usually null here. |
rejectionReasons | { code: string, label: string }[] | Machine code and label for each rejection reason. Usually empty here. |
riskStatus | string | null | Result of the desk's risk check on the levels. |
riskReason | string | null | Why the risk check returned that status. |
actionabilityStatus | string | null | Whether price is still near enough to the entry to act on, at the time of the call. |
actionabilityReason | string | null | Why actionability returned that status. |
canLogToDesk | boolean | True when qualified, risk passed, and actionable at the time of the call. |
setupVersion | string | Strategy version that produced the signal. |
Errors
Errors return JSON with the same shape:
{
"error": "A valid API key is required.",
"message": "A valid API key is required.",
"code": "INVALID_API_KEY"
}| Status | Code | When |
|---|---|---|
| 400 | INVALID_SINCE | since is not an ISO-8601 date, or has a time without Z or an offset. |
| 400 | INVALID_CURSOR | cursor is not a nextCursor value returned by the list endpoint. |
| 400 | INVALID_QUERY | since and cursor were both sent. Send one; the cursor already carries its since. |
| 401 | INVALID_API_KEY | The Authorization header is missing or malformed, or the key is unknown or revoked. |
| 404 | NOT_FOUND | No qualified, current-strategy signal has that id. Expired signals also return 404. |