SDK Preview
Official client libraries for Python, JavaScript, PHP, and Go. All SDKs support the same API surface: analyze, analyzers, languages, and health - across all 12 production analyzers.
Contents
SDK status: not yet published
The Python, JavaScript, PHP, and Go packages described on this page are in development and are not available on PyPI, npm, Packagist, or a public Go module. The package names shown are planned namespaces - not reserved or installable - and will only become install instructions once published under verified publisher accounts. The code samples below preview the planned client APIs. Until then, integrate directly against POST https://sentiqra.tech/v1/analyze - see the quickstart and API reference for working HTTP examples. Receipt verification does not need an SDK: use POST /v1/verify, the standalone browser verifier, or the upcoming standalone verification package (a separate release from these SDKs).
Works today: REST
A complete request you can run now - no SDK required. The analyzers field is required: pass one or two analyzer slugs.
curl -X POST https://sentiqra.tech/v1/analyze \
-H "Authorization: Bearer $SENTIQRA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"text": "Old people should not be hired, it makes me angry",
"language": "en",
"analyzers": [
"emotions",
"discrimination"
]
}'
Common API Surface
All SDKs expose the same methods. The only difference is language syntax.
| Method | Description | Auth Required |
|---|---|---|
| analyze() | Analyze text with selected analyzers. Returns signals with scores and verification receipt. | Yes |
| analyzers() | List available analyzers and their metadata. | Yes |
| languages() | List supported languages for the active analyzer. | Yes |
| health() | Check API health and connectivity. | No |
Analyzers
trust-safetyHarmful language detection
cybersecurityCybersecurity threats
crisis-intelligenceCrisis event detection
financeMarket intelligence
disinformationDisinformation analysis
discriminationDiscrimination analysis
emotionsEmotion analysis
customer-serviceCustomer service intelligence
dating-safetyRomance scam & unsafe contact
fraud-scamFraudulent scheme detection
insuranceInsurance intelligence
wellnessWellness signal detection
Python SDK Coming soon
planned: sentiqra (PyPI)
Installation (planned - package not yet published)
sentiqra on PyPI - not yet published. Use the REST endpoint directly (see quickstart).
Planned SDK usage (preview - use REST today)
from sentiqra import Sentiqra
client = Sentiqra(api_key="sq_live_your_api_key_here")
result = client.analyze(
text="you are a worthless idiot",
language="en",
analyzers=["trust-safety"],
)
for signal in result.signals:
print(f"{signal['code']}: {signal['score']}")
# insults_derogation: 0.86
# insult: 0.99
# belittling: 0.99
print(result.verification.configuration) # sqcfg_ZZW77NM9
Async Client
import asyncio
from sentiqra import AsyncSentiqra
async def main():
client = AsyncSentiqra(api_key="sq_live_your_api_key_here")
result = await client.analyze(
text="you are a worthless idiot",
language="en",
analyzers=["trust-safety"],
)
for signal in result.signals:
print(f"{signal['code']}: {signal['score']}")
asyncio.run(main())
Running Different Analyzers
# Cybersecurity
result = client.analyze(
text="click here for free coins",
language="en",
analyzers=["cybersecurity"],
)
# Disinformation
result = client.analyze(
text="the election was rigged",
language="en",
analyzers=["disinformation"],
)
# Multiple analyzers in one request (max 2)
result = client.analyze(
text="this product is terrible and I want to cancel",
language="en",
analyzers=["emotions", "customer-service"],
)
Other Methods
# List available analyzers
analyzers = client.analyzers()
# [{'id': 'trust-safety', 'name': 'Trust & Safety', 'languages': ['en', 'de', ...]}, ...]
# List supported languages
langs = client.languages()
# [{'code': 'en', 'name': 'English'}, {'code': 'de', 'name': 'German'}, ...]
# Health check (no auth required)
health = client.health()
# {'status': 'ok', 'version': '1.0.0', ...}
Error Handling
from sentiqra import Sentiqra, SentiqraError
client = Sentiqra(api_key="sq_live_your_api_key_here")
try:
result = client.analyze(text="some text", language="en")
except SentiqraError as e:
print(f"API error: {e.status_code} - {e.message}")
# 401 - Invalid API key
# 403 - Rate limited or quota exceeded
# 400 - Bad request (invalid language, text too long)
# 503 - Service unavailable
JavaScript SDK Coming soon
planned: @sentiqra/sdk (npm)
Installation (planned - package not yet published)
@sentiqra/sdk on npm - not yet published. Use the REST endpoint directly (see quickstart).
Planned SDK usage (preview - use REST today)
const { Sentiqra } = require('@sentiqra/sdk');
// or: import { Sentiqra } from '@sentiqra/sdk';
const client = new Sentiqra({ apiKey: 'sq_live_your_api_key_here' });
const result = await client.analyze({
text: 'you are a worthless idiot',
language: 'en',
analyzers: ['trust-safety'],
});
for (const signal of result.signals) {
console.log(`${signal.code}: ${signal.score}`);
}
// insults_derogation: 0.86
// insult: 0.99
// belittling: 0.99
console.log(result.verification.configuration); // sqcfg_ZZW77NM9
Running Different Analyzers
// Cybersecurity
const r1 = await client.analyze({
text: 'click here for free coins',
language: 'en',
analyzers: ['cybersecurity'],
});
// Disinformation
const r2 = await client.analyze({
text: 'the election was rigged',
language: 'en',
analyzers: ['disinformation'],
});
// Multiple analyzers in one request (max 2)
const r3 = await client.analyze({
text: 'this product is terrible and I want to cancel',
language: 'en',
analyzers: ['emotions', 'customer-service'],
});
Other Methods
// List available analyzers
const analyzers = await client.analyzers();
// [{ id: 'trust-safety', name: 'Trust & Safety', languages: ['en', 'de', ...] }, ...]
// List supported languages
const langs = await client.languages();
// [{ code: 'en', name: 'English' }, { code: 'de', name: 'German' }, ...]
// Health check (no auth required)
const health = await client.health();
// { status: 'ok', version: '1.0.0', ... }
Error Handling
const { Sentiqra, SentiqraError } = require('@sentiqra/sdk');
const client = new Sentiqra({ apiKey: 'sq_live_your_api_key_here' });
try {
const result = await client.analyze({ text: 'some text', language: 'en' });
} catch (e) {
if (e instanceof SentiqraError) {
console.error(`API error: ${e.statusCode} - ${e.message}`);
}
}
PHP SDK Coming soon
planned: sentiqra/sentiqra-php (Packagist)
Installation (planned - package not yet published)
sentiqra/sentiqra-php on Packagist - not yet published. Use the REST endpoint directly (see quickstart).
Planned SDK usage (preview - use REST today)
<?php
require 'vendor/autoload.php';
$client = new Sentiqra('sq_live_your_api_key_here');
$result = $client->analyze('you are a worthless idiot', 'en', ['trust-safety']);
foreach ($result['signals'] as $signal) {
echo $signal['code'] . ': ' . $signal['score'] . "\n";
}
// insults_derogation: 0.86
// insult: 0.99
// belittling: 0.99
echo $result['verification']['configuration']; // sqcfg_ZZW77NM9
Running Different Analyzers
// Cybersecurity
$r1 = $client->analyze('click here for free coins', 'en', ['cybersecurity']);
// Disinformation
$r2 = $client->analyze('the election was rigged', 'en', ['disinformation']);
// Multiple analyzers in one request (max 2)
$r3 = $client->analyze('this product is terrible', 'en', ['emotions', 'customer-service']);
Other Methods
// List available analyzers
$analyzers = $client->analyzers();
// [['id' => 'trust-safety', 'name' => 'Trust & Safety', 'languages' => ['en', 'de', ...]], ...]
// List supported languages
$langs = $client->languages();
// [['code' => 'en', 'name' => 'English'], ['code' => 'de', 'name' => 'German'], ...]
// Health check (no auth required)
$health = $client->health();
// ['status' => 'ok', 'version' => '1.0.0', ...]
Error Handling
try {
$result = $client->analyze('some text', 'en');
} catch (SentiqraError $e) {
echo "API error: {$e->statusCode} - {$e->getMessage()}";
}
Go SDK Coming soon
planned: github.com/sentiqra/sentiqra-go
Installation (planned - package not yet published)
github.com/sentiqra/sentiqra-go on Go module - not yet published. Use the REST endpoint directly (see quickstart).
Planned SDK usage (preview - use REST today)
package main
import (
"fmt"
"github.com/sentiqra/sentiqra-go"
)
func main() {
client := sentiqra.New("sq_live_your_api_key_here")
result, err := client.Analyze(
"you are a worthless idiot", "en",
sentiqra.WithAnalyzers("trust-safety"),
)
if err != nil {
panic(err)
}
for _, signal := range result.Signals {
fmt.Printf("%s: %.2f\n", signal.Code, signal.Score)
}
// insults_derogation: 0.86
// insult: 0.99
// belittling: 0.99
fmt.Println(result.Verification.Configuration) // sqcfg_ZZW77NM9
}
Running Different Analyzers
// Cybersecurity
r1, _ := client.Analyze("click here for free coins", "en",
sentiqra.WithAnalyzers("cybersecurity"))
// Disinformation
r2, _ := client.Analyze("the election was rigged", "en",
sentiqra.WithAnalyzers("disinformation"))
// Multiple analyzers in one request (max 2)
r3, _ := client.Analyze("this product is terrible", "en",
sentiqra.WithAnalyzers("emotions", "customer-service"))
Other Methods
// List available analyzers
analyzers, _ := client.Analyzers()
// []Analyzer{ID: "trust-safety", Name: "Trust & Safety", Languages: ["en", "de", ...]}, ...}
// List supported languages
langs, _ := client.Languages()
// []Language{Code: "en", Name: "English"}, ...}
// Health check (no auth required)
health, _ := client.Health()
// &HealthResponse{Status: "ok", Version: "1.0.0"}
Error Handling
result, err := client.Analyze("some text", "en")
if err != nil {
if sqErr, ok := err.(*sentiqra.Error); ok {
fmt.Printf("API error: %d - %s\n", sqErr.StatusCode, sqErr.Message)
}
return
}
Analysis Response Format
All SDKs parse this JSON response into typed objects:
{
"language": "en",
"language_source": "declared",
"signals": [
{
"analyzer": "trust-safety",
"code": "insults_derogation",
"label": "Insults & Derogation",
"score": 0.86,
"level": "category"
},
{
"analyzer": "trust-safety",
"code": "insult",
"label": "Insult",
"score": 0.99,
"level": "label",
"parent": "insults_derogation"
},
{
"analyzer": "trust-safety",
"code": "belittling",
"label": "Belittling",
"score": 0.99,
"level": "label",
"parent": "insults_derogation"
}
],
"meta": {
"analyzers": [
{
"name": "trust-safety",
"status": "completed",
"applicability": "analyzable",
"assessment": "signals_detected",
"signal_count": 3,
"billed": true
}
]
},
"usage": {
"analyzer_runs": 1,
"billed": true
},
"verification": {
"version": 3,
"configuration": "sqcfg_ZZW77NM9",
"fingerprint": "fp2_8a72c4...19f",
"input_commitment": "ic3_31bd5e...a42",
"signature": "sig_ed25519_4c1f...e2a",
"key_id": "edk_af4f218e",
"binding_key_id": "bk_31bd5e42f7a019c8"
}
}
SDK-Parsed Fields
signals- array of detected signalssignals[].analyzer- analyzer that produced the signalsignals[].code- stable machine identifiersignals[].label- human-readable labelsignals[].score- signal-match strength (0.0–1.0)signals[].confidence- band name, present only in the reduced.v1 output profilesignals[].level- "category" or "label"signals[].parent- parent category code (label-level only)verification- configuration, fingerprint, input commitment, Ed25519 signature, and key IDusage- billing info (analyzer_runs count)
Score Interpretation
A score expresses signal-match strength under a particular analyzer configuration. It is not a probability that the signal or a downstream action is correct. Validate action thresholds on representative labeled data. There is no universal threshold that means "auto-action" - the right cutoff depends on your cost of a false positive versus a false negative in your use case. Scores are not comparable across labels or analyzers unless validated on your own labeled traffic.