Submit compliance assessment data via API and receive 25 persona-specific stakeholder reports. Reports can be embedded on your website via iframe — no client identity exposed.
POST your company's met/not_met requirements to /api/v1/assessments
POST to /api/v1/assessments/:id/generate to create all 25 persona reports
Use the returned embedUrl in an iframe on your website
All authenticated endpoints require a Bearer token in the Authorization header. API keys are generated from the API Key Management page.
Authorization: Bearer lf_YOUR_API_KEY_HEREKey format: lf_ prefix followed by 64 hex characters
Rate limits: Configurable per key (default 100 requests/hour)
Framework restrictions: Keys can be limited to specific frameworks
This API is designed with privacy as a core principle. Partner companies send only an opaque company ID (e.g., client_8472) — never the actual company name.
Reports use generic language like "the organization" unless the partner provides an optional displayName field. This means client identity is never stored or exposed in the Lionfish platform.
ceo_presidentExecutivecfoExecutivecioExecutivecisoExecutivecooExecutiveboard_memberExecutivegeneral_counselManagementcompliance_officerManagementit_directorManagementrisk_managerManagementhr_directorManagementprocurement_managerManagementdata_privacy_officerManagementproject_managerOperationalinternal_auditorOperationalsecurity_analystOperationalsecurity_architectOperationalincident_responderOperationalnetwork_adminOperationalsales_directorBusinessmarketing_directorBusinesssmall_business_ownerBusinessexternal_auditorExternalinsurance_underwriterExternalinvestorExternal1. Submit Assessment
curl -X POST https://stakeholder.lionfishcyber.com/api/v1/assessments \
-H "Authorization: Bearer lf_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{\n "companyId": "client_8472",\n "industry": "Healthcare",\n "framework": "HIPAA",\n "policy": "YES",\n "requirements": [\n { "id": "164.308(a)(1)", "title": "Security Management Process", "status": "met" },\n { "id": "164.308(a)(2)", "title": "Assigned Security Responsibility", "status": "met" },\n { "id": "164.308(a)(3)", "title": "Workforce Security", "status": "not_met" },\n { "id": "164.308(a)(4)", "title": "Information Access Management", "status": "partially_met" },\n { "id": "164.308(a)(5)", "title": "Security Awareness and Training", "status": "not_met" },\n { "id": "164.310(a)(1)", "title": "Facility Access Controls", "status": "met" },\n { "id": "164.310(b)", "title": "Workstation Use", "status": "met" },\n { "id": "164.312(a)(1)", "title": "Access Control", "status": "partially_met" },\n { "id": "164.312(b)", "title": "Audit Controls", "status": "not_met" },\n { "id": "164.312(c)(1)", "title": "Integrity", "status": "met" }\n ],\n "displayName": "Acme Health Corp"\n}'2. Generate Reports
curl -X POST https://stakeholder.lionfishcyber.com/api/v1/assessments/42/generate \
-H "Authorization: Bearer lf_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"methodology": "spin"}'3. Embed on Your Website
<!-- Embed all reports with persona selector -->
<iframe
src="https://stakeholder.lionfishcyber.com/embed/assessment/{embedToken}"
width="100%"
height="800"
frameborder="0"
style="border: 1px solid #1e293b; border-radius: 12px;"
></iframe>
<!-- Embed a single report -->
<iframe
src="https://stakeholder.lionfishcyber.com/embed/report/{viewToken}"
width="100%"
height="800"
frameborder="0"
></iframe>Each report can be generated with a specific sales methodology that changes the tone, framing, and call-to-action style. Default is SPIN.
spinSPIN Selling
challengerChallenger Sale
sandlerSandler
solution_sellingSolution Selling
bantBANT
gap_sellingGap Selling
value_sellingValue Selling
command_of_messageCommand of the Message
consultative_sellingConsultative
meddpiccMEDDPICC
Each API key has a configurable rate limit (default: 100 requests/hour). The API returns rate limit information in response headers on every authenticated request.
X-RateLimit-LimitMaximum requests allowed per hour
X-RateLimit-RemainingRequests remaining in current window
X-RateLimit-ResetUTC epoch seconds when window resets
429 Too Many Requests Response
{
"error": "Rate limit exceeded. Try again later.",
"retryAfter": 1842
}Tier options: 10/hr (Trial), 50/hr (Starter), 100/hr (Standard), 500/hr (Professional), 1000/hr (Enterprise)
Sliding window: Uses a 1-hour sliding window, not a fixed clock-hour reset
Configure a webhook URL when creating an API key to receive automatic notifications when report generation completes. Webhooks are signed with HMAC-SHA256 so you can verify they came from Lionfish.
Webhook Headers
X-Lionfish-Signature — HMAC-SHA256 hex digest of the request bodyX-Lionfish-Event — Event type (e.g., assessment.reports.completed)X-Lionfish-Delivery — Unique delivery ID for deduplicationX-Lionfish-Timestamp — ISO 8601 timestamp of the eventWebhook Payload Example
{
"event": "assessment.reports.completed",
"assessmentId": 42,
"externalCompanyId": "client_8472",
"framework": "HIPAA",
"complianceScore": 50,
"status": "completed",
"totalReports": 25,
"failedReports": 0,
"embedToken": "abc123def456...",
"embedUrl": "https://your-domain/embed/assessment/abc123def456...",
"reports": [
{ "persona": "ceo_president", "viewToken": "tok_...", "viewUrl": "/embed/report/tok_..." },
...
],
"timestamp": "2026-02-25T22:00:00.000Z"
}Signature Verification (Node.js)
import crypto from 'crypto';
function verifyWebhook(body: string, signature: string, secret: string): boolean {
const expected = crypto.createHmac('sha256', secret).update(body).digest('hex');
return crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected));
}
// In your Express handler:
app.post('/webhooks/lionfish', (req, res) => {
const signature = req.headers['x-lionfish-signature'];
const isValid = verifyWebhook(JSON.stringify(req.body), signature, WEBHOOK_SECRET);
if (!isValid) return res.status(401).send('Invalid signature');
// Process the webhook...
console.log('Reports ready:', req.body.reports.length);
res.status(200).send('OK');
});Events: assessment.reports.completed, assessment.reports.failed
Retries: 3 attempts with exponential backoff (1s, 4s, 16s)
Timeout: 10 seconds per attempt
Success: Any 2xx response is considered successful delivery
$250 per assessment — includes all 25 persona-specific reports ($10 each).
Partners processing 20 clients/month = $5,000/month recurring revenue.
Contact us for volume discounts and enterprise pricing.