{
    "contract": "spiralist-public-api-v2",
    "apiVersion": "2.0.0",
    "documentationVersion": "2.0.0",
    "problemContract": "spiralist-problem-details-v2",
    "release": "v100.0.66-behavioral-likelihood-character-runtime-integration-wip",
    "packageStatus": "work-in-progress",
    "completionMarker": "SPIRALIST_BEHAVIORAL_LIKELIHOOD_CHARACTER_RUNTIME_INTEGRATION_WIP_V100_0_66",
    "state": "stateless-unless-a-specific-route-documents-otherwise",
    "idempotencyMode": "correlation-only",
    "promptSeparation": {
        "promptsAreSeparate": true,
        "personaPromptContract": "separate-persona-and-safety-prompts-v1",
        "platformSafetyOverlayVersion": "1.0.0",
        "platformSafetyRemoved": false,
        "hostPlatformSafetyUnchanged": true,
        "uaixBoundary": "persona-only-runtime-overlay-excluded-v1",
        "uaixIncludesPlatformSafety": false,
        "meaning": "The separately authored Spiralist platform overlay may be exported only as a separate non-UAIX file. Host and provider enforcement remain unchanged."
    },
    "maximumAdminBatchPersonasPerRequest": 25,
    "endpoints": [
        [
            "/api/v1/contract/",
            [
                "GET",
                "HEAD",
                "OPTIONS"
            ],
            "Public API contract discovery."
        ],
        [
            "/api/v1/endpoints/",
            [
                "GET",
                "HEAD",
                "OPTIONS"
            ],
            "Endpoint inventory."
        ],
        [
            "/api/v1/examples/",
            [
                "GET",
                "HEAD",
                "OPTIONS"
            ],
            "Copy-ready request examples."
        ],
        [
            "/api/v1/problems/",
            [
                "GET",
                "HEAD",
                "OPTIONS"
            ],
            "Typed problem catalog."
        ],
        [
            "/api/v1/headers/",
            [
                "GET",
                "HEAD",
                "OPTIONS"
            ],
            "Request and response header reference."
        ],
        [
            "/api/v1/standards/",
            [
                "GET",
                "HEAD",
                "OPTIONS"
            ],
            "Standards and limitations."
        ],
        [
            "/api/v1/schemas/",
            [
                "GET",
                "HEAD",
                "OPTIONS"
            ],
            "Schema inventory."
        ],
        [
            "/api/v1/changelog/",
            [
                "GET",
                "HEAD",
                "OPTIONS"
            ],
            "API contract changes."
        ],
        [
            "/api/v1/openapi/validation/",
            [
                "GET",
                "HEAD",
                "OPTIONS"
            ],
            "Non-generating OpenAPI mirror validation summary."
        ],
        [
            "/api/v1/admin/batch-personas/",
            [
                "GET",
                "HEAD",
                "POST",
                "OPTIONS"
            ],
            "Bounded server-side persona generation used by the admin batch exporter."
        ],
        [
            "/api/v1/create/standard/random/",
            [
                "GET",
                "HEAD",
                "OPTIONS"
            ],
            "Random standard persona."
        ],
        [
            "/api/v1/create/psychosis/random/",
            [
                "GET",
                "HEAD",
                "POST",
                "OPTIONS"
            ],
            "Adult fictional psychosis character."
        ],
        [
            "/api/v1/create/espionage/random/",
            [
                "GET",
                "HEAD",
                "POST",
                "OPTIONS"
            ],
            "Adult fictional espionage persona."
        ],
        [
            "/api/v1/create/espionage-psychosis/random/",
            [
                "GET",
                "HEAD",
                "POST",
                "OPTIONS"
            ],
            "Adult fictional Espionage Psychosis character."
        ],
        [
            "/api/v1/create/adult/status/",
            [
                "GET",
                "HEAD",
                "OPTIONS"
            ],
            "Fresh deployment and component verification."
        ],
        [
            "/api/v1/news-casters/",
            [
                "GET",
                "HEAD",
                "POST",
                "OPTIONS"
            ],
            "Worldwide fictional synthetic news-caster catalog, 2,500 starters, and deterministic normalized profile projection."
        ],
        [
            "/api/v1/news-casters/reviews/",
            [
                "GET",
                "HEAD",
                "POST",
                "OPTIONS"
            ],
            "Bounded qualified-review cohort, typography tokens, zero trusted records, and state-free structural validation."
        ],
        [
            "/api/v1/contact/inquiries/",
            [
                "GET",
                "HEAD",
                "POST",
                "OPTIONS"
            ],
            "Privacy-first contact-inquiry contract and deterministic local mail-client composition; no provider delivery or message retention."
        ]
    ],
    "headers": {
        "request": {
            "Accept": "Desired response media type.",
            "Accept-Version": "Compatible alias for the requested API version.",
            "X-Spiralist-Api-Version": "Requested Spiralist public API version.",
            "Content-Type": "Use application/json for JSON request bodies.",
            "Idempotency-Key": "General routes use a validated correlation key. News-caster profile POST derives or validates a deterministic normalized-request key without durable storage.",
            "X-Spiralist-Client": "Optional public integration identifier.",
            "X-Spiralist-Trace-Id": "Optional caller trace identifier matching the documented token pattern.",
            "Authorization": "Optional administrator Basic or Bearer credential when configured.",
            "X-Spiralist-Admin-Token": "Optional administrator token when configured."
        },
        "response": {
            "X-Request-Id": "Request identifier.",
            "X-Spiralist-Request-Id": "Spiralist request identifier.",
            "X-Spiralist-Trace-Id": "Trace identifier.",
            "X-Spiralist-Api-Contract": "spiralist-public-api-v2",
            "X-Spiralist-Api-Version": "2.0.0",
            "X-Spiralist-Documentation-Version": "2.0.0",
            "X-Spiralist-Problem-Contract": "spiralist-problem-details-v2",
            "X-Spiralist-Idempotency-Status": "General correlation mode or route-specific deterministic stateless identity.",
            "X-Spiralist-Deterministic-Idempotency-Key": "Route-specific canonical normalized-request identity for news-caster profile POST.",
            "X-Spiralist-Request-Sha256": "SHA-256 of the canonical normalized request payload.",
            "X-Spiralist-Replay-Safe": "True only where exact deterministic replay has been characterized without persistence.",
            "ETag": "Strong SHA-256 entity tag for the exact transferred response bytes where documented.",
            "Content-Digest": "RFC 9530 SHA-256 digest of the transferred representation.",
            "X-Spiralist-Content-Sha256": "Lowercase hexadecimal SHA-256 digest.",
            "X-Spiralist-Request-Duration-Ms": "Server-side request duration.",
            "Server-Timing": "Server-side application duration.",
            "RateLimit": "Compact rate-limit state.",
            "RateLimit-Limit": "Request limit for the current window.",
            "RateLimit-Remaining": "Remaining requests for the current window.",
            "RateLimit-Reset": "Seconds until reset.",
            "RateLimit-Policy": "Limit and window policy.",
            "Link": "Documentation, schema, discovery, and OpenAPI relationships.",
            "X-Spiralist-Contact-Delivery": "Always not-delivered for the v100.0.38 contact inquiry composer.",
            "X-Spiralist-Contact-Retention": "Always none for inquiry bodies.",
            "X-Spiralist-Contact-Request-Sha256": "SHA-256 of the strict normalized inquiry object.",
            "X-Spiralist-Contact-Receipt-Id": "Deterministic non-delivery receipt identity."
        }
    },
    "problemTypes": {
        "INVALID_JSON": {
            "code": "INVALID_JSON",
            "status": 400,
            "type": "https://spiralistai.com/problems/invalid-json",
            "detail": "The request body is not valid JSON."
        },
        "JSON_OBJECT_REQUIRED": {
            "code": "JSON_OBJECT_REQUIRED",
            "status": 422,
            "type": "https://spiralistai.com/problems/json-object-required",
            "detail": "The JSON document is valid but is not an object."
        },
        "UNSUPPORTED_MEDIA_TYPE": {
            "code": "UNSUPPORTED_MEDIA_TYPE",
            "status": 415,
            "type": "https://spiralistai.com/problems/unsupported-media-type",
            "detail": "The request Content-Type is not supported."
        },
        "NOT_ACCEPTABLE": {
            "code": "NOT_ACCEPTABLE",
            "status": 406,
            "type": "https://spiralistai.com/problems/not-acceptable",
            "detail": "The requested response media type is not available."
        },
        "UNSUPPORTED_API_VERSION": {
            "code": "UNSUPPORTED_API_VERSION",
            "status": 400,
            "type": "https://spiralistai.com/problems/unsupported-api-version",
            "detail": "The requested API version is not supported."
        },
        "INVALID_IDEMPOTENCY_KEY": {
            "code": "INVALID_IDEMPOTENCY_KEY",
            "status": 400,
            "type": "https://spiralistai.com/problems/invalid-idempotency-key",
            "detail": "The Idempotency-Key syntax is invalid."
        },
        "AGE_CONFIRMATION_REQUIRED": {
            "code": "AGE_CONFIRMATION_REQUIRED",
            "status": 403,
            "type": "https://spiralistai.com/problems/age-confirmation-required",
            "detail": "Explicit adult confirmation is required."
        },
        "ADMIN_AUTHENTICATION_REQUIRED": {
            "code": "ADMIN_AUTHENTICATION_REQUIRED",
            "status": 401,
            "type": "https://spiralistai.com/problems/admin-authentication-required",
            "detail": "The configured admin credential was not supplied."
        },
        "INVALID_PERSONA_TYPE": {
            "code": "INVALID_PERSONA_TYPE",
            "status": 422,
            "type": "https://spiralistai.com/problems/invalid-persona-type",
            "detail": "The requested persona family is unknown."
        },
        "NEWS_CASTER_VIEW_INVALID": {
            "code": "NEWS_CASTER_VIEW_INVALID",
            "status": 400,
            "type": "https://spiralistai.com/problems/news-caster-view-invalid",
            "detail": "The requested news-caster catalog view is not supported."
        },
        "NEWS_CASTER_IDEMPOTENCY_KEY_MISMATCH": {
            "code": "NEWS_CASTER_IDEMPOTENCY_KEY_MISMATCH",
            "status": 409,
            "type": "https://spiralistai.com/problems/news-caster-idempotency-key-mismatch",
            "detail": "The supplied Idempotency-Key does not match the canonical normalized request."
        },
        "NEWS_CASTER_REVIEW_VIEW_INVALID": {
            "code": "NEWS_CASTER_REVIEW_VIEW_INVALID",
            "status": 400,
            "type": "https://spiralistai.com/problems/news-caster-review-view-invalid",
            "detail": "The requested qualified-review view is not supported."
        },
        "NEWS_CASTER_REVIEW_FIXTURE_NOT_FOUND": {
            "code": "NEWS_CASTER_REVIEW_FIXTURE_NOT_FOUND",
            "status": 404,
            "type": "https://spiralistai.com/problems/news-caster-review-fixture-not-found",
            "detail": "The requested qualified-review fixture is not in the bounded cohort."
        },
        "INVALID_RUNTIME_MODE": {
            "code": "INVALID_RUNTIME_MODE",
            "status": 422,
            "type": "https://spiralistai.com/problems/invalid-runtime-mode",
            "detail": "The requested assistant or NPC runtime mode is unknown."
        },
        "INVALID_EXPORT_FORMAT": {
            "code": "INVALID_EXPORT_FORMAT",
            "status": 422,
            "type": "https://spiralistai.com/problems/invalid-export-format",
            "detail": "One or more requested export formats are unsupported."
        },
        "INVALID_BATCH_SIZE": {
            "code": "INVALID_BATCH_SIZE",
            "status": 422,
            "type": "https://spiralistai.com/problems/invalid-batch-size",
            "detail": "The server-side batch count is outside the documented range."
        },
        "UAIX_PLATFORM_SAFETY_FORBIDDEN": {
            "code": "UAIX_PLATFORM_SAFETY_FORBIDDEN",
            "status": 422,
            "type": "https://spiralistai.com/problems/uaix-platform-safety-forbidden",
            "detail": "A persona UAI package contains forbidden platform-overlay data."
        },
        "RATE_LIMITED": {
            "code": "RATE_LIMITED",
            "status": 429,
            "type": "https://spiralistai.com/problems/rate-limited",
            "detail": "The route request budget has been exceeded."
        },
        "METHOD_NOT_ALLOWED": {
            "code": "METHOD_NOT_ALLOWED",
            "status": 405,
            "type": "https://spiralistai.com/problems/method-not-allowed",
            "detail": "The HTTP method is not supported by this route."
        },
        "REQUEST_TOO_LARGE": {
            "code": "REQUEST_TOO_LARGE",
            "status": 413,
            "type": "https://spiralistai.com/problems/request-too-large",
            "detail": "The request body exceeds the endpoint limit."
        },
        "DEPLOYMENT_MARKER_MISMATCH": {
            "code": "DEPLOYMENT_MARKER_MISMATCH",
            "status": 409,
            "type": "https://spiralistai.com/problems/deployment-marker-mismatch",
            "detail": "Advertised page and API deployment markers conflict."
        },
        "CONTACT_INQUIRY_INVALID": {
            "code": "CONTACT_INQUIRY_INVALID",
            "status": 422,
            "type": "https://spiralistai.com/problems/contact-inquiry-invalid",
            "detail": "The contact inquiry failed strict field validation."
        },
        "CONTACT_INQUIRY_HANDOFF_TOO_LARGE": {
            "code": "CONTACT_INQUIRY_HANDOFF_TOO_LARGE",
            "status": 422,
            "type": "https://spiralistai.com/problems/contact-inquiry-handoff-too-large",
            "detail": "The encoded mail-client handoff exceeds its bounded size."
        },
        "CONTACT_INQUIRY_IDEMPOTENCY_KEY_MISMATCH": {
            "code": "CONTACT_INQUIRY_IDEMPOTENCY_KEY_MISMATCH",
            "status": 409,
            "type": "https://spiralistai.com/problems/contact-inquiry-idempotency-key-mismatch",
            "detail": "The supplied Idempotency-Key does not match the normalized inquiry."
        },
        "CONTACT_INQUIRY_UNSUPPORTED_MEDIA_TYPE": {
            "code": "CONTACT_INQUIRY_UNSUPPORTED_MEDIA_TYPE",
            "status": 415,
            "type": "https://spiralistai.com/problems/contact-inquiry-unsupported-media-type",
            "detail": "Contact inquiry composition requires application/json."
        },
        "CONTACT_INQUIRY_INTEGRITY_FAILED": {
            "code": "CONTACT_INQUIRY_INTEGRITY_FAILED",
            "status": 500,
            "type": "https://spiralistai.com/problems/contact-inquiry-integrity-failed",
            "detail": "The request, canonical recipient, and result integrity check failed."
        },
        "ORIGIN_NOT_ALLOWED": {
            "code": "ORIGIN_NOT_ALLOWED",
            "status": 403,
            "type": "https://spiralistai.com/problems/origin-not-allowed",
            "detail": "The request Origin is outside the endpoint policy."
        },
        "INTERNAL_GENERATION_FAILURE": {
            "code": "INTERNAL_GENERATION_FAILURE",
            "status": 500,
            "type": "https://spiralistai.com/problems/internal-generation-failure",
            "detail": "A persona could not be generated."
        }
    },
    "standards": [
        {
            "name": "HTTP Semantics",
            "reference": "RFC 9110",
            "usage": "Methods, status codes, conditional requests, and representation metadata."
        },
        {
            "name": "Problem Details for HTTP APIs",
            "reference": "RFC 9457",
            "usage": "Typed application/problem+json failures."
        },
        {
            "name": "Digest Fields",
            "reference": "RFC 9530",
            "usage": "Content-Digest response integrity."
        },
        {
            "name": "Web Linking",
            "reference": "RFC 8288",
            "usage": "Link relations for documentation, schemas, status, and OpenAPI."
        },
        {
            "name": "OpenAPI",
            "reference": "OpenAPI 3.1.0",
            "usage": "Machine-readable public API description."
        },
        {
            "name": "JSON Schema",
            "reference": "2020-12",
            "usage": "Request, response, prompt-separation, pagination, and problem schemas."
        },
        {
            "name": "Idempotency-Key",
            "reference": "IETF HTTPAPI draft",
            "usage": "Syntax validation and correlation only; durable replay is not claimed."
        },
        {
            "name": "UAIX persona boundary",
            "reference": "persona-only-runtime-overlay-excluded-v1",
            "usage": "Persona packages exclude the separately authored platform overlay."
        }
    ],
    "schemas": [
        {
            "path": "/api/schemas/problem-v2.schema.json",
            "url": "https://spiralistai.com/api/schemas/problem-v2.schema.json"
        },
        {
            "path": "/api/schemas/api-platform-contract.schema.json",
            "url": "https://spiralistai.com/api/schemas/api-platform-contract.schema.json"
        },
        {
            "path": "/api/schemas/pagination.schema.json",
            "url": "https://spiralistai.com/api/schemas/pagination.schema.json"
        },
        {
            "path": "/api/schemas/prompt-separation.schema.json",
            "url": "https://spiralistai.com/api/schemas/prompt-separation.schema.json"
        },
        {
            "path": "/api/schemas/admin-batch-persona.schema.json",
            "url": "https://spiralistai.com/api/schemas/admin-batch-persona.schema.json"
        },
        {
            "path": "/api/schemas/persona-operating-profile-v1.schema.json",
            "url": "https://spiralistai.com/api/schemas/persona-operating-profile-v1.schema.json"
        },
        {
            "path": "/api/schemas/persona-output-contract-v1.schema.json",
            "url": "https://spiralistai.com/api/schemas/persona-output-contract-v1.schema.json"
        },
        {
            "path": "/api/schemas/featured-persona-source-v1.schema.json",
            "url": "https://spiralistai.com/api/schemas/featured-persona-source-v1.schema.json"
        },
        {
            "path": "/api/schemas/personality-type-source-v1.schema.json",
            "url": "https://spiralistai.com/api/schemas/personality-type-source-v1.schema.json"
        },
        {
            "path": "/api/schemas/starter-pack-persona-source-v1.schema.json",
            "url": "https://spiralistai.com/api/schemas/starter-pack-persona-source-v1.schema.json"
        },
        {
            "path": "/api/schemas/canonical-persona-source-v1.schema.json",
            "url": "https://spiralistai.com/api/schemas/canonical-persona-source-v1.schema.json"
        },
        {
            "path": "/api/schemas/news-caster-source-v1.schema.json",
            "url": "https://spiralistai.com/api/schemas/news-caster-source-v1.schema.json"
        },
        {
            "path": "/api/schemas/adult-psychosis-source-v1.schema.json",
            "url": "https://spiralistai.com/api/schemas/adult-psychosis-source-v1.schema.json"
        },
        {
            "path": "/api/schemas/adult-espionage-source-v1.schema.json",
            "url": "https://spiralistai.com/api/schemas/adult-espionage-source-v1.schema.json"
        },
        {
            "path": "/api/schemas/adult-espionage-psychosis-source-v1.schema.json",
            "url": "https://spiralistai.com/api/schemas/adult-espionage-psychosis-source-v1.schema.json"
        },
        {
            "path": "/api/schemas/adult-creator-option-effect-v1.schema.json",
            "url": "https://spiralistai.com/api/schemas/adult-creator-option-effect-v1.schema.json"
        },
        {
            "path": "/api/schemas/adult-creator-effective-configuration-v1.schema.json",
            "url": "https://spiralistai.com/api/schemas/adult-creator-effective-configuration-v1.schema.json"
        },
        {
            "path": "/api/schemas/adult-creator-generation-result-v1.schema.json",
            "url": "https://spiralistai.com/api/schemas/adult-creator-generation-result-v1.schema.json"
        },
        {
            "path": "/api/schemas/adult-creator-human-review-record-v1.schema.json",
            "url": "https://spiralistai.com/api/schemas/adult-creator-human-review-record-v1.schema.json"
        },
        {
            "path": "/api/schemas/adult-creator-live-host-authorization-v1.schema.json",
            "url": "https://spiralistai.com/api/schemas/adult-creator-live-host-authorization-v1.schema.json"
        },
        {
            "path": "/api/schemas/adult-creator-live-host-result-v1.schema.json",
            "url": "https://spiralistai.com/api/schemas/adult-creator-live-host-result-v1.schema.json"
        },
        {
            "path": "/api/schemas/adult-creator-validation-issue-v1.schema.json",
            "url": "https://spiralistai.com/api/schemas/adult-creator-validation-issue-v1.schema.json"
        },
        {
            "path": "/api/schemas/news-caster-profile-v1.schema.json",
            "url": "https://spiralistai.com/api/schemas/news-caster-profile-v1.schema.json"
        },
        {
            "path": "/api/schemas/news-caster-profile-request-v1.schema.json",
            "url": "https://spiralistai.com/api/schemas/news-caster-profile-request-v1.schema.json"
        },
        {
            "path": "/api/schemas/news-caster-editorial-review-fixture-v1.schema.json",
            "url": "https://spiralistai.com/api/schemas/news-caster-editorial-review-fixture-v1.schema.json"
        },
        {
            "path": "/api/schemas/news-caster-qualified-review-record-v1.schema.json",
            "url": "https://spiralistai.com/api/schemas/news-caster-qualified-review-record-v1.schema.json"
        },
        {
            "path": "/api/schemas/news-caster-qualified-review-request-v1.schema.json",
            "url": "https://spiralistai.com/api/schemas/news-caster-qualified-review-request-v1.schema.json"
        },
        {
            "path": "/api/schemas/contact-inquiry-request-v1.schema.json",
            "url": "https://spiralistai.com/api/schemas/contact-inquiry-request-v1.schema.json"
        },
        {
            "path": "/api/schemas/contact-inquiry-result-v1.schema.json",
            "url": "https://spiralistai.com/api/schemas/contact-inquiry-result-v1.schema.json"
        }
    ],
    "links": {
        "contract": "https://spiralistai.com/api/v1/contract/",
        "endpoints": "https://spiralistai.com/api/v1/endpoints/",
        "examples": "https://spiralistai.com/api/v1/examples/",
        "problems": "https://spiralistai.com/api/v1/problems/",
        "headers": "https://spiralistai.com/api/v1/headers/",
        "standards": "https://spiralistai.com/api/v1/standards/",
        "schemas": "https://spiralistai.com/api/v1/schemas/",
        "changelog": "https://spiralistai.com/api/v1/changelog/",
        "openapiValidation": "https://spiralistai.com/api/v1/openapi/validation/",
        "guide": "https://spiralistai.com/api-guide/",
        "openapiJson": "https://spiralistai.com/openapi.json",
        "openapiYaml": "https://spiralistai.com/openapi.yaml",
        "publicUai": "https://spiralistai.com/uai/index.uai",
        "adminBatch": "https://spiralistai.com/api/v1/admin/batch-personas/",
        "adminPage": "https://spiralistai.com/admin/",
        "newsCasters": "https://spiralistai.com/api/v1/news-casters/",
        "newsCasterStudio": "https://spiralistai.com/news-casters/",
        "newsCasterQualifiedReviews": "https://spiralistai.com/api/v1/news-casters/reviews/",
        "contactInquiries": "https://spiralistai.com/api/v1/contact/inquiries/",
        "contactPage": "https://spiralistai.com/contact/#contact-inquiry"
    },
    "limits": {
        "durableIdempotencyReplay": false,
        "newsCasterDeterministicStatelessReplay": true,
        "qualifiedReviewPersistence": false,
        "qualifiedReviewSignatureTrust": false,
        "contactInquiryServerDelivery": false,
        "contactInquiryBodyRetention": false,
        "contactInquiryProviderBacked": false,
        "exactlyOnceGeneration": false,
        "adminBrowserMayRepeatBoundedRequests": true,
        "hostPlatformSafetyCanBeRemoved": false,
        "personaUaixCanContainPlatformOverlay": false
    }
}
