Accredible Issuer and SSO API
Read issuer account details and generate recipient single sign-on (SSO) links that let a recipient access their credentials, plus rotate the account API token.
Read issuer account details and generate recipient single sign-on (SSO) links that let a recipient access their credentials, plus rotate the account API token.
openapi: 3.0.3
info:
title: Accredible API
description: >-
The Accredible API issues, manages, and verifies digital credentials -
certificates and Open Badges - programmatically. Credentials are issued to a
recipient against a Group (a course or achievement) and rendered with a
reusable Design. The API also manages Evidence Items and References attached
to credentials, generates credential PDFs and blockchain-verifiable records,
returns engagement analytics, administers Departments and Team Members, and
generates recipient SSO links. All requests are authenticated with an API
key sent in the Authorization header using the scheme
`Token token=YOUR_API_KEY`. Production base URL is
https://api.accredible.com/v1; a sandbox is available at
https://sandbox.api.accredible.com/v1. Endpoints and paths are grounded in
Accredible's published API reference; request and response schemas are
modeled and simplified.
version: '1.0'
contact:
name: Accredible
url: https://www.accredible.com
license:
name: Proprietary
url: https://www.accredible.com/terms-of-service
servers:
- url: https://api.accredible.com/v1
description: Production
- url: https://sandbox.api.accredible.com/v1
description: Sandbox
security:
- tokenAuth: []
tags:
- name: Credentials
description: Issue, retrieve, update, delete, search, and verify digital credentials.
- name: Groups
description: Course or achievement containers that credentials are issued against.
- name: Designs
description: Reusable visual specifications for rendering badges and certificates.
- name: Evidence Items
description: Supplemental work samples attached to a credential.
- name: References
description: Peer, teacher, or manager endorsements attached to a credential.
- name: Analytics
description: Issuer-level and per-credential engagement analytics.
- name: Departments
description: Independent sub-organizations within an issuer account.
- name: Team Members
description: Administrators and roles within the issuer account.
- name: Issuer
description: Issuer account details and API token management.
- name: SSO
description: Recipient single sign-on link generation.
paths:
/credentials:
post:
operationId: createCredential
tags: [Credentials]
summary: Create a credential
description: >-
Issues a new credential (certificate or badge) to a recipient against a
Group, optionally with custom attributes, evidence items, and references.
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [credential]
properties:
credential:
$ref: '#/components/schemas/CredentialInput'
responses:
'200':
description: The created credential.
content:
application/json:
schema:
$ref: '#/components/schemas/CredentialEnvelope'
'401':
$ref: '#/components/responses/Unauthorized'
/credentials/bulk_create:
post:
operationId: bulkCreateCredentials
tags: [Credentials]
summary: Bulk create credentials
description: Issues many credentials in a single request.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
credentials:
type: array
items:
$ref: '#/components/schemas/CredentialInput'
responses:
'200':
description: The created credentials.
'401':
$ref: '#/components/responses/Unauthorized'
/credentials/{id}:
parameters:
- $ref: '#/components/parameters/CredentialId'
get:
operationId: getCredential
tags: [Credentials]
summary: View a credential
description: Retrieves a single credential by its ID.
responses:
'200':
description: The requested credential.
content:
application/json:
schema:
$ref: '#/components/schemas/CredentialEnvelope'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
put:
operationId: updateCredential
tags: [Credentials]
summary: Update a credential
description: Updates an existing credential.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
credential:
$ref: '#/components/schemas/CredentialInput'
responses:
'200':
description: The updated credential.
content:
application/json:
schema:
$ref: '#/components/schemas/CredentialEnvelope'
'401':
$ref: '#/components/responses/Unauthorized'
delete:
operationId: deleteCredential
tags: [Credentials]
summary: Delete a credential
description: Deletes a credential by ID.
responses:
'200':
description: The credential was deleted.
'401':
$ref: '#/components/responses/Unauthorized'
/credentials/search:
post:
operationId: searchCredentials
tags: [Credentials]
summary: Search for credentials
description: >-
Searches credentials by group, recipient email, recipient ID, and other
attributes, with pagination.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
group_id:
type: integer
email:
type: string
recipient_id:
type: string
page:
type: integer
page_size:
type: integer
responses:
'200':
description: Matching credentials.
'401':
$ref: '#/components/responses/Unauthorized'
/all_credentials:
get:
operationId: listAllCredentials
deprecated: true
tags: [Credentials]
summary: View many credentials (deprecated)
description: >-
Lists credentials filtered by group, email, or recipient. Deprecated in
favor of the search endpoint.
parameters:
- name: group_id
in: query
schema: { type: integer }
- name: email
in: query
schema: { type: string }
- name: recipient_id
in: query
schema: { type: string }
- name: page
in: query
schema: { type: integer }
- name: page_size
in: query
schema: { type: integer }
responses:
'200':
description: A list of credentials.
'401':
$ref: '#/components/responses/Unauthorized'
/credentials/generate_pdf:
post:
operationId: generateCredentialPdfs
tags: [Credentials]
summary: Generate PDFs for credentials
description: Generates certificate PDFs for a set of credentials.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
credential_ids:
type: array
items: { type: integer }
responses:
'200':
description: PDF generation result.
'401':
$ref: '#/components/responses/Unauthorized'
/credentials/generate_single_pdf/{id}:
parameters:
- $ref: '#/components/parameters/CredentialId'
post:
operationId: generateSingleCredentialPdf
tags: [Credentials]
summary: Generate PDF for a single credential
description: Generates a certificate PDF for one credential.
responses:
'200':
description: PDF generation result.
'401':
$ref: '#/components/responses/Unauthorized'
/credentials/blockchain_data/{encoded_id}:
get:
operationId: getBlockchainCredential
tags: [Credentials]
summary: Verify blockchain credential
description: Returns the blockchain verification record for an encoded credential ID.
parameters:
- name: encoded_id
in: path
required: true
schema: { type: string }
responses:
'200':
description: Blockchain verification data.
'404':
$ref: '#/components/responses/NotFound'
/credentials/analytics/{id}:
post:
operationId: getCredentialAnalytics
tags: [Analytics]
summary: View credential analytics
description: Returns engagement analytics for a single credential.
parameters:
- $ref: '#/components/parameters/CredentialId'
responses:
'200':
description: Per-credential analytics.
'401':
$ref: '#/components/responses/Unauthorized'
/issuer/credential_redirect:
get:
operationId: credentialRedirect
tags: [Credentials]
summary: Redirect to a credential
description: Resolves and redirects to a credential's public page.
parameters:
- name: issuer_id
in: query
schema: { type: integer }
- name: id
in: query
schema: { type: string }
responses:
'302':
description: Redirect to the credential page.
/issuer/groups:
post:
operationId: createGroup
tags: [Groups]
summary: Create a group
description: Creates a new Group (course or achievement) under the issuer account.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
group:
$ref: '#/components/schemas/GroupInput'
responses:
'200':
description: The created group.
content:
application/json:
schema:
$ref: '#/components/schemas/GroupEnvelope'
'401':
$ref: '#/components/responses/Unauthorized'
/issuer/groups/{group_id}:
parameters:
- $ref: '#/components/parameters/GroupId'
get:
operationId: getGroup
tags: [Groups]
summary: View a group
description: Retrieves a single Group by ID.
responses:
'200':
description: The requested group.
content:
application/json:
schema:
$ref: '#/components/schemas/GroupEnvelope'
'404':
$ref: '#/components/responses/NotFound'
put:
operationId: updateGroup
tags: [Groups]
summary: Update a group
description: Updates an existing Group.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
group:
$ref: '#/components/schemas/GroupInput'
responses:
'200':
description: The updated group.
'401':
$ref: '#/components/responses/Unauthorized'
delete:
operationId: deleteGroup
tags: [Groups]
summary: Delete a group
description: Deletes a Group by ID.
responses:
'200':
description: The group was deleted.
'401':
$ref: '#/components/responses/Unauthorized'
/issuer/all_groups:
get:
operationId: listAllGroups
deprecated: true
tags: [Groups]
summary: View all groups (deprecated)
description: Lists all Groups under the issuer account. Deprecated in favor of search.
parameters:
- name: name
in: query
schema: { type: string }
- name: page
in: query
schema: { type: integer }
- name: page_size
in: query
schema: { type: integer }
responses:
'200':
description: A list of groups.
'401':
$ref: '#/components/responses/Unauthorized'
/issuer/groups/search:
post:
operationId: searchGroups
tags: [Groups]
summary: Search for groups
description: Searches Groups by name and other attributes with pagination.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name: { type: string }
page: { type: integer }
page_size: { type: integer }
responses:
'200':
description: Matching groups.
'401':
$ref: '#/components/responses/Unauthorized'
/designs:
get:
operationId: listDesigns
deprecated: true
tags: [Designs]
summary: View all designs (deprecated)
description: Lists Designs, optionally filtered by kind and department.
parameters:
- name: kind
in: query
schema: { type: string, enum: [certificate, badge] }
- name: department_id
in: query
schema: { type: integer }
responses:
'200':
description: A list of designs.
'401':
$ref: '#/components/responses/Unauthorized'
post:
operationId: createDesign
tags: [Designs]
summary: Create a design
description: Creates a new visual Design for badges or certificates.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
design:
$ref: '#/components/schemas/DesignInput'
responses:
'200':
description: The created design.
'401':
$ref: '#/components/responses/Unauthorized'
/designs/{design_id}:
parameters:
- $ref: '#/components/parameters/DesignId'
get:
operationId: getDesign
tags: [Designs]
summary: View a design
description: Retrieves a single Design by ID.
responses:
'200':
description: The requested design.
'404':
$ref: '#/components/responses/NotFound'
put:
operationId: updateDesign
tags: [Designs]
summary: Update a design
description: Updates an existing Design.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
design:
$ref: '#/components/schemas/DesignInput'
responses:
'200':
description: The updated design.
'401':
$ref: '#/components/responses/Unauthorized'
delete:
operationId: deleteDesign
tags: [Designs]
summary: Delete a design
description: Deletes a Design by ID.
responses:
'200':
description: The design was deleted.
'401':
$ref: '#/components/responses/Unauthorized'
/designs/{design_id}/copy:
post:
operationId: copyDesign
tags: [Designs]
summary: Copy a design
description: Creates a duplicate of an existing Design.
parameters:
- $ref: '#/components/parameters/DesignId'
responses:
'200':
description: The copied design.
'401':
$ref: '#/components/responses/Unauthorized'
/designs/search:
post:
operationId: searchDesigns
tags: [Designs]
summary: Search for designs
description: Searches Designs by name, kind, and other attributes.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name: { type: string }
kind: { type: string, enum: [certificate, badge] }
page: { type: integer }
page_size: { type: integer }
responses:
'200':
description: Matching designs.
'401':
$ref: '#/components/responses/Unauthorized'
/designs/{design_id}/preview:
post:
operationId: previewDesign
tags: [Designs]
summary: Preview a design
description: Renders a preview image of a Design with sample data.
parameters:
- $ref: '#/components/parameters/DesignId'
responses:
'200':
description: A design preview.
'401':
$ref: '#/components/responses/Unauthorized'
/designers/badge/initialize:
post:
operationId: initializeBadgeDesigner
tags: [Designs]
summary: Initialize embedded badge designer
description: Returns a session for the embedded badge designer experience.
responses:
'200':
description: An embedded badge designer session.
'401':
$ref: '#/components/responses/Unauthorized'
/designers/certificate/initialize:
post:
operationId: initializeCertificateDesigner
tags: [Designs]
summary: Initialize embedded certificate designer
description: Returns a session for the embedded certificate designer experience.
responses:
'200':
description: An embedded certificate designer session.
'401':
$ref: '#/components/responses/Unauthorized'
/departments/search:
post:
operationId: searchDepartments
tags: [Departments]
summary: Search for departments
description: >-
Searches Departments - independent sub-organizations, each with their
own Designs, Groups, and branding.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name: { type: string }
page: { type: integer }
page_size: { type: integer }
responses:
'200':
description: Matching departments.
'401':
$ref: '#/components/responses/Unauthorized'
/credentials/{credential_id}/evidence_items:
post:
operationId: createEvidenceItem
tags: [Evidence Items]
summary: Create an evidence item
description: Attaches a new Evidence Item (work sample or artifact) to a credential.
parameters:
- $ref: '#/components/parameters/CredentialIdPath'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
evidence_item:
$ref: '#/components/schemas/EvidenceItemInput'
responses:
'200':
description: The created evidence item.
'401':
$ref: '#/components/responses/Unauthorized'
/credentials/{credential_id}/evidence_items/{evidence_item_id}:
parameters:
- $ref: '#/components/parameters/CredentialIdPath'
- name: evidence_item_id
in: path
required: true
schema: { type: integer }
get:
operationId: getEvidenceItem
tags: [Evidence Items]
summary: View an evidence item
description: Retrieves a single Evidence Item on a credential.
responses:
'200':
description: The requested evidence item.
'404':
$ref: '#/components/responses/NotFound'
put:
operationId: updateEvidenceItem
tags: [Evidence Items]
summary: Update an evidence item
description: Updates an Evidence Item on a credential.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
evidence_item:
$ref: '#/components/schemas/EvidenceItemInput'
responses:
'200':
description: The updated evidence item.
'401':
$ref: '#/components/responses/Unauthorized'
delete:
operationId: deleteEvidenceItem
tags: [Evidence Items]
summary: Delete an evidence item
description: Deletes an Evidence Item from a credential.
responses:
'200':
description: The evidence item was deleted.
'401':
$ref: '#/components/responses/Unauthorized'
/credentials/{credential_id}/references:
post:
operationId: createReference
tags: [References]
summary: Create a reference
description: Attaches a new Reference (endorsement) to a credential.
parameters:
- $ref: '#/components/parameters/CredentialIdPath'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
reference:
$ref: '#/components/schemas/ReferenceInput'
responses:
'200':
description: The created reference.
'401':
$ref: '#/components/responses/Unauthorized'
/credentials/{credential_id}/references/{reference_id}:
parameters:
- $ref: '#/components/parameters/CredentialIdPath'
- name: reference_id
in: path
required: true
schema: { type: integer }
get:
operationId: getReference
tags: [References]
summary: View a reference
description: Retrieves a single Reference on a credential.
responses:
'200':
description: The requested reference.
'404':
$ref: '#/components/responses/NotFound'
put:
operationId: updateReference
tags: [References]
summary: Update a reference
description: Updates a Reference on a credential.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
reference:
$ref: '#/components/schemas/ReferenceInput'
responses:
'200':
description: The updated reference.
'401':
$ref: '#/components/responses/Unauthorized'
delete:
operationId: deleteReference
tags: [References]
summary: Delete a reference
description: Deletes a Reference from a credential.
responses:
'200':
description: The reference was deleted.
'401':
$ref: '#/components/responses/Unauthorized'
/analytics:
get:
operationId: indexAnalytics
tags: [Analytics]
summary: Index analytics
description: Returns issuer-level engagement analytics across credentials.
responses:
'200':
description: Issuer analytics.
'401':
$ref: '#/components/responses/Unauthorized'
/team_members:
post:
operationId: createTeamMember
tags: [Team Members]
summary: Create a team member
description: Adds a new Team Member (administrator) to the issuer account.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
team_member:
$ref: '#/components/schemas/TeamMemberInput'
responses:
'200':
description: The created team member.
'401':
$ref: '#/components/responses/Unauthorized'
/team_members/{id}:
parameters:
- name: id
in: path
required: true
schema: { type: integer }
get:
operationId: getTeamMember
tags: [Team Members]
summary: View a team member
description: Retrieves a single Team Member by ID.
responses:
'200':
description: The requested team member.
'404':
$ref: '#/components/responses/NotFound'
put:
operationId: updateTeamMember
tags: [Team Members]
summary: Update a team member
description: Updates a Team Member's details or role.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
team_member:
$ref: '#/components/schemas/TeamMemberInput'
responses:
'200':
description: The updated team member.
'401':
$ref: '#/components/responses/Unauthorized'
delete:
operationId: deleteTeamMember
tags: [Team Members]
summary: Delete a team member
description: Removes a Team Member from the issuer account.
responses:
'200':
description: The team member was deleted.
'401':
$ref: '#/components/responses/Unauthorized'
/issuer/details:
get:
operationId: getIssuerDetails
tags: [Issuer]
summary: View an issuer
description: Returns details about the authenticated issuer account.
responses:
'200':
description: Issuer details.
'401':
$ref: '#/components/responses/Unauthorized'
/sso/generate_link:
post:
operationId: generateSsoLink
tags: [SSO]
summary: Generate recipient SSO link
description: >-
Generates a single sign-on link that lets a recipient access their
credentials.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
recipient_email: { type: string }
recipient_id: { type: string }
responses:
'200':
description: A recipient SSO link.
'401':
$ref: '#/components/responses/Unauthorized'
/api/generate_token:
post:
operationId: generateApiToken
tags: [Issuer]
summary: Update API key
description: Rotates the API token for the issuer account.
responses:
'200':
description: A new API token.
'401':
$ref: '#/components/responses/Unauthorized'
components:
securitySchemes:
tokenAuth:
type: apiKey
in: header
name: Authorization
description: >-
API key sent in the Authorization header using the scheme
`Token token=YOUR_API_KEY`.
parameters:
CredentialId:
name: id
in: path
required: true
description: The unique ID of the credential.
schema: { type: integer }
CredentialIdPath:
name: credential_id
in: path
required: true
description: The unique ID of the credential.
schema: { type: integer }
GroupId:
name: group_id
in: path
required: true
description: The unique ID of the group.
schema: { type: integer }
DesignId:
name: design_id
in: path
required: true
description: The unique ID of the design.
schema: { type: integer }
responses:
Unauthorized:
description: Invalid or missing API key.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
NotFound:
description: The requested resource was not found.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
schemas:
Recipient:
type: object
properties:
name: { type: string, description: The recipient's name. }
email: { type: string, description: The recipient's email address. }
id: { type: string, description: The recipient's ID as defined by your organization. }
CredentialInput:
type: object
required: [group_id]
properties:
recipient:
$ref: '#/components/schemas/Recipient'
group_id: { type: integer, description: The Group the credential belongs to. }
group_name: { type: string, description: The Group name, usable in place of a Group ID. }
name: { type: string, description: The credential/course name shown to recipients. }
description: { type: string, description: The credential/course description shown to recipients. }
issued_on: { type: string, description: 'Date of issue. Format: DD/MM/YYYY.' }
expired_on: { type: string, description: 'Expiry date. Format: DD/MM/YYYY.' }
complete: { type: boolean, description: Whether the achievement is complete. }
private: { type: boolean, description: Whether the credential is private. }
custom_attributes:
type: object
description: Custom variables displayed on the credential's design.
meta_data:
type: object
description: Arbitrary key-value strings stored on the credential.
Credential:
allOf:
- $ref: '#/components/schemas/CredentialInput'
- type: object
properties:
id: { type: integer, description: The unique credential ID. }
url: { type: string, description: The public credential page URL. }
created_at: { type: string, format: date-time }
CredentialEnvelope:
type: object
properties:
credential:
$ref: '#/components/schemas/Credential'
GroupInput:
type: object
properties:
name: { type: string, description: The internal name of the group. }
course_name: { type: string, description: The course/achievement name shown to recipients. }
course_description: { type: string, description: The course/achievement description. }
design_id: { type: integer, description: The Design used to render credentials in this group. }
language: { type: string, description: The language code for the group. }
Group:
allOf:
- $ref: '#/components/schemas/GroupInput'
- type: object
properties:
id: { type: integer, description: The unique group ID. }
GroupEnvelope:
type: object
properties:
group:
$ref: '#/components/schemas/Group'
DesignInput:
type: object
properties:
name: { type: string, description: The name of the design. }
kind: { type: string, enum: [certificate, badge], description: Whether the design renders a certificate or a badge. }
department_id: { type: integer, description: The department the design belongs to. }
EvidenceItemInput:
type: object
properties:
description: { type: string, description: A description of the evidence. }
category: { type: string, description: The category of the evidence item. }
string_object: { type: string, description: A text value for the evidence. }
file: { type: string, description: A file URL or upload reference for the evidence. }
hidden: { type: boolean, description: Whether the evidence item is hidden. }
ReferenceInput:
type: object
properties:
name: { type: string, description: The name of the person giving the reference. }
email: { type: string, description: The email of the referee. }
body: { type: string, description: The reference text. }
hidden: { type: boolean, description: Whether the reference is hidden. }
TeamMemberInput:
type: object
properties:
name: { type: string, description: The team member's name. }
email: { type: string, description: The team member's email address. }
role: { type: string, description: The team member's role. }
Error:
type: object
properties:
error: { type: string, description: A human-readable error message. }
errors:
type: array
items: { type: string }