{"openapi":"3.0.3","info":{"title":"Republic bot API","version":"1.0.0","description":"NOT FOR PROFIT civic voting API for an external bot. Create a personal API key on /me. Send Authorization: Bearer rk_… or X-Api-Key. Levels: read, voter, officer. Expiration: 7d, 30d, 90d, 180d, 365d, or never (default 30d).","license":{"name":"AGPL-3.0-or-later"}},"servers":[{"url":"/"}],"tags":[{"name":"Status"},{"name":"Documentation"},{"name":"Sign-in"},{"name":"Profile"},{"name":"API keys"},{"name":"Vote PIN"},{"name":"Identity"},{"name":"Elections"},{"name":"External parties"},{"name":"Jurisdictions"},{"name":"Pages"},{"name":"Terms"},{"name":"Feedback"},{"name":"Receipts"},{"name":"Outcomes"},{"name":"Explorer"},{"name":"Polls"},{"name":"Mail"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"rk_","description":"Personal API key. Example: Authorization: Bearer rk_…"},"apiKeyHeader":{"type":"apiKey","in":"header","name":"X-Api-Key","description":"Personal API key. Same secret as the bearer token."}}},"paths":{"/health":{"get":{"tags":["Status"],"operationId":"get_health","summary":"Process health, writer mode, chain id, and the hourly disclosure window.","description":"Process health, writer mode, chain id, and the hourly disclosure window. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}}}},"/api/health":{"get":{"tags":["Status"],"operationId":"get_api_health","summary":"Same payload as GET /health.","description":"Same payload as GET /health. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}}}},"/api/config":{"get":{"tags":["Status"],"operationId":"get_api_config","summary":"Public Node configuration: voting hostname, chain, polls flag, identity caps, ballot types, receipt portal, and outcome portal.","description":"Public Node configuration: voting hostname, chain, polls flag, identity caps, ballot types, receipt portal, and outcome portal. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}}}},"/api":{"get":{"tags":["Documentation"],"operationId":"get_api","summary":"Human documentation for this bot API. Send Accept: application/json, or ?format=json, for a machine index of the same routes.","description":"Human documentation for this bot API. Send Accept: application/json, or ?format=json, for a machine index of the same routes. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}}}},"/api/openapi.json":{"get":{"tags":["Documentation"],"operationId":"get_api_openapi_json","summary":"OpenAPI 3 description of every route listed here.","description":"OpenAPI 3 description of every route listed here. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}}}},"/api/llms.txt":{"get":{"tags":["Documentation"],"operationId":"get_api_llms_txt","summary":"Plain-text guide for a language model that will call this API.","description":"Plain-text guide for a language model that will call this API. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}}}},"/llms.txt":{"get":{"tags":["Documentation"],"operationId":"get_llms_txt","summary":"Same plain-text guide as GET /api/llms.txt.","description":"Same plain-text guide as GET /api/llms.txt. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}}}},"/api/auth/passkey/register/begin":{"post":{"tags":["Sign-in"],"operationId":"post_api_auth_passkey_register_begin","summary":"Begin WebAuthn registration. An API key is refused here. A bot that already has a key does not need this ceremony.","description":"Begin WebAuthn registration. An API key is refused here. A bot that already has a key does not need this ceremony. An API key is refused. Use a browser session or the sign-in flow. Authentication is optional unless noted. JSON body: handle, acceptedTerms. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":false,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"handle, acceptedTerms"}}}}}},"/api/auth/passkey/register/finish":{"post":{"tags":["Sign-in"],"operationId":"post_api_auth_passkey_register_finish","summary":"Finish WebAuthn registration and start email MFA when MFA is on.","description":"Finish WebAuthn registration and start email MFA when MFA is on. An API key is refused. Use a browser session or the sign-in flow. Authentication is optional unless noted. JSON body: WebAuthn credential, handle, email. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":false,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"WebAuthn credential, handle, email"}}}}}},"/api/auth/passkey/login/begin":{"post":{"tags":["Sign-in"],"operationId":"post_api_auth_passkey_login_begin","summary":"Begin WebAuthn sign-in.","description":"Begin WebAuthn sign-in. An API key is refused. Use a browser session or the sign-in flow. Authentication is optional unless noted. JSON body: handle. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":false,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"handle"}}}}}},"/api/auth/passkey/login/finish":{"post":{"tags":["Sign-in"],"operationId":"post_api_auth_passkey_login_finish","summary":"Finish WebAuthn sign-in. Sets the session cookie after MFA.","description":"Finish WebAuthn sign-in. Sets the session cookie after MFA. An API key is refused. Use a browser session or the sign-in flow. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":false,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}}}},"/api/auth/web3/challenge":{"post":{"tags":["Sign-in"],"operationId":"post_api_auth_web3_challenge","summary":"Issue a sign-in challenge for a bound Ethereum address.","description":"Issue a sign-in challenge for a bound Ethereum address. An API key is refused. Use a browser session or the sign-in flow. Authentication is optional unless noted. JSON body: address. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":false,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"address"}}}}}},"/api/auth/web3/login":{"post":{"tags":["Sign-in"],"operationId":"post_api_auth_web3_login","summary":"Submit the Ethereum signature for that challenge.","description":"Submit the Ethereum signature for that challenge. An API key is refused. Use a browser session or the sign-in flow. Authentication is optional unless noted. JSON body: address, signature. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":false,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"address, signature"}}}}}},"/api/auth/email/start":{"post":{"tags":["Sign-in"],"operationId":"post_api_auth_email_start","summary":"Start email sign-in. The one-time code arrives by transactional email.","description":"Start email sign-in. The one-time code arrives by transactional email. An API key is refused. Use a browser session or the sign-in flow. Authentication is optional unless noted. JSON body: email. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":false,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"email"}}}}}},"/api/auth/smart-card/challenge":{"post":{"tags":["Sign-in"],"operationId":"post_api_auth_smart_card_challenge","summary":"Issue a smart-card sign-in challenge.","description":"Issue a smart-card sign-in challenge. An API key is refused. Use a browser session or the sign-in flow. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":false,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}}}},"/api/auth/smart-card/login":{"post":{"tags":["Sign-in"],"operationId":"post_api_auth_smart_card_login","summary":"Complete smart-card sign-in.","description":"Complete smart-card sign-in. An API key is refused. Use a browser session or the sign-in flow. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":false,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}}}},"/api/auth/civic-id/login":{"post":{"tags":["Sign-in"],"operationId":"post_api_auth_civic_id_login","summary":"Sign in with a hashed driver license or passport already bound to the person.","description":"Sign in with a hashed driver license or passport already bound to the person. An API key is refused. Use a browser session or the sign-in flow. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":false,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}}}},"/api/auth/mfa/status":{"get":{"tags":["Sign-in"],"operationId":"get_api_auth_mfa_status","summary":"Whether email MFA is required and whether SES is configured.","description":"Whether email MFA is required and whether SES is configured. An API key is refused. Use a browser session or the sign-in flow. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":false,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}}}},"/api/auth/mfa/email":{"post":{"tags":["Sign-in"],"operationId":"post_api_auth_mfa_email","summary":"Send or confirm the email factor during sign-in.","description":"Send or confirm the email factor during sign-in. An API key is refused. Use a browser session or the sign-in flow. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":false,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}}}},"/api/auth/mfa/resend":{"post":{"tags":["Sign-in"],"operationId":"post_api_auth_mfa_resend","summary":"Resend the email one-time code.","description":"Resend the email one-time code. An API key is refused. Use a browser session or the sign-in flow. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":false,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}}}},"/api/auth/mfa/verify":{"post":{"tags":["Sign-in"],"operationId":"post_api_auth_mfa_verify","summary":"Verify the email one-time code and receive the session cookie.","description":"Verify the email one-time code and receive the session cookie. An API key is refused. Use a browser session or the sign-in flow. Authentication is optional unless noted. JSON body: code. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":false,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"code"}}}}}},"/api/auth/logout":{"post":{"tags":["Sign-in"],"operationId":"post_api_auth_logout","summary":"End the browser session. An API key is refused here.","description":"End the browser session. An API key is refused here. An API key is refused. Use a browser session or the sign-in flow. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":false,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/auth/session":{"get":{"tags":["Sign-in"],"operationId":"get_api_auth_session","summary":"Session cookie profile. Prefer GET /api/me with an API key.","description":"Session cookie profile. Prefer GET /api/me with an API key. An API key is refused. Use a browser session or the sign-in flow. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":false,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/me":{"get":{"tags":["Profile"],"operationId":"get_api_me","summary":"The signed-in person: handle, role, identity summary, jurisdiction grants, and election registration status. Choice is never included.","description":"The signed-in person: handle, role, identity summary, jurisdiction grants, and election registration status. Choice is never included. Minimum API key level: read. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/session":{"get":{"tags":["Profile"],"operationId":"get_api_session","summary":"Same payload as GET /api/me.","description":"Same payload as GET /api/me. Minimum API key level: read. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/me/contact-email":{"patch":{"tags":["Profile"],"operationId":"patch_api_me_contact_email","summary":"Set or clear the contact email used for operator notices and the API-key alert.","description":"Set or clear the contact email used for operator notices and the API-key alert. Minimum API key level: voter. The account’s own role is still enforced. Caller must be authenticated. JSON body: contactEmail. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"contactEmail"}}}}}},"/api/notifications":{"get":{"tags":["Profile"],"operationId":"get_api_notifications","summary":"In-app notices for this person, newest first.","description":"In-app notices for this person, newest first. Minimum API key level: read. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/notifications/:id/read":{"post":{"tags":["Profile"],"operationId":"post_api_notifications_id_read","summary":"Mark one notice read.","description":"Mark one notice read. Minimum API key level: voter. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/me/api-keys":{"get":{"tags":["API keys"],"operationId":"get_api_me_api_keys","summary":"List this account’s API keys. The secret is never returned. Revoked and expired keys stay in the list.","description":"List this account’s API keys. The secret is never returned. Revoked and expired keys stay in the list. Minimum API key level: read. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]},"post":{"tags":["API keys"],"operationId":"post_api_me_api_keys","summary":"Create a key from a browser session on /me. Body fields: name, level (read, voter, or officer), expiresIn (7d, 30d, 90d, 180d, 365d, or never; default 30d). The secret is displayed once and cannot be retrieved again. The account email says a key was created and does not include the key.","description":"Create a key from a browser session on /me. Body fields: name, level (read, voter, or officer), expiresIn (7d, 30d, 90d, 180d, 365d, or never; default 30d). The secret is displayed once and cannot be retrieved again. The account email says a key was created and does not include the key. An API key is refused. Use a browser session or the sign-in flow. Caller must be authenticated. JSON body: name, level, expiresIn. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":false,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"name, level, expiresIn"}}}}}},"/api/me/api-keys/:id":{"delete":{"tags":["API keys"],"operationId":"delete_api_me_api_keys_id","summary":"Revoke one of this account’s keys. Later calls with that secret are rejected.","description":"Revoke one of this account’s keys. Later calls with that secret are rejected. Minimum API key level: voter. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/me/pin/keypad":{"post":{"tags":["Vote PIN"],"operationId":"post_api_me_pin_keypad","summary":"Issue the scrambled phone keypad used to enter the vote PIN.","description":"Issue the scrambled phone keypad used to enter the vote PIN. Minimum API key level: voter. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/me/pin":{"post":{"tags":["Vote PIN"],"operationId":"post_api_me_pin","summary":"Set the 4–8 digit vote PIN.","description":"Set the 4–8 digit vote PIN. Minimum API key level: voter. The account’s own role is still enforced. Caller must be authenticated. JSON body: pin. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"pin"}}}}}},"/api/me/pin/verify":{"post":{"tags":["Vote PIN"],"operationId":"post_api_me_pin_verify","summary":"Verify the vote PIN and receive a short-lived pinToken for POST /api/elections/:id/vote.","description":"Verify the vote PIN and receive a short-lived pinToken for POST /api/elections/:id/vote. Minimum API key level: voter. The account’s own role is still enforced. Caller must be authenticated. JSON body: pin. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"pin"}}}}}},"/api/me/pin/forgot":{"post":{"tags":["Vote PIN"],"operationId":"post_api_me_pin_forgot","summary":"Start a PIN reset for the signed-in person. Completes with email MFA.","description":"Start a PIN reset for the signed-in person. Completes with email MFA. Minimum API key level: voter. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/pin/forgot":{"post":{"tags":["Vote PIN"],"operationId":"post_api_pin_forgot","summary":"Start a PIN reset from an email address. Sends a one-time code.","description":"Start a PIN reset from an email address. Sends a one-time code. Minimum API key level: voter. The account’s own role is still enforced. Authentication is optional unless noted. JSON body: email. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"email"}}}}}},"/api/identity/methods":{"get":{"tags":["Identity"],"operationId":"get_api_identity_methods","summary":"Identity method types a person may bind: email, passkey, Web3, smart card, driver license, passport.","description":"Identity method types a person may bind: email, passkey, Web3, smart card, driver license, passport. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}}}},"/api/me/identity":{"get":{"tags":["Identity"],"operationId":"get_api_me_identity","summary":"Full identity view for the signed-in person: emails, passkeys, Ethereum addresses, civic credentials. No trapdoor and no PIN.","description":"Full identity view for the signed-in person: emails, passkeys, Ethereum addresses, civic credentials. No trapdoor and no PIN. Minimum API key level: read. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/identity/email/start":{"post":{"tags":["Identity"],"operationId":"post_api_identity_email_start","summary":"Start binding another email. One email is primary. Cap is 5.","description":"Start binding another email. One email is primary. Cap is 5. Minimum API key level: voter. The account’s own role is still enforced. Caller must be authenticated. JSON body: email. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"email"}}}}}},"/api/identity/web3/challenge":{"post":{"tags":["Identity"],"operationId":"post_api_identity_web3_challenge","summary":"Challenge used to prove control of an Ethereum address before it is bound.","description":"Challenge used to prove control of an Ethereum address before it is bound. Minimum API key level: voter. The account’s own role is still enforced. Caller must be authenticated. JSON body: address. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"address"}}}}}},"/api/identity/web3/verify":{"post":{"tags":["Identity"],"operationId":"post_api_identity_web3_verify","summary":"Bind a signature-verified Ethereum address. Only one address is active.","description":"Bind a signature-verified Ethereum address. Only one address is active. Minimum API key level: voter. The account’s own role is still enforced. Caller must be authenticated. JSON body: address, signature. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"address, signature"}}}}}},"/api/identity/smart-card/challenge":{"post":{"tags":["Identity"],"operationId":"post_api_identity_smart_card_challenge","summary":"Challenge for binding a smart card.","description":"Challenge for binding a smart card. Minimum API key level: voter. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/identity/smart-card/verify":{"post":{"tags":["Identity"],"operationId":"post_api_identity_smart_card_verify","summary":"Bind a smart card after the reader signs the challenge.","description":"Bind a smart card after the reader signs the challenge. Minimum API key level: voter. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/identity/civic-id/verify":{"post":{"tags":["Identity"],"operationId":"post_api_identity_civic_id_verify","summary":"Bind a hashed driver license or passport. Images and full document numbers are not stored.","description":"Bind a hashed driver license or passport. Images and full document numbers are not stored. Minimum API key level: voter. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/me/emails":{"get":{"tags":["Identity"],"operationId":"get_api_me_emails","summary":"Email methods on this person.","description":"Email methods on this person. Minimum API key level: read. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/me/emails/primary":{"post":{"tags":["Identity"],"operationId":"post_api_me_emails_primary","summary":"Choose the primary email. Exactly one email is primary.","description":"Choose the primary email. Exactly one email is primary. Minimum API key level: voter. The account’s own role is still enforced. Caller must be authenticated. JSON body: id or email. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"id or email"}}}}}},"/api/me/emails/:id":{"delete":{"tags":["Identity"],"operationId":"delete_api_me_emails_id","summary":"Remove one email method.","description":"Remove one email method. Minimum API key level: voter. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/me/passkeys":{"get":{"tags":["Identity"],"operationId":"get_api_me_passkeys","summary":"Passkeys bound to this person. Cap is 5.","description":"Passkeys bound to this person. Cap is 5. Minimum API key level: read. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/me/passkeys/:credentialId":{"delete":{"tags":["Identity"],"operationId":"delete_api_me_passkeys_credentialId","summary":"Remove one passkey.","description":"Remove one passkey. Minimum API key level: voter. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"credentialId","in":"path","required":true,"schema":{"type":"string"}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/me/eth-accounts":{"get":{"tags":["Identity"],"operationId":"get_api_me_eth_accounts","summary":"Verified Ethereum addresses and which one is active.","description":"Verified Ethereum addresses and which one is active. Minimum API key level: read. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]},"post":{"tags":["Identity"],"operationId":"post_api_me_eth_accounts","summary":"Submit the signature that binds an Ethereum address.","description":"Submit the signature that binds an Ethereum address. Minimum API key level: voter. The account’s own role is still enforced. Caller must be authenticated. JSON body: address, signature. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"address, signature"}}}}}},"/api/me/eth-accounts/active":{"post":{"tags":["Identity"],"operationId":"post_api_me_eth_accounts_active","summary":"Switch the single active Ethereum address.","description":"Switch the single active Ethereum address. Minimum API key level: voter. The account’s own role is still enforced. Caller must be authenticated. JSON body: address. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"address"}}}}}},"/api/me/credentials":{"get":{"tags":["Identity"],"operationId":"get_api_me_credentials","summary":"Smart cards and civic documents on this person.","description":"Smart cards and civic documents on this person. Minimum API key level: read. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/persons/:id/person-key":{"post":{"tags":["Identity"],"operationId":"post_api_persons_id_person_key","summary":"Registrar or clerk binds the person key for someone on their jurisdiction.","description":"Registrar or clerk binds the person key for someone on their jurisdiction. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/persons/:id/methods":{"post":{"tags":["Identity"],"operationId":"post_api_persons_id_methods","summary":"Officer adds an identity method to a person in their jurisdiction.","description":"Officer adds an identity method to a person in their jurisdiction. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/persons/:id/eth-accounts":{"post":{"tags":["Identity"],"operationId":"post_api_persons_id_eth_accounts","summary":"Officer records an Ethereum address on a person.","description":"Officer records an Ethereum address on a person. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. JSON body: address. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"address"}}}}}},"/api/persons/:id/eth-accounts/active":{"post":{"tags":["Identity"],"operationId":"post_api_persons_id_eth_accounts_active","summary":"Officer switches the person’s active Ethereum address.","description":"Officer switches the person’s active Ethereum address. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. JSON body: address. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"address"}}}}}},"/api/persons/:id/identity":{"get":{"tags":["Identity"],"operationId":"get_api_persons_id_identity","summary":"Registrar or clerk reads a person’s identity. A read-only key still needs that officer grant.","description":"Registrar or clerk reads a person’s identity. A read-only key still needs that officer grant. Minimum API key level: read. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/office/credentials":{"get":{"tags":["Identity"],"operationId":"get_api_office_credentials","summary":"Credentials waiting for civil-officer review.","description":"Credentials waiting for civil-officer review. Minimum API key level: read. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/persons/:id/methods/:methodId/review":{"post":{"tags":["Identity"],"operationId":"post_api_persons_id_methods_methodId_review","summary":"Approve or reject a smart card or civic document.","description":"Approve or reject a smart card or civic document. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. JSON body: decision. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}},{"name":"methodId","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"decision"}}}}}},"/api/persons/:id/methods/:methodId/revoke":{"post":{"tags":["Identity"],"operationId":"post_api_persons_id_methods_methodId_revoke","summary":"Revoke an expired card or license. Revocation is an event.","description":"Revoke an expired card or license. Revocation is an event. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}},{"name":"methodId","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/integrations/credentials/status":{"post":{"tags":["Identity"],"operationId":"post_api_integrations_credentials_status","summary":"Credential-provider status callback. Uses the host provider secret header, not a personal API key. An API key is refused.","description":"Credential-provider status callback. Uses the host provider secret header, not a personal API key. An API key is refused. An API key is refused. Use a browser session or the sign-in flow. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":false,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}}}},"/api/elections":{"get":{"tags":["Elections"],"operationId":"get_api_elections","summary":"Published elections. Counts follow the hourly disclosure rule.","description":"Published elections. Counts follow the hourly disclosure rule. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}}},"post":{"tags":["Elections"],"operationId":"post_api_elections","summary":"Clerk creates an election in a jurisdiction they already serve.","description":"Clerk creates an election in a jurisdiction they already serve. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. JSON body: title, jurisdictionId, startTime, cutoffTime, questions or ballot. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"title, jurisdictionId, startTime, cutoffTime, questions or ballot"}}}}}},"/api/elections/:id":{"get":{"tags":["Elections"],"operationId":"get_api_elections_id","summary":"One election. When the caller is signed in, includes that person’s registration status. Choice is never included.","description":"One election. When the caller is signed in, includes that person’s registration status. Choice is never included. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}]},"patch":{"tags":["Elections"],"operationId":"patch_api_elections_id","summary":"Clerk edits the ballot before the roll is frozen.","description":"Clerk edits the ballot before the roll is frozen. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]},"put":{"tags":["Elections"],"operationId":"put_api_elections_id","summary":"Same edit as PATCH.","description":"Same edit as PATCH. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/elections/:id/info":{"get":{"tags":["Elections"],"operationId":"get_api_elections_id_info","summary":"Voter-facing questions, options, and supporting info.","description":"Voter-facing questions, options, and supporting info. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}]}},"/api/elections/:id/info/:questionId/:optionId":{"get":{"tags":["Elections"],"operationId":"get_api_elections_id_info_questionId_optionId","summary":"One option and its external links.","description":"One option and its external links. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}},{"name":"questionId","in":"path","required":true,"schema":{"type":"string","description":"Ballot label or public slug. Not a count of people."}},{"name":"optionId","in":"path","required":true,"schema":{"type":"string","description":"Ballot label or public slug. Not a count of people."}}]}},"/api/elections/:id/results":{"get":{"tags":["Elections"],"operationId":"get_api_elections_id_results","summary":"Certified plurality or IRV results after tally. Empty of option counts before tally.","description":"Certified plurality or IRV results after tally. Empty of option counts before tally. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}]}},"/api/elections/:id/summary":{"get":{"tags":["Elections"],"operationId":"get_api_elections_id_summary","summary":"Short public status: state, window, disclosed ballot count, links.","description":"Short public status: state, window, disclosed ballot count, links. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}]}},"/api/elections/:id/ballots":{"get":{"tags":["Elections"],"operationId":"get_api_elections_id_ballots","summary":"Disclosed ballot proofs for closed hours. Choice is not a field.","description":"Disclosed ballot proofs for closed hours. Choice is not a field. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}]}},"/api/elections/:id/artifacts":{"get":{"tags":["Elections"],"operationId":"get_api_elections_id_artifacts","summary":"Auditor pack: roots, counts, and public checks. No Node private database.","description":"Auditor pack: roots, counts, and public checks. No Node private database. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}]}},"/api/elections/:id/l1":{"get":{"tags":["Elections"],"operationId":"get_api_elections_id_l1","summary":"L1 certification status for the tally, when a tally exists.","description":"L1 certification status for the tally, when a tally exists. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}]}},"/api/elections/:id/tally-key":{"get":{"tags":["Elections"],"operationId":"get_api_elections_id_tally_key","summary":"Public tally ceremony view. The Node does not return a tally private key.","description":"Public tally ceremony view. The Node does not return a tally private key. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}]}},"/api/elections/:id/staff":{"get":{"tags":["Elections"],"operationId":"get_api_elections_id_staff","summary":"Election staff list. Caller must already be staff for that election.","description":"Election staff list. Caller must already be staff for that election. Minimum API key level: read. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]},"post":{"tags":["Elections"],"operationId":"post_api_elections_id_staff","summary":"Platform admin approves election staff.","description":"Platform admin approves election staff. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. JSON body: handle or userId. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"handle or userId"}}}}},"delete":{"tags":["Elections"],"operationId":"delete_api_elections_id_staff","summary":"Platform admin revokes election staff.","description":"Platform admin revokes election staff. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. JSON body: handle or userId. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"handle or userId"}}}}}},"/api/elections/:id/registrations":{"get":{"tags":["Elections"],"operationId":"get_api_elections_id_registrations","summary":"Clerk, registrar, or disqualification officer lists the roll and requests.","description":"Clerk, registrar, or disqualification officer lists the roll and requests. Minimum API key level: read. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/elections/:id/registration-requests":{"get":{"tags":["Elections"],"operationId":"get_api_elections_id_registration_requests","summary":"Clerk or registrar lists registration requests. Filter with ?status=.","description":"Clerk or registrar lists registration requests. Filter with ?status=. Minimum API key level: read. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/elections/:id/register":{"post":{"tags":["Elections"],"operationId":"post_api_elections_id_register","summary":"Voter asks to join the roll. A registrar or clerk of that jurisdiction must approve.","description":"Voter asks to join the roll. A registrar or clerk of that jurisdiction must approve. Minimum API key level: voter. The account’s own role is still enforced. Caller must be authenticated. JSON body: identityCommitment. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"identityCommitment"}}}}}},"/api/elections/:id/registration-requests/:requestId/approve":{"post":{"tags":["Elections"],"operationId":"post_api_elections_id_registration_requests_requestId_approve","summary":"Clerk or registrar approves a registration request and inserts the commitment.","description":"Clerk or registrar approves a registration request and inserts the commitment. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}},{"name":"requestId","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/elections/:id/registration-requests/:requestId/deny":{"post":{"tags":["Elections"],"operationId":"post_api_elections_id_registration_requests_requestId_deny","summary":"Clerk or registrar declines a registration request.","description":"Clerk or registrar declines a registration request. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. JSON body: reason. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}},{"name":"requestId","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"reason"}}}}}},"/api/elections/:id/freeze":{"post":{"tags":["Elections"],"operationId":"post_api_elections_id_freeze","summary":"Clerk freezes the eligible and disqualification roots.","description":"Clerk freezes the eligible and disqualification roots. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/elections/:id/vote":{"post":{"tags":["Elections"],"operationId":"post_api_elections_id_vote","summary":"Submit one ballot. A signed-in voter must send pinToken from POST /api/me/pin/verify. The body is a proof plus ciphertext. Choice is not a public field. The same nullifier is accepted once. A read-only key is refused.","description":"Submit one ballot. A signed-in voter must send pinToken from POST /api/me/pin/verify. The body is a proof plus ciphertext. Choice is not a public field. The same nullifier is accepted once. A read-only key is refused. Minimum API key level: voter. The account’s own role is still enforced. Authentication is optional unless noted. JSON body: proof, public inputs, ciphertext, pinToken, identityCommitment when an external party is active. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"proof, public inputs, ciphertext, pinToken, identityCommitment when an external party is active"}}}}}},"/api/elections/:id/disqualify":{"post":{"tags":["Elections"],"operationId":"post_api_elections_id_disqualify","summary":"Disqualification officer applies a coded reason and an evidence hash.","description":"Disqualification officer applies a coded reason and an evidence hash. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. JSON body: identityCommitment, reasonCode, evidenceHash. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"identityCommitment, reasonCode, evidenceHash"}}}}}},"/api/elections/:id/disqualify/revoke":{"post":{"tags":["Elections"],"operationId":"post_api_elections_id_disqualify_revoke","summary":"Disqualification officer records a revocation event.","description":"Disqualification officer records a revocation event. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/elections/:id/revoke":{"post":{"tags":["Elections"],"operationId":"post_api_elections_id_revoke","summary":"Same revocation event as /disqualify/revoke.","description":"Same revocation event as /disqualify/revoke. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/elections/:id/envelopes":{"get":{"tags":["Elections"],"operationId":"get_api_elections_id_envelopes","summary":"Tally operator reads encrypted envelopes after cutoff. Plaintext choice is not stored.","description":"Tally operator reads encrypted envelopes after cutoff. Plaintext choice is not stored. Minimum API key level: read. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/elections/:id/guardians":{"post":{"tags":["Elections"],"operationId":"post_api_elections_id_guardians","summary":"Tally operator enrolls a guardian in the opens-ballots ceremony. Non-production cryptography.","description":"Tally operator enrolls a guardian in the opens-ballots ceremony. Non-production cryptography. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/elections/:id/guardians/deals":{"post":{"tags":["Elections"],"operationId":"post_api_elections_id_guardians_deals","summary":"Tally operator posts a guardian deal.","description":"Tally operator posts a guardian deal. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/elections/:id/guardians/:index/inbox":{"get":{"tags":["Elections"],"operationId":"get_api_elections_id_guardians_index_inbox","summary":"Encrypted shares addressed to one enrolled guardian index.","description":"Encrypted shares addressed to one enrolled guardian index. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}},{"name":"index","in":"path","required":true,"schema":{"type":"integer","minimum":0}}]}},"/api/elections/:id/guardians/partials":{"post":{"tags":["Elections"],"operationId":"post_api_elections_id_guardians_partials","summary":"Tally operator submits partial decryptions after cutoff.","description":"Tally operator submits partial decryptions after cutoff. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/elections/:id/tally":{"post":{"tags":["Elections"],"operationId":"post_api_elections_id_tally","summary":"Tally operator posts the tally after cutoff. Invented counts that do not match opened ballots are rejected for opens-ballots.","description":"Tally operator posts the tally after cutoff. Invented counts that do not match opened ballots are rejected for opens-ballots. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/elections/:id/certify-l1":{"post":{"tags":["Elections"],"operationId":"post_api_elections_id_certify_l1","summary":"Tally operator asks the Node to mirror the tally to L1 when L1 env is set.","description":"Tally operator asks the Node to mirror the tally to L1 when L1 env is set. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/elections/:id/parties":{"get":{"tags":["External parties"],"operationId":"get_api_elections_id_parties","summary":"External eligibility parties for an election. Endpoint URLs are included only for staff.","description":"External eligibility parties for an election. Endpoint URLs are included only for staff. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}]},"post":{"tags":["External parties"],"operationId":"post_api_elections_id_parties","summary":"Election staff registers an external eligibility party.","description":"Election staff registers an external eligibility party. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. JSON body: name, mode, operatorHandle. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"name, mode, operatorHandle"}}}}}},"/api/elections/:id/parties/check":{"post":{"tags":["External parties"],"operationId":"post_api_elections_id_parties_check","summary":"Staff checks whether a commitment is cleared to cast.","description":"Staff checks whether a commitment is cleared to cast. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. JSON body: identityCommitment. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"identityCommitment"}}}}}},"/api/elections/:id/parties/:partyId":{"patch":{"tags":["External parties"],"operationId":"patch_api_elections_id_parties_partyId","summary":"Staff changes a party status.","description":"Staff changes a party status. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. JSON body: status. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}},{"name":"partyId","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"status"}}}}}},"/api/elections/:id/parties/:partyId/rejections":{"get":{"tags":["External parties"],"operationId":"get_api_elections_id_parties_partyId_rejections","summary":"Staff lists party rejections.","description":"Staff lists party rejections. Minimum API key level: read. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}},{"name":"partyId","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/elections/:id/parties/:partyId/reject":{"post":{"tags":["External parties"],"operationId":"post_api_elections_id_parties_partyId_reject","summary":"Staff or the party operator records a rejection.","description":"Staff or the party operator records a rejection. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. JSON body: identityCommitment, reasonCode, evidenceHash. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}},{"name":"partyId","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"identityCommitment, reasonCode, evidenceHash"}}}}}},"/api/elections/:id/parties/:partyId/clear":{"post":{"tags":["External parties"],"operationId":"post_api_elections_id_parties_partyId_clear","summary":"Staff or the party operator clears a rejection.","description":"Staff or the party operator clears a rejection. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. JSON body: identityCommitment, evidenceHash. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}},{"name":"partyId","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"identityCommitment, evidenceHash"}}}}}},"/api/elections/:id/parties/:partyId/attest":{"post":{"tags":["External parties"],"operationId":"post_api_elections_id_parties_partyId_attest","summary":"Staff or the party operator attests a commitment.","description":"Staff or the party operator attests a commitment. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. JSON body: identityCommitment, expiresAt, evidenceHash. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}},{"name":"partyId","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"identityCommitment, expiresAt, evidenceHash"}}}}}},"/api/jurisdictions":{"get":{"tags":["Jurisdictions"],"operationId":"get_api_jurisdictions","summary":"Jurisdictions on this Node. Officer lists are included only for officers.","description":"Jurisdictions on this Node. Officer lists are included only for officers. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}}},"post":{"tags":["Jurisdictions"],"operationId":"post_api_jurisdictions","summary":"Platform admin creates a jurisdiction.","description":"Platform admin creates a jurisdiction. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. JSON body: name, metadataURI. The Node assigns a UUID id; a caller cannot choose it.. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"name, metadataURI. The Node assigns a UUID id; a caller cannot choose it."}}}}}},"/api/jurisdictions/:id":{"get":{"tags":["Jurisdictions"],"operationId":"get_api_jurisdictions_id","summary":"One jurisdiction.","description":"One jurisdiction. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}]}},"/api/jurisdictions/:id/roles":{"get":{"tags":["Jurisdictions"],"operationId":"get_api_jurisdictions_id_roles","summary":"Officers granted on a jurisdiction. Caller must already be an officer.","description":"Officers granted on a jurisdiction. Caller must already be an officer. Minimum API key level: read. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]},"post":{"tags":["Jurisdictions"],"operationId":"post_api_jurisdictions_id_roles","summary":"Platform admin grants clerk, registrar, disqualification officer, tally operator, or election staff.","description":"Platform admin grants clerk, registrar, disqualification officer, tally operator, or election staff. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. JSON body: role, handle or userId. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"role, handle or userId"}}}}},"delete":{"tags":["Jurisdictions"],"operationId":"delete_api_jurisdictions_id_roles","summary":"Platform admin revokes a jurisdiction grant.","description":"Platform admin revokes a jurisdiction grant. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. JSON body: role, handle or userId. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"role, handle or userId"}}}}}},"/api/admin/roles":{"post":{"tags":["Jurisdictions"],"operationId":"post_api_admin_roles","summary":"Same grant as POST /api/jurisdictions/:id/roles.","description":"Same grant as POST /api/jurisdictions/:id/roles. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. JSON body: jurisdictionId, role, handle or userId. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"jurisdictionId, role, handle or userId"}}}}}},"/api/admin/grant":{"post":{"tags":["Jurisdictions"],"operationId":"post_api_admin_grant","summary":"Alias of POST /api/admin/roles.","description":"Alias of POST /api/admin/roles. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. JSON body: jurisdictionId, role, handle or userId. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"jurisdictionId, role, handle or userId"}}}}}},"/api/users":{"get":{"tags":["Jurisdictions"],"operationId":"get_api_users","summary":"Platform admin lists accounts and their jurisdiction grants. A read-only key may list. It cannot change roles.","description":"Platform admin lists accounts and their jurisdiction grants. A read-only key may list. It cannot change roles. Minimum API key level: read. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/users/:id":{"patch":{"tags":["Jurisdictions"],"operationId":"patch_api_users_id","summary":"Platform admin sets a role the account is already allowed to grant: voter, observer, clerk, registrar, disqualification_officer, tally_operator, or election_staff.","description":"Platform admin sets a role the account is already allowed to grant: voter, observer, clerk, registrar, disqualification_officer, tally_operator, or election_staff. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. JSON body: role. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"role"}}}}}},"/api/reason-codes":{"get":{"tags":["Jurisdictions"],"operationId":"get_api_reason_codes","summary":"Public disqualification reason catalog.","description":"Public disqualification reason catalog. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}}}},"/api/pages":{"get":{"tags":["Pages"],"operationId":"get_api_pages","summary":"Published public pages and the shared-contract site view.","description":"Published public pages and the shared-contract site view. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}}}},"/api/pages/:slug":{"get":{"tags":["Pages"],"operationId":"get_api_pages_slug","summary":"One published page.","description":"One published page. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","description":"Ballot label or public slug. Not a count of people."}}]}},"/api/site":{"get":{"tags":["Pages"],"operationId":"get_api_site","summary":"Public site record, including pinned contract addresses.","description":"Public site record, including pinned contract addresses. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}}}},"/api/office/site":{"get":{"tags":["Pages"],"operationId":"get_api_office_site","summary":"Clerk reads the office site record.","description":"Clerk reads the office site record. Minimum API key level: read. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]},"patch":{"tags":["Pages"],"operationId":"patch_api_office_site","summary":"Clerk pins shared contract addresses. Environment pins win over the stored site.","description":"Clerk pins shared contract addresses. Environment pins win over the stored site. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/office/pages":{"get":{"tags":["Pages"],"operationId":"get_api_office_pages","summary":"Clerk lists CMS pages, including drafts they may edit.","description":"Clerk lists CMS pages, including drafts they may edit. Minimum API key level: read. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]},"post":{"tags":["Pages"],"operationId":"post_api_office_pages","summary":"Clerk creates a page.","description":"Clerk creates a page. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/office/pages/:id":{"get":{"tags":["Pages"],"operationId":"get_api_office_pages_id","summary":"Clerk reads one CMS page.","description":"Clerk reads one CMS page. Minimum API key level: read. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]},"patch":{"tags":["Pages"],"operationId":"patch_api_office_pages_id","summary":"Clerk edits a CMS page.","description":"Clerk edits a CMS page. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]},"delete":{"tags":["Pages"],"operationId":"delete_api_office_pages_id","summary":"Clerk deletes a CMS page.","description":"Clerk deletes a CMS page. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/terms":{"get":{"tags":["Terms"],"operationId":"get_api_terms","summary":"Current Terms of Use metadata and whether the caller has accepted this PDF hash.","description":"Current Terms of Use metadata and whether the caller has accepted this PDF hash. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}}}},"/api/terms.pdf":{"get":{"tags":["Terms"],"operationId":"get_api_terms_pdf","summary":"Terms PDF bytes. SHA-256 is in the X-Pdf-SHA256 header.","description":"Terms PDF bytes. SHA-256 is in the X-Pdf-SHA256 header. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}}}},"/terms.pdf":{"get":{"tags":["Terms"],"operationId":"get_terms_pdf","summary":"Same Terms PDF as GET /api/terms.pdf.","description":"Same Terms PDF as GET /api/terms.pdf. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}}}},"/api/terms/view":{"post":{"tags":["Terms"],"operationId":"post_api_terms_view","summary":"Record that the signed-in person viewed the Terms.","description":"Record that the signed-in person viewed the Terms. Minimum API key level: voter. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}}}},"/api/terms/accept":{"post":{"tags":["Terms"],"operationId":"post_api_terms_accept","summary":"Accept the current Terms. Acceptance stores the SHA-256 of the PDF bytes.","description":"Accept the current Terms. Acceptance stores the SHA-256 of the PDF bytes. Minimum API key level: voter. The account’s own role is still enforced. Caller must be authenticated. JSON body: acceptedTerms. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"acceptedTerms"}}}}}},"/api/feedback":{"get":{"tags":["Feedback"],"operationId":"get_api_feedback","summary":"Feedback form limits, categories, and whether the operator inbox is configured.","description":"Feedback form limits, categories, and whether the operator inbox is configured. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}}},"post":{"tags":["Feedback"],"operationId":"post_api_feedback","summary":"Send one feedback message. This is also how a person contacts support. Rate-limited. A read-only key is refused because the call sends mail.","description":"Send one feedback message. This is also how a person contacts support. Rate-limited. A read-only key is refused because the call sends mail. Minimum API key level: voter. The account’s own role is still enforced. Authentication is optional unless noted. JSON body: category, name, email, message, acceptedTerms. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"category, name, email, message, acceptedTerms"}}}}}},"/api/receipts/metrics":{"get":{"tags":["Receipts"],"operationId":"get_api_receipts_metrics","summary":"Public receipt metrics and hourly turnout. No candidate and no option.","description":"Public receipt metrics and hourly turnout. No candidate and no option. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}}}},"/api/receipts/verify":{"post":{"tags":["Receipts"],"operationId":"post_api_receipts_verify","summary":"Check a hash-only receipt or its locked PDF. Returns whether the ballot counted. Never returns a choice.","description":"Check a hash-only receipt or its locked PDF. Returns whether the ballot counted. Never returns a choice. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. JSON body: proof or receipt text, or PDF bytes. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"proof or receipt text, or PDF bytes"}}}}}},"/api/receipts/email":{"post":{"tags":["Receipts"],"operationId":"post_api_receipts_email","summary":"Email the voter their hash-only receipt after the ballot is accepted.","description":"Email the voter their hash-only receipt after the ballot is accepted. Minimum API key level: voter. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/receipts/pdf":{"post":{"tags":["Receipts"],"operationId":"post_api_receipts_pdf","summary":"Download the locked receipt PDF for a ballot this caller may access.","description":"Download the locked receipt PDF for a ballot this caller may access. Minimum API key level: voter. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/outcomes":{"get":{"tags":["Outcomes"],"operationId":"get_api_outcomes","summary":"Every election grouped before, during, and after voting. No unofficial option counts during the open window.","description":"Every election grouped before, during, and after voting. No unofficial option counts during the open window. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}}}},"/api/outcomes/:id":{"get":{"tags":["Outcomes"],"operationId":"get_api_outcomes_id","summary":"One election’s public outcome monitor.","description":"One election’s public outcome monitor. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}]}},"/api/outcomes/reports":{"get":{"tags":["Outcomes"],"operationId":"get_api_outcomes_reports","summary":"Issued official outcome reports.","description":"Issued official outcome reports. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}}}},"/api/outcomes/reports/:id":{"get":{"tags":["Outcomes"],"operationId":"get_api_outcomes_reports_id","summary":"One official outcome report record.","description":"One official outcome report record. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}]}},"/api/outcomes/reports/:id/pdf":{"get":{"tags":["Outcomes"],"operationId":"get_api_outcomes_reports_id_pdf","summary":"Locked official outcome PDF.","description":"Locked official outcome PDF. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}]}},"/api/outcomes/verify":{"post":{"tags":["Outcomes"],"operationId":"post_api_outcomes_verify","summary":"Check an official outcome PDF was not modified.","description":"Check an official outcome PDF was not modified. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. JSON body: pdf bytes or id. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"pdf bytes or id"}}}}}},"/api/me/outcome-subscriptions":{"get":{"tags":["Outcomes"],"operationId":"get_api_me_outcome_subscriptions","summary":"Elections whose official PDF this person will be emailed. Voting subscribes them by default.","description":"Elections whose official PDF this person will be emailed. Voting subscribes them by default. Minimum API key level: read. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]},"post":{"tags":["Outcomes"],"operationId":"post_api_me_outcome_subscriptions","summary":"Subscribe the caller to an election’s official outcome PDF.","description":"Subscribe the caller to an election’s official outcome PDF. Minimum API key level: voter. The account’s own role is still enforced. Caller must be authenticated. JSON body: electionId. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"electionId"}}}}}},"/api/me/outcome-subscriptions/:electionId":{"put":{"tags":["Outcomes"],"operationId":"put_api_me_outcome_subscriptions_electionId","summary":"Subscribe or confirm a subscription to an official outcome PDF.","description":"Subscribe or confirm a subscription to an official outcome PDF. Minimum API key level: voter. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"electionId","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/admin/outcome-report-template":{"get":{"tags":["Outcomes"],"operationId":"get_api_admin_outcome_report_template","summary":"Platform admin reads the official outcome PDF template. QR and hash seals stay required.","description":"Platform admin reads the official outcome PDF template. QR and hash seals stay required. Minimum API key level: read. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]},"patch":{"tags":["Outcomes"],"operationId":"patch_api_admin_outcome_report_template","summary":"Platform admin edits template copy. QR and hash seals cannot be removed.","description":"Platform admin edits template copy. QR and hash seals cannot be removed. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/admin/outcome-report-template/preview":{"post":{"tags":["Outcomes"],"operationId":"post_api_admin_outcome_report_template_preview","summary":"Platform admin previews the outcome PDF template.","description":"Platform admin previews the outcome PDF template. Minimum API key level: officer. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/explorer/disclosure":{"get":{"tags":["Explorer"],"operationId":"get_api_explorer_disclosure","summary":"Hourly disclosure window the explorer uses.","description":"Hourly disclosure window the explorer uses. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}}}},"/api/explorer/blocks":{"get":{"tags":["Explorer"],"operationId":"get_api_explorer_blocks","summary":"Civic L2 blocks.","description":"Civic L2 blocks. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}}}},"/api/explorer/blocks/:n":{"get":{"tags":["Explorer"],"operationId":"get_api_explorer_blocks_n","summary":"One civic L2 block.","description":"One civic L2 block. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"n","in":"path","required":true,"schema":{"type":"string"}}]}},"/api/explorer/txs/:hash":{"get":{"tags":["Explorer"],"operationId":"get_api_explorer_txs_hash","summary":"One civic L2 transaction. Ballot plaintext is not a field.","description":"One civic L2 transaction. Ballot plaintext is not a field. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"hash","in":"path","required":true,"schema":{"type":"string"}}]}},"/api/explorer/nullifiers/:value":{"get":{"tags":["Explorer"],"operationId":"get_api_explorer_nullifiers_value","summary":"Whether a nullifier was accepted. The nullifier does not reveal the choice or the person.","description":"Whether a nullifier was accepted. The nullifier does not reveal the choice or the person. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"value","in":"path","required":true,"schema":{"type":"string"}}]}},"/api/explorer/search":{"get":{"tags":["Explorer"],"operationId":"get_api_explorer_search","summary":"Search blocks, transactions, and elections.","description":"Search blocks, transactions, and elections. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}}}},"/api/explorer/elections/:id":{"get":{"tags":["Explorer"],"operationId":"get_api_explorer_elections_id","summary":"Explorer view of one election.","description":"Explorer view of one election. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}]}},"/api/explorer/ingest":{"post":{"tags":["Explorer"],"operationId":"post_api_explorer_ingest","summary":"Operator ingest of civic L2 events. Send the host ingest secret in X-Republic-Ingest-Secret. A personal API key does not replace that secret. Minimum key level when a key is also sent: officer.","description":"Operator ingest of civic L2 events. Send the host ingest secret in X-Republic-Ingest-Secret. A personal API key does not replace that secret. Minimum key level when a key is also sent: officer. Minimum API key level: officer. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"officer","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}}}},"/api/polls":{"get":{"tags":["Polls"],"operationId":"get_api_polls","summary":"Token polls when POLLS_ENABLED is on. Polls are signal, not binding elections. Omitted from the Node when the flag is off.","description":"Token polls when POLLS_ENABLED is on. Polls are signal, not binding elections. Omitted from the Node when the flag is off. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}}}},"/api/polls/:id":{"get":{"tags":["Polls"],"operationId":"get_api_polls_id","summary":"One token poll.","description":"One token poll. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}]}},"/api/polls/:id/weight":{"get":{"tags":["Polls"],"operationId":"get_api_polls_id_weight","summary":"Read-only token weight for an address. The Node does not move tokens.","description":"Read-only token weight for an address. The Node does not move tokens. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}]}},"/api/polls/:id/typed-data":{"get":{"tags":["Polls"],"operationId":"get_api_polls_id_typed_data","summary":"EIP-712 typed data a holder signs. Query: address, choices.","description":"EIP-712 typed data a holder signs. Query: address, choices. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}]}},"/api/polls/:id/ballots":{"post":{"tags":["Polls"],"operationId":"post_api_polls_id_ballots","summary":"Submit a signed token-poll ballot. No Republic account is required. A read-only key is refused.","description":"Submit a signed token-poll ballot. No Republic account is required. A read-only key is refused. Minimum API key level: voter. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}]}},"/api/polls/:id/tally":{"post":{"tags":["Polls"],"operationId":"post_api_polls_id_tally","summary":"Any signed-in person may ask the Node to tally a closed token poll. Counts come from accepted ballots.","description":"Any signed-in person may ask the Node to tally a closed token poll. Counts come from accepted ballots. Minimum API key level: voter. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"voter","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/polls/:id/results":{"get":{"tags":["Polls"],"operationId":"get_api_polls_id_results","summary":"Token poll results after tally.","description":"Token poll results after tally. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}]}},"/api/polls/:id/artifacts":{"get":{"tags":["Polls"],"operationId":"get_api_polls_id_artifacts","summary":"Token poll auditor pack.","description":"Token poll auditor pack. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}]}},"/api/polls/:id/ballots.json":{"get":{"tags":["Polls"],"operationId":"get_api_polls_id_ballots_json","summary":"Disclosed token-poll ballots.","description":"Disclosed token-poll ballots. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}]}},"/api/polls/:id/outcome.pdf":{"get":{"tags":["Polls"],"operationId":"get_api_polls_id_outcome_pdf","summary":"Token poll outcome PDF.","description":"Token poll outcome PDF. Minimum API key level: read. The account’s own role is still enforced. Authentication is optional unless noted. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}]}},"/api/mail/templates":{"get":{"tags":["Mail"],"operationId":"get_api_mail_templates","summary":"Platform admin lists operator mail templates stored on the Node. Mail is never written to civic L2.","description":"Platform admin lists operator mail templates stored on the Node. Mail is never written to civic L2. Minimum API key level: read. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/mail/templates/:id":{"get":{"tags":["Mail"],"operationId":"get_api_mail_templates_id","summary":"Platform admin previews one operator mail template, including api_key.created.","description":"Platform admin previews one operator mail template, including api_key.created. Minimum API key level: read. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","description":"Stable mail template name."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/mail/outbox":{"get":{"tags":["Mail"],"operationId":"get_api_mail_outbox","summary":"Platform admin lists queued operator mail. Bodies stay on the detail route.","description":"Platform admin lists queued operator mail. Bodies stay on the detail route. Minimum API key level: read. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}},"/api/mail/outbox/:id":{"get":{"tags":["Mail"],"operationId":"get_api_mail_outbox_id","summary":"Platform admin reads one outbox message, including text and HTML.","description":"Platform admin reads one outbox message, including text and HTML. Minimum API key level: read. The account’s own role is still enforced. Caller must be authenticated. Errors are JSON: { \"error\": string, \"nfp\": true, \"code\"?: string }.","x-republic-min-level":"read","x-republic-api-key":true,"responses":{"200":{"description":"JSON body. nfp is true."},"201":{"description":"Created. JSON body. nfp is true."},"400":{"description":"Invalid request."},"401":{"description":"Missing, revoked, or expired credential."},"403":{"description":"The key level or the account role does not allow this call."},"404":{"description":"Not found."}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UUID. Sequential integers are rejected so the path does not reveal how many records exist."}}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}]}}}}