{"openapi":"3.1.0","info":{"title":"credforge API","version":"1","description":"Create and award Open Badges 3.0 badges from your own systems.\n\n**Authentication.** Create an API key under *Settings → API keys* in the issuer app and send it as `Authorization: Bearer cf_…`. A key belongs to one organization and can only use the operations marked for API keys, with the scopes it was given: `issuer:read`, `achievement:read`, `achievement:write`, `credential:read`, `credential:issue`, `credential:revoke`, `credential:export`, `audit:read`. Requests from the issuer app use its session cookie instead.\n\n**Errors** are `application/problem+json` (RFC 9457) with a machine-readable `code`.\n\n**Rate limits.** Each API key has its own limit per minute; over it, `429` with `Retry-After`. Verification is limited per client IP.\n\n**Pagination** is by cursor: pass the `next` value from one page as `before` (or `after`) for the next.","license":{"name":"Apache-2.0","identifier":"Apache-2.0"}},"servers":[{"url":"https://credforge.app/api/v1"}],"tags":[{"name":"Account"},{"name":"Organizations"},{"name":"Members and invitations"},{"name":"API keys"},{"name":"Issuers"},{"name":"Achievements"},{"name":"Awarded badges"},{"name":"Batches"},{"name":"Exports"},{"name":"Audit log"},{"name":"Verify"},{"name":"Platform"}],"paths":{"/instance":{"get":{"operationId":"getInstance","tags":["Account"],"summary":"How this instance signs people up","description":"No sign-in needed.","security":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstanceInfo"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/me":{"get":{"operationId":"getMe","tags":["Account"],"summary":"The signed-in person, their sign-in methods and memberships","description":"Needs a person signed in.","security":[{"session":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Me"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs":{"post":{"operationId":"postOrgs","tags":["Organizations"],"summary":"Create an organization","description":"With `SIGNUP_MODE=approval` it starts as `pending` until a platform admin approves it.\n\nNeeds a person signed in.","security":[{"session":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120}},"required":["name"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Organization"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}":{"get":{"operationId":"getOrgsByOrgId","tags":["Organizations"],"summary":"The organization, with your role and permissions","description":"A member. Not available to API keys.","security":[{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Organization"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"operationId":"patchOrgsByOrgId","tags":["Organizations"],"summary":"Rename the organization","description":"A member with `org:update`. Not available to API keys.","security":[{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120}},"required":["name"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Organization"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/members":{"get":{"operationId":"getMembers","tags":["Members and invitations"],"summary":"List members","description":"A member with `member:read`. Not available to API keys.","security":[{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"members":{"type":"array","items":{"$ref":"#/components/schemas/Member"}}},"required":["members"],"additionalProperties":false}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/members/{memberId}":{"patch":{"operationId":"patchMembersByMemberId","tags":["Members and invitations"],"summary":"Change a member’s role","description":"A member with `member:manage`. Not available to API keys.","security":[{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"memberId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"role":{"type":"string","enum":["owner","admin","issuer","viewer"]}},"required":["role"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"role":{"type":"string"}},"required":["id","role"],"additionalProperties":false}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"delete":{"operationId":"deleteMembersByMemberId","tags":["Members and invitations"],"summary":"Remove a member, or leave (your own member id)","description":"A member. Not available to API keys.","security":[{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"memberId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Done"},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/invitations":{"get":{"operationId":"getInvitations","tags":["Members and invitations"],"summary":"List open invitations","description":"A member with `member:invite`. Not available to API keys.","security":[{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"invitations":{"type":"array","items":{"$ref":"#/components/schemas/Invitation"}}},"required":["invitations"],"additionalProperties":false}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"operationId":"postInvitations","tags":["Members and invitations"],"summary":"Invite someone by email","description":"A member with `member:invite`. Not available to API keys.","security":[{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","maxLength":254},"role":{"type":"string","enum":["owner","admin","issuer","viewer"]}},"required":["email","role"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invitation"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/invitations/{invitationId}/resend":{"post":{"operationId":"postInvitationsByInvitationIdResend","tags":["Members and invitations"],"summary":"Send an invitation again with a new link","description":"A member with `member:invite`. Not available to API keys.","security":[{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"invitationId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"expiresAt":{"type":"string"}},"required":["id","expiresAt"],"additionalProperties":false}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/invitations/{invitationId}":{"delete":{"operationId":"deleteInvitationsByInvitationId","tags":["Members and invitations"],"summary":"Withdraw an invitation","description":"A member with `member:invite`. Not available to API keys.","security":[{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"invitationId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Done"},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/invitations/{token}":{"get":{"operationId":"getInvitationsByToken","tags":["Members and invitations"],"summary":"Preview an invitation from its link","description":"No sign-in needed.","security":[],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationPreview"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/invitations/{token}/accept":{"post":{"operationId":"postInvitationsByTokenAccept","tags":["Members and invitations"],"summary":"Accept an invitation from its link","description":"Needs a person signed in.","security":[{"session":[]}],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"org":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"}},"required":["id","name"],"additionalProperties":false},"role":{"type":"string"}},"required":["org","role"],"additionalProperties":false}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/me/invitations/{invitationId}/accept":{"post":{"operationId":"postMeInvitationsByInvitationIdAccept","tags":["Members and invitations"],"summary":"Accept an invitation to your confirmed address","description":"Needs a person signed in.","security":[{"session":[]}],"parameters":[{"name":"invitationId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"org":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"}},"required":["id","name"],"additionalProperties":false},"role":{"type":"string"}},"required":["org","role"],"additionalProperties":false}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/api-keys":{"get":{"operationId":"getApiKeys","tags":["API keys"],"summary":"List API keys (including revoked ones)","description":"A member with `api_key:manage`. Not available to API keys.","security":[{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"apiKeys":{"type":"array","items":{"$ref":"#/components/schemas/ApiKey"}}},"required":["apiKeys"],"additionalProperties":false}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"operationId":"postApiKeys","tags":["API keys"],"summary":"Create an API key","description":"The response holds the whole key. It is never shown again; only its hash is kept.\n\nA member with `api_key:manage`. Not available to API keys.","security":[{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"scopes":{"minItems":1,"type":"array","items":{"type":"string","enum":["issuer:read","achievement:read","achievement:write","credential:read","credential:issue","credential:revoke","credential:export","audit:read"]}},"expiresInDays":{"anyOf":[{"type":"integer","minimum":1,"maximum":730},{"type":"null"}]}},"required":["name","scopes"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatedApiKey"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/api-keys/{keyId}":{"delete":{"operationId":"deleteApiKeysByKeyId","tags":["API keys"],"summary":"Revoke an API key","description":"It stops working at once. The key stays listed as revoked.\n\nA member with `api_key:manage`. Not available to API keys.","security":[{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"keyId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Revoked"},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/issuers":{"get":{"operationId":"getIssuers","tags":["Issuers"],"summary":"List issuer profiles","description":"A member with `issuer:read`, or an API key with that scope.","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"issuers":{"type":"array","items":{"$ref":"#/components/schemas/Issuer"}}},"required":["issuers"],"additionalProperties":false}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"operationId":"postIssuers","tags":["Issuers"],"summary":"Create an issuer profile (with its signing key)","description":"A member with `issuer:create`. Not available to API keys.","security":[{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"url":{"type":"string","maxLength":2000},"email":{"type":"string","maxLength":254},"description":{"type":"string","maxLength":2000}},"required":["name"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Issuer"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/issuers/{issuerId}":{"get":{"operationId":"getIssuersByIssuerId","tags":["Issuers"],"summary":"Get an issuer profile","description":"A member with `issuer:read`, or an API key with that scope.","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"issuerId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Issuer"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"operationId":"patchIssuersByIssuerId","tags":["Issuers"],"summary":"Change an issuer profile","description":"Badges already awarded keep the profile they were signed with.\n\nA member with `issuer:update`. Not available to API keys.","security":[{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"issuerId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"url":{"type":"string","maxLength":2000},"email":{"type":"string","maxLength":254},"description":{"type":"string","maxLength":2000}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Issuer"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/issuers/{issuerId}/logo":{"put":{"operationId":"putIssuersByIssuerIdLogo","tags":["Issuers"],"summary":"Upload the issuer’s logo","description":"A member with `issuer:update`. Not available to API keys.","security":[{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"issuerId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"image/png":{"schema":{"type":"string","contentMediaType":"image/png","description":"The image itself as the request body, up to 2 MB. JPEG and WebP become PNG; SVGs are sanitized."}},"image/svg+xml":{"schema":{"type":"string","contentMediaType":"image/svg+xml","description":"The image itself as the request body, up to 2 MB. JPEG and WebP become PNG; SVGs are sanitized."}},"image/jpeg":{"schema":{"type":"string","contentMediaType":"image/jpeg","description":"The image itself as the request body, up to 2 MB. JPEG and WebP become PNG; SVGs are sanitized."}},"image/webp":{"schema":{"type":"string","contentMediaType":"image/webp","description":"The image itself as the request body, up to 2 MB. JPEG and WebP become PNG; SVGs are sanitized."}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Issuer"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"delete":{"operationId":"deleteIssuersByIssuerIdLogo","tags":["Issuers"],"summary":"Remove the issuer’s logo","description":"A member with `issuer:update`. Not available to API keys.","security":[{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"issuerId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Issuer"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/issuers/{issuerId}/domain-verification":{"post":{"operationId":"postIssuersByIssuerIdDomainVerification","tags":["Issuers"],"summary":"Get the DNS record or file that verifies the website’s domain","description":"A member with `issuer:update`. Not available to API keys.","security":[{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"issuerId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainVerification"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/issuers/{issuerId}/domain-verification/check":{"post":{"operationId":"postIssuersByIssuerIdDomainVerificationCheck","tags":["Issuers"],"summary":"Check the DNS record or file now","description":"A member with `issuer:update`. Not available to API keys.","security":[{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"issuerId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainCheckResult"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/achievements":{"get":{"operationId":"getAchievements","tags":["Achievements"],"summary":"List achievements","description":"A member with `achievement:read`, or an API key with that scope.","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["draft","active","archived"]}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"achievements":{"type":"array","items":{"$ref":"#/components/schemas/Achievement"}}},"required":["achievements"],"additionalProperties":false}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"operationId":"postAchievements","tags":["Achievements"],"summary":"Create an achievement (a draft)","description":"A member with `achievement:write`, or an API key with that scope.","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","minLength":1,"maxLength":4000},"criteriaNarrative":{"type":"string","maxLength":10000},"criteriaUrl":{"type":"string","maxLength":2000},"achievementType":{"type":"string"},"tags":{"maxItems":20,"type":"array","items":{"type":"string","minLength":1,"maxLength":60}},"alignments":{"maxItems":20,"type":"array","items":{"type":"object","properties":{"targetName":{"type":"string","minLength":1,"maxLength":200},"targetUrl":{"type":"string","minLength":1,"maxLength":2000},"targetDescription":{"type":"string","maxLength":1000},"targetFramework":{"type":"string","maxLength":200},"targetCode":{"type":"string","maxLength":100},"targetType":{"type":"string"}},"required":["targetName","targetUrl"]}},"validForDays":{"anyOf":[{"type":"integer","minimum":1,"maximum":36500},{"type":"null"}]}},"required":["name","description"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Achievement"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/achievements/{achievementId}":{"get":{"operationId":"getAchievementsByAchievementId","tags":["Achievements"],"summary":"Get an achievement","description":"A member with `achievement:read`, or an API key with that scope.","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"achievementId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Achievement"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"operationId":"patchAchievementsByAchievementId","tags":["Achievements"],"summary":"Change an achievement","description":"A change to a signed field adds a revision. Badges already awarded don’t change.\n\nA member with `achievement:write`, or an API key with that scope.","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"achievementId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","minLength":1,"maxLength":4000},"criteriaNarrative":{"type":"string","maxLength":10000},"criteriaUrl":{"type":"string","maxLength":2000},"achievementType":{"type":"string"},"tags":{"maxItems":20,"type":"array","items":{"type":"string","minLength":1,"maxLength":60}},"alignments":{"maxItems":20,"type":"array","items":{"type":"object","properties":{"targetName":{"type":"string","minLength":1,"maxLength":200},"targetUrl":{"type":"string","minLength":1,"maxLength":2000},"targetDescription":{"type":"string","maxLength":1000},"targetFramework":{"type":"string","maxLength":200},"targetCode":{"type":"string","maxLength":100},"targetType":{"type":"string"}},"required":["targetName","targetUrl"]}},"validForDays":{"anyOf":[{"type":"integer","minimum":1,"maximum":36500},{"type":"null"}]}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Achievement"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"delete":{"operationId":"deleteAchievementsByAchievementId","tags":["Achievements"],"summary":"Delete a draft achievement","description":"A member with `achievement:write`, or an API key with that scope.","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"achievementId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Deleted"},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/achievements/{achievementId}/image":{"put":{"operationId":"putAchievementsByAchievementIdImage","tags":["Achievements"],"summary":"Upload the badge image","description":"A member with `achievement:write`, or an API key with that scope.","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"achievementId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"image/png":{"schema":{"type":"string","contentMediaType":"image/png","description":"The image itself as the request body, up to 2 MB. JPEG and WebP become PNG; SVGs are sanitized."}},"image/svg+xml":{"schema":{"type":"string","contentMediaType":"image/svg+xml","description":"The image itself as the request body, up to 2 MB. JPEG and WebP become PNG; SVGs are sanitized."}},"image/jpeg":{"schema":{"type":"string","contentMediaType":"image/jpeg","description":"The image itself as the request body, up to 2 MB. JPEG and WebP become PNG; SVGs are sanitized."}},"image/webp":{"schema":{"type":"string","contentMediaType":"image/webp","description":"The image itself as the request body, up to 2 MB. JPEG and WebP become PNG; SVGs are sanitized."}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Achievement"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/achievements/{achievementId}/publish":{"post":{"operationId":"postAchievementsByAchievementIdPublish","tags":["Achievements"],"summary":"Publish a draft so it can be awarded","description":"A member with `achievement:write`, or an API key with that scope.","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"achievementId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Achievement"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/achievements/{achievementId}/archive":{"post":{"operationId":"postAchievementsByAchievementIdArchive","tags":["Achievements"],"summary":"Stop awarding an achievement (its page stays up)","description":"A member with `achievement:write`, or an API key with that scope.","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"achievementId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Achievement"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/achievements/{achievementId}/restore":{"post":{"operationId":"postAchievementsByAchievementIdRestore","tags":["Achievements"],"summary":"Award an archived achievement again","description":"A member with `achievement:write`, or an API key with that scope.","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"achievementId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Achievement"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/achievements/{achievementId}/revisions":{"get":{"operationId":"getAchievementsByAchievementIdRevisions","tags":["Achievements"],"summary":"List an achievement’s revisions","description":"A member with `achievement:read`, or an API key with that scope.","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"achievementId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"revisions":{"type":"array","items":{"$ref":"#/components/schemas/AchievementRevision"}}},"required":["revisions"],"additionalProperties":false}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/credentials":{"get":{"operationId":"getCredentials","tags":["Awarded badges"],"summary":"Search awarded badges (newest first)","description":"A member with `credential:read`, or an API key with that scope.","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":200}},{"name":"achievementId","in":"query","required":false,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["valid","not_yet_valid","expired","revoked"]}},{"name":"batchId","in":"query","required":false,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"name":"from","in":"query","required":false,"schema":{"type":"string"}},{"name":"to","in":"query","required":false,"schema":{"type":"string"}},{"name":"before","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"default":25,"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CredentialPage"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"operationId":"postCredentials","tags":["Awarded badges"],"summary":"Award a badge to one person","description":"Signs an Open Badges 3.0 credential and, unless `sendEmail` is false, emails the recipient their claim link. Counts against the daily email cap.\n\nA member with `credential:issue`, or an API key with that scope.","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"achievementId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"recipient":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"email":{"type":"string","maxLength":254}},"required":["name","email"]},"issuedOn":{"type":"string"},"expiresOn":{"type":["string","null"]},"evidence":{"maxItems":5,"type":"array","items":{"type":"object","properties":{"url":{"type":"string","maxLength":2000},"name":{"type":"string","maxLength":200},"narrative":{"type":"string","maxLength":4000}}}},"sendEmail":{"type":"boolean"}},"required":["achievementId","recipient"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Credential"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/credentials/preview":{"post":{"operationId":"postCredentialsPreview","tags":["Awarded badges"],"summary":"What the award email would say (signs nothing)","description":"A member with `credential:issue`, or an API key with that scope.","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"achievementId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"recipient":{"type":"object","properties":{"name":{"type":"string","maxLength":200}}}},"required":["achievementId"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AwardPreview"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/credentials/{credentialId}":{"get":{"operationId":"getCredentialsByCredentialId","tags":["Awarded badges"],"summary":"Get an awarded badge, its signed credential and its emails","description":"A member with `credential:read`, or an API key with that scope.","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"credentialId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Credential"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/credentials/{credentialId}/resend":{"post":{"operationId":"postCredentialsByCredentialIdResend","tags":["Awarded badges"],"summary":"Email the claim link again (a new link; the old one stops working)","description":"A member with `credential:issue`, or an API key with that scope.","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"credentialId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Credential"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/credentials/{credentialId}/revoke":{"post":{"operationId":"postCredentialsByCredentialIdRevoke","tags":["Awarded badges"],"summary":"Revoke a badge","description":"Its status list is re-signed a few seconds later.\n\nA member with `credential:revoke`, or an API key with that scope.","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"credentialId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reason":{"type":"string","minLength":1,"maxLength":1000},"publicReason":{"type":"string","maxLength":500}},"required":["reason"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Credential"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/credentials/revoke":{"post":{"operationId":"postCredentialsRevoke","tags":["Awarded badges"],"summary":"Revoke up to 500 badges","description":"A member with `credential:revoke`, or an API key with that scope.","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reason":{"type":"string","minLength":1,"maxLength":1000},"publicReason":{"type":"string","maxLength":500},"credentialIds":{"minItems":1,"maxItems":500,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["reason","credentialIds"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkRevokeResult"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/credentials/{credentialId}/reissue":{"post":{"operationId":"postCredentialsByCredentialIdReissue","tags":["Awarded badges"],"summary":"Replace a badge with a corrected copy","description":"Needs `credential:issue` and `credential:revoke`. The old badge is revoked as superseded.\n\nA member with `credential:issue`, or an API key with that scope.","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"credentialId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"recipient":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"email":{"type":"string","maxLength":254}}},"issuedOn":{"type":"string"},"expiresOn":{"type":["string","null"]},"evidence":{"maxItems":5,"type":"array","items":{"type":"object","properties":{"url":{"type":"string","maxLength":2000},"name":{"type":"string","maxLength":200},"narrative":{"type":"string","maxLength":4000}}}},"sendEmail":{"type":"boolean"},"reason":{"type":"string","maxLength":1000}}}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Credential"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/credentials/{credentialId}/erasure":{"get":{"operationId":"getCredentialsByCredentialIdErasure","tags":["Awarded badges"],"summary":"What erasing this badge’s recipient would cover","description":"Every badge the organization awarded to the same email address, the badges linked to those by a reissue, and the CSV rows holding the address.\n\nA member with `recipient:erase`. Not available to API keys.","security":[{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"credentialId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecipientErasurePreview"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"operationId":"postCredentialsByCredentialIdErasure","tags":["Awarded badges"],"summary":"Erase the recipient’s data (can’t be undone)","description":"Revokes the badges that are still valid (they stay revoked: copies keep verifying as revoked), removes the signed credentials, the name and email address from badges, emails and CSV rows, deletes the uploaded CSV files, and makes what the audit log says about the person unreadable. The badges’ pages answer 410 Gone. 409 `already_erased` when nothing is left to erase.\n\nA member with `recipient:erase`. Not available to API keys.","security":[{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"credentialId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecipientErasureResult"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/batches":{"get":{"operationId":"getBatches","tags":["Batches"],"summary":"List batches (newest first)","description":"A member with `credential:read`, or an API key with that scope.","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"before","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"default":20,"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchPage"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"operationId":"postBatches","tags":["Batches"],"summary":"Upload a CSV file or JSON rows (a draft)","description":"Send a CSV file as the raw body (`Content-Type: text/csv`, with `achievementId` and an optional `fileName` in the query), or JSON rows. Up to 10,000 rows and 5 MB. Nothing is awarded until the batch is confirmed.\n\nA member with `credential:issue`, or an API key with that scope.","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"achievementId","in":"query","required":false,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"name":"fileName","in":"query","required":false,"schema":{"type":"string","maxLength":200}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"achievementId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"rows":{"minItems":1,"maxItems":10000,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","maxLength":2000},"email":{"type":"string","maxLength":2000},"issuedOn":{"type":"string","maxLength":2000},"expiresOn":{"type":"string","maxLength":2000},"evidenceUrl":{"type":"string","maxLength":2000},"custom":{"type":"object","propertyNames":{"type":"string","maxLength":100},"additionalProperties":{"type":"string","maxLength":2000}}},"required":["name","email"]}},"sendEmail":{"type":"boolean"},"awardExisting":{"type":"boolean"}},"required":["achievementId","rows"]}},"text/csv":{"schema":{"type":"string","contentMediaType":"text/csv","description":"The CSV file"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Batch"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/batches/template.csv":{"get":{"operationId":"getBatchesTemplateCsv","tags":["Batches"],"summary":"A CSV template","description":"A member with `credential:read`, or an API key with that scope.","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The template","content":{"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/batches/{batchId}":{"get":{"operationId":"getBatchesByBatchId","tags":["Batches"],"summary":"Get a batch, its counts and what confirming would do","description":"A member with `credential:read`, or an API key with that scope.","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"batchId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Batch"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"operationId":"patchBatchesByBatchId","tags":["Batches"],"summary":"Change a draft batch: columns, header line, options","description":"A member with `credential:issue`, or an API key with that scope.","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"batchId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"achievementId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"hasHeader":{"type":"boolean"},"columns":{"maxItems":50,"type":"array","items":{"type":"string","enum":["name","firstName","lastName","email","issuedOn","expiresOn","evidenceUrl","custom","ignore"]}},"sendEmail":{"type":"boolean"},"awardExisting":{"type":"boolean"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Batch"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"delete":{"operationId":"deleteBatchesByBatchId","tags":["Batches"],"summary":"Discard a draft batch","description":"A member with `credential:issue`, or an API key with that scope.","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"batchId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Discarded"},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/batches/{batchId}/confirm":{"post":{"operationId":"postBatchesByBatchIdConfirm","tags":["Batches"],"summary":"Award the batch","description":"Refused with 429 `send_limit_reached` when its emails would pass the daily cap; nothing is half sent.\n\nA member with `credential:issue`, or an API key with that scope.","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"batchId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Batch"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/batches/{batchId}/rows":{"get":{"operationId":"getBatchesByBatchIdRows","tags":["Batches"],"summary":"A batch’s rows and the problems found in them","description":"A member with `credential:read`, or an API key with that scope.","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"batchId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"validation","in":"query","required":false,"schema":{"type":"string","enum":["ready","invalid","duplicate","existing"]}},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["draft","pending","issued","failed","skipped"]}},{"name":"after","in":"query","required":false,"schema":{"type":"integer","minimum":0,"maximum":9007199254740991}},{"name":"limit","in":"query","required":false,"schema":{"default":100,"type":"integer","minimum":1,"maximum":500}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchRowPage"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/batches/{batchId}/results.csv":{"get":{"operationId":"getBatchesByBatchIdResultsCsv","tags":["Batches"],"summary":"Each row’s result as CSV","description":"A member with `credential:read`, or an API key with that scope.","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"batchId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Results","content":{"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/exports/credentials.csv":{"get":{"operationId":"getExportsCredentialsCsv","tags":["Exports"],"summary":"Export awarded badges as CSV","description":"A member with `credential:export`, or an API key with that scope.","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":200}},{"name":"achievementId","in":"query","required":false,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["valid","not_yet_valid","expired","revoked"]}},{"name":"batchId","in":"query","required":false,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"name":"from","in":"query","required":false,"schema":{"type":"string"}},{"name":"to","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Streamed CSV","content":{"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/exports/credentials.jsonl":{"get":{"operationId":"getExportsCredentialsJsonl","tags":["Exports"],"summary":"Export awarded badges as JSON Lines, with the signed credentials","description":"A member with `credential:export`, or an API key with that scope.","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":200}},{"name":"achievementId","in":"query","required":false,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["valid","not_yet_valid","expired","revoked"]}},{"name":"batchId","in":"query","required":false,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"name":"from","in":"query","required":false,"schema":{"type":"string"}},{"name":"to","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Streamed JSON Lines","content":{"application/jsonl":{"schema":{"type":"string"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/exports/audit-events.csv":{"get":{"operationId":"getExportsAuditEventsCsv","tags":["Exports"],"summary":"Export the audit log as CSV","description":"A member with `audit:read`, or an API key with that scope.","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Streamed CSV","content":{"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/exports/audit-events.jsonl":{"get":{"operationId":"getExportsAuditEventsJsonl","tags":["Exports"],"summary":"Export the audit log as JSON Lines","description":"A member with `audit:read`, or an API key with that scope.","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Streamed JSON Lines","content":{"application/jsonl":{"schema":{"type":"string"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/orgs/{orgId}/audit-events":{"get":{"operationId":"getAuditEvents","tags":["Audit log"],"summary":"Read the audit log (newest first)","description":"A member with `audit:read`, or an API key with that scope.","security":[{"apiKey":[]},{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"before","in":"query","required":false,"schema":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},{"name":"limit","in":"query","required":false,"schema":{"default":50,"type":"integer","minimum":1,"maximum":200}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditEventPage"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/verify":{"post":{"operationId":"postVerify","tags":["Verify"],"summary":"Verify an Open Badges 3.0 credential","description":"Give a URL, the credential’s JSON, or a baked PNG/SVG (base64, or the raw body with `Content-Type: image/png` or `image/svg+xml`). Nothing about the request is stored. Rate limited per client IP.\n\nNo sign-in needed.","security":[],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","maxLength":2000},"credential":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"string","maxLength":1000000}]},"image":{"type":"string","maxLength":8000000},"email":{"type":"string","maxLength":254}}}},"image/png":{"schema":{"type":"string","contentMediaType":"image/png","description":"A baked badge image"}},"image/svg+xml":{"schema":{"type":"string","contentMediaType":"image/svg+xml","description":"A baked badge image"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyResult"}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/platform/orgs":{"get":{"operationId":"getPlatformOrgs","tags":["Platform"],"summary":"Organizations, by status","description":"Needs a platform admin signed in.","security":[{"session":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["pending","active","suspended","declined"]}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"orgs":{"type":"array","items":{"$ref":"#/components/schemas/PlatformOrg"}}},"required":["orgs"],"additionalProperties":false}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/platform/orgs/{orgId}/approve":{"post":{"operationId":"postPlatformOrgsByOrgIdApprove","tags":["Platform"],"summary":"Approve an organization","description":"Needs a platform admin signed in.","security":[{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reason":{"type":"string","maxLength":1000}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"status":{"type":"string"},"statusReason":{"type":["string","null"]}},"required":["id","status","statusReason"],"additionalProperties":false}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/platform/orgs/{orgId}/decline":{"post":{"operationId":"postPlatformOrgsByOrgIdDecline","tags":["Platform"],"summary":"Decline an organization","description":"Needs a platform admin signed in.","security":[{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reason":{"type":"string","maxLength":1000}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"status":{"type":"string"},"statusReason":{"type":["string","null"]}},"required":["id","status","statusReason"],"additionalProperties":false}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/platform/orgs/{orgId}/suspend":{"post":{"operationId":"postPlatformOrgsByOrgIdSuspend","tags":["Platform"],"summary":"Suspend an organization","description":"Needs a platform admin signed in.","security":[{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reason":{"type":"string","maxLength":1000}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"status":{"type":"string"},"statusReason":{"type":["string","null"]}},"required":["id","status","statusReason"],"additionalProperties":false}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/platform/orgs/{orgId}/reinstate":{"post":{"operationId":"postPlatformOrgsByOrgIdReinstate","tags":["Platform"],"summary":"Reinstate an organization","description":"Needs a platform admin signed in.","security":[{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reason":{"type":"string","maxLength":1000}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"status":{"type":"string"},"statusReason":{"type":["string","null"]}},"required":["id","status","statusReason"],"additionalProperties":false}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/platform/orgs/{orgId}/limits":{"patch":{"operationId":"patchPlatformOrgsByOrgIdLimits","tags":["Platform"],"summary":"Set an organization’s daily email cap","description":"Needs a platform admin signed in.","security":[{"session":[]}],"parameters":[{"name":"orgId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"dailySendLimit":{"anyOf":[{"type":"integer","minimum":0,"maximum":1000000},{"type":"null"}]}},"required":["dailySendLimit"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"dailySendLimit":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"defaultDailySendLimit":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["id","dailySendLimit","defaultDailySendLimit"],"additionalProperties":false}}}},"400":{"description":"Invalid input (`validation_failed`, with field errors)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Not signed in, or the API key is unknown, revoked or expired","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Not allowed (role, key scope, org status, or an endpoint API keys can’t use)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found (also for organizations you aren’t a member of)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Too many requests (`rate_limited`, with `Retry-After`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}}},"components":{"schemas":{"Problem":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"code":{"type":"string","description":"Machine-readable reason, e.g. `validation_failed`"},"errors":{"description":"Field errors for `validation_failed`: dotted path → message","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}},"required":["type","title","status","code"],"additionalProperties":false,"description":"An RFC 9457 problem (`application/problem+json`)."},"InstanceInfo":{"type":"object","properties":{"signupMode":{"type":"string","enum":["approval","open","invite"]},"providers":{"type":"object","properties":{"google":{"type":"boolean"},"microsoft":{"type":"boolean"}},"required":["google","microsoft"],"additionalProperties":false},"requireMfaForAdmins":{"type":"boolean"}},"required":["signupMode","providers","requireMfaForAdmins"],"additionalProperties":false},"Me":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"email":{"type":"string"},"emailVerified":{"type":"boolean"},"image":{"type":["string","null"]},"isPlatformAdmin":{"type":"boolean"},"twoFactorEnabled":{"type":"boolean"}},"required":["id","name","email","emailVerified","image","isPlatformAdmin","twoFactorEnabled"],"additionalProperties":false},"mfa":{"type":"object","properties":{"state":{"type":"string","enum":["ok","challenge","setup"]},"required":{"type":"boolean"}},"required":["state","required"],"additionalProperties":false},"signInMethods":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"provider":{"type":"string"}},"required":["id","provider"],"additionalProperties":false}},"memberships":{"type":"array","items":{"type":"object","properties":{"org":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"status":{"type":"string","enum":["pending","active","suspended","declined"]},"statusReason":{"type":["string","null"]},"createdAt":{"type":"string","description":"ISO 8601 date-time"}},"required":["id","name","status","statusReason","createdAt"],"additionalProperties":false},"role":{"type":"string","enum":["owner","admin","issuer","viewer"]}},"required":["org","role"],"additionalProperties":false}},"invitations":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"org":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"}},"required":["id","name"],"additionalProperties":false},"role":{"type":"string","enum":["owner","admin","issuer","viewer"]},"invitedByName":{"type":["string","null"]},"expiresAt":{"type":"string","description":"ISO 8601 date-time"}},"required":["id","org","role","invitedByName","expiresAt"],"additionalProperties":false}}},"required":["user","mfa","signInMethods","memberships","invitations"],"additionalProperties":false},"Organization":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"status":{"type":"string","enum":["pending","active","suspended","declined"]},"statusReason":{"type":["string","null"]},"createdAt":{"type":"string","description":"ISO 8601 date-time"},"role":{"type":"string","enum":["owner","admin","issuer","viewer"]},"permissions":{"type":"array","items":{"type":"string","enum":["org:read","org:update","member:read","member:invite","member:manage","issuer:read","issuer:create","issuer:update","achievement:read","achievement:write","credential:read","credential:issue","credential:revoke","credential:export","recipient:erase","audit:read","api_key:manage"]}},"approvedAt":{"anyOf":[{"type":"string","description":"ISO 8601 date-time"},{"type":"null"}]},"dailySendLimit":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]}},"required":["id","name","status","statusReason","createdAt","role","permissions","approvedAt","dailySendLimit"],"additionalProperties":false},"Member":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"userId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"email":{"type":"string"},"role":{"type":"string","enum":["owner","admin","issuer","viewer"]},"twoFactorEnabled":{"type":"boolean"},"createdAt":{"type":"string","description":"ISO 8601 date-time"}},"required":["id","userId","name","email","role","twoFactorEnabled","createdAt"],"additionalProperties":false},"Invitation":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"email":{"type":"string"},"role":{"type":"string","enum":["owner","admin","issuer","viewer"]},"invitedBy":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"],"additionalProperties":false},{"type":"null"}]},"expiresAt":{"type":"string","description":"ISO 8601 date-time"},"createdAt":{"type":"string","description":"ISO 8601 date-time"}},"required":["id","email","role","invitedBy","expiresAt","createdAt"],"additionalProperties":false},"InvitationPreview":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"org":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"}},"required":["id","name"],"additionalProperties":false},"role":{"type":"string","enum":["owner","admin","issuer","viewer"]},"invitedByName":{"type":["string","null"]},"expiresAt":{"type":"string","description":"ISO 8601 date-time"},"email":{"type":"string"}},"required":["id","org","role","invitedByName","expiresAt","email"],"additionalProperties":false},"ApiKey":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"prefix":{"type":"string"},"scopes":{"type":"array","items":{"type":"string","enum":["issuer:read","achievement:read","achievement:write","credential:read","credential:issue","credential:revoke","credential:export","audit:read"]}},"createdBy":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"],"additionalProperties":false},{"type":"null"}]},"createdAt":{"type":"string","description":"ISO 8601 date-time"},"expiresAt":{"anyOf":[{"type":"string","description":"ISO 8601 date-time"},{"type":"null"}]},"lastUsedAt":{"anyOf":[{"type":"string","description":"ISO 8601 date-time"},{"type":"null"}]},"revokedAt":{"anyOf":[{"type":"string","description":"ISO 8601 date-time"},{"type":"null"}]}},"required":["id","name","prefix","scopes","createdBy","createdAt","expiresAt","lastUsedAt","revokedAt"],"additionalProperties":false},"CreatedApiKey":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"prefix":{"type":"string"},"scopes":{"type":"array","items":{"type":"string","enum":["issuer:read","achievement:read","achievement:write","credential:read","credential:issue","credential:revoke","credential:export","audit:read"]}},"createdBy":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"],"additionalProperties":false},{"type":"null"}]},"createdAt":{"type":"string","description":"ISO 8601 date-time"},"expiresAt":{"anyOf":[{"type":"string","description":"ISO 8601 date-time"},{"type":"null"}]},"lastUsedAt":{"anyOf":[{"type":"string","description":"ISO 8601 date-time"},{"type":"null"}]},"revokedAt":{"anyOf":[{"type":"string","description":"ISO 8601 date-time"},{"type":"null"}]},"key":{"type":"string","description":"The whole key. Shown only this once."}},"required":["id","name","prefix","scopes","createdBy","createdAt","expiresAt","lastUsedAt","revokedAt","key"],"additionalProperties":false},"Issuer":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"url":{"type":"string","description":"The permanent issuer id embedded in credentials"},"name":{"type":"string"},"website":{"type":["string","null"]},"domain":{"anyOf":[{"type":"object","properties":{"host":{"type":"string"},"verifiedAt":{"anyOf":[{"type":"string","description":"ISO 8601 date-time"},{"type":"null"}]},"method":{"anyOf":[{"type":"string","enum":["dns","file"]},{"type":"null"}]}},"required":["host","verifiedAt","method"],"additionalProperties":false},{"type":"null"}]},"email":{"type":["string","null"]},"description":{"type":["string","null"]},"logo":{"anyOf":[{"$ref":"#/components/schemas/ImageSet"},{"type":"null"}]},"keys":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"algorithm":{"type":"string","const":"Ed25519"},"publicKeyMultibase":{"type":"string"},"status":{"type":"string","enum":["active","retired","revoked"]},"createdAt":{"type":"string","description":"ISO 8601 date-time"}},"required":["id","algorithm","publicKeyMultibase","status","createdAt"],"additionalProperties":false}},"createdAt":{"type":"string","description":"ISO 8601 date-time"},"updatedAt":{"type":"string","description":"ISO 8601 date-time"}},"required":["id","url","name","website","domain","email","description","logo","keys","createdAt","updatedAt"],"additionalProperties":false},"ImageSet":{"type":"object","properties":{"url":{"type":"string","description":"The cleaned original (PNG or SVG), as in credentials"},"url512":{"type":"string"},"url128":{"type":"string"},"ogUrl":{"type":["string","null"]},"mimeType":{"type":"string","enum":["image/png","image/svg+xml"]},"width":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"height":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]}},"required":["url","url512","url128","ogUrl","mimeType","width","height"],"additionalProperties":false,"description":"Permanent, content-addressed image URLs."},"DomainVerification":{"type":"object","properties":{"host":{"type":"string"},"verifiedAt":{"anyOf":[{"type":"string","description":"ISO 8601 date-time"},{"type":"null"}]},"method":{"anyOf":[{"type":"string","enum":["dns","file"]},{"type":"null"}]},"value":{"type":"string","description":"Publish this in DNS or as the whole file"},"dnsName":{"type":"string","description":"Where the TXT record goes"},"fileUrl":{"type":"string","description":"Where the file goes"},"lastCheckedAt":{"anyOf":[{"type":"string","description":"ISO 8601 date-time"},{"type":"null"}]}},"required":["host","verifiedAt","method","value","dnsName","fileUrl","lastCheckedAt"],"additionalProperties":false},"DomainCheckResult":{"type":"object","properties":{"verified":{"type":"boolean"},"findings":{"type":"array","items":{"type":"object","properties":{"method":{"type":"string","enum":["dns","file"]},"found":{"type":"boolean"},"detail":{"type":"string"}},"required":["method","found","detail"],"additionalProperties":false}},"domain":{"$ref":"#/components/schemas/DomainVerification"}},"required":["verified","findings","domain"],"additionalProperties":false},"Achievement":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"url":{"type":"string","description":"The permanent id embedded in credentials"},"issuerId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"description":{"type":"string"},"criteriaNarrative":{"type":["string","null"]},"criteriaUrl":{"type":["string","null"]},"achievementType":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"alignments":{"type":"array","items":{"type":"object","properties":{"targetName":{"type":"string"},"targetUrl":{"type":"string"},"targetDescription":{"type":["string","null"]},"targetFramework":{"type":["string","null"]},"targetCode":{"type":["string","null"]},"targetType":{"type":["string","null"]}},"required":["targetName","targetUrl","targetDescription","targetFramework","targetCode","targetType"],"additionalProperties":false}},"validForDays":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"image":{"anyOf":[{"$ref":"#/components/schemas/ImageSet"},{"type":"null"}]},"revision":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"status":{"type":"string","enum":["draft","active","archived"]},"awardedCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"publishedAt":{"anyOf":[{"type":"string","description":"ISO 8601 date-time"},{"type":"null"}]},"archivedAt":{"anyOf":[{"type":"string","description":"ISO 8601 date-time"},{"type":"null"}]},"createdAt":{"type":"string","description":"ISO 8601 date-time"},"updatedAt":{"type":"string","description":"ISO 8601 date-time"}},"required":["id","url","issuerId","name","description","criteriaNarrative","criteriaUrl","achievementType","tags","alignments","validForDays","image","revision","status","awardedCount","publishedAt","archivedAt","createdAt","updatedAt"],"additionalProperties":false},"AchievementRevision":{"type":"object","properties":{"revision":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"createdAt":{"type":"string","description":"ISO 8601 date-time"},"createdBy":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"],"additionalProperties":false},{"type":"null"}]}},"required":["revision","createdAt","createdBy"],"additionalProperties":false},"CredentialPage":{"type":"object","properties":{"credentials":{"type":"array","items":{"$ref":"#/components/schemas/CredentialSummary"}},"next":{"description":"Pass as `before` for the next page; null on the last","type":["string","null"]}},"required":["credentials","next"],"additionalProperties":false},"CredentialSummary":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"url":{"type":"string","description":"The credential’s permanent public URL"},"achievement":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"revision":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"image128":{"type":["string","null"]}},"required":["id","name","revision","image128"],"additionalProperties":false},"recipient":{"anyOf":[{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string"}},"required":["name","email"],"additionalProperties":false},{"type":"null"}],"description":"Null once the recipient’s data was erased"},"status":{"type":"string","enum":["draft","issued","revoked"]},"state":{"type":"string","enum":["valid","not_yet_valid","expired","revoked"]},"validFrom":{"type":"string","description":"ISO 8601 date-time"},"validUntil":{"anyOf":[{"type":"string","description":"ISO 8601 date-time"},{"type":"null"}]},"visibility":{"type":"string","enum":["public","hidden"]},"acceptedAt":{"anyOf":[{"type":"string","description":"ISO 8601 date-time"},{"type":"null"}]},"delivery":{"type":"string","enum":["not_sent","queued","sent","delivered","bounced","dropped","spam_reported","failed"]},"revocation":{"anyOf":[{"type":"object","properties":{"kind":{"type":"string","enum":["revoked","superseded"]},"at":{"type":"string","description":"ISO 8601 date-time"},"reason":{"type":["string","null"]},"publicReason":{"type":["string","null"]}},"required":["kind","at","reason","publicReason"],"additionalProperties":false},{"type":"null"}]},"batchId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"replacedById":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"replacesId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"erasedAt":{"anyOf":[{"type":"string","description":"ISO 8601 date-time"},{"type":"null"}],"description":"When the recipient’s data was erased: the badge is a revoked tombstone"},"createdAt":{"type":"string","description":"ISO 8601 date-time"}},"required":["id","url","achievement","recipient","status","state","validFrom","validUntil","visibility","acceptedAt","delivery","revocation","batchId","replacedById","replacesId","erasedAt","createdAt"],"additionalProperties":false},"Credential":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"url":{"type":"string","description":"The credential’s permanent public URL"},"achievement":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"revision":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"image128":{"type":["string","null"]}},"required":["id","name","revision","image128"],"additionalProperties":false},"recipient":{"anyOf":[{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string"}},"required":["name","email"],"additionalProperties":false},{"type":"null"}],"description":"Null once the recipient’s data was erased"},"status":{"type":"string","enum":["draft","issued","revoked"]},"state":{"type":"string","enum":["valid","not_yet_valid","expired","revoked"]},"validFrom":{"type":"string","description":"ISO 8601 date-time"},"validUntil":{"anyOf":[{"type":"string","description":"ISO 8601 date-time"},{"type":"null"}]},"visibility":{"type":"string","enum":["public","hidden"]},"acceptedAt":{"anyOf":[{"type":"string","description":"ISO 8601 date-time"},{"type":"null"}]},"delivery":{"type":"string","enum":["not_sent","queued","sent","delivered","bounced","dropped","spam_reported","failed"]},"revocation":{"anyOf":[{"type":"object","properties":{"kind":{"type":"string","enum":["revoked","superseded"]},"at":{"type":"string","description":"ISO 8601 date-time"},"reason":{"type":["string","null"]},"publicReason":{"type":["string","null"]}},"required":["kind","at","reason","publicReason"],"additionalProperties":false},{"type":"null"}]},"batchId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"replacedById":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"replacesId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"erasedAt":{"anyOf":[{"type":"string","description":"ISO 8601 date-time"},{"type":"null"}],"description":"When the recipient’s data was erased: the badge is a revoked tombstone"},"createdAt":{"type":"string","description":"ISO 8601 date-time"},"issuedBy":{"type":"object","properties":{"type":{"type":"string","enum":["user","api_key"]},"id":{"type":["string","null"]},"label":{"type":["string","null"]}},"required":["type","id","label"],"additionalProperties":false},"claimLinkExpiresAt":{"anyOf":[{"type":"string","description":"ISO 8601 date-time"},{"type":"null"}]},"emails":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"kind":{"type":"string"},"to":{"description":"Null once the recipient’s data was erased","type":["string","null"]},"status":{"type":"string","enum":["queued","sent","delivered","bounced","dropped","spam_reported","failed"]},"attempts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"lastError":{"type":["string","null"]},"events":{"type":"array","items":{"type":"object","properties":{"event":{"type":"string"},"at":{"type":"string","description":"ISO 8601 date-time"},"reason":{"type":"string"}},"required":["event","at"],"additionalProperties":false}},"createdAt":{"type":"string","description":"ISO 8601 date-time"},"sentAt":{"anyOf":[{"type":"string","description":"ISO 8601 date-time"},{"type":"null"}]},"deliveredAt":{"anyOf":[{"type":"string","description":"ISO 8601 date-time"},{"type":"null"}]},"bouncedAt":{"anyOf":[{"type":"string","description":"ISO 8601 date-time"},{"type":"null"}]}},"required":["id","kind","to","status","attempts","lastError","events","createdAt","sentAt","deliveredAt","bouncedAt"],"additionalProperties":false}},"customFields":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"evidence":{"type":"array","items":{"type":"object","properties":{"url":{"type":["string","null"]},"name":{"type":["string","null"]},"narrative":{"type":["string","null"]}},"required":["url","name","narrative"],"additionalProperties":false}},"revokedBy":{"anyOf":[{"type":"object","properties":{"label":{"type":["string","null"]}},"required":["label"],"additionalProperties":false},{"type":"null"}]},"document":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}],"description":"The signed Open Badges 3.0 credential (OpenBadgeCredential); null once the recipient’s data was erased"},"erasedBy":{"anyOf":[{"type":"object","properties":{"label":{"type":["string","null"]}},"required":["label"],"additionalProperties":false},{"type":"null"}]}},"required":["id","url","achievement","recipient","status","state","validFrom","validUntil","visibility","acceptedAt","delivery","revocation","batchId","replacedById","replacesId","erasedAt","createdAt","issuedBy","claimLinkExpiresAt","emails","customFields","evidence","revokedBy","document","erasedBy"],"additionalProperties":false},"AwardPreview":{"type":"object","properties":{"email":{"type":"object","properties":{"subject":{"type":"string"},"text":{"type":"string"},"from":{"type":"string"},"replyTo":{"type":["string","null"]}},"required":["subject","text","from","replyTo"],"additionalProperties":false}},"required":["email"],"additionalProperties":false},"BulkRevokeResult":{"type":"object","properties":{"revoked":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"alreadyRevoked":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"notFound":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["revoked","alreadyRevoked","notFound"],"additionalProperties":false},"RecipientErasurePreview":{"type":"object","properties":{"recipient":{"anyOf":[{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string"}},"required":["name","email"],"additionalProperties":false},{"type":"null"}]},"credentials":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"achievement":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"}},"required":["id","name"],"additionalProperties":false},"state":{"type":"string","enum":["valid","not_yet_valid","expired","revoked"]},"validFrom":{"type":"string","description":"ISO 8601 date-time"},"erased":{"type":"boolean"}},"required":["id","achievement","state","validFrom","erased"],"additionalProperties":false}},"toRevoke":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"batchRows":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["recipient","credentials","toRevoke","batchRows"],"additionalProperties":false},"RecipientErasureResult":{"type":"object","properties":{"erasureId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"erased":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"revoked":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"batchRows":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["erasureId","erased","revoked","batchRows"],"additionalProperties":false},"BatchPage":{"type":"object","properties":{"batches":{"type":"array","items":{"$ref":"#/components/schemas/BatchSummary"}},"next":{"type":["string","null"]}},"required":["batches","next"],"additionalProperties":false},"BatchSummary":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"achievement":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"}},"required":["id","name"],"additionalProperties":false},"source":{"type":"string","enum":["csv","api"]},"fileName":{"type":["string","null"]},"status":{"type":"string","enum":["draft","queued","running","completed","failed"]},"totalRows":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"counts":{"type":"object","properties":{"ready":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"invalid":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"duplicate":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"existing":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"pending":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"issued":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"failed":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"skipped":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["ready","invalid","duplicate","existing","pending","issued","failed","skipped"],"additionalProperties":false},"options":{"type":"object","properties":{"sendEmail":{"type":"boolean"},"awardExisting":{"type":"boolean"}},"required":["sendEmail","awardExisting"],"additionalProperties":false},"createdBy":{"type":"object","properties":{"type":{"type":"string","enum":["user","api_key"]},"id":{"type":["string","null"]},"label":{"type":["string","null"]}},"required":["type","id","label"],"additionalProperties":false},"error":{"type":["string","null"]},"createdAt":{"type":"string","description":"ISO 8601 date-time"},"confirmedAt":{"anyOf":[{"type":"string","description":"ISO 8601 date-time"},{"type":"null"}]},"startedAt":{"anyOf":[{"type":"string","description":"ISO 8601 date-time"},{"type":"null"}]},"finishedAt":{"anyOf":[{"type":"string","description":"ISO 8601 date-time"},{"type":"null"}]}},"required":["id","achievement","source","fileName","status","totalRows","counts","options","createdBy","error","createdAt","confirmedAt","startedAt","finishedAt"],"additionalProperties":false},"Batch":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"achievement":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"}},"required":["id","name"],"additionalProperties":false},"source":{"type":"string","enum":["csv","api"]},"fileName":{"type":["string","null"]},"status":{"type":"string","enum":["draft","queued","running","completed","failed"]},"totalRows":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"counts":{"type":"object","properties":{"ready":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"invalid":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"duplicate":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"existing":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"pending":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"issued":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"failed":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"skipped":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["ready","invalid","duplicate","existing","pending","issued","failed","skipped"],"additionalProperties":false},"options":{"type":"object","properties":{"sendEmail":{"type":"boolean"},"awardExisting":{"type":"boolean"}},"required":["sendEmail","awardExisting"],"additionalProperties":false},"createdBy":{"type":"object","properties":{"type":{"type":"string","enum":["user","api_key"]},"id":{"type":["string","null"]},"label":{"type":["string","null"]}},"required":["type","id","label"],"additionalProperties":false},"error":{"type":["string","null"]},"createdAt":{"type":"string","description":"ISO 8601 date-time"},"confirmedAt":{"anyOf":[{"type":"string","description":"ISO 8601 date-time"},{"type":"null"}]},"startedAt":{"anyOf":[{"type":"string","description":"ISO 8601 date-time"},{"type":"null"}]},"finishedAt":{"anyOf":[{"type":"string","description":"ISO 8601 date-time"},{"type":"null"}]},"hasHeader":{"type":"boolean"},"columns":{"type":"array","items":{"type":"object","properties":{"header":{"type":"string"},"target":{"type":"string","enum":["name","firstName","lastName","email","issuedOn","expiresOn","evidenceUrl","custom","ignore"]},"samples":{"type":"array","items":{"type":"string"}}},"required":["header","target","samples"],"additionalProperties":false}},"plan":{"type":"object","properties":{"toAward":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"toSkip":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"emails":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"sendLimit":{"type":"object","properties":{"limit":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"remaining":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]}},"required":["limit","remaining"],"additionalProperties":false}},"required":["toAward","toSkip","emails","sendLimit"],"additionalProperties":false}},"required":["id","achievement","source","fileName","status","totalRows","counts","options","createdBy","error","createdAt","confirmedAt","startedAt","finishedAt","hasHeader","columns","plan"],"additionalProperties":false},"BatchRowPage":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"rowNumber":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"values":{"anyOf":[{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string"},"issuedOn":{"type":"string"},"expiresOn":{"type":"string"},"evidenceUrl":{"type":"string"},"custom":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}},"required":["name","email","custom"],"additionalProperties":false},{"type":"null"}]},"validation":{"type":"string","enum":["ready","invalid","duplicate","existing"]},"issues":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["field","message"],"additionalProperties":false}},"status":{"type":"string","enum":["draft","pending","issued","failed","skipped"]},"credential":{"anyOf":[{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"url":{"type":"string"}},"required":["id","url"],"additionalProperties":false},{"type":"null"}]},"error":{"anyOf":[{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false},{"type":"null"}]},"erasedAt":{"anyOf":[{"type":"string","description":"ISO 8601 date-time"},{"type":"null"}]}},"required":["rowNumber","values","validation","issues","status","credential","error","erasedAt"],"additionalProperties":false}},"next":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]}},"required":["rows","next"],"additionalProperties":false},"AuditEventPage":{"type":"object","properties":{"events":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"action":{"type":"string"},"actor":{"type":"object","properties":{"type":{"type":"string","enum":["user","system","api_key","recipient"]},"id":{"type":["string","null"]},"label":{"type":["string","null"]}},"required":["type","id","label"],"additionalProperties":false},"target":{"anyOf":[{"type":"object","properties":{"type":{"type":"string"},"id":{"type":"string"}},"required":["type","id"],"additionalProperties":false},{"type":"null"}]},"data":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"ip":{"type":["string","null"]},"createdAt":{"type":"string","description":"ISO 8601 date-time"}},"required":["id","action","actor","target","data","ip","createdAt"],"additionalProperties":false}},"next":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]}},"required":["events","next"],"additionalProperties":false},"VerifyResult":{"type":"object","properties":{"verified":{"type":"boolean"},"checkedAt":{"type":"string","description":"ISO 8601 date-time"},"source":{"type":"string","enum":["url","json","png","svg"]},"credential":{"anyOf":[{"type":"object","properties":{"id":{"type":["string","null"]},"name":{"type":["string","null"]},"achievement":{"type":"object","properties":{"id":{"type":["string","null"]},"name":{"type":["string","null"]},"description":{"type":["string","null"]}},"required":["id","name","description"],"additionalProperties":false},"issuer":{"type":"object","properties":{"id":{"type":["string","null"]},"name":{"type":["string","null"]},"url":{"type":["string","null"]}},"required":["id","name","url"],"additionalProperties":false},"recipientName":{"type":["string","null"]},"validFrom":{"type":["string","null"]},"validUntil":{"type":["string","null"]},"issuedHere":{"type":"boolean"}},"required":["id","name","achievement","issuer","recipientName","validFrom","validUntil","issuedHere"],"additionalProperties":false},{"type":"null"}]},"checks":{"type":"object","properties":{"format":{"type":"object","properties":{"outcome":{"type":"string","enum":["passed","failed","skipped"]},"message":{"type":"string"},"details":{"type":"array","items":{"type":"string"}}},"required":["outcome","message"],"additionalProperties":false},"proof":{"type":"object","properties":{"outcome":{"type":"string","enum":["passed","failed","skipped"]},"message":{"type":"string"},"details":{"type":"array","items":{"type":"string"}}},"required":["outcome","message"],"additionalProperties":false},"status":{"type":"object","properties":{"outcome":{"type":"string","enum":["passed","failed","skipped"]},"message":{"type":"string"},"details":{"type":"array","items":{"type":"string"}}},"required":["outcome","message"],"additionalProperties":false},"validity":{"type":"object","properties":{"outcome":{"type":"string","enum":["passed","failed","skipped"]},"message":{"type":"string"},"details":{"type":"array","items":{"type":"string"}}},"required":["outcome","message"],"additionalProperties":false},"recipient":{"type":"object","properties":{"outcome":{"type":"string","enum":["passed","failed","skipped"]},"message":{"type":"string"},"details":{"type":"array","items":{"type":"string"}}},"required":["outcome","message"],"additionalProperties":false}},"required":["format","proof","status","validity"],"additionalProperties":false}},"required":["verified","checkedAt","source","credential","checks"],"additionalProperties":false},"PlatformOrg":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"status":{"type":"string","enum":["pending","active","suspended","declined"]},"statusReason":{"type":["string","null"]},"createdAt":{"type":"string","description":"ISO 8601 date-time"},"approvedAt":{"anyOf":[{"type":"string","description":"ISO 8601 date-time"},{"type":"null"}]},"requestedBy":{"anyOf":[{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string"}},"required":["name","email"],"additionalProperties":false},{"type":"null"}]},"memberCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"issuers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"website":{"type":["string","null"]},"domainVerified":{"type":"boolean"}},"required":["id","name","website","domainVerified"],"additionalProperties":false}},"dailySendLimit":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"defaultDailySendLimit":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["id","name","status","statusReason","createdAt","approvedAt","requestedBy","memberCount","issuers","dailySendLimit","defaultDailySendLimit"],"additionalProperties":false}},"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","bearerFormat":"cf_…","description":"An API key from Settings → API keys."},"session":{"type":"apiKey","in":"cookie","name":"credforge.session_token","description":"The issuer app’s session (sign in at /login)."}}}}