{"openapi":"3.1.0","info":{"title":"Xynthera EffectGuard","version":"guard-products-2026-10-14.1","description":"Durable hosted PAYG guard for replay-safe external-effect decisions. A first decision costs 390 micro-EUR; exact prepare replays, reads and reconciliation are not debited. Runtime availability is authoritative only in GET /health."},"servers":[{"url":"https://pfxxzsnboehxsefyajml.supabase.co/functions/v1/xynthera-ai-guard-products","description":"Xynthera hosted Edge API"}],"security":[{"bearerAuth":[]}],"paths":{"/v1/effect-guard/jwks.json":{"get":{"operationId":"getEffectGuardJwks","security":[],"responses":{"200":{"description":"ES256 public verification key","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/v1/effect-guard/intents":{"post":{"operationId":"prepareEffectIntent","description":"Prepare or replay one exact logical effect. Tenant identity is derived by the server and is not accepted in this body.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrepareRequest"}}}},"responses":{"201":{"description":"Prepared or replayed intent","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Intent"}}}},"409":{"$ref":"#/components/responses/Conflict"}}}},"/v1/effect-guard/intents/{intent_id}":{"parameters":[{"$ref":"#/components/parameters/IntentId"}],"get":{"operationId":"getEffectIntent","responses":{"200":{"description":"Current state; an expired executing claim is reported as unknown","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Intent"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/effect-guard/intents/{intent_id}/claim":{"parameters":[{"$ref":"#/components/parameters/IntentId"}],"post":{"operationId":"claimEffectIntent","description":"Atomically grants one opaque authority. The capability appears only in the winning response and is stored only as a hash.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyObject"}}}},"responses":{"200":{"description":"Intent plus a one-time authority for the winning claim, or null authority on replay","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimResponse"}}}},"401":{"description":"Authentication failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/effect-guard/intents/{intent_id}/settle":{"parameters":[{"$ref":"#/components/parameters/IntentId"}],"post":{"operationId":"settleEffectIntent","description":"Asks the injected server verifier to validate already-observed provider evidence. Ambiguity transitions to unknown and requires readback.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettleRequest"}}}},"responses":{"200":{"description":"Current intent, with ES256 receipt only after a verified terminal decision","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Intent"}}}},"401":{"description":"Invalid claim capability","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"$ref":"#/components/responses/Conflict"}}}},"/v1/effect-guard/intents/{intent_id}/reconcile":{"parameters":[{"$ref":"#/components/parameters/IntentId"}],"post":{"operationId":"reconcileEffectIntent","description":"Runs only the injected server readback adapter. Client proof and verified flags are not accepted.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyObject"}}}},"responses":{"200":{"description":"Reconciled state or still unknown","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Intent"}}}},"409":{"$ref":"#/components/responses/Conflict"}}}},"/v1/effect-guard/intents/{intent_id}/cancel":{"parameters":[{"$ref":"#/components/parameters/IntentId"}],"post":{"operationId":"cancelPreparedEffectIntent","description":"Cancels only a prepared intent, before any authority is issued.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyObject"}}}},"responses":{"200":{"description":"Cancelled intent with signed receipt","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Intent"}}}},"409":{"$ref":"#/components/responses/Conflict"}}}},"/v1/effect-guard/verifier-keys":{"post":{"operationId":"register_effectguard_verifier_key","summary":"Register a tenant-scoped ES256 outcome verifier key","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/XyntheraVerifierKeyRegistration"}}}},"responses":{"201":{"description":"Verifier key registered or replayed","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid key envelope","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid PAYG Bearer code","content":{"application/json":{"schema":{"type":"object"}}}},"409":{"description":"Verifier key conflicts with an existing key or the tenant key limit","content":{"application/json":{"schema":{"type":"object"}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/v1/effect-guard/verifier-keys/revoke":{"post":{"operationId":"revoke_effectguard_verifier_key","summary":"Revoke a tenant-scoped verifier key","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/XyntheraVerifierKeyRevocation"}}}},"responses":{"200":{"description":"Verifier key revoked","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid key id","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid PAYG Bearer code","content":{"application/json":{"schema":{"type":"object"}}}},"409":{"description":"Verifier key unavailable or cannot be revoked","content":{"application/json":{"schema":{"type":"object"}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/v1/effect-guard/intents/{intent_id}/outcomes":{"post":{"operationId":"ingest_effectguard_authoritative_outcome","summary":"Ingest a signed authoritative outcome for later reconciliation","parameters":[{"$ref":"#/components/parameters/IntentId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/XyntheraOutcomeAttestation"}}}},"responses":{"202":{"description":"Signed outcome accepted; terminal outcomes are persisted","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Malformed, invalid, or unverifiable attestation","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid PAYG Bearer code","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Guard resource unavailable","content":{"application/json":{"schema":{"type":"object"}}}},"409":{"description":"Attestation scope, verifier key, existing outcome, or resource state conflict","content":{"application/json":{"schema":{"type":"object"}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"type":"object"}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"Xynthera PAYG code","description":"Use the same opaque Bearer code delivered by the Xynthera PAYG checkout. Tenant and prepaid ledger authority are derived server-side; never send a tenant id as authentication."}},"parameters":{"IntentId":{"name":"intent_id","in":"path","required":true,"schema":{"type":"string","pattern":"^egi_[a-f0-9]{24}$"}}},"responses":{"Conflict":{"description":"Replay variation or invalid state transition","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"Intent absent or owned by another tenant","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"schemas":{"EmptyObject":{"type":"object","additionalProperties":false,"maxProperties":0},"Error":{"type":"object","additionalProperties":false,"required":["error"],"properties":{"error":{"type":"string"}}},"AtomicCost":{"type":"object","additionalProperties":false,"required":["amount_atomic","scale","currency"],"properties":{"amount_atomic":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$"},"scale":{"type":"integer","minimum":0,"maximum":18},"currency":{"type":"string","pattern":"^[A-Z]{3,12}$"}}},"PrepareRequest":{"type":"object","additionalProperties":false,"required":["logical_identity","agent_id","tool_id","destination","effect_kind","action"],"properties":{"logical_identity":{"type":"string","minLength":1,"maxLength":128},"agent_id":{"type":"string","minLength":1,"maxLength":128},"tool_id":{"type":"string","minLength":1,"maxLength":128},"destination":{"type":"string","minLength":1,"maxLength":512},"effect_kind":{"type":"string","minLength":1,"maxLength":128},"action":{"type":"object","description":"Canonical JSON object. Integers outside the JavaScript safe range and lone Unicode surrogates are rejected; encode large integers as decimal strings."},"cost":{"$ref":"#/components/schemas/AtomicCost"}}},"SettleRequest":{"type":"object","additionalProperties":false,"required":["capability","evidence"],"properties":{"capability":{"type":"string","pattern":"^egc_[A-Za-z0-9_-]{43}$","writeOnly":true},"evidence":{"$ref":"#/components/schemas/XyntheraSettlementEvidence"}}},"Intent":{"type":"object","required":["profile","intent_id","state","logical_identity","action_sha256","context","cost","created_at","claim","ambiguity","receipt"],"properties":{"profile":{"const":"xynthera-effect-guard-v1"},"intent_id":{"type":"string","pattern":"^egi_[a-f0-9]{24}$"},"state":{"enum":["prepared","executing","settled","unknown","refused","cancelled"]},"logical_identity":{"type":"string"},"action_sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"context":{"type":"object"},"cost":{"oneOf":[{"$ref":"#/components/schemas/AtomicCost"},{"type":"null"}]},"created_at":{"type":"string","format":"date-time"},"claim":{"oneOf":[{"type":"object"},{"type":"null"}]},"ambiguity":{"oneOf":[{"type":"object"},{"type":"null"}]},"receipt":{"oneOf":[{"type":"object"},{"type":"null"}]},"replayed":{"type":"boolean"},"reconciliation_pending":{"type":"boolean"},"reconciliation_required":{"type":"boolean"},"verification_pending":{"type":"boolean"}}},"ClaimAuthority":{"type":"object","additionalProperties":false,"required":["capability","claim_id","provider_idempotency_key","expires_at"],"properties":{"capability":{"type":"string","pattern":"^egc_[A-Za-z0-9_-]{43}$","readOnly":true,"description":"Returned exactly once to the winning server worker. Never log or persist this plaintext value."},"claim_id":{"type":"string","pattern":"^egcl_[a-f0-9]{24}$"},"provider_idempotency_key":{"type":"string","pattern":"^xeg_[a-f0-9]{48}$"},"expires_at":{"type":"string","format":"date-time"}}},"ClaimResponse":{"allOf":[{"$ref":"#/components/schemas/Intent"},{"type":"object","required":["authority","replayed"],"properties":{"authority":{"oneOf":[{"$ref":"#/components/schemas/ClaimAuthority"},{"type":"null"}]},"replayed":{"type":"boolean"}}}]},"XyntheraVerifierPublicJwk":{"type":"object","additionalProperties":false,"required":["kty","crv","alg","use","kid","x","y"],"properties":{"kty":{"const":"EC"},"crv":{"const":"P-256"},"alg":{"const":"ES256"},"use":{"const":"sig"},"kid":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$"},"x":{"type":"string","pattern":"^[A-Za-z0-9_-]{43}$"},"y":{"type":"string","pattern":"^[A-Za-z0-9_-]{43}$"}},"description":"Public P-256 verification JWK. Private parameter d and every undeclared member are forbidden."},"XyntheraVerifierKeyRegistration":{"type":"object","additionalProperties":false,"required":["scope","public_jwk","verify_until"],"properties":{"scope":{"type":"string","minLength":1,"maxLength":512,"pattern":"^[^\\u0000-\\u001F\\u007F]+$","description":"Exact EffectGuard destination covered by this key."},"public_jwk":{"$ref":"#/components/schemas/XyntheraVerifierPublicJwk"},"verify_until":{"type":"string","format":"date-time","description":"Must be more than 1 day and no more than 730 days in the future."}}},"XyntheraVerifierKeyRevocation":{"type":"object","additionalProperties":false,"required":["kid"],"properties":{"kid":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$"}}},"XyntheraEffectOutcomePayload":{"type":"object","additionalProperties":false,"required":["profile","tenant_id","intent_id","claim_id","logical_key","action_sha256","provider_idempotency_key","status","observed_at","effect_reference","reason_code"],"properties":{"profile":{"const":"xynthera-effect-outcome-v1"},"tenant_id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$"},"logical_key":{"type":"string","pattern":"^[a-f0-9]{64}$"},"provider_idempotency_key":{"type":"string","pattern":"^xeg_[a-f0-9]{48}$"},"status":{"type":"string","enum":["settled","refused","ambiguous"]},"observed_at":{"type":"string","format":"date-time"},"reason_code":{"type":["string","null"],"pattern":"^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$"},"intent_id":{"type":"string","pattern":"^egi_[a-f0-9]{24}$"},"claim_id":{"type":"string","pattern":"^egcl_[a-f0-9]{24}$"},"action_sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"effect_reference":{"type":["string","null"],"minLength":1,"maxLength":256,"pattern":"^[^\\u0000-\\u001F\\u007F]+$"}},"description":"Exact JSON payload signed by the registered EffectGuard verifier. settled requires a non-null effect_reference and null reason_code; refused or ambiguous require a reason_code."},"XyntheraOutcomeAttestation":{"type":"object","additionalProperties":false,"required":["attestation_jws"],"properties":{"attestation_jws":{"type":"string","minLength":80,"maxLength":131072,"description":"Compact ES256 JWS with protected typ application/xynthera-effect-outcome+jws, a registered kid, and the exact XyntheraEffectOutcomePayload payload."}},"x-xynthera-jws":{"alg":"ES256","typ":"application/xynthera-effect-outcome+jws","payload_schema":"#/components/schemas/XyntheraEffectOutcomePayload"}},"XyntheraSettlementEvidence":{"type":"object","additionalProperties":false,"required":["attestation_jws"],"properties":{"attestation_jws":{"type":"string","minLength":80,"maxLength":130974,"description":"Compact ES256 JWS for the nested settle request. Protected typ must be application/xynthera-effect-outcome+jws; the 130974-character limit leaves room for the capability and JSON envelope inside the 131072-byte REST body limit."}},"x-xynthera-jws":{"alg":"ES256","typ":"application/xynthera-effect-outcome+jws","payload_schema":"#/components/schemas/XyntheraEffectOutcomePayload"}}}},"x-xynthera-pricing":{"sku":"xyntheraEffectGuardDecision","pricing_version":"guard-products-2026-10-14","currency":"EUR","unit_micro_eur":390,"billable_event":"first_new_decision","exact_replay_debited":false,"availability_status_path":"/health","hosted_free_trial":false},"x-xynthera-limits":{"business_request_body_bytes":131072,"nested_settlement_attestation_jws_chars":130974,"direct_outcome_attestation_jws_chars":131072}}