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.com

Authentication

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 paramRequiredDescription
sinceNoISO-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.
cursorNoThe nextCursor value from the previous page. Returns the page that follows it, with the same since. Do not send since with it.
Response fieldTypeDescription
apiVersionstringAlways v1.
sincestring | nullThe since bound this page was read with.
limitnumberPage size, 100.
countnumberSignals in this page.
nextCursorstring | nullSend as cursor to get the next page. null when this is the last page.
signalsSignal[]See Signal fields below.

To poll:

  1. Call with since set to the value you saved last time (omit it on the first run).
  2. While nextCursor is not null, call again with cursor set to it.
  3. Save the largest updatedAt from all pages as the next since.

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

FieldTypeDescription
idstringStable signal id. Use it with GET /api/v1/partner/signals/{id}.
symbolstringInstrument symbol, e.g. EUR/USD or XAU/USD.
displaystringHuman-readable instrument name.
side"LONG" | "SHORT"Trade direction.
setupTypestringSetup family that produced the signal.
timeframestringChart timeframe of the setup bar.
entrynumber | nullEntry price.
stopnumber | nullStop-loss price.
targetnumber | nullTake-profit price.
riskRewardnumber | nullReward divided by risk at the entry, stop, and target above.
statusstringAlways "QUALIFIED" in this feed.
statusLabelstringDisplay label for status.
scorenumberConfluence checklist score from 0 to 100. Not a probability.
gradestringLetter grade banded from the score.
detectedAtstring (ISO-8601)Open time of the setup bar.
updatedAtstring (ISO-8601)Last time the desk changed this signal.
expiresAtstring (ISO-8601) | nullWhen the setup stops being valid. Do not act on it after this time.
reasonstring | nullSummary of rejection or expiry reasons. Usually null here.
rejectionReasons{ code: string, label: string }[]Machine code and label for each rejection reason. Usually empty here.
riskStatusstring | nullResult of the desk's risk check on the levels.
riskReasonstring | nullWhy the risk check returned that status.
actionabilityStatusstring | nullWhether price is still near enough to the entry to act on, at the time of the call.
actionabilityReasonstring | nullWhy actionability returned that status.
canLogToDeskbooleanTrue when qualified, risk passed, and actionable at the time of the call.
setupVersionstringStrategy 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"
}
StatusCodeWhen
400INVALID_SINCEsince is not an ISO-8601 date, or has a time without Z or an offset.
400INVALID_CURSORcursor is not a nextCursor value returned by the list endpoint.
400INVALID_QUERYsince and cursor were both sent. Send one; the cursor already carries its since.
401INVALID_API_KEYThe Authorization header is missing or malformed, or the key is unknown or revoked.
404NOT_FOUNDNo qualified, current-strategy signal has that id. Expired signals also return 404.