{"name":"Mask.ID Attestation API","version":1,"request":{"fields":{"v":"1","redirect":"https URL the member returns to with ?maskid=<payload>.<signature>","expires":"unix seconds (optional)","nonce":"single-use random string (≤200 bytes)","scopes":"list of scope ids beyond trust_index (optional; unknown ids invalidate the request)","rp_user_id":"your user id (≤200 bytes) — returned in the payload","webhook":"https URL, public host (one of webhook/redirect required)"},"identity":"your site is identified by the HOST of webhook/redirect; site_name fields are ignored"},"spec":"https://app.mask.id/docs/attestation-api.md","fields":[{"label":"Trust Index (0–100)","scope":"trust_index","status":"live","key":"trust_index","category":"profile","example":"\"trust_index\": 87"},{"label":"Trust Index tier — unproven · low · building · trusted (the platform's own bands)","scope":"trust_index","status":"live","key":"trust_index_tier","category":"profile","example":"\"trust_index_tier\": \"trusted\""},{"label":"Profile type","scope":"profile","status":"live","key":"profile_type","category":"profile","example":"\"profile_type\": \"individual\""},{"label":"Real-person hurdle cleared (anti-sybil gate)","scope":"profile","status":"live","key":"earned_username","category":"profile","example":"\"earned_username\": true"},{"label":"Account age","scope":"profile","status":"live","key":"account_age","category":"profile","example":"\"account_age\": \"1–2 years\""},{"label":"Recently active","scope":"profile","status":"live","key":"active_within","category":"profile","example":"\"active_within\": \"30 days\""},{"label":"Founding Member","scope":"profile","status":"live","key":"founding_member","category":"profile","example":"\"founding_member\": true"},{"label":"Invited by an existing member","scope":"profile","status":"live","key":"invited","category":"profile","example":"\"invited\": true"},{"label":"Masternode owner","scope":"mno","status":"live","key":"mno_verified","category":"profile","example":"\"mno_verified\": true"},{"label":"Region / language / timezone","scope":"location","status":"live","key":"location","category":"profile","example":"\"region\": \"North America\""},{"label":"Referrals pillar score (0–100)","scope":"referrals","status":"live","key":"referrals_score","category":"referrals","example":"\"referrals_score\": 72"},{"label":"Accepted referrals received","scope":"referrals","status":"live","key":"referrals_received","category":"referrals","example":"\"referrals_received\": \"25+\""},{"label":"Accepted referrals given","scope":"referrals","status":"live","key":"referrals_given","category":"referrals","example":"\"referrals_given\": \"10+\""},{"label":"Average Trust Index of referrers","scope":"referrals","status":"live","key":"referrer_avg_ti","category":"referrals","example":"\"referrer_avg_ti\": 64"},{"label":"Share of referrers with verified platforms","scope":"referrals","status":"live","key":"referrers_verified_pct","category":"referrals","example":"\"referrers_verified_pct\": 80"},{"label":"New referral accepted in the last 90 days","scope":"referrals","status":"live","key":"referral_recent","category":"referrals","example":"\"referral_recent\": true"},{"label":"Overall Trust Score + tier","scope":"reputation","status":"live","key":"trust_score","category":"trust_scores","example":"\"trust_score\": 78, \"trust_tier\": \"Established\""},{"label":"Section scores — Confidence, Relationship, Identity, Reputation, Trust-with, Longevity","scope":"reputation","status":"live","key":"section_scores","category":"trust_scores","example":"\"identity_score\": 84"},{"label":"“Real person” confidence (referrer average)","scope":"reputation","status":"live","key":"real_person","category":"trust_scores","example":"\"real_person\": 92"},{"label":"“Identity has stayed consistent” (referrer average)","scope":"reputation","status":"live","key":"identity_consistent","category":"trust_scores","example":"\"identity_consistent\": 90"},{"label":"“The Mask ID belongs to them” confidence (referrer average)","scope":"reputation","status":"live","key":"owns_user_id","category":"trust_scores","example":"\"owns_user_id\": 85"},{"label":"How well referrers know them (referrer average)","scope":"reputation","status":"live","key":"familiarity","category":"trust_scores","example":"\"familiarity\": 80"},{"label":"In what capacity referrers know them (share per bucket; all-that-apply)","scope":"reputation","status":"live","key":"capacity_mix","category":"trust_scores","example":"\"capacity_mix\": {\"colleague\": 40, \"client\": 60, \"community\": 30}"},{"label":"Still in contact this year (share of referrers)","scope":"reputation","status":"live","key":"active_relationship_pct","category":"trust_scores","example":"\"active_relationship_pct\": 80"},{"label":"Known 5+ years and still in contact (share of referrers)","scope":"reputation","status":"live","key":"long_standing_current_pct","category":"trust_scores","example":"\"long_standing_current_pct\": 30"},{"label":"Would trust them with money (share of referrers who answered)","scope":"reputation","status":"live","key":"trust_money_pct","category":"trust_scores","example":"\"trust_money_pct\": 80"},{"label":"Would trust them with their home, vehicle or belongings (share)","scope":"reputation","status":"live","key":"trust_property_pct","category":"trust_scores","example":"\"trust_property_pct\": 70"},{"label":"Would trust them with the care of a person or animal (share)","scope":"reputation","status":"live","key":"trust_care_pct","category":"trust_scores","example":"\"trust_care_pct\": 60"},{"label":"Would trust their advice in their field (share)","scope":"reputation","status":"live","key":"trust_advice_pct","category":"trust_scores","example":"\"trust_advice_pct\": 90"},{"label":"Would meet them alone in person (share)","scope":"reputation","status":"live","key":"trust_meet_pct","category":"trust_scores","example":"\"trust_meet_pct\": 90"},{"label":"In contact weekly or more (share of referrers)","scope":"reputation","status":"live","key":"frequent_contact_pct","category":"trust_scores","example":"\"frequent_contact_pct\": 50"},{"label":"Have exchanged money or goods with them (share)","scope":"reputation","status":"live","key":"transacted_pct","category":"trust_scores","example":"\"transacted_pct\": 60"},{"label":"Transactions went as agreed (share of those who transacted)","scope":"reputation","status":"live","key":"settled_as_agreed_pct","category":"trust_scores","example":"\"settled_as_agreed_pct\": 90"},{"label":"“One person controls this account” confidence (referrer average)","scope":"reputation","status":"live","key":"sole_operator","category":"trust_scores","example":"\"sole_operator\": 90"},{"label":"Respectful and civil (referrer average)","scope":"reputation","status":"live","key":"conduct","category":"trust_scores","example":"\"conduct\": 95"},{"label":"Responds and communicates clearly (referrer average)","scope":"reputation","status":"live","key":"responsiveness","category":"trust_scores","example":"\"responsiveness\": 85"},{"label":"Average familiarity / years known","scope":"reputation","status":"live","key":"avg_years_known","category":"trust_scores","example":"\"avg_years_known\": \"4 years\""},{"label":"Met in person / communicated directly (share of referrers)","scope":"reputation","status":"live","key":"met_in_person_pct","category":"trust_scores","example":"\"met_in_person_pct\": 40"},{"label":"Video calls (share of referrers)","scope":"reputation","status":"live","key":"video_calls_pct","category":"trust_scores","example":"\"video_calls_pct\": 60"},{"label":"Audio calls (share of referrers)","scope":"reputation","status":"live","key":"audio_calls_pct","category":"trust_scores","example":"\"audio_calls_pct\": 40"},{"label":"Completed a project together (share of referrers)","scope":"reputation","status":"live","key":"project_together_pct","category":"trust_scores","example":"\"project_together_pct\": 50"},{"label":"Would recommend / would work with again (share)","scope":"reputation","status":"live","key":"recommend_pct","category":"trust_scores","example":"\"recommend_pct\": 95"},{"label":"Professional reputation (referrer average)","scope":"reputation","status":"live","key":"professional_rep","category":"trust_scores","example":"\"professional_rep\": 88"},{"label":"Reliability as a person — shows up, keeps their word (referrer average)","scope":"reputation","status":"live","key":"personal_reliability","category":"trust_scores","example":"\"personal_reliability\": 85"},{"label":"Commitment reliability — do they do what they say (referrer average)","scope":"reputation","status":"live","key":"commitment_reliability","category":"trust_scores","example":"\"commitment_reliability\": 85"},{"label":"Coverage score (0–100)","scope":"presence","status":"live","key":"presence_score","category":"presence","example":"\"presence_score\": 75"},{"label":"Verified platform count","scope":"presence","status":"live","key":"verified_platforms","category":"presence","example":"\"verified_platforms\": 3"},{"label":"Cryptographic key linkage (Nostr / Vector)","scope":"presence","status":"live","key":"crypto_linkage","category":"presence","example":"\"crypto_linkage\": true"},{"label":"Which platforms are verified","scope":"platforms","status":"live","key":"platforms","category":"presence","example":"\"platforms\": [\"github\", \"x\"]"},{"label":"Oldest verified identity","scope":"presence","status":"live","key":"oldest_identity","category":"presence","example":"\"oldest_identity\": \"5+ years\""},{"label":"Trust Capital pillar score (0–100)","scope":"commitment","status":"live","key":"capital_score","category":"capital","example":"\"capital_score\": 61"},{"label":"Per-coin holdings + Coin Age, keyed by chain — native units, never FX","scope":"commitment","status":"live","key":"capital","category":"capital","example":"\"capital\": {\n    \"pivx\": {\"unit\": \"PIV\", \"commitment\": \"1k–10k\", \"coin_age_all\": \"10k–100k\",\n             \"coin_age_6mo\": \"10k–100k\", \"coin_age_3mo\": \"1k–10k\", \"coin_age_30d\": \"100–1k\"}\n  }"},{"label":"Backing exists (referrers stake PIV behind them)","scope":"commitment","status":"live","key":"backed","category":"capital","example":"\"backed\": true"},{"label":"Tips received (distinct members)","scope":"commitment","status":"live","key":"tipped_by","category":"capital","example":"\"tipped_by\": \"5+ members\""},{"label":"Tips given (distinct members)","scope":"commitment","status":"live","key":"tipped","category":"capital","example":"\"tipped\": \"10+ members\""},{"label":"Parked Usernames held","scope":"commitment","status":"live","key":"parked_held","category":"capital","example":"\"parked_held\": \"3+\""},{"label":"Usernames bought (lifetime)","scope":"commitment","status":"live","key":"names_bought","category":"capital","example":"\"names_bought\": \"1+\""},{"label":"Usernames sold (lifetime)","scope":"commitment","status":"live","key":"names_sold","category":"capital","example":"\"names_sold\": \"1+\""},{"label":"Verified on other sites via this API","scope":"commitment","status":"live","key":"attested_sites","category":"cross_site","example":"\"attested_sites\": \"3+\""},{"label":"Other sites that re-read this member in the last 30 days (a re-read is a \"session\": the site checked them, typically at login). Never which sites.","scope":"commitment","status":"live","key":"active_sites_30d","category":"cross_site","example":"\"active_sites_30d\": \"1+\""},{"label":"Same, over 90 days — cross-site history is the best bot signal we hold.","scope":"commitment","status":"live","key":"active_sites_90d","category":"cross_site","example":"\"active_sites_90d\": \"3+\""},{"label":"Sites with standing where dealings settled as agreed (a site earns standing by age and real members, so a member's own fork counts for nothing).","scope":"track_record","status":"live","key":"settled_sites","category":"track_record","example":"\"settled_sites\": \"1+\""},{"label":"Distinct people dealt with, across those sites (a pair counts once per site).","scope":"track_record","status":"live","key":"settled_counterparties","category":"track_record","example":"\"settled_counterparties\": \"5+\""},{"label":"Present (true) once at least five dealings settled and none were disputed; absent otherwise — never false. A negative only ever removes a positive.","scope":"track_record","status":"live","key":"dispute_free","category":"track_record","example":"\"dispute_free\": true"},{"label":"Witnessed (0–100): referrers' real-person and one-operator confidence, weighted up by video, audio or in-person contact. Absent below the 10-referrer threshold.","scope":"humanity","status":"live","key":"human_witnessed","category":"humanity","example":"\"human_witnessed\": 90"},{"label":"Costly to fake (0–100): real-person hurdle, age of the oldest verified outside identity, cryptographic key linkage, PIV backing, and cross-site history (sites active in 90 days). Cost, not proof; available day one.","scope":"humanity","status":"live","key":"human_costly","category":"humanity","example":"\"human_costly\": 55"},{"label":"Combined (0–100): Witnessed where it exists, else Costly capped at 60 so an unwitnessed profile never reads as confirmed. The one field to use if you want one.","scope":"humanity","status":"live","key":"human_confidence","category":"humanity","example":"\"human_confidence\": 90"},{"label":"Confirmed fields of work (≥3 referrers vouched; share who vouched)","scope":"competence","status":"live","key":"competence","category":"trust_scores","example":"\"competence\": [{\"code\": \"software.web\", \"domain\": \"Software & IT\", \"subdomain\": \"Web development\", \"endorsed_pct\": 60}]"},{"label":"Verified payment page (pairwise pay link)","scope":"pay_link","status":"live","key":"pay_link","category":"payments","example":"\"pay_link\": \"https://app.mask.id/pay/hTgkxGkYyBWJow0KrTppBQ\""}],"response":{"rule":"granted-scope fields merge flat into the payload; an absent field is normal (declined, unset, or below a privacy floor) — code for presence, never position","envelope":{"signature":"base64url(ed25519)","key_id":"hex","payload":"base64url(JSON)"},"payload_base":{"type":"maskid.attestation","v":1,"subject_id":"pairwise, stable per (member, your host); meaningless elsewhere","api":"the subject re-read URL","nonce":"echoed","scopes":"what the member actually granted","rp_host":"your host","rp_user_id":"echoed","trust_index":"0–100","issued_at":"ISO-8601","trust_index_tier":"unproven | low | building | trusted"}},"key":{"verify":"Ed25519 over the base64url-decoded payload bytes; verify BEFORE parsing","alg":"ed25519","key_id":"cdde5c8d68dbb162","url":"https://app.mask.id/.well-known/maskid-attest-key"},"endpoints":[{"path":"/.well-known/maskid-attest-key","method":"GET","purpose":"platform key to pin"},{"path":"/verify-trust?c=<base64url(request)>","method":"GET","purpose":"member consent page (deep link)"},{"path":"<your webhook>","method":"POST","purpose":"we deliver {payload, signature, key_id}; https public host only; up to 3 attempts"},{"path":"<your redirect>?maskid=<payload>.<signature>","method":"GET","purpose":"same response via the member's browser"},{"path":"/api/attest/v1/subject/:subject_id","method":"GET","purpose":"re-read current granted data; 404 once revoked; 60/min per IP"},{"path":"/api/attest/v1/subject/:subject_id/events","method":"POST","purpose":"write-back: count events; 204; nonce single-use; 60/min per host"}],"scopes":[{"id":"trust_index","title":"Trust Index","kind":"basic","default_on":false,"consent":"Your overall Trust Index — always included in every verification."},{"id":"profile","title":"Profile basics","kind":"pack","default_on":false,"consent":"Broad account facts: profile type, that you cleared the real-person hurdle, account age and activity as ranges, Founding Member yes/no, invited yes/no."},{"id":"referrals","title":"Referrals","kind":"pack","default_on":false,"consent":"Aggregate referral strength: counts as ranges, your referrers' average Trust Index and verification rate. Never who they are."},{"id":"reputation","title":"Trust Scores","kind":"pack","default_on":false,"consent":"What your referrers said, averaged across all of them: real-person confidence, how well they know you, whether they'd recommend you. No individual answers."},{"id":"presence","title":"Online Presence","kind":"pack","default_on":false,"consent":"How verified your social footprint is: coverage score, verified platform count, crypto-key linkage. Not which accounts."},{"id":"commitment","title":"Commitment","kind":"pack","default_on":false,"consent":"Economic commitment as ranges: Trust Capital score, holdings and coin-age buckets, tip and username-market activity. Never exact amounts or addresses."},{"id":"humanity","title":"Humanity","kind":"pack","default_on":false,"consent":"Two \"is this a person?\" confidences and a roll-up: what your referrers witnessed (real-person and one-operator confidence, weighted up by video, audio or in-person contact) and how costly your profile would be to fake (real-person hurdle, oldest verified identity, key linkage, backing). Never who vouched or what any one of them said."},{"id":"mno","title":"Masternode owner","kind":"optin","default_on":false,"consent":"Reveal that you run a PIVX masternode."},{"id":"location","title":"Location context","kind":"optin","default_on":false,"consent":"Your region (continent only), language, and UTC offset — never your country or city."},{"id":"platforms","title":"Verified platforms","kind":"optin","default_on":false,"consent":"WHICH platforms you've verified (e.g. GitHub, X) — not your usernames on them. The combination is more identifying than the count alone."},{"id":"competence","title":"Confirmed fields","kind":"optin","default_on":false,"consent":"The fields of work you listed on your profile that at least 3 of your referrers confirmed, with the share who vouched. Never who vouched."},{"id":"track_record","title":"Track record","kind":"optin","default_on":false,"consent":"Counts of dealings that settled as agreed on other sites you've verified with — how many sites, how many people, and whether any were disputed. Never amounts, never which sites, never who."},{"id":"pay_link","title":"Payment link","kind":"optin","default_on":true,"consent":"Creates a private payment page for this site — a fresh shielded address just for them, behind a random link. People there can pay you directly; the site and its visitors never see your username, balance, or other addresses."}],"ai_policy":"https://app.mask.id/ai-policy.json","llms_txt":"https://app.mask.id/llms.txt","buckets":{"count":["0","1+","5+","10+","25+","50+"],"members":["0","1+ members","5+ members","10+ members","25+ members"],"years":["under a year","N+ years","10+ years"],"rule":"display text — compare for presence/equality, never parse","piv_days":["<100","100–1k","1k–10k","10k–100k","100k+"],"small_count":["0","1+","3+","10+"],"account_age":["<3 months","3–12 months","1–2 years","2+ years"],"active_within":["7 days","30 days","90 days","90+ days"],"piv":["<100","100–1k","1k–10k","10k+"],"scores":"0–100 snapped to the nearest 5; shares to the nearest 10"},"nostr":{"docs":"https://mask.id/nostr","npub":"npub1uhq0ye3a9pjgml864ml38lenthgeuq2z0l3rh2pspl6wqrv8qrjq2mcrhf","pubkey":"e5c0f2663d28648dfcfaaeff13ff335dd19e01427fe23ba8300ff4e00d8700e4","relays":["wss://asia.vectorapp.io/nostr","wss://nos.lol","wss://purplepag.es","wss://relay.damus.io","wss://relay.nostr.band"],"nip05":"_@mask.id","kinds":{"30009":"NIP-58 badge definitions: tier-building, tier-trusted","30382":"NIP-85 User Trusted Assertion: d = member pubkey; tags tier, username, L/l mask.id (opt-in members only)","8":"NIP-58 badge award to the member (building/trusted)"}},"pricing":"pilot: free and keyless; when keys ship, metered by monthly active verified members — see https://app.mask.id/api#pricing","privacy_invariants":["subject ids are pairwise: no correlation across sites, no path back to a wallet or username","no wallet address, username, display name, image, bio, or free text ever crosses the API","referral graph (who vouched for whom) is never exposed in any direction","aggregates publish only past k=10 referrers with hysteresis; values are bucketed on the way out","which sites a member verified with, and which counterparties, are never exposed","negatives (disputes, flags) are never published as numbers — they only remove a positive","no IP addresses are persisted or logged on any endpoint"],"write_back":{"events":["session","transaction_settled","transaction_disputed","flagged"],"never":["amounts","currency","free text","timestamps beyond the day","IP or request metadata"],"counterparty":"the other party's subject_id on YOUR site; stored only as a hash of the pair","session_rule":"counts only if your site re-read the member in the last 30 days","standing_rule":"your reports are published only once your site has standing: min(age/30d,1) × min(distinct verified members/3,1) ≥ 1"}}