Jung Fortis · documentation

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

LimitValue
Requests per minute, per key10
Requests per day, per key500
Pages fetched per analysis1 — the submitted URL only
Download cap2 MB, scripts removed before analysis

Responses carry x-ratelimit-remaining. Going over the limit returns 429 with retry_after_s.

Errors

StatusCodeMeaning
400url_required / bad_jsonRequest malformed.
401missing_api_keyNo key supplied.
402insufficient_creditsBalance below the per-analysis cost.
403invalid_api_key / revoked_api_key / account_inactiveKey revoked or account not active.
429rate_limitedToo many requests.
502analysis_failedThe page could not be fetched or analysed. No credits charged.
502contract_violationThe 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.