Eformogi Trust API

W3C Verifiable Credentials and DID

GitHub OpenAPI

Operations 7

GET /api/did DID Document (W3C did:web) #
GET /api/revocation-list Credential revocation list #
POST /api/verify-credential Verify a Verifiable Credential #
GET /api/verify-receipt Verify a receipt (tr_/cr_/ws_/wn_/wl_/att_, consent or audit id) #
GET /api/portrait-evidence Download a transcript's Portrait of a Graduate evidence as a JSON file #
POST /api/issue-credential Issue a Verifiable Credential #
POST /api/revoke-credential Revoke a Verifiable Credential #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/eformogi-com:eformogi-com-trust-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

eformogi-com-trust-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Eformogi Trust API
  version: 33.5.1
  description: 'Eformogi is a record of learning the student owns, witnessed by the adults who were there, verifiable at one link with no login, and issued by the schools and counselors who hold the learners. The family-issued receipt (`tr_`) is a Witness Transcript. This document describes the machine-readable surface: verification, witness attestation, consent, the agent protocol, and the issuer rail (enrollment, roster, declared courses, and the family side that folds them into the transcript). The open record format itself is published at https://eformogi.com/spec.'
  contact:
    url: https://eformogi.com
  license:
    name: Proprietary
servers:
- url: https://eformogi.com
  description: Production
tags:
- name: Trust
  description: W3C Verifiable Credentials and DID
paths:
  /api/did:
    get:
      summary: DID Document (W3C did:web)
      tags:
      - Trust
      responses:
        '200':
          description: W3C DID Document for did:web:eformogi.com
          content:
            application/did+json: {}
      operationId: getApiDid
      x-operation-id-source: derived
  /api/revocation-list:
    get:
      summary: Credential revocation list
      tags:
      - Trust
      parameters:
      - name: since
        in: query
        schema:
          type: string
          format: date-time
      - name: type
        in: query
        schema:
          type: string
      responses:
        '200':
          description: List of revoked credential IDs
      operationId: getApiRevocationList
      x-operation-id-source: derived
  /api/verify-credential:
    post:
      summary: Verify a Verifiable Credential
      tags:
      - Trust
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                credential:
                  type: object
              required:
              - credential
      responses:
        '200':
          description: Verification result with proof, issuer, revocation, expiry checks
      operationId: postApiVerifyCredential
      x-operation-id-source: derived
  /api/verify-receipt:
    get:
      summary: Verify a receipt (tr_/cr_/ws_/wn_/wl_/att_, consent or audit id)
      description: 'The single verification front door for all Eformogi receipts.

        Single-link verification is **free and keyless**. No account, no signup, ever

        (BRAND_THESIS rule 11). Paste any receipt id (`tr_`, `cr_`, `ws_`, `wn_`, `wl_`,

        `att_`, a consent receipt UUID, or an audit log id) and get back a verified,

        non-PII metadata response.


        **Optional org attribution (V31 receiver billing):** send

        `Authorization: Bearer efg_org_…` to attribute the call to your org''s plan.

        Keyed calls are counted toward your monthly verification quota

        (free orgs get 50/mo for evaluation; an office that wants a hosted

        verification service at volume can ask us at hello@eformogi.com).

        Quota state is returned in response headers:

        - `X-Verify-Quota-Plan`: your plan name (`free`, `api`, etc.)

        - `X-Verify-Quota-Limit`: monthly included verifications (omitted for unlimited plans)

        - `X-Verify-Quota-Used`: verifications used so far this calendar month


        **An invalid or unrecognised key never blocks a verify**. The endpoint falls back

        to the public (keyless) path so a misconfigured integration can never break a

        single-link verification. Orgs on a paid plan are never blocked; only free-tier

        orgs over their evaluation allowance are gated

        (and only once `EFG_VERIFY_QUOTA_ENFORCE=true` is set, currently shadow mode).'
      tags:
      - Trust
      security:
      - {}
      - orgApiKey: []
      parameters:
      - name: id
        in: query
        required: true
        schema:
          type: string
        description: 'Receipt id to verify. Accepted formats: `tr_<12hex>` (transcript), `cr_<12hex>` (course receipt), `ws_<12hex>` (work sample), `wn_<12hex>` (Sunday Note), `wl_<12hex>` (wall), `att_<12hex>` (attestation), consent receipt UUID, or audit log UUID. Alias: `receipt_id` is accepted as a fallback query parameter.'
      responses:
        '200':
          description: 'Verification result. `verified: true` with non-PII metadata. Top-level fields vary by receipt kind but always include `verified` (boolean), `id` (string), `issued_by` (string), and `kind` (string). Actual values returned by the code: `family_transcript` (`tr_` ids), `course_receipt` (`cr_`), `work_sample` (`ws_`), `weekly_note` (`wn_`), `wall` (`wl_`), `attestation` (`att_`), `consent_receipt` (consent UUIDs), `event_receipt` (audit log UUIDs), `plan_receipt` (plan receipts), and `revoked` when the issuing family has withdrawn the receipt (carries `revoked: true`, `original_kind`, `revoked_at`; the content is withheld).'
        '402':
          description: 'Free-tier org over monthly evaluation allowance (only when `EFG_VERIFY_QUOTA_ENFORCE=true`; paid plans never receive this). Response body fields: `error` (string), `plan` (string), `included` (number), `used` (number), `hint` (string), `upgrade_url` (string).'
        '404':
          description: 'Not a valid Eformogi receipt. Response shape is uniform (`verified: false`, `id`, `message`). For well-formed prefixes (`tr_`, `ws_`, `wn_`, `wl_`, `cr_`, `att_`) the message names the receipt family (e.g. "No Eformogi work-sample receipt with this id."); unrecognised prefixes and UUIDs receive a generic fallback message. Existence is never confirmed: revoked, deleted, and never-issued ids all return 404.'
        '429':
          description: 'Rate limited. Public path: 10 requests/min/IP.'
      operationId: getApiVerifyReceipt
      x-operation-id-source: derived
  /api/portrait-evidence:
    get:
      summary: Download a transcript's Portrait of a Graduate evidence as a JSON file
      description: 'Public and keyless, like /api/verify-receipt. Reads the transcript through that

        endpoint''s own lookupTranscript (no separate copy of the read, no behavior change

        to /api/verify-receipt) and writes a downloadable file: the student, the transcript

        and its link, the New York Portrait of a Graduate taxonomy and its source, and every

        signed piece of evidence grouped by attribute, each with the evidence kind and

        reference, the course, the signer''s name, role, organization, and sentence, an

        identity note, and a verify link for the underlying course and signature receipts.

        Nothing here is not already on the verify page''s Portrait section: never an email,

        a hash, or a user id. Not metered and not tracked: an export is not a verification.

        Demo samples export like any other record; they are public samples already.'
      tags:
      - Trust
      parameters:
      - name: id
        in: query
        required: true
        schema:
          type: string
          pattern: ^tr_[a-f0-9]{12}$
        description: A family-issued transcript id.
      responses:
        '200':
          description: 'Body: `format` (`eformogi-portrait-evidence/1`), `transcript` ({ id, verify_url, student_name, issued_at, course_count }), `taxonomy` ({ jurisdiction, version, name, source_line, rubric_status }), `evidence_count` (a sum), `attributes` (array of { id, name, description, evidence_count, evidence: array of { evidence_kind, evidence_kind_label, evidence_ref, course_title, term, cr_receipt_id, cr_verify_url, att_id, att_verify_url, signed_at, signer: { name, role, organization, statement, identity_level, identity_source } } }). Served as `Content-Disposition: attachment`.'
        '400':
          description: '`id` is not `tr_` plus 12 hex characters. Body: `error`.'
        '404':
          description: 'Unknown or withdrawn transcript. Existence of a withdrawn transcript is never confirmed by content. Body: `error`.'
        '405':
          description: 'Not a GET. Body: `error`.'
        '429':
          description: 'Rate limited (30 per minute per IP). Body: `error`.'
        '500':
          description: 'The lookup failed. Body: `error`.'
      operationId: getApiPortraitEvidence
      x-operation-id-source: derived
  /api/issue-credential:
    post:
      summary: Issue a Verifiable Credential
      description: 'By default, issues the Eformogi W3C Verifiable Credential shape from `categoryId` and `fields` (both required). With `format: "ob3"`, issues a signed Open Badges 3.0 OpenBadgeCredential for `itemReceiptId` instead: the achievement and its evidence are built entirely from the stored record, never from the request body. Only `itemReceiptId` (required) and `subjectId` (optional) are accepted for that format; any other field in the body is refused with a 400, because the achievement text and the witness evidence are not caller-supplied facts.'
      tags:
      - Trust
      security:
      - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                categoryId:
                  type: string
                  description: Default format only.
                fields:
                  type: object
                  description: Default format only.
                provenance:
                  type: object
                  description: Default format only.
                personName:
                  type: string
                  description: Default format only.
                format:
                  type: string
                  enum:
                  - ob3
                  description: Omit for the default credential shape; "ob3" for the Open Badges 3.0 profile.
                itemReceiptId:
                  type: string
                  pattern: ^(tr|ws|att)_[a-f0-9]{12}$
                  description: 'format "ob3" only, required: a tr_, ws_, or att_ receipt id owned by the authenticated account.'
                subjectId:
                  type: string
                  description: 'format "ob3" only, optional: the holder''s own did: identifier, never an internal account id.'
      responses:
        '200':
          description: Signed W3C Verifiable Credential, or a signed OB3 OpenBadgeCredential when format is "ob3"
        '400':
          description: An unknown format, a malformed itemReceiptId or subjectId, or an ob3-only field carrying a fact that is built from the record
        '401':
          description: Authentication required
        '403':
          description: 'format "ob3": itemReceiptId exists but does not belong to the authenticated account'
        '404':
          description: 'format "ob3": no record with that itemReceiptId'
      operationId: postApiIssueCredential
      x-operation-id-source: derived
  /api/revoke-credential:
    post:
      summary: Revoke a Verifiable Credential
      tags:
      - Trust
      security:
      - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                credentialId:
                  type: string
                reason:
                  type: string
              required:
              - credentialId
      responses:
        '200':
          description: Credential revoked
        '403':
          description: Not credential owner
        '409':
          description: Already revoked
      operationId: postApiRevokeCredential
      x-operation-id-source: derived
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: Supabase JWT access token
    orgApiKey:
      type: apiKey
      in: header
      name: Authorization
      description: Institutional org API key. Use "Bearer efg_org_..." or "Api-Key efg_org_..." header. Keys are scoped to specific data categories.