API documentation
Base URL https://api.fortisdigital.dev/jung/ · JSON in, JSON out · one analysis per call.
Authentication
Send your key as a bearer token or in x-api-key:
Authorization: Bearer jf_live_xxxxxxxxxxxxxxxxxxxxxxxx # or x-api-key: jf_live_xxxxxxxxxxxxxxxxxxxxxxxx
Keys are issued when a payment clears — see Keys. A revoked key is rejected with 403 revoked_api_key.
Analyse a page
POST /v1/analyses
curl -X POST https://api.fortisdigital.dev/jung/v1/analyses \
-H "Authorization: Bearer $JUNG_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/pricing"}'
One analysis debits one credit. A credit is debited only when an analysis succeeds.
Response
{
"id": "anl_xxxxxxxx",
"status": "ok",
"credits_charged": 1,
"balance": 99,
"report": {
"verdict": "one sentence naming the page's central mechanic",
"levers": [ { "lever": "reciprocity", "state": "present|absent|misused",
"evidence": "verbatim quote from the page", "read": "what it does to the buyer" } ],
"fogg": { "motivation": {"diagnosis":"...","evidence":"...","confidence":"high"},
"ability": {...}, "prompt": {...},
"binding_constraint": "motivation|ability|prompt" },
"findings": [ { "title":"...", "kind":"observed|inference", "confidence":"high|medium|low",
"evidence":"...", "read":"..." } ],
"fixes": [ { "priority": 1, "title":"...", "resolves":"...", "lever":"...",
"change":"...", "expected_effect":"qualitative prediction",
"measure":"...", "falsifier":"what would prove this wrong" } ],
"hypotheses": [ { "statement":"...", "prediction":"...", "falsifier":"..." } ],
"limitations": [ "what could not be assessed from the supplied source" ],
"analysed_url": "https://example.com/pricing"
},
"meta": { "model": "...", "prompt_version": "...", "passes": 2, "pages_fetched": 1, "latency_ms": 41230 }
}
findings[].kind separates what the page actually shows (observed) from the reading placed on it (inference). Every fix carries a falsifier: the result that would prove it wrong.
Retrieve an analysis
GET /v1/analyses/{id}
curl https://api.fortisdigital.dev/jung/v1/analyses/anl_xxxxxxxx \ -H "Authorization: Bearer $JUNG_KEY"
Account
GET /v1/me
Balance in credits, the per-analysis cost, and your key prefixes.
POST /v1/keys
Issue an additional key for the same account: {"label":"ci"}. The new key is returned once.
Rate limits
| Limit | Value |
|---|---|
| Requests per minute, per key | 10 |
| Requests per day, per key | 500 |
| Pages fetched per analysis | 1 — the submitted URL only |
| Download cap | 2 MB, scripts removed before analysis |
Responses carry x-ratelimit-remaining. Going over the limit returns 429 with retry_after_s.
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | url_required / bad_json | Request malformed. |
| 401 | missing_api_key | No key supplied. |
| 402 | insufficient_credits | Balance below the per-analysis cost. |
| 403 | invalid_api_key / revoked_api_key / account_inactive | Key revoked or account not active. |
| 429 | rate_limited | Too many requests. |
| 502 | analysis_failed | The page could not be fetched or analysed. No credits charged. |
| 502 | contract_violation | The report failed the output contract and was rejected. No credits charged. |
A rejected report is never returned. It is regenerated once, and if it still fails the contract you get an error instead of an unverified claim.
Credits
One credit = $1. One analysis = one credit. Minimum top-up $100. Credits do not expire, are not transferable, and cannot be redeemed for cash. Top-ups are one-time payments.
Scope
Text and markup analysis only. The service fetches the single URL you submit, within a 2 MB cap, and analyses that source. Images, rendered layout and anything behind a login are out of scope, and are listed in the report's limitations.