Acuity Analyst Ratings Extended API
This document provides an overview of the Acuity Analyst Ratings Extended API, including the consensus calculation, the request model and the response structure.
Basic Concepts
The Analyst Ratings Extended API returns two analyst datasets for equities in a single call:
- Consensus – monthly snapshots of analyst recommendations split into five rating buckets (Strong Buy, Buy, Hold, Sell, Strong Sell). Each snapshot also carries a calculated consensus score and consensus rating.
- Price Targets – monthly snapshots of analyst price targets (high, low, mean and median), with the number of analysts contributing a target.
The API supports:
- the latest snapshot or the full history over a date range
- up to 50 stocks per request
- lookup by Acuity Asset ID, ISIN code, or both in the same request
- a clear distinction between "this stock has no analyst coverage" and "this identifier was not recognised"
The existing POST /api/asset/analystratings endpoint (latest Buy/Hold/Sell counts and a ConsensusPhrase over a rolling 90 days) is unchanged and remains available.
Consensus Calculation
Each consensus snapshot carries a numeric ConsensusScore, from −2 (Strong Sell) to +2 (Strong Buy), and a ConsensusRating label derived from it. The score lets you rank stocks; the rating gives you a label to display.
Weights
|
Rating |
Weight |
|---|---|
|
Strong Buy |
+2 |
|
Buy |
+1 |
|
Hold |
0 |
|
Sell |
−1 |
|
Strong Sell |
−2 |
Formula
N = StrongBuy + Buy + Hold + Sell + StrongSell
ConsensusScore = 2 x StrongBuy + 1 x Buy + 0 x Hold - 1 x Sell - 2 x StrongSell
N is the total number of consensus ratings in the snapshot. It is not the price-target AnalystCount: the two datasets come from different coverage sets and are not reconciled.
The score is rounded to 2 decimal places (half away from zero), and the rating is then derived from the rounded score. When N = 0, both ConsensusScore and ConsensusRating are null; the snapshot is still returned with its zero counts.
Consensus Rating Thresholds
|
Rounded score (s) |
ConsensusRating |
|---|---|
|
s ≥ +1.50 |
StrongBuy |
|
+0.50 ≤ s < +1.50 |
Buy |
|
−0.50 < s < +0.50 |
Hold |
|
−1.50 < s ≤ −0.50 |
Sell |
|
s ≤ −1.50 |
StrongSell |
Example
Apple Inc, consensus snapshot for October 2026:
|
Rating |
Count × weight |
Contribution |
|---|---|---|
|
Strong Buy |
11 × (+2) |
+22 |
|
Buy |
20 × (+1) |
+20 |
|
Hold |
14 × 0 |
0 |
|
Sell |
3 × (−1) |
−3 |
|
Strong Sell |
1 × (−2) |
−2 |
The weighted sum is 37 and N = 49. The score is 37 / 49 = 0.7551, which rounds to 0.76, giving a rating of Buy.
REST API
Documentation
- Overview: https://api.acuitytrading.com/
- Swagger URL: https://api.acuitytrading.com/swagger/index.html
- Endpoint: POST /api/asset/analystratings/extended
Authentication
Documentation URL: https://api.acuitytrading.com/Security
Exchange your username and password for a Bearer token that you can pass with any request. The token is valid for 14 days.
Sample Request
curl -L -X POST 'https://api.acuitytrading.com/token' \
-H 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=password' \
--data-urlencode 'username=YOUR_USERNAME' \
--data-urlencode 'password=YOUR_PASSWORD'
Sample Response
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "bearer",
"expires_in": 1209600,
"userName": "YOUR_USERNAME"
}
Pass the access_token in the Authorization header of every request: Authorization: Bearer YOUR_BEARER_TOKEN. A request without a valid token receives 401 Unauthorized.
Request Model
|
Field |
Type |
Required |
Description |
|---|---|---|---|
|
AssetIds |
array of integers |
One of AssetIds / ISINCodes |
Acuity Asset IDs that uniquely identify the stocks. |
|
ISINCodes |
array of strings |
One of AssetIds / ISINCodes |
ISIN codes, 12 characters each. Matching is case-insensitive. |
|
StartDate |
string, date-time |
false (both dates or neither) |
Start of the history range, inclusive. |
|
EndDate |
string, date-time |
false (both dates or neither) |
End of the history range, inclusive. |
AssetIds and ISINCodes can be combined in one request, up to 50 identifiers in total. If both StartDate and EndDate are omitted, the response contains the latest snapshot only.
Response Model
The response is an array of asset objects.
Asset object
|
Field |
Type |
Description |
|---|---|---|
|
AssetId |
integer |
Acuity Asset ID that uniquely identifies the stock. |
|
AssetName |
string |
Name of the company. |
|
ISIN |
string |
ISIN of the asset, so ISIN-based callers can match results back. Empty when the asset has no ISIN. |
|
Currency |
string |
Asset currency code, for example USD. Price targets are quoted in this currency. Empty when it could not be determined. |
|
Consensus |
array of objects |
Consensus snapshots, newest first. Empty if the asset has no analyst coverage. |
|
PriceTargets |
array of objects |
Price-target snapshots, newest first. Empty if the asset has no analyst coverage. |
Consensus object
|
Field |
Type |
Description |
|---|---|---|
|
Date |
string, date-time |
The date the snapshot represents (the first day of the month), not the ingestion time. |
|
StrongBuyCount |
integer |
Number of Strong Buy ratings. |
|
BuyCount |
integer |
Number of Buy ratings. |
|
HoldCount |
integer |
Number of Hold ratings. |
|
SellCount |
integer |
Number of Sell ratings. |
|
StrongSellCount |
integer |
Number of Strong Sell ratings. |
|
ConsensusScore |
number or null |
Weighted average of the ratings, from −2 (Strong Sell) to +2 (Strong Buy), rounded to 2 dp. Null when all counts are 0. |
|
ConsensusRating |
string or null |
One of StrongBuy, Buy, Hold, Sell, StrongSell, derived from the rounded ConsensusScore. Null when ConsensusScore is null. |
PriceTarget object
|
Field |
Type |
Description |
|---|---|---|
|
Date |
string, date-time |
The date of the price-target update the snapshot represents, not the ingestion time. |
|
AnalystCount |
integer |
Number of analysts contributing a price target. |
|
TargetHigh |
number |
Highest price target, rounded to 2 dp. |
|
TargetLow |
number |
Lowest price target, rounded to 2 dp. |
|
TargetMean |
number |
Mean price target, rounded to 2 dp. |
|
TargetMedian |
number |
Median price target, rounded to 2 dp. |
Response Behaviour
Latest and History Modes
- Latest mode (no StartDate or EndDate): each series contains one item, the most recent snapshot for that asset, or is empty.
- History mode (StartDate and EndDate supplied): each series contains every snapshot dated between StartDate and EndDate, inclusive. Consensus and PriceTargets are filtered independently.
Snapshot Cadence
- Consensus snapshots are monthly and dated the first day of the month, for example 2026-10-01T00:00:00.
- Price Targets snapshots are dated on the day of the last price-target update in each calendar month, for example 2026-10-22T00:00:00. There is at most one per month, and a month with no update has no snapshot.
Because consensus snapshots are dated the 1st of the month, a range that does not include the 1st of any month (for example 5–15 October) returns no consensus snapshot. To chart monthly history, start your range on the 1st of a month.
Identifiers and Ordering
- ISIN codes are matched case-insensitively and resolved to Acuity Asset IDs.
- An asset requested more than once, by AssetId, ISIN or both, appears once in the response.
- Assets are returned in ascending AssetId order, whatever order they were requested in.
- Series items are returned newest first.
Coverage and Unknown Identifiers
- A well-formed AssetId or ISIN that does not match any asset is omitted from the response. It is not treated as an error. If no identifier matches, the response is an empty array [].
- A known asset with no analyst coverage is returned with empty Consensus and PriceTargets arrays. This lets you tell "no coverage" apart from "identifier not recognised".
- A consensus snapshot where every count is 0 is still returned, with ConsensusScore and ConsensusRating set to null.
Consensus and Price-Target Coverage
Consensus counts and the price-target AnalystCount come from different coverage sets and are not reconciled. For example, Sony Group Corp has 31 consensus ratings (8 + 20 + 3) but an AnalystCount of 30.
Common Requests
All responses below are live data from the production API.
Retrieve the latest ratings for a stock by Asset ID
Sample Request
curl -L 'https://api.acuitytrading.com/api/asset/analystratings/extended' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer YOUR_BEARER_TOKEN' \
-d '{
"AssetIds": [113240]
}'
Sample Response
[
{
"AssetId": 113240,
"AssetName": "Sony Group Corp",
"ISIN": "US8356993076",
"Currency": "USD",
"Consensus": [
{
"Date": "2026-10-01T00:00:00",
"StrongBuyCount": 8,
"BuyCount": 20,
"HoldCount": 3,
"SellCount": 0,
"StrongSellCount": 0,
"ConsensusScore": 1.16,
"ConsensusRating": "Buy"
}
],
"PriceTargets": [
{
"Date": "2026-10-22T00:00:00",
"AnalystCount": 30,
"TargetHigh": 38.9,
"TargetLow": 16.76,
"TargetMean": 29.42,
"TargetMedian": 29.46
}
]
}
]
Retrieve the latest ratings for several stocks by ISIN
ISIN matching is case-insensitive, so the lowercase Apple ISIN below still matches. Assets are returned in ascending AssetId order.
Sample Request
curl -L 'https://api.acuitytrading.com/api/asset/analystratings/extended' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer YOUR_BEARER_TOKEN' \
-d '{
"ISINCodes": ["US8356993076", "us0378331005"]
}'
Sample Response
[
{
"AssetId": 3,
"AssetName": "Apple Inc",
"ISIN": "US0378331005",
"Currency": "USD",
"Consensus": [
{
"Date": "2026-10-01T00:00:00",
"StrongBuyCount": 11,
"BuyCount": 20,
"HoldCount": 14,
"SellCount": 3,
"StrongSellCount": 1,
"ConsensusScore": 0.76,
"ConsensusRating": "Buy"
}
],
"PriceTargets": [
{
"Date": "2026-10-20T00:00:00",
"AnalystCount": 43,
"TargetHigh": 425.25,
"TargetLow": 217.15,
"TargetMean": 331.5,
"TargetMedian": 336.6
}
]
},
{
"AssetId": 113240,
"AssetName": "Sony Group Corp",
"ISIN": "US8356993076",
"Currency": "USD",
"Consensus": [
{
"Date": "2026-10-01T00:00:00",
"StrongBuyCount": 8,
"BuyCount": 20,
"HoldCount": 3,
"SellCount": 0,
"StrongSellCount": 0,
"ConsensusScore": 1.16,
"ConsensusRating": "Buy"
}
],
"PriceTargets": [
{
"Date": "2026-10-22T00:00:00",
"AnalystCount": 30,
"TargetHigh": 38.9,
"TargetLow": 16.76,
"TargetMean": 29.42,
"TargetMedian": 29.46
}
]
}
]
Retrieve rating history over a date range
Sony is requested twice here, once by AssetId and once by ISIN, and appears once in the response. July 2026 has a consensus snapshot but no price-target update, so PriceTargets has three items.
Sample Request
curl -L 'https://api.acuitytrading.com/api/asset/analystratings/extended' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer YOUR_BEARER_TOKEN' \
-d '{
"AssetIds": [113240],
"ISINCodes": ["US8356993076"],
"StartDate": "2026-07-01T00:00:00",
"EndDate": "2026-10-30T00:00:00"
}'
Sample Response
[
{
"AssetId": 113240,
"AssetName": "Sony Group Corp",
"ISIN": "US8356993076",
"Currency": "USD",
"Consensus": [
{ "Date": "2026-10-01T00:00:00", "StrongBuyCount": 8, "BuyCount": 20, "HoldCount": 3, "SellCount": 0, "StrongSellCount": 0, "ConsensusScore": 1.16, "ConsensusRating": "Buy" },
{ "Date": "2026-09-01T00:00:00", "StrongBuyCount": 8, "BuyCount": 20, "HoldCount": 3, "SellCount": 0, "StrongSellCount": 0, "ConsensusScore": 1.16, "ConsensusRating": "Buy" },
{ "Date": "2026-08-01T00:00:00", "StrongBuyCount": 8, "BuyCount": 20, "HoldCount": 3, "SellCount": 0, "StrongSellCount": 0, "ConsensusScore": 1.16, "ConsensusRating": "Buy" },
{ "Date": "2026-07-01T00:00:00", "StrongBuyCount": 9, "BuyCount": 20, "HoldCount": 2, "SellCount": 0, "StrongSellCount": 0, "ConsensusScore": 1.23, "ConsensusRating": "Buy" }
],
"PriceTargets": [
{ "Date": "2026-10-22T00:00:00", "AnalystCount": 30, "TargetHigh": 38.9, "TargetLow": 16.76, "TargetMean": 29.42, "TargetMedian": 29.46 },
{ "Date": "2026-09-13T00:00:00", "AnalystCount": 30, "TargetHigh": 40.28, "TargetLow": 17.35, "TargetMean": 30.63, "TargetMedian": 30.82 },
{ "Date": "2026-08-27T00:00:00", "AnalystCount": 30, "TargetHigh": 39.12, "TargetLow": 16.85, "TargetMean": 29.5, "TargetMedian": 29.93 }
]
}
]
Unknown identifiers and assets with no coverage
AssetId 999999999 and ISIN XS0000000000 are well-formed but unknown, so they are omitted. EURUSD (AssetId 50) is a known asset with no analyst coverage, so it is returned with empty arrays.
Sample Request
curl -L 'https://api.acuitytrading.com/api/asset/analystratings/extended' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer YOUR_BEARER_TOKEN' \
-d '{
"AssetIds": [50, 999999999],
"ISINCodes": ["XS0000000000"]
}'
Sample Response
[
{
"AssetId": 50,
"AssetName": "EURUSD",
"ISIN": "",
"Currency": "",
"Consensus": [],
"PriceTargets": []
}
]
If none of the requested identifiers match, the response is an empty array: [].
Errors
Errors are returned in the standard ProblemDetails format, with a detail field explaining the cause.
Validation errors (400 Bad Request)
|
Cause |
detail |
|---|---|
|
No AssetIds or ISINCodes supplied |
At least one of AssetIds or ISINCodes must be provided. |
|
Only one of StartDate / EndDate supplied |
StartDate and EndDate must be provided together. |
|
StartDate later than EndDate |
StartDate must be on or before EndDate. |
|
An ISIN that is not 12 characters |
Invalid ISIN code(s): US835699307. |
|
More than 50 AssetIds + ISINCodes combined |
A maximum of 50 identifiers (AssetIds + ISINCodes combined) is allowed. |
Sample Request
curl -L 'https://api.acuitytrading.com/api/asset/analystratings/extended' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer YOUR_BEARER_TOKEN' \
-d '{
"AssetIds": [113240],
"StartDate": "2026-10-01T00:00:00",
"EndDate": "2026-07-01T00:00:00"
}'
Sample Response
{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"detail": "StartDate must be on or before EndDate.",
"traceId": "00-2d3ba8047f40523d2a81081c294325f2-abca3170eb285809-00"
}
Authentication and permission errors
|
Status |
Cause |
|---|---|
|
401 Unauthorized |
The Bearer token is missing, invalid or expired. Request a new token. |
|
403 Forbidden |
Your account does not have access to Analyst Ratings data. Contact your Acuity account manager or support@acuitytrading.com to enable it. |
Sample 403 Response
{
"title": "Forbidden",
"status": 403,
"detail": "The user does not have access to Analyst Ratings data."
}