Eformogi Account API

User account management

GitHub OpenAPI

Operations 27

POST /api/delete-account Delete user account #
GET /api/user-activity Get user activity dashboard #
GET /api/notifications Get notifications #
PATCH /api/notifications Mark notifications as read #
GET /api/data-export Export all user data (GDPR Art. 20) #
GET /api/security-events Get security events #
GET /api/notification-preferences Get notification preferences #
PATCH /api/notification-preferences Update notification preferences #
POST /api/feedback Submit feedback #
GET /api/api-keys List API keys #
POST /api/api-keys Create API key #
DELETE /api/api-keys Revoke API key #
GET /api/sessions List active sessions #
DELETE /api/sessions Revoke a session #
GET /api/data-retention Get retention policies #
PATCH /api/data-retention Update retention policies #
POST /api/data-retention Preview or apply data retention #
GET /api/trusted-devices List trusted devices #
POST /api/trusted-devices Trust current device #
DELETE /api/trusted-devices Remove trusted device #
GET /api/login-history Get login history #
GET /api/webhooks List webhooks #
POST /api/webhooks Create webhook or send test ping #
DELETE /api/webhooks Delete webhook #
POST /api/page-handle Claim or rename a page handle (signed-in) #
POST /api/push-subscribe Register this browser for recognition-delivery push (signed-in) #
DELETE /api/push-subscribe Remove this browser's push subscription (signed-in) #

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-account-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-account-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Eformogi Account 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: Account
  description: User account management
paths:
  /api/delete-account:
    post:
      summary: Delete user account
      description: Permanently deletes the authenticated user's account and all associated data. Requires confirmation phrase. GDPR Art. 17 compliant.
      tags:
      - Account
      security:
      - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - confirmation
              properties:
                confirmation:
                  type: string
                  enum:
                  - DELETE MY ACCOUNT
                  description: Confirmation phrase
      responses:
        '200':
          description: Account permanently deleted
        '400':
          description: Confirmation phrase required
        '401':
          description: Authentication required
      operationId: postApiDeleteAccount
      x-operation-id-source: derived
  /api/user-activity:
    get:
      summary: Get user activity dashboard
      description: Returns comprehensive activity history including documents, form fills, AI usage, credentials, shares, audit events, and monthly trends.
      tags:
      - Account
      security:
      - bearerAuth: []
      responses:
        '200':
          description: Activity data including tier, documents, fills, ai, shares, credentials, auditEvents, monthlyTrend
        '401':
          description: Authentication required
        '429':
          description: Rate limited (30/min)
      operationId: getApiUserActivity
      x-operation-id-source: derived
  /api/notifications:
    get:
      summary: Get notifications
      description: Returns paginated list of user notifications with unread count. Supports filtering by read/unread status.
      tags:
      - Account
      security:
      - bearerAuth: []
      parameters:
      - name: limit
        in: query
        schema:
          type: integer
          default: 20
        description: Max notifications to return
      - name: offset
        in: query
        schema:
          type: integer
          default: 0
        description: Pagination offset
      - name: unread
        in: query
        schema:
          type: boolean
        description: Filter to unread only
      responses:
        '200':
          description: Notification list with total and unread counts
        '401':
          description: Authentication required
        '429':
          description: Rate limited (60/min)
      operationId: getApiNotifications
      x-operation-id-source: derived
    patch:
      summary: Mark notifications as read
      description: Mark specific notifications or all notifications as read.
      tags:
      - Account
      security:
      - bearerAuth: []
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                all:
                  type: boolean
                  description: Mark all as read
                ids:
                  type: array
                  items:
                    type: string
                  description: Specific notification IDs to mark read
      responses:
        '200':
          description: Notifications marked as read
        '401':
          description: Authentication required
      operationId: patchApiNotifications
      x-operation-id-source: derived
  /api/data-export:
    get:
      summary: Export all user data (GDPR Art. 20)
      description: Returns all personal data in JSON or CSV format. Includes vault data, documents, form fills, share links, credentials, consent receipts, audit log, notifications, AI usage, and family members.
      tags:
      - Account
      security:
      - bearerAuth: []
      parameters:
      - name: format
        in: query
        schema:
          type: string
          enum:
          - json
          - csv
          default: json
        description: Export format
      responses:
        '200':
          description: Complete data export with Content-Disposition header for download
        '401':
          description: Authentication required
        '429':
          description: Rate limited (5/hour)
      operationId: getApiDataExport
      x-operation-id-source: derived
  /api/security-events:
    get:
      summary: Get security events
      description: 'Returns recent security-related events on the user''s account: data access, share link views, credential events, consent changes, and account activity. All events are from the audit log.'
      tags:
      - Account
      security:
      - bearerAuth: []
      parameters:
      - name: limit
        in: query
        schema:
          type: integer
          default: 20
          maximum: 50
        description: Number of events to return (max 50)
      responses:
        '200':
          description: Security events with summary stats and account info
        '401':
          description: Authentication required
      operationId: getApiSecurityEvents
      x-operation-id-source: derived
  /api/notification-preferences:
    get:
      summary: Get notification preferences
      description: Returns the authenticated user's notification preferences with type descriptions.
      tags:
      - Account
      security:
      - bearerAuth: []
      responses:
        '200':
          description: Current preferences and available notification types
        '401':
          description: Authentication required
      operationId: getApiNotificationPreferences
      x-operation-id-source: derived
    patch:
      summary: Update notification preferences
      description: Toggle notification types on/off. Merged with existing preferences.
      tags:
      - Account
      security:
      - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - preferences
              properties:
                preferences:
                  type: object
                  description: Map of notification types to boolean values
                  example:
                    share_viewed: true
                    system: false
      responses:
        '200':
          description: Preferences updated
        '400':
          description: Invalid type names or values
        '401':
          description: Authentication required
      operationId: patchApiNotificationPreferences
      x-operation-id-source: derived
  /api/feedback:
    post:
      summary: Submit feedback
      description: Submit user feedback. Authentication optional, anonymous submissions accepted.
      tags:
      - Account
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - type
              - message
              properties:
                type:
                  type: string
                  enum:
                  - bug
                  - feature
                  - general
                  - question
                message:
                  type: string
                  minLength: 5
                  maxLength: 5000
                page:
                  type: string
                  description: Page where feedback was submitted
                metadata:
                  type: object
                  description: Optional browser/device metadata
      responses:
        '200':
          description: Feedback submitted successfully
        '400':
          description: Invalid type or message length
        '429':
          description: Rate limited
      operationId: postApiFeedback
      x-operation-id-source: derived
  /api/api-keys:
    get:
      summary: List API keys
      description: Returns the authenticated user's active API keys with masked previews.
      tags:
      - Account
      security:
      - bearerAuth: []
      responses:
        '200':
          description: List of active API keys
        '401':
          description: Authentication required
      operationId: getApiApiKeys
      x-operation-id-source: derived
    post:
      summary: Create API key
      description: Generate a new personal API key. The full key is only returned once at creation.
      tags:
      - Account
      security:
      - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  maxLength: 100
                  description: Friendly name for the key
                expires_in_days:
                  type: integer
                  minimum: 1
                  maximum: 365
      responses:
        '200':
          description: API key created with secret (shown once)
        '400':
          description: Maximum 5 active keys reached
        '401':
          description: Authentication required
      operationId: postApiApiKeys
      x-operation-id-source: derived
    delete:
      summary: Revoke API key
      description: Revoke an API key by ID. Cannot be undone.
      tags:
      - Account
      security:
      - bearerAuth: []
      parameters:
      - name: id
        in: query
        required: true
        schema:
          type: string
        description: Key ID to revoke
      responses:
        '200':
          description: API key revoked
        '401':
          description: Authentication required
        '404':
          description: Key not found
      operationId: deleteApiApiKeys
      x-operation-id-source: derived
  /api/sessions:
    get:
      summary: List active sessions
      description: Returns active sessions for the authenticated user with device/browser info and IP.
      tags:
      - Account
      security:
      - bearerAuth: []
      responses:
        '200':
          description: List of active sessions
        '401':
          description: Authentication required
      operationId: getApiSessions
      x-operation-id-source: derived
    delete:
      summary: Revoke a session
      description: Revoke an active session by ID, signing out that device remotely.
      tags:
      - Account
      security:
      - bearerAuth: []
      parameters:
      - name: id
        in: query
        required: true
        schema:
          type: string
        description: Session event ID to revoke
      responses:
        '200':
          description: Session revoked
        '401':
          description: Authentication required
        '404':
          description: Session not found
      operationId: deleteApiSessions
      x-operation-id-source: derived
  /api/data-retention:
    get:
      summary: Get retention policies
      description: Returns the user's data retention policies for each category.
      tags:
      - Account
      security:
      - bearerAuth: []
      responses:
        '200':
          description: Current retention policies with category metadata
        '401':
          description: Authentication required
      operationId: getApiDataRetention
      x-operation-id-source: derived
    patch:
      summary: Update retention policies
      description: Update retention periods for specific data categories.
      tags:
      - Account
      security:
      - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - policies
              properties:
                policies:
                  type: object
                  description: Map of category keys to retention_days values
      responses:
        '200':
          description: Policies updated
        '400':
          description: Invalid retention period
        '401':
          description: Authentication required
      operationId: patchApiDataRetention
      x-operation-id-source: derived
    post:
      summary: Preview or apply data retention
      description: Preview records eligible for deletion or apply retention policies. Use ?action=preview or ?action=apply.
      tags:
      - Account
      security:
      - bearerAuth: []
      parameters:
      - name: action
        in: query
        required: true
        schema:
          type: string
          enum:
          - preview
          - apply
      responses:
        '200':
          description: Preview results or deletion confirmation
        '401':
          description: Authentication required
      operationId: postApiDataRetention
      x-operation-id-source: derived
  /api/trusted-devices:
    get:
      summary: List trusted devices
      description: Returns all trusted (non-revoked) devices for the authenticated user, with current device detection.
      tags:
      - Account
      security:
      - bearerAuth: []
      responses:
        '200':
          description: Array of trusted devices with browser, OS, device type, and expiration info
        '401':
          description: Authentication required
      operationId: getApiTrustedDevices
      x-operation-id-source: derived
    post:
      summary: Trust current device
      description: Register the current browser/device as trusted. Maximum 10 trusted devices. Default expiration 90 days.
      tags:
      - Account
      security:
      - bearerAuth: []
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: Custom device name
                expires_in_days:
                  type: integer
                  minimum: 1
                  maximum: 365
                  description: Days until trust expires (default 90)
      responses:
        '200':
          description: Device trusted successfully
        '400':
          description: Maximum device limit reached
        '401':
          description: Authentication required
      operationId: postApiTrustedDevices
      x-operation-id-source: derived
    delete:
      summary: Remove trusted device
      description: Revoke trust for a specific device by ID.
      tags:
      - Account
      security:
      - bearerAuth: []
      parameters:
      - name: id
        in: query
        required: true
        schema:
          type: string
        description: Device ID to remove
      responses:
        '200':
          description: Device trust revoked
        '401':
          description: Authentication required
        '404':
          description: Device not found
      operationId: deleteApiTrustedDevices
      x-operation-id-source: derived
  /api/login-history:
    get:
      summary: Get login history
      description: Returns paginated sign-in events with device info, IP, status, and authentication method.
      tags:
      - Account
      security:
      - bearerAuth: []
      parameters:
      - name: limit
        in: query
        schema:
          type: integer
          minimum: 1
          maximum: 100
          default: 50
        description: Max results
      - name: offset
        in: query
        schema:
          type: integer
          minimum: 0
          default: 0
        description: Pagination offset
      - name: status
        in: query
        schema:
          type: string
          enum:
          - all
          - success
          - failed
          default: all
        description: Filter by status
      responses:
        '200':
          description: Paginated login history with summary stats
        '401':
          description: Authentication required
      operationId: getApiLoginHistory
      x-operation-id-source: derived
  /api/webhooks:
    get:
      summary: List webhooks
      description: Returns all configured webhooks for the authenticated user, plus available event types.
      tags:
      - Account
      security:
      - bearerAuth: []
      responses:
        '200':
          description: Array of webhooks with event subscriptions, status, and available events list
        '401':
          description: Authentication required
      operationId: getApiWebhooks
      x-operation-id-source: derived
    post:
      summary: Create webhook or send test ping
      description: Create a new webhook endpoint (max 5) or send a test ping with ?action=test. HTTPS URLs only. Returns signing secret on creation.
      tags:
      - Account
      security:
      - bearerAuth: []
      parameters:
      - name: action
        in: query
        schema:
          type: string
          enum:
          - test
        description: Set to "test" to send a test ping instead of creating
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: Webhook name
                url:
                  type: string
                  format: uri
                  description: HTTPS endpoint URL
                events:
                  type: array
                  items:
                    type: string
                  description: Event types to subscribe to
                id:
                  type: string
                  description: Webhook ID (for test ping only)
      responses:
        '200':
          description: Webhook created with signing secret, or test ping result
        '400':
          description: Invalid URL, missing events, or limit reached
        '401':
          description: Authentication required
      operationId: postApiWebhooks
      x-operation-id-source: derived
    delete:
      summary: Delete webhook
      description: Permanently delete a webhook endpoint.
      tags:
      - Account
      security:
      - bearerAuth: []
      parameters:
      - name: id
        in: query
        required: true
        schema:
          type: string
        description: Webhook ID to delete
      responses:
        '200':
          description: Webhook deleted
        '401':
          description: Authentication required
        '404':
          description: Webhook not found
      operationId: deleteApiWebhooks
      x-operation-id-source: derived
  /api/page-handle:
    post:
      summary: Claim or rename a page handle (signed-in)
      tags:
      - Account
      security:
      - bearerAuth: []
      responses:
        '200':
          description: Claimed
        '409':
          description: Taken
      operationId: postApiPageHandle
      x-operation-id-source: derived
  /api/push-subscribe:
    post:
      summary: Register this browser for recognition-delivery push (signed-in)
      description: Stores or updates the caller's own web push subscription (endpoint, keys.p256dh, keys.auth). The endpoint must be https and match a real browser push service (FCM, Apple, Windows, or Mozilla); anything else is refused before it is ever stored. On a conflict (the same browser subscription already has a row), ownership moves to the caller and failed_count resets, the honest shared-device handoff. At most 5 subscriptions are kept per caller, oldest evicted.
      tags:
      - Account
      security:
      - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - subscription
              properties:
                subscription:
                  type: object
                  required:
                  - endpoint
                  - keys
                  properties:
                    endpoint:
                      type: string
                      format: uri
                      description: https, and must match a supported push service host (fcm.googleapis.com, *.push.apple.com, *.notify.windows.com, *.push.services.mozilla.com).
                    keys:
                      type: object
                      required:
                      - p256dh
                      - auth
                      properties:
                        p256dh:
                          type: string
                        auth:
                          type: string
      responses:
        '200':
          description: Stored or updated
        '400':
          description: Bad shape, or the endpoint is not a supported push service
        '401':
          description: No or bad token
        '503':
          description: push_subscriptions is not migrated yet
      operationId: postApiPushSubscribe
      x-operation-id-source: derived
    delete:
      summary: Remove this browser's push subscription (signed-in)
      description: Best-effort cleanup, called from the sign-out flow before the session drops (and from the toggle on an explicit turn-off), so a shared device can never keep notifying about the signed-out student's items. Removes only the caller's own row for the given endpoint; removing an already-absent row is still 200.
      tags:
      - Account
      security:
      - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - endpoint
              properties:
                endpoint:
                  type: string
                  format: uri
      responses:
        '200':
          description: Removed (or already absent)
        '400':
          description: endpoint required
        '401':
          description: No or bad token
        '503':
          description: push_subscriptions is not migrated yet
      operationId: deleteApiPushSubscribe
      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.