For the complete documentation index, see llms.txt. This page is also available as Markdown.

Credential Activity

The event log behind every credential you send — created, delivered, claimed — and how to query it.

Every send() (and every claim, template issue, or consent-driven write) is logged as a chain of events keyed by an activityId. This is the same data the Developer Portal dashboard shows and exports. Query it to answer "what happened to the credential I sent?" without a webhook.

Events

eventType

When

CREATED

You sent to an email or phone; the credential is waiting in the Universal Inbox

DELIVERED

It reached the recipient — directly to an existing account, or the claim message went out

CLAIMED

The recipient accepted it; credentialUri is now set

EXPIRED

The claim window passed

FAILED

Delivery failed; see metadata.error

A send to an existing profile goes straight to DELIVERED. A send to a new email is CREATED → DELIVERED → CLAIMED.

Record

{
    activityId: string;         // groups every event for one send
    eventType: 'CREATED' | 'DELIVERED' | 'CLAIMED' | 'EXPIRED' | 'FAILED';
    timestamp: string;          // ISO 8601
    recipientType: 'profile' | 'email' | 'phone';
    recipientIdentifier: string;
    boostUri?: string;          // the template, if any
    credentialUri?: string;     // set once claimed
    status?: 'active' | 'revoked' | 'suspended';
    source: 'send' | 'sendBoost' | 'sendCredential' | 'contract' | 'claim' | 'inbox' | 'claimLink' | 'acceptCredential' | 'appEvent';
    metadata?: Record<string, unknown>;
    boost?: { id: string; name?: string; category?: string };
    recipientProfile?: { profileId: string; displayName?: string };
}

Methods

All via learnCard.invoke; REST paths under https://network.learncard.com/api.

Method
REST
Returns

getActivityChain({ activityId })

GET /activity/credentials/{activityId}/chain

Every event for one send, oldest first

getActivity({ activityId })

GET /activity/credentials/{activityId}

The latest event for one send

getMyActivities({ limit?, cursor?, eventType?, boostUri?, integrationId? })

GET /activity/credentials

Your sends, newest first; eventType filters by current state

getActivityStats({ boostUris?, integrationId? })

GET /activity/credentials/stats

{ total, created, delivered, claimed, expired, failed, claimRate }

getMyCredentialLifecycleStatuses({ uris })

GET /activity/credentials/lifecycle-statuses

Holder-side: active/revoked/suspended per URI

eventType on getMyActivities means "sends whose latest event is this" — filtering by DELIVERED returns credentials that are delivered and not yet claimed, not everything that was ever delivered.

Examples

Did this one get claimed?

Everything still waiting to be claimed:

Claim rate for one template:

From the terminal: npx @learncard/cli status lists recent sends; status <activityId> shows one chain; add --json for scripts.

Last updated

Was this helpful?