API & gRPC Reference
All REST traffic flows API Gateway → Core Engine (orchestration) → microservices (gRPC), except
Admin Console, which the gateway routes to directly. Business-logic REST controllers live almost
entirely in Core Engine (60+ controller classes); Admin Console owns a separate /api/v1/admin/**
namespace of its own.
REST endpoints by actor
Grouped by base path — not an exhaustive per-endpoint listing. Read the named controller for a group’s full method list.
| Base path | Owning service | Purpose |
|---|---|---|
/api/v1/issuer/**, /issuer/auth/**, /issuer/{issuer_did}/api-keys | Core Engine | Issuer auth (magic link/SSO), KYC, server-to-server API keys |
/api/v1/issuers/** | Core Engine | Issuer portal user management; public DID/key resolution |
/api/v1/portal/me/** | Core Engine | Issuer Portal session-scoped ops (team, credential-templates, bulk-issuance) |
/api/v1/portal/catalog | Core Engine | Issuer-facing read view of the Program Catalog |
/api/v1/credentials/** | Core Engine | Issue, verify, get AI insight (IssueCredentialController, VerifyCredentialController, CredentialInsightController) |
/api/v1/verify/** | Core Engine | Public shareable-link/QR verification — no auth |
/api/v1/holder/** | Core Engine | Holder auth, credentials, requests, notifications, access-logs, wallet-key, consent, evidence, share links, claim flow, proof links, onboarding invites |
/api/v1/holders | Core Engine | Holder registry lookups |
/api/v1/custodian/** | Core Engine | Custodian Portal: bulk intake, review/attestation, workforce compliance, search, SSO |
/api/v1/custodians | Core Engine | Custodian directory management |
/api/v1/verifier/** | Core Engine | Verifier auth (self-registration, magic link) |
/api/v1/verifiers | Core Engine | Verifier directory management |
/api/v1/admin/claim-integrity, /admin/custodian-onboarding, /admin/issuer-onboarding, /admin/catalog, /admin/federated-issuers, /admin/anomalies | Core Engine | Cross-cutting admin ops Core Engine already orchestrates |
/api/v1/admin/auth, /admin/users, /admin/config, /admin/system-health, /admin/system-logs, /admin/audit-logs, /admin/network-stats | Admin Console (own module) | Platform-ops: admin-user management, config, health/log inspection |
/api/v1/audit-logs, /api/v1/network-stats, /api/v1/system-health | Core Engine | Cross-service audit search + network stats — distinct from Admin Console’s own /api/v1/admin/* equivalents |
/api/v1/reports | Core Engine | Compliance exports (e.g. AVETMISS) |
/api/v1/support | Core Engine | LLM-backed docs support Q&A |
/api/v1/demo-mode | Core Engine | Toggle demo/seeded-data mode |
/api/v1/learners | Learner Records (own REST controller) | Direct REST surface — not gRPC-only |
Core Engine and Admin Console both expose routes under /api/v1/admin/**, but they’re different
controllers in different services, disambiguated only by sub-path — there is no shared
AdminController. Check the table above before assuming which service owns a given path.
gRPC services
Proto files live in backends/shared/src/main/proto/ — 8 contracts, not the 3–4 historically
documented.
| Proto file | Service | Port | Scope |
|---|---|---|---|
credential.proto | CredentialIssuanceService | 50051 | Issue/revoke/get/claim; issuer/holder/custodian listings and stats; cross-custodian LinkSupersededCredential |
verification.proto | VerificationEngineService | 50052 | VerifyCredential, ValidateSignature, CheckCredentialStatus, VerifyRawSignature |
registry.proto | IssuerRegistryService | 50053 | Issuer CRUD, DID documents, key rotation, API keys, federated-issuer trust registry |
catalog.proto | CatalogRegistryService | 50054 | Jurisdictions, frameworks, catalog entries/versions, code sets, regulatory schemes, scheme registrations, proposals, skills, semantic search |
learner.proto | LearnerRecordsService | 50055 | Learner identity, enrolments, outcomes |
custodian_registry.proto | CustodianRegistryService | 50056 | Custodian DID/key registry, key rotation, status, payload signing |
issuer_sso.proto | IssuerSsoService | (Issuer Registry) | Issuer SSO config, OIDC/SAML authorization + assertion validation |
custodian_sso.proto | CustodianSsoService | (Custodian Registry) | Custodian SSO config, OIDC/SAML authorization + assertion validation |
Service ports
| Service | gRPC | REST |
|---|---|---|
| Credential Issuance | 50051 | 8081 |
| Verification Engine | 50052 | 8082 |
| Issuer Registry | 50053 | 8083 |
| Program Catalog | 50054 | 8085 |
| Learner Records | 50055 | 8086 |
| Custodian Registry | 50056 | 8087 |
| Core Engine | — | 8080 |
| Admin Console | — | 8084 |
| API Gateway | — | 8000 |
There is no BatchIssue RPC anywhere in the proto contracts — batch issuance is a REST-layer
concern (POST /api/v1/credentials/batch), not a streaming gRPC method.
Authentication
- JWT bearer tokens — API Gateway validates for issuers, holders, verifiers, custodians.
- Service-to-service mTLS — every internal gRPC connection requires mutual TLS with no plaintext fallback; a missing/invalid certificate fails the connection outright. See Internal gRPC mTLS.
- API keys — for custodial-issuer headless integrations. An issuer generates a
server-to-server key via
POST /api/v1/issuer/{issuer_did}/api-keys, then presents it asX-Api-Keyon/api/v1/credentials/issueand/api/v1/credentials/batchinstead of a JWT. See Issuer API Keys.
See API Gateway for gateway-level auth config.
Error handling
REST — standard HTTP status codes with a JSON error object:
{
"error": "CREDENTIAL_EXPIRED",
"message": "The provided credential has expired and is no longer valid.",
"timestamp": "2026-03-15T10:30:00Z",
"correlationId": "uuid-for-tracking"
}gRPC — standard Status codes:
| Code | Use case |
|---|---|
INVALID_ARGUMENT | Missing fields or malformed credential JSON |
NOT_FOUND | Issuer, custodian, or credential ID not in registry |
ALREADY_EXISTS | Duplicate issuer/custodian registration attempt |
UNAVAILABLE | Service (e.g. Issuer Registry) temporarily down |
Rate limiting
Redis-backed, per-route (not one blanket tier), via RateLimitingGatewayFilterFactory, keyed per
authenticated user/issuer or else per IP. Representative ceilings from GatewayConfig.java:
| Route | Limit |
|---|---|
| Credential verify / verify-link | 120 req/min |
| Credential issue | 30 req/min |
| Issuer registration | 10 req/min |
| Issuer KYC document upload | 5 req/min |
| Credential insight / support-ask (LLM) | 20 req/min |
| Admin/portal-user/registry ops | 30–60 req/min |
GatewayConfig is the authoritative, current per-route list — it changes independently of this
page.
Versioning
- v1 — current stable API, in active use by every route above.
- v2 — not yet started; no v2 routes or deprecation plan exist in the codebase.