Skip to content
RockGroup
DocsSentiment API
API ReferenceRESTv1

Sentiment API
Reference

Programmatic access to the Rock Group AI Sentiment Engine — scored financial signals from press releases, market news, and SEC 8-K filings in real time.

Base/api/v1AuthBearer keyUpdatedAug 2026

01. Overview

What is the Sentiment API?

The Sentiment API gives you programmatic access to the same scored financial signals that power the Live AI Sentiment Engine dashboard. Every press release, news article, and SEC 8-K filing processed by the Rock Group scoring pipeline is available via API within seconds of being scored.

API access is currently in limited preview. Contact us via the API Access page or the contact form to request credentials.


02. Authentication

API Keys

All API requests must include your API key in the Authorization header using Bearer token format. An X-API-Key header carrying the bare key is accepted as an equivalent.

Authorization: Bearer rh_your_api_key_here

# equivalent
X-API-Key: rh_your_api_key_here

Keys are issued with an rh_ prefix and are managed from the API Dashboard. The key carries your plan, which determines both your rate limit and the maximum number of results a single request may return. Keys can be revoked at any time and stop working immediately.

Keep your key private. Do not expose your API key in client-side code, public repositories, or browser consoles. If compromised, revoke it immediately via the API Dashboard and generate a replacement.


03. Base URL & Format

Making requests

Base URL:  https://rockhewn.com/api/v1

Content-Type:  application/json
Accept:        application/json

All responses are JSON. Successful responses return HTTP 200. Errors return a JSON object with an error key and an appropriate HTTP status code.


04. Endpoints

Available endpoints

GET/api/v1/sentiment

Returns the most recent AI-scored signals from all three data streams (press releases, news, SEC 8-K). Optionally filtered by data source, ticker, or score range.

Query Parameters
sourcestringOptional"pr" | "news" | "sec" | "all". Default: all. Any other value returns 400.
tickerstringOptionalFilter by ticker symbol. Upper-cased for you. Example: AAPL
score_minnumberOptionalMinimum sentiment score (-5 to 10). Default: no minimum
score_maxnumberOptionalMaximum sentiment score (-5 to 10). Default: no maximum
limitintegerOptionalResults to return. Default 100, and clamped to your plan's maximum (Free 50, Pro 1,000).
date_fromstringPaidISO 8601 lower bound on scored_at. Ignored on the Free plan — see below.
date_tostringPaidISO 8601 upper bound on scored_at. Ignored on the Free plan — see below.

The Free plan is a live window, not an archive. Free keys receive only the most recent rows from each stream — the same window the public dashboard shows — and the date_from / date_to parameters are ignored rather than rejected, so a historical query silently returns recent data. Paid plans query the full history and honour both dates. Free responses also omit the justification field.

Example Request
curl -X GET \
  "https://rockhewn.com/api/v1/sentiment?source=pr&score_min=7&limit=10" \
  -H "Authorization: Bearer rh_your_api_key_here"
Example Response
{
  "data": [
    {
      "article_id": "abc123",
      "source": "pr",
      "ticker": "NVDA",
      "scored_at": "2026-06-19T14:32:00Z",
      "sentiment": "BULLISH",
      "sentiment_score": "9.1",
      "pr_title": "NVIDIA Reports Record Q4 Revenue...",
      "author": "Business Wire",
      "pr_published": "2026-06-19T14:31:12Z",
      "justification": "Earnings significantly beat consensus with record data centre revenue."
    }
  ],
  "meta": {
    "count": 1,
    "has_more": false,
    "response_time_ms": 84,
    "plan": "pro",
    "rate_limit_remaining": "4987"
  }
}

Numeric fields arrive as strings. sentiment_score is extracted from a JSON document by the database and is returned as "9.1", not 9.1. Parse it before comparing — treating it as a number without conversion is the most common integration bug against this endpoint.

Response Fields

Common to every row, whatever the stream:

article_idstringUnique identifier for the signal, stable across requests
sourcestringStream the row came from: "pr" | "news" | "sec"
tickerstringTicker symbol the signal was attributed to
scored_atstringTimestamp the model finished scoring this item
sentimentstringDirectional label — BULLISH / BEARISH / NEUTRAL / MIXED
sentiment_scorestringSentiment score from -5 to 10, returned as a STRING
justificationstringOne-sentence model reasoning. Paid plans only — absent on Free.

Additional fields, which depend on the stream — a press-release row and an SEC row do not carry the same keys:

pr_title · author · pr_published · exchange · pr_detected_atprHeadline, wire, publication time, listing venue and the moment the pipeline first saw it.
headline · news_datetime · news_providernewsHeadline, publication time and the provider that carried it.
company_name · filing_date · filing_datetime · items_reported · sec_filing_urlsecRegistrant, filing dates, the 8-K items reported, and a link to the filing on EDGAR.

And the meta object on every successful response:

countnumberRows in this response
has_morebooleanTrue when more rows matched than were returned
response_time_msnumberServer-side handling time
planstringPlan your key resolved to: "free" | "pro" | "enterprise"
rate_limit_remainingstringRequests left in the current window

05. Filtering & Result Sets

Working with results

There is no offset-based pagination in v1. The endpoint returns the most recent matching signals up to your limit, newest first. Use meta.has_more to detect truncation, and narrow with ticker, source or a score bound rather than paging. On paid plans, walk history with date_from / date_to instead. Cursor pagination is planned; if you send offset today it is ignored.

Score filtering is the fastest way to cut the volume down to what is worth acting on:

# Only major catalysts (score >= 8)
GET /api/v1/sentiment?score_min=8

# Negative signals only
GET /api/v1/sentiment?score_max=-1

# One stream, one name
GET /api/v1/sentiment?source=sec&ticker=AAPL&limit=50

# A date range (paid plans; ignored on Free)
GET /api/v1/sentiment?date_from=2026-08-01&date_to=2026-08-14

Signals are pushed to the dashboard within about a second of scoring and are queryable here immediately afterwards. Polling every few seconds is reasonable; polling every 100ms will only spend your rate limit.


06. Errors

Error responses

All errors return a JSON body with an error field.

{
  "error": "Invalid API key",
  "message": "Your API key is invalid or has been revoked."
}
400Bad RequestInvalid parameter — e.g. a source other than pr / news / sec / all
401Missing keyNo Authorization or X-API-Key header was sent
401Invalid keyThe key is unrecognised or has been revoked
429Rate limitedLimit exceeded. The response carries Retry-After (3600) and X-RateLimit-Remaining: 0
500Server ErrorInternal error — retry with exponential backoff

07. Rate Limits

Request limits

Limits are enforced per API key, on a rolling hourly window. Two separate things are limited: how many requests you may make, and how many rows a single request may return.

Free50 requests / hour · 500 / day · up to 50 rows per request
Pro5,000 requests / hour · 50,000 / day · up to 1,000 rows per request
EnterpriseUnlimited — contact us

A limitabove your plan’s maximum is silently reduced to it rather than rejected, so check meta.count against what you asked for. Your remaining allowance is reported on every successful response as meta.rate_limit_remaining.

# On a 429 the response carries:
X-RateLimit-Remaining: 0
Retry-After:           3600

When you exceed the limit, requests return HTTP 429 until the window rolls over. Honour Retry-After, and back off exponentially — 1s, then 2s, then 4s — for any 5xx.


08. Getting API Access

How to get an API key

1
Sign up

Create an account on the Rock Group platform via the API Sign Up page.

2
Request access

API access is currently in limited preview. Use the API Access page to request credentials and describe your intended use case.

3
Generate your key

Once approved, log in to the API Dashboard to generate your first API key. You can create multiple keys for different environments (dev, prod).

4
Start making requests

Include your key in the Authorization header of every request. Monitor usage in the API Dashboard.

Ready to integrate?

Rock Group · Sentiment API Documentation · v1 · Last updated August 2026
Questions? Contact us