A component, not a destination
A desk that already has an order management system will not keep its positions in a second place, and will not open a second screen to see them. So the scoring is available as something your own systems call, and the signals are available as something that arrives where your team already reads. Nothing here requires anyone to visit this site.
Score a book we do not hold
POST/v1/score
Send the positions on the request. We score them and return them. No
holding, weight or label from this call is written to our database, so
there is nothing to keep in sync and nothing to delete afterwards. The
response says "stored": false because that is the first
question a fund asks.
curl -sX POST https://sigmalens.co.uk/v1/score \
-H "X-API-Key: $SIGMALENS_KEY" \
-H "Content-Type: application/json" \
-d '{
"holdings": [
{"ticker": "LMT", "weight": 12.5},
{"ticker": "SHEL", "weight": 9.0},
{"ticker": "TSM", "weight": 7.25}
],
"include_drivers": true
}'
Each holding comes back with a signed sentiment on a −10 to +10
scale, the exposures it came through, its coverage state, and - when
include_drivers is true - the events behind the number, each
carrying the reason it counts as that company's news rather than a story
it merely appears in.
sentiment_score- signed. Negative is adverse for the holder of that position, not for the world: a defence name reads positive on a security scare.state-moving,faint,quietoruncovered. Whether news moved the holding. A holding we have no coverage for says so instead of returning a confident zero.resolution- whether we could see the holding at all, which is a different question.statusis one ofRESOLVED,PARTIAL,STALE_DATA,NO_EXPOSURE,UNRESOLVEDorSOURCE_UNAVAILABLE, withreasonin plain English andcheckedsaying whether "nothing reached this" is a statement we are entitled to make about it. TreatSOURCE_UNAVAILABLEas "come back later", never as a quiet position.impact- the reading taken apart into the four terms it is a product of:materiality,direction,exposureandevidence, each with the reason it reads that way, plusarithmeticandterms. Multiplyingtermsback together reproducessentiment_score. It is a reading of what happened and how it reaches the position, and it is not a forecast of the price.why_relevant- why the story is about this company. Decided when the event was ingested, not after the fact.- Up to 500 holdings per request.
Have the signals come to you
POSTyour endpoint
Set alert_webhook_url in settings and material signals are
delivered there: a Slack or Teams incoming webhook, a queue, or your own
service. Digest mode sends once a day on a fixed schedule whether or not
anything breached, which is deliberate - the timing is a publication
schedule, not a reaction to your positions.
Every delivery is signed. The headers carry a timestamp and an
HMAC-SHA256 over timestamp + "." + body using the secret you
set, so your receiver can tell our POST from anyone else's POST to the
same address, and can spot a replay.
X-SigmaLens-Timestamp: 1786800000
X-SigmaLens-Signature: 9f2c... # hex HMAC-SHA256
# verifying, in Python
expected = hmac.new(secret.encode(),
timestamp.encode() + b"." + raw_body,
hashlib.sha256).hexdigest()
hmac.compare_digest(expected, received_signature)
We deliver only to public https addresses, and we do not
follow redirects. An address that resolves inside a private network is
refused when you save it and again before each send, because the name can
change in between.
Before you rely on it
- Scores are informational news-sentiment readings from public data. They are not a recommendation to buy, sell or hold any security.
- Coverage is not uniform. US and US-listed foreign issuers get
filing-grade disclosure; a company listed only outside the US gets news
coverage alone, and the
statefield tells you which you are looking at rather than hiding it. - Where the data comes from, and what could take it away, is set out at /data.