Properties
| Name | Type | Description |
|---|---|---|
| id | string | |
| parent_forecast_id | string | Echoed only when the request supplied parent_forecast_id (per-call swarm threading) — links this forecast to the parent action it was run under. |
| recommendation | string | |
| risk_score | integer | |
| confidence | number | |
| gate | string | The actionable control, derived from risk_score AND reversibility: AUTO = proceed automatically; CONFIRM = hold for human confirmation; HUMAN_REQUIRED = block until a human approves. An irreversible a |
| reversibility | object | Can the action be undone, and at what cost? |
| predicted_result | object | |
| red_flags | array | |
| alternative_actions | array | |
| decision_trace | array | Only present when depth is "deep" |
| counterfactuals | array | Only present when depth is "deep" |
| mitigations | array | Only present when depth is "deep" |
| prior_findings_truncated | integer | Only present when the per-call cap dropped some caller-supplied context.prior_findings — either more than 100 findings, or the array's total serialized size exceeded the byte ceiling. The value is how |
| tokens_charged | integer | |
| latency_ms | integer | |
| receipt | object | |
| receipt_unavailable | string | Present ONLY when `receipt` is absent, and never alongside it. A receipt is attached if and only if its row was stored, so that a receipt you hold is always one `GET /v1/receipts/{id}` can honour. The |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://artifacts.apis.io/blackwalltier-com/json-schema/blackwalltier-com-forecast-response-schema.json",
"title": "ForecastResponse",
"x-generated": "2026-10-29",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/blackwalltier-com-openapi.yaml#/components/schemas/ForecastResponse",
"type": "object",
"required": [
"id",
"recommendation",
"risk_score",
"gate",
"reversibility",
"predicted_result",
"red_flags",
"tokens_charged",
"latency_ms"
],
"properties": {
"id": {
"type": "string"
},
"parent_forecast_id": {
"type": "string",
"description": "Echoed only when the request supplied parent_forecast_id (per-call swarm\nthreading) — links this forecast to the parent action it was run under.\n"
},
"recommendation": {
"type": "string",
"enum": [
"GO",
"CAUTION",
"STOP"
]
},
"risk_score": {
"type": "integer",
"minimum": 0,
"maximum": 100
},
"confidence": {
"type": "number",
"format": "float",
"minimum": 0,
"maximum": 1
},
"gate": {
"type": "string",
"enum": [
"AUTO",
"CONFIRM",
"HUMAN_REQUIRED"
],
"description": "The actionable control, derived from risk_score AND reversibility:\nAUTO = proceed automatically; CONFIRM = hold for human confirmation;\nHUMAN_REQUIRED = block until a human approves. An irreversible action\nis gated at a lower risk threshold than a reversible one.\n"
},
"reversibility": {
"type": "object",
"description": "Can the action be undone, and at what cost?",
"properties": {
"class": {
"type": "string",
"enum": [
"REVERSIBLE",
"RECOVERABLE",
"IRREVERSIBLE"
]
},
"rollback_cost": {
"type": "integer",
"minimum": 0,
"maximum": 100,
"description": "0 = trivially undoable, 100 = permanent/catastrophic"
},
"rollback_window_sec": {
"type": [
"integer",
"null"
],
"description": "Seconds available to undo; null = no window / permanent"
},
"rationale": {
"type": "string"
}
}
},
"predicted_result": {
"type": "object",
"properties": {
"outcome": {
"type": "string",
"description": "One-sentence prediction"
},
"side_effects": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"red_flags": {
"type": "array",
"items": {
"type": "object",
"required": [
"severity",
"code",
"message"
],
"properties": {
"severity": {
"type": "string",
"enum": [
"low",
"medium",
"high",
"critical"
]
},
"code": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
},
"alternative_actions": {
"type": "array",
"items": {
"type": "string"
}
},
"decision_trace": {
"type": "array",
"items": {
"type": "string"
},
"description": "Only present when depth is \"deep\""
},
"counterfactuals": {
"type": "array",
"items": {
"type": "string"
},
"description": "Only present when depth is \"deep\""
},
"mitigations": {
"type": "array",
"items": {
"type": "string"
},
"description": "Only present when depth is \"deep\""
},
"prior_findings_truncated": {
"type": "integer",
"minimum": 1,
"description": "Only present when the per-call cap dropped some caller-supplied\ncontext.prior_findings — either more than 100 findings, or the array's\ntotal serialized size exceeded the byte ceiling. The value is how many\nfindings were dropped (the gate scored a subset of your swarm). Absent\nwhen nothing was dropped. Send fewer/smaller findings per call to clear it.\n"
},
"tokens_charged": {
"type": "integer"
},
"latency_ms": {
"type": "integer"
},
"receipt": {
"$ref": "#/$defs/Receipt"
},
"receipt_unavailable": {
"type": "string",
"enum": [
"not_persisted",
"signing_failed"
],
"description": "Present ONLY when `receipt` is absent, and never alongside it. A receipt is\nattached if and only if its row was stored, so that a receipt you hold is\nalways one `GET /v1/receipts/{id}` can honour. The forecast itself is\nunaffected (and is not re-charged) — you simply have no signed receipt for\nthis call.\n\n`not_persisted` — the receipt was signed but its row did not land.\n`signing_failed` — the signature could not be produced.\n\nBoth are issuer-side faults worth reporting. Neither is retried for you.\n\nUnsigned: like `receipt` and `confirmation`, strip this key before\nre-deriving `response_hash`.\n"
}
},
"$defs": {
"Receipt": {
"type": "object",
"description": "Cryptographic decision receipt — an Ed25519 signature over canonical\nhashes of the request + response of a single forecast call. Anyone\nwith the published public key (see /.well-known/blackwall-signing-keys.json)\ncan verify offline without contacting Black_Wall.\n\nWe sign and store HASHES ONLY — the raw request/response bodies are\nnever persisted on our side. To verify later, you (or your auditor)\nprovide the bodies and we re-hash to check against the signed envelope.\n",
"required": [
"id",
"forecast_id",
"issued_at",
"algorithm",
"key_id",
"request_hash",
"response_hash",
"signature"
],
"properties": {
"id": {
"type": "string",
"description": "Receipt's own UUID (distinct from forecast_id)."
},
"forecast_id": {
"type": "string",
"description": "The forecast this receipt vouches for."
},
"issued_at": {
"type": "string",
"format": "date-time"
},
"algorithm": {
"type": "string",
"enum": [
"ed25519"
]
},
"key_id": {
"type": "string",
"description": "Which signing key was used. Look it up in\n/.well-known/blackwall-signing-keys.json. Receipts issued before\na key rotation continue to verify against the retired key.\n"
},
"request_hash": {
"type": "string",
"description": "SHA-256 (hex) of canonical(request_body), prefixed `sha256:`."
},
"response_hash": {
"type": "string",
"description": "SHA-256 (hex) of canonical(response_body without receipt), prefixed `sha256:`."
},
"signature": {
"type": "string",
"description": "Base64url Ed25519 signature over the canonicalized envelope (minus signature)."
},
"verify_url": {
"type": "string",
"format": "uri",
"description": "Convenience URL for POST verification."
}
}
}
}
}
Work with this as data
Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for schemas
4 MCP tools reach this
find_json_schemasBrowse and filter every JSON Schema in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/blackwalltier-com-forecast-response"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.