Jung Fortis

API documentation

Base URL: / · 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 http://127.0.0.1:3010/v1/analyses \
  -H "Authorization: Bearer $JUNG_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com/pricing"}'

One analysis debits one credit. Credits are only debited 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 http://127.0.0.1:3010/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"}. Returns the new key once.

Rate limits

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

Responses carry x-ratelimit-remaining. 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_limitedSlow down.
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 to you. It is regenerated once, and if it still breaches 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 are not redeemable 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 the source. Images, rendered layout and anything behind a login are out of scope and are listed in the report's limitations.