{"service":"identity-score","description":"Signed depth-of-identity score for any Nostr pubkey. The signature is the product, consuming agents verify against the service pubkey to know the score came from PowForge.","version":1,"score_version":"v0.5.1","signed_by":"b4b12dfbc3dfdfa803bb72e344e761dc78db4ec2058c8db3f1c3ac63f9e42b44","endpoints":[{"path":"/l402/identity-score","method":"POST","scope":"identity-score:lookup","price_sats":2,"request":{"pubkey":"64-hex-char Nostr pubkey (npub decoded)"},"response":{"pubkey":"echoed","depth":"object with per-dimension scores (social, access, vouch, economic). Pass ?includeSpatial=1 for a deprecated spatial block.","composite":"integer total weight","rank":"bucket: unknown, emerging, active, established, trusted","bitcoin_tip":"{ height, hash } — bitcoin chaintip witness at compute time. The score is bound to a thermodynamic clock: signature breaks if the binding changes. Opt out with ?chaintip=0 for legacy byte-identical shape.","freshness_blocks":"integer, validity window in blocks past bitcoin_tip.height. Verifier rejects scores where current_tip_height - bitcoin_tip.height exceeds this. Covered by the schnorr signature.","signed_by":"hex pubkey of the signing service","signed_at":"unix seconds","valid_until":"unix seconds, cache expiry","signature":"128-char hex schnorr signature over canonical JSON (covers bitcoin_tip + freshness_blocks)"},"auth":"L402 (RFC 7235 + Lightning)"},{"path":"/l402/identity-score/:pubkey","method":"GET","scope":"identity-score:lookup","price_sats":1,"note":"Cheaper if score was computed in the last 3600s. Otherwise computes fresh at the same 1-sat tier (best-effort, not 100% cache-locked).","auth":"L402 (RFC 7235 + Lightning)"}],"free_endpoints":[{"path":"/oracle/freshness","method":"GET, POST","description":"Verify a signed score's schnorr signature AND its freshness window against a caller-supplied current bitcoin chaintip height. Public, unauthenticated. Returns {valid_signature, fresh, blocks_elapsed, freshness_blocks, fresh_until_height, reason}.","request":{"GET":"score_response (base64 JSON) + current_tip_height (int) query params","POST":"{score_response: object|base64-string, current_tip_height: int}"},"auth":"none"},{"path":"/oracle/witness/verify","method":"GET, POST","description":"Verify a signed witness envelope. Recomputes the schnorr signature and reports whether the bound chaintip is now buried (blocks_since_witness). Public, unauthenticated.","request":{"GET":"envelope (base64 JSON) query param","POST":"{envelope: object|base64-string}"},"auth":"none"}],"witness_endpoints":[{"path":"/l402/witness","method":"POST","scope":"oracle-witness:sign","price_sats":1,"request":{"hash":"64-hex sha256 of caller content","note":"optional, ≤200 chars"},"response":{"hash":"echoed","note":"echoed when supplied","witness_kind":"powforge-witness-v0.1","witnessed_at":"unix seconds","signed_by":"oracle pubkey hex","bitcoin_tip":"{height, hash} — chaintip witness at sign time","signature":"128-char hex schnorr over canonical JSON"},"auth":"L402 (RFC 7235 + Lightning)"},{"path":"/oracle/witness","method":"POST","scope":"oracle-witness:sign","price_sats":1,"description":"Alias of /l402/witness. Byte-identical response.","auth":"L402 (RFC 7235 + Lightning)","alias_of":"/l402/witness"}],"freshness_blocks_default":6,"cache_ttl_seconds":3600,"default_relays":["wss://relay.damus.io","wss://nos.lol","wss://relay.primal.net","wss://relay.nostr.band","wss://nostr.wine"],"contact":"zeke@zap.fubz.dev"}