Webhooks

Receive real-time events as tutoring sessions progress.

Setup

Register a webhook endpoint via the API:

curl -X POST https://api.evelynlearning.com/v1/webhooks \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "url": "https://your-app.com/webhooks/evelyn", "events": ["session.ended", "usage.summary"] }'

Payload Format

Example: session.ended
{
  "event": "session.ended",
  "timestamp": "2026-10-15T14:30:00Z",
  "partner_id": "algerian-bac",
  "data": {
    "session_id": "sess_abc123",
    "student_id": "stu_xyz789",
    "subject": "math",
    "topic": "quadratic-functions",
    "level": "11-12",
    "duration_seconds": 1847,
    "message_count": 24,
    "whiteboard_items": 8,
    "end_reason": "student_ended",
    "token_usage": {
      "input_audio_tokens": 14200,
      "output_audio_tokens": 21800,
      "input_text_tokens": 48500,
      "output_text_tokens": 18200
    },
    "estimated_cost_usd": 1.23,
    "metadata": {
      "class_id": "math-11b"
    }
  }
}

Events

15 events across 5 categories.

Session Lifecycle

EventTriggerKey Fields
session.startedStudent begins tutoringsession_id, student_id, subject, topic, level, input_mode, timestamp
session.activeFirst student message sentsession_id, student_id, timestamp
session.pausedStudent pauses sessionsession_id, pause_reason, elapsed_seconds
session.resumedStudent resumes sessionsession_id, pause_duration_seconds
session.endedSession completes or times outsession_id, duration, message_count, whiteboard_items, token_usage, end_reason
session.abandonedStudent leaves without endingsession_id, last_activity_timestamp, duration
session.transcriptFull transcript available (post-session)session_id, transcript[], whiteboard_commands[]

Usage

EventTriggerKey Fields
usage.summaryEnd-of-session cost breakdownsession_id, input_tokens, output_tokens, audio_tokens, estimated_cost
usage.dailyDaily aggregate for partnerdate, total_sessions, total_minutes, total_cost, unique_students

Content

EventTriggerKey Fields
whiteboard.generatedWhiteboard visual createdsession_id, command_type, page_number, timestamp
homework.uploadedStudent uploads homework photosession_id, student_id, extraction_status, problem_count
homework.extractedProblems extracted from photosession_id, problems[], confidence_score

Learning

EventTriggerKey Fields
student.milestoneStudent demonstrates mastery of a conceptsession_id, student_id, concept_id, milestone_type

Errors

EventTriggerKey Fields
error.sessionSession-level errorsession_id, error_code, error_message, recoverable
error.voiceVoice engine error (connection, transcription)session_id, error_type, fallback_action

Security

All webhooks are signed with HMAC-SHA256 using your webhook secret. Verify the X-Evelyn-Signature header before processing. See Authentication for verification code examples.

Retry Policy

Failed deliveries (non-2xx response) are retried with exponential backoff: 1 minute, 5 minutes, 30 minutes, 2 hours, 24 hours. After 5 failed attempts, the event is logged and available via GET /webhooks/:id/events.

*Testing

Use POST /webhooks/:id/test to send a test event and verify your endpoint is configured correctly.