{"revision":"0ed62d2c742f8e20","language":"en","baseUrl":"https://veil.rip","documentationUrl":"https://veil.rip/docs","groups":[{"id":"guides","title":"Guides"},{"id":"cards","title":"Find people and cards"},{"id":"keys","title":"Keys and signatures"},{"id":"history","title":"Versions and changes"},{"id":"orgs","title":"Organisations and public status"},{"id":"share","title":"Share and embed"},{"id":"log","title":"Transparency log"},{"id":"developer","title":"Developer API keys"},{"id":"manage","title":"Manage a card"},{"id":"reference","title":"Service reference"}],"entries":[{"id":"start","kind":"guide","group":"guides","title":"Integrate Veil","summary":"Find the right key through an account your users already know. Let them check who signed a message, even if that account is stolen.","documentationUrl":"https://veil.rip/docs"},{"id":"browser-apps","kind":"guide","group":"guides","title":"Call Veil from a website","summary":"Use fetch directly for public reads and message verification.","documentationUrl":"https://veil.rip/docs/browser-apps"},{"id":"message-verification","kind":"guide","group":"guides","title":"Verify a signed message","summary":"Check the exact text, its signing key and that key’s state.","documentationUrl":"https://veil.rip/docs/message-verification"},{"id":"external-keys","kind":"guide","group":"guides","title":"Bring your public keys","summary":"Put the public half of your SSH, PGP, minisign, Ed25519 or ML-DSA keys on your card with a proof anyone can check, then hand them to git, ssh-keygen or gpg.","documentationUrl":"https://veil.rip/docs/external-keys"},{"id":"verify-files","kind":"guide","group":"guides","title":"Verify signed files and releases","summary":"Check a download against the signature beside it and the card that holds the key: in the browser, with the API, or in a GitHub workflow.","documentationUrl":"https://veil.rip/docs/verify-files"},{"id":"cli","kind":"guide","group":"guides","title":"Install the command line tool","summary":"Install veil from the signed apt repository, winget or Homebrew, and check the repository key against the Veil organisation’s card.","documentationUrl":"https://veil.rip/docs/cli"},{"id":"sharing","kind":"guide","group":"guides","title":"Show a card on your site","summary":"Choose a linked badge, an image or a widget that checks the card.","documentationUrl":"https://veil.rip/docs/sharing"},{"id":"discord-app","kind":"guide","group":"guides","title":"Add the Veil app to Discord","summary":"Look up cards and check signed messages in any Discord server or DM.","documentationUrl":"https://veil.rip/docs/discord-app"},{"id":"chat-api","kind":"guide","group":"guides","title":"The Veil chat API","summary":"Read and write the chat at veil.rip/chat/ with the key of a card, and check who signed each message.","documentationUrl":"https://veil.rip/docs/chat-api"},{"id":"chat","kind":"guide","group":"guides","title":"Veil chat: your card is your account","summary":"Talk in servers and channels at veil.rip/chat/, signed in with the card this browser already holds.","documentationUrl":"https://veil.rip/docs/chat"},{"id":"proofs","kind":"guide","group":"guides","title":"Verify a card independently","summary":"Check a card’s signed versions, its place in the log’s index and the witnesses behind the log.","documentationUrl":"https://veil.rip/docs/proofs"},{"id":"signed-requests","kind":"guide","group":"guides","title":"Make a signed request","summary":"Use an authorised device key for changes to cards and organisations.","documentationUrl":"https://veil.rip/docs/signed-requests"},{"id":"limits","kind":"guide","group":"guides","title":"Limits and errors","summary":"Keep requests bounded and follow the response when a call needs to wait.","documentationUrl":"https://veil.rip/docs/limits"},{"id":"api-reference","kind":"guide","group":"guides","title":"API reference","summary":"Public reads, integration resources and requests available to card owners.","documentationUrl":"https://veil.rip/docs/api-reference"},{"id":"api-keys","kind":"guide","group":"guides","title":"Use a developer API key","summary":"Give a server integration a shared allowance without granting authority over a Veil card.","documentationUrl":"https://veil.rip/docs/api-keys"},{"id":"errors","kind":"guide","group":"guides","title":"Responses and errors","summary":"Read HTTP statuses, response fields and stable error codes, then decide whether to correct, retry or stop.","documentationUrl":"https://veil.rip/docs/errors"},{"id":"lookup","kind":"endpoint","group":"cards","title":"Look up a card","summary":"Find the card that holds one exact account, key or fingerprint.","method":"GET","path":"/v1/lookup","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/lookup","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"person-card","kind":"endpoint","group":"cards","title":"Read a person’s card","summary":"Read the full public card, signed record, proof and recent history.","method":"GET","path":"/u/{card}.json","paths":["/u/{card}","/v1/identities/{n}"],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/person-card","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"organisation-card","kind":"endpoint","group":"cards","title":"Read an organisation’s card","summary":"Read an organisation, its signed membership record, public links and proof.","method":"GET","path":"/o/{card}.json","paths":["/o/{card}","/v1/organizations/{n}"],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/organisation-card","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"summary","kind":"endpoint","group":"cards","title":"Read a small card summary","summary":"Get current metadata without downloading signed records, proofs or history.","method":"GET","path":"/v1/identities/{n}/summary","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/summary","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"card-alerts","kind":"endpoint","group":"cards","title":"Read a card’s account alerts","summary":"The alerts in force on the card’s accounts, one per account, and every alert in the log, each with what a client checks it with.","method":"GET","path":"/v1/identities/{n}/alerts","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/card-alerts","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"card-statements","kind":"endpoint","group":"cards","title":"Read a card’s statements","summary":"A card’s signed statements, newest first, each with what a client checks it with. The same address without .json is the page that checks them.","method":"GET","path":"/{kind}/{card}/statements.json","paths":["/{kind}/{card}/statements"],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/card-statements","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"statement","kind":"endpoint","group":"cards","title":"Read one statement","summary":"One signed statement by its id, with its card and, for a retraction, the statement it retracts. /statements/{id} is its page, with a preview and an Article in JSON-LD; add .json for this JSON.","method":"GET","path":"/v1/statements/{id}","paths":["/statements/{id}"],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/statement","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"aliases","kind":"endpoint","group":"cards","title":"Resolve or check an alias","summary":"Check availability and find the permanent card behind a claimed alias.","method":"GET","path":"/v1/aliases/{kind}/{alias}","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/aliases","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"platforms","kind":"endpoint","group":"cards","title":"List account platforms","summary":"Find the supported platforms, proof methods and their current availability.","method":"GET","path":"/v1/platforms","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/platforms","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"key-info","kind":"endpoint","group":"keys","title":"Find the owner of a key","summary":"Look up a public key, the card holding it and its validity period.","method":"GET","path":"/v1/keys/{key}","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/key-info","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"key-at-time","kind":"endpoint","group":"keys","title":"Check when a key could sign","summary":"Ask whether a key was active at a particular time.","method":"GET","path":"/v1/keys/{key}/active-at","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/key-at-time","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"verify-message","kind":"endpoint","group":"keys","title":"Verify a message","summary":"Check a signature block or an explicit key, message and signature. This POST only reads.","method":"POST","path":"/v1/verify","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/verify-message","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"verify-file","kind":"endpoint","group":"keys","title":"Verify a file or a release","summary":"Check the signature of a file from its hash, or of a signed checksum list, against a card’s keys. This POST only reads.","method":"POST","path":"/v1/verify","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/verify-file","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"grant-key","kind":"endpoint","group":"keys","title":"Read the account-proof key","summary":"Read the public key used to sign account-linking grants.","method":"GET","path":"/v1/grant-key","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/grant-key","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"external-keys-file","kind":"endpoint","group":"keys","title":"Get a card’s public keys from elsewhere as a file","summary":"Feed a person’s SSH, minisign and OpenPGP public keys to git, ssh-keygen, a server, minisign or gpg: all of them, or one key by its fingerprint.","method":"GET","path":"/u/{card}/keys.txt","paths":["/u/{card}.keys"],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/external-keys-file","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"versions","kind":"endpoint","group":"history","title":"Read signed versions","summary":"Page through canonical records, signatures and openings.","method":"GET","path":"/v1/identities/{n}/versions","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/versions","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"history","kind":"endpoint","group":"history","title":"Read card history","summary":"Read older version events and the account transfers around them.","method":"GET","path":"/v1/identities/{n}/history","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/history","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"version-proof","kind":"endpoint","group":"history","title":"Read a version’s proof","summary":"Get the inclusion proof for a particular version under the current checkpoint.","method":"GET","path":"/v1/identities/{n}/versions/{k}/proof","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/version-proof","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"events","kind":"endpoint","group":"history","title":"Read account events","summary":"Read takeover and publication-reconciliation events for a card.","method":"GET","path":"/v1/identities/{n}/events","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/events","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"takeovers","kind":"endpoint","group":"history","title":"Read account transfers","summary":"Read account transfer requests involving a card on either side.","method":"GET","path":"/v1/takeovers","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/takeovers","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"authority","kind":"endpoint","group":"history","title":"Read authority versions","summary":"Page through the versions that changed who can sign the card.","method":"GET","path":"/v1/identities/{n}/authority","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/authority","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"statements","kind":"endpoint","group":"history","title":"Read the chain of statements","summary":"Page through a card's counted staff statements after the first page in index.statements.","method":"GET","path":"/v1/identities/{n}/statements","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/statements","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"labels","kind":"endpoint","group":"history","title":"Read version labels","summary":"Read the chain of labels alone, up to 1000 a page.","method":"GET","path":"/v1/identities/{n}/labels","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/labels","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"version-v2","kind":"endpoint","group":"history","title":"Read one version","summary":"Read one version whole: label, body, signature and log position.","method":"GET","path":"/v1/identities/{n}/versions/{v}","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/version-v2","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"set-path","kind":"endpoint","group":"history","title":"Read the path of a state item","summary":"Get the sparse Merkle path of one item, or of its empty place, to update a set root.","method":"GET","path":"/v1/identities/{n}/sets/{set}/path","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/set-path","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"memberships","kind":"endpoint","group":"orgs","title":"Read memberships and invitations","summary":"Read a person’s organisation memberships or an organisation’s members.","method":"GET","path":"/v1/identities/{n}/orgs","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/memberships","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"staff-roles","kind":"endpoint","group":"orgs","title":"Read Veil’s public role matrix","summary":"Identify Veil’s official organisation and the powers of each staff role.","method":"GET","path":"/v1/staff","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/staff-roles","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"moderation","kind":"endpoint","group":"orgs","title":"Read a card’s moderation state","summary":"Read the public status and moderation actions affecting a card.","method":"GET","path":"/v1/identities/{n}/moderation","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/moderation","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"moderation-entries","kind":"endpoint","group":"orgs","title":"Read public moderation entries","summary":"Page through public moderation, badge and badge-removal log entries.","method":"GET","path":"/v1/moderation/entries","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/moderation-entries","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"badge-catalogue","kind":"endpoint","group":"orgs","title":"Read available badge types","summary":"Read badge IDs, labels and assignment rules.","method":"GET","path":"/v1/badges/catalogue","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/badge-catalogue","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"card-badges","kind":"endpoint","group":"orgs","title":"Read a card’s badges","summary":"Read a card’s badges and removed badge history.","method":"GET","path":"/v1/identities/{n}/badges","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/card-badges","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"members","kind":"endpoint","group":"orgs","title":"Read organisation members by page","summary":"Read the members whose position starts with a prefix, with the proof to the members root.","method":"GET","path":"/v1/organizations/{n}/members","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/members","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"canary","kind":"endpoint","group":"orgs","title":"Read the warrant canary","summary":"Get the latest signed statement that no authority has asked Veil in secret for user data, with every earlier one.","method":"GET","path":"/v1/canary","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/canary","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"canary-page","kind":"endpoint","group":"orgs","title":"Open the warrant canary","summary":"Check the warrant canary’s signature in the reader’s browser.","method":"GET","path":"/canary","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/canary-page","supportsBrowserFetch":false,"browserMode":"navigation"},{"id":"oembed","kind":"endpoint","group":"share","title":"Read an oEmbed response","summary":"Get an embeddable card or link preview for a supported Veil URL.","method":"GET","path":"/oembed","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/oembed","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"badge-image","kind":"endpoint","group":"share","title":"Use an SVG badge","summary":"Show a linked status badge in a README, profile or forum signature.","method":"GET","path":"/{kind}/{card}/badge.svg","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/badge-image","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"card-image","kind":"endpoint","group":"share","title":"Use a card preview image","summary":"Read a 1200 by 630 PNG for a card’s social preview.","method":"GET","path":"/{kind}/{card}/card.png","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/card-image","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"contact-file","kind":"endpoint","group":"share","title":"Save a card as a contact","summary":"Download a person’s card as a vCard for a phone or a mail client: the name, the card’s address, the verified accounts and the 12 words.","method":"GET","path":"/u/{card}.vcf","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/contact-file","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"statements-feed","kind":"endpoint","group":"share","title":"Follow a card’s statements","summary":"A card’s latest 50 statements as an Atom feed, for a feed reader, a Discord channel or a page.","method":"GET","path":"/{kind}/{card}/statements.atom","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/statements-feed","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"logo","kind":"endpoint","group":"share","title":"Read a published logo or photo","summary":"Read the image currently published on a person’s or organisation’s card.","method":"GET","path":"/{kind}/{n}/logo.{format}","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/logo","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"widget","kind":"endpoint","group":"share","title":"Embed a verifying widget","summary":"Show a read-only card that verifies itself in the visitor’s browser.","method":"GET","path":"/{kind}/{card}/embed","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/widget","supportsBrowserFetch":false,"browserMode":"frame"},{"id":"embed-loader","kind":"endpoint","group":"share","title":"Load widgets with a script","summary":"Turn data-veil-card and data-veil-org elements into card frames.","method":"GET","path":"/embed.js","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/embed-loader","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"robots","kind":"endpoint","group":"share","title":"Read robots.txt","summary":"What search engines may crawl, and where the sitemap is.","method":"GET","path":"/robots.txt","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/robots","supportsBrowserFetch":false,"browserMode":"local-or-server"},{"id":"sitemap","kind":"endpoint","group":"share","title":"Read the sitemap","summary":"The public pages and cards a search engine may list, each card at its canonical address.","method":"GET","path":"/sitemap.xml","paths":["/sitemaps/pages.xml","/sitemaps/{file}"],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/sitemap","supportsBrowserFetch":false,"browserMode":"local-or-server"},{"id":"preview-image","kind":"endpoint","group":"share","title":"Use Veil’s preview image","summary":"Read the general directory preview image.","method":"GET","path":"/preview.png","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/preview-image","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"verify-page","kind":"endpoint","group":"share","title":"Open browser verification","summary":"Open a message check that runs in the reader’s browser.","method":"GET","path":"/verify","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/verify-page","supportsBrowserFetch":false,"browserMode":"navigation"},{"id":"verify-link","kind":"endpoint","group":"share","title":"Share a verification preview","summary":"Share a signed message with a server-generated social preview.","method":"GET","path":"/v/{n}/{signature}","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/verify-link","supportsBrowserFetch":false,"browserMode":"navigation"},{"id":"snippet-builder","kind":"endpoint","group":"share","title":"Open the snippet builder","summary":"Copy a card link, badge or widget with a live preview.","method":"GET","path":"/embed","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/snippet-builder","supportsBrowserFetch":false,"browserMode":"frame"},{"id":"log-state","kind":"endpoint","group":"log","title":"Read the directory’s log state","summary":"Identify the active log and read the checkpoint and witness state seen by the server.","method":"GET","path":"/v1/log","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/log-state","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"log-about","kind":"endpoint","group":"log","title":"Read a log’s public details","summary":"Read the log origin, verification key, daily request allowance and contact.","method":"GET","path":"/{log}/","paths":[],"access":"public","base":"log","documentationUrl":"https://veil.rip/docs/log-about","supportsBrowserFetch":false,"browserMode":"navigation"},{"id":"log-checkpoint","kind":"endpoint","group":"log","title":"Read a signed checkpoint","summary":"Read the log’s signed size and Merkle root.","method":"GET","path":"/{log}/checkpoint","paths":[],"access":"public","base":"log","documentationUrl":"https://veil.rip/docs/log-checkpoint","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"log-policy","kind":"endpoint","group":"log","title":"Read a witness policy","summary":"Read the log key, witness keys and quorum rule.","method":"GET","path":"/{log}/policy","paths":[],"access":"public","base":"log","documentationUrl":"https://veil.rip/docs/log-policy","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"log-witnesses","kind":"endpoint","group":"log","title":"Read witness cosignatures","summary":"Read each configured witness’s latest stored cosignature.","method":"GET","path":"/{log}/witnesses","paths":[],"access":"public","base":"log","documentationUrl":"https://veil.rip/docs/log-witnesses","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"log-hash-tiles","kind":"endpoint","group":"log","title":"Read Merkle hash tiles","summary":"Read C2SP hash tiles for inclusion and consistency proofs.","method":"GET","path":"/{log}/tile/{level}/{index}","paths":["/{log}/tile/{level}/{index}.p/{width}"],"access":"public","base":"log","documentationUrl":"https://veil.rip/docs/log-hash-tiles","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"log-entry-tiles","kind":"endpoint","group":"log","title":"Read entry bundles","summary":"Read C2SP bundles of public log entries.","method":"GET","path":"/{log}/tile/entries/{index}","paths":["/{log}/tile/entries/{index}.p/{width}"],"access":"public","base":"log","documentationUrl":"https://veil.rip/docs/log-entry-tiles","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"create-person","kind":"endpoint","group":"manage","title":"Create a person’s card","summary":"Publish the first record, signed by the key named in that record.","method":"POST","path":"/v1/identities","paths":[],"access":"signed","base":"directory","documentationUrl":"https://veil.rip/docs/create-person","supportsBrowserFetch":false,"browserMode":"local-or-server"},{"id":"publish-person","kind":"endpoint","group":"manage","title":"Publish a person’s next version","summary":"Change keys, linked accounts, alias or other signed card fields.","method":"POST","path":"/v1/identities/{n}/versions","paths":[],"access":"signed","base":"directory","documentationUrl":"https://veil.rip/docs/publish-person","supportsBrowserFetch":false,"browserMode":"local-or-server"},{"id":"create-organisation","kind":"endpoint","group":"manage","title":"Create an organisation","summary":"Publish an organisation’s first record, signed by its founder’s active person key.","method":"POST","path":"/v1/organizations","paths":[],"access":"signed","base":"directory","documentationUrl":"https://veil.rip/docs/create-organisation","supportsBrowserFetch":false,"browserMode":"local-or-server"},{"id":"publish-organisation","kind":"endpoint","group":"manage","title":"Publish an organisation’s next version","summary":"Publish a change authorised by an accepted owner or administrator. Role rules still apply.","method":"POST","path":"/v1/organizations/{n}/versions","paths":[],"access":"signed","base":"directory","documentationUrl":"https://veil.rip/docs/publish-organisation","supportsBrowserFetch":false,"browserMode":"local-or-server"},{"id":"salt-ticket","kind":"endpoint","group":"manage","title":"Request a first-version salt ticket","summary":"Commit the server’s half of the first-version salt before the device chooses its half.","method":"POST","path":"/v1/salt-tickets","paths":[],"access":"public-write","base":"directory","documentationUrl":"https://veil.rip/docs/salt-ticket","supportsBrowserFetch":false,"browserMode":"local-or-server"},{"id":"start-link","kind":"endpoint","group":"manage","title":"Start an account proof","summary":"Begin OAuth, email, domain or Fediverse proof for a card you can manage.","method":"POST","path":"/v1/links/start","paths":[],"access":"signed","base":"directory","documentationUrl":"https://veil.rip/docs/start-link","supportsBrowserFetch":false,"browserMode":"local-or-server"},{"id":"complete-link","kind":"endpoint","group":"manage","title":"Complete an account proof","summary":"Complete a proof using the same key that started it.","method":"POST","path":"/v1/links/{state}/complete","paths":[],"access":"signed","base":"directory","documentationUrl":"https://veil.rip/docs/complete-link","supportsBrowserFetch":false,"browserMode":"local-or-server"},{"id":"link-state","kind":"endpoint","group":"manage","title":"Read a private proof state","summary":"Resume a proof with its secret state token.","method":"GET","path":"/v1/links/{state}","paths":[],"access":"private-code","base":"directory","documentationUrl":"https://veil.rip/docs/link-state","supportsBrowserFetch":false,"browserMode":"local-or-server"},{"id":"oauth-callback","kind":"endpoint","group":"manage","title":"Return from an OAuth provider","summary":"Receive the redirect from Veil’s configured Discord or GitHub application.","method":"GET","path":"/v1/links/callback/{platform}","paths":[],"access":"provider-callback","base":"directory","documentationUrl":"https://veil.rip/docs/oauth-callback","supportsBrowserFetch":false,"browserMode":"local-or-server"},{"id":"request-device","kind":"endpoint","group":"manage","title":"Request device pairing","summary":"Create a temporary pairing code for a new device’s public key.","method":"POST","path":"/v1/device-requests","paths":[],"access":"public-write","base":"directory","documentationUrl":"https://veil.rip/docs/request-device","supportsBrowserFetch":false,"browserMode":"local-or-server"},{"id":"read-device-request","kind":"endpoint","group":"manage","title":"Read a pairing request","summary":"Read a pairing request with an active person key before adding the new device.","method":"GET","path":"/v1/device-requests/{code}","paths":[],"access":"signed","base":"directory","documentationUrl":"https://veil.rip/docs/read-device-request","supportsBrowserFetch":false,"browserMode":"local-or-server"},{"id":"invite-accept","kind":"endpoint","group":"manage","title":"Accept an organisation invitation","summary":"The invited person signs with an active key. The JSON body contains nonce and timestamp.","method":"POST","path":"/v1/orgs/{n}/invites/{id}/accept","paths":[],"access":"signed","base":"directory","documentationUrl":"https://veil.rip/docs/invite-accept","supportsBrowserFetch":false,"browserMode":"local-or-server"},{"id":"invite-decline","kind":"endpoint","group":"manage","title":"Decline an organisation invitation","summary":"The invited person signs with an active key. The JSON body contains nonce and timestamp.","method":"POST","path":"/v1/orgs/{n}/invites/{id}/decline","paths":[],"access":"signed","base":"directory","documentationUrl":"https://veil.rip/docs/invite-decline","supportsBrowserFetch":false,"browserMode":"local-or-server"},{"id":"cancel-takeover","kind":"endpoint","group":"manage","title":"Cancel an incoming account transfer","summary":"The current account holder signs to cancel an open transfer.","method":"POST","path":"/v1/takeovers/{id}/cancel","paths":[],"access":"signed","base":"directory","documentationUrl":"https://veil.rip/docs/cancel-takeover","supportsBrowserFetch":false,"browserMode":"local-or-server"},{"id":"notices-state","kind":"endpoint","group":"manage","title":"Read a card’s email notices","summary":"An active key of the card reads its opt-in to email notices, with a signed GET.","method":"GET","path":"/v1/identities/{n}/notices","paths":[],"access":"signed","base":"directory","documentationUrl":"https://veil.rip/docs/notices-state","supportsBrowserFetch":false,"browserMode":"local-or-server"},{"id":"notices-set","kind":"endpoint","group":"manage","title":"Turn a card’s email notices on or off","summary":"An active key of the card opts in, with the language of the emails, or opts out. The body is {\"on\": true, \"lang\": \"en\" or \"it\"} or {\"on\": false}, with nonce and timestamp.","method":"PUT","path":"/v1/identities/{n}/notices","paths":[],"access":"signed","base":"directory","documentationUrl":"https://veil.rip/docs/notices-set","supportsBrowserFetch":false,"browserMode":"local-or-server"},{"id":"notices-unsubscribe","kind":"endpoint","group":"manage","title":"Stop the email notices from an email’s link","summary":"Opts a card out with the token of its emails’ stop link, without a key: n and t in the query (a mail program’s one-click POST, RFC 8058) or {\"n\", \"token\"} in the body.","method":"POST","path":"/v1/notices/unsubscribe","paths":[],"access":"public-write","base":"directory","documentationUrl":"https://veil.rip/docs/notices-unsubscribe","supportsBrowserFetch":false,"browserMode":"local-or-server"},{"id":"notices-stop-page","kind":"endpoint","group":"manage","title":"Open an email’s stop link","summary":"The page the email notices link to, to stop them without the card’s key.","method":"GET","path":"/notices/stop","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/notices-stop-page","supportsBrowserFetch":false,"browserMode":"local-or-server"},{"id":"logo-preview-create","kind":"endpoint","group":"manage","title":"Check an image before publishing","summary":"Validate a profile image or organisation logo before including it in a signed record.","method":"POST","path":"/v1/logo-previews","paths":[],"access":"signed","base":"directory","documentationUrl":"https://veil.rip/docs/logo-preview-create","supportsBrowserFetch":false,"browserMode":"local-or-server"},{"id":"logo-preview-read","kind":"endpoint","group":"manage","title":"Read a private image preview","summary":"Read a temporary image using the preview URL returned to its creator.","method":"GET","path":"/v1/logo-previews/{hash}.{format}","paths":[],"access":"private-code","base":"directory","documentationUrl":"https://veil.rip/docs/logo-preview-read","supportsBrowserFetch":false,"browserMode":"local-or-server"},{"id":"request-erasure","kind":"endpoint","group":"manage","title":"Request card erasure","summary":"An active person key or an organisation owner signs the erasure request. There is a 24-hour cancellation window.","method":"POST","path":"/v1/identities/{n}/erase","paths":[],"access":"signed","base":"directory","documentationUrl":"https://veil.rip/docs/request-erasure","supportsBrowserFetch":false,"browserMode":"local-or-server"},{"id":"cancel-erasure","kind":"endpoint","group":"manage","title":"Cancel pending card erasure","summary":"An active authorised key cancels erasure during its cancellation window.","method":"POST","path":"/v1/identities/{n}/erase/cancel","paths":[],"access":"signed","base":"directory","documentationUrl":"https://veil.rip/docs/cancel-erasure","supportsBrowserFetch":false,"browserMode":"local-or-server"},{"id":"publish-alert","kind":"endpoint","group":"manage","title":"Declare an account stolen, abandoned or moved","summary":"The owner signs an alert about one of the card’s linked accounts. From then on every lookup of that account opens with it, until a regained alert ends it.","method":"POST","path":"/v1/identities/{n}/alerts","paths":[],"access":"signed","base":"directory","documentationUrl":"https://veil.rip/docs/publish-alert","supportsBrowserFetch":false,"browserMode":"local-or-server"},{"id":"publish-statement","kind":"endpoint","group":"manage","title":"Publish a signed statement","summary":"A person or an organisation publishes a statement with a title, a text and an optional link, or retracts an earlier one. The log’s witnesses date it.","method":"POST","path":"/v1/identities/{n}/statements","paths":[],"access":"signed","base":"directory","documentationUrl":"https://veil.rip/docs/publish-statement","supportsBrowserFetch":false,"browserMode":"local-or-server"},{"id":"submit-report","kind":"endpoint","group":"manage","title":"Report a card","summary":"An active person key submits a moderation report about a card.","method":"POST","path":"/v1/identities/{n}/reports","paths":[],"access":"signed","base":"directory","documentationUrl":"https://veil.rip/docs/submit-report","supportsBrowserFetch":false,"browserMode":"local-or-server"},{"id":"catalogue","kind":"endpoint","group":"reference","title":"Read the integration catalogue","summary":"Read the guides and endpoint index as JSON.","method":"GET","path":"/v1/integrations","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/catalogue","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"catalogue-entry","kind":"endpoint","group":"reference","title":"Read one documentation entry","summary":"Read one guide or endpoint contract, including examples.","method":"GET","path":"/v1/integrations/{id}","paths":[],"access":"public","base":"directory","documentationUrl":"https://veil.rip/docs/catalogue-entry","supportsBrowserFetch":true,"browserMode":"fetch"},{"id":"developer-account","kind":"endpoint","group":"developer","title":"Read an API owner account","summary":"Read shared limits, quota balances, usage, keys and private activity.","method":"GET","path":"/v1/developer/accounts/{n}","paths":[],"access":"signed","base":"directory","documentationUrl":"https://veil.rip/docs/developer-account","supportsBrowserFetch":false,"browserMode":"local-or-server"},{"id":"developer-keys","kind":"endpoint","group":"developer","title":"List integration keys","summary":"List key metadata without revealing secrets.","method":"GET","path":"/v1/developer/accounts/{n}/keys","paths":[],"access":"signed","base":"directory","documentationUrl":"https://veil.rip/docs/developer-keys","supportsBrowserFetch":false,"browserMode":"local-or-server"},{"id":"create-api-key","kind":"endpoint","group":"developer","title":"Create an integration key","summary":"A person or organisation owner signs the request to issue a secret bearer key.","method":"POST","path":"/v1/developer/accounts/{n}/keys","paths":[],"access":"signed","base":"directory","documentationUrl":"https://veil.rip/docs/create-api-key","supportsBrowserFetch":false,"browserMode":"local-or-server"},{"id":"revoke-api-key","kind":"endpoint","group":"developer","title":"Revoke an integration key","summary":"Permanently stop a key owned by this card.","method":"DELETE","path":"/v1/developer/accounts/{n}/keys/{id}","paths":[],"access":"signed","base":"directory","documentationUrl":"https://veil.rip/docs/revoke-api-key","supportsBrowserFetch":false,"browserMode":"local-or-server"},{"id":"api-key-audit","kind":"endpoint","group":"developer","title":"Read private API-key activity","summary":"Inspect management receipts and the original device signatures.","method":"GET","path":"/v1/developer/accounts/{n}/audit","paths":[],"access":"signed","base":"directory","documentationUrl":"https://veil.rip/docs/api-key-audit","supportsBrowserFetch":false,"browserMode":"local-or-server"},{"id":"rate-limit","kind":"endpoint","group":"developer","title":"Check an API key’s allowance","summary":"Read your current owner and key quotas without spending the primary allowance.","method":"GET","path":"/v1/rate-limit","paths":[],"access":"api-key","base":"directory","documentationUrl":"https://veil.rip/docs/rate-limit","supportsBrowserFetch":false,"browserMode":"local-or-server"}]}