# Ravetell > Voice-first testimonial collection. A campaign link starts a guided voice interview > (agent "Remy"); the giver approves a drafted testimonial with explicit, per-channel > consent. Everything below is the machine surface for agents and automations. ## MCP (preferred for agents) - Endpoint: https://mcp.ravetell.com (Streamable HTTP, stateless; POST JSON-RPC) - Auth, pick one: - OAuth 2.1: discovery at /.well-known/oauth-authorization-server (DCR + PKCE S256). Claude/compatible clients: add the URL as a connector and complete consent. - API key: Authorization: Bearer rvt_live_… (create at https://ravetell.com/campaigns/settings) - Tools (wire names are ravetell_-prefixed; read tools carry annotations.readOnlyHint=true): read: list_campaigns, get_testimonials, get_response, get_campaign_stats, get_person, get_account_settings, get_share_link, get_errors, help write (requires write scope): create_campaign, update_campaign, update_testimonial, approve_testimonial, report_bug - create_campaign is two-phase: first call returns a preview card and creates NOTHING; call again with confirm:true to create. Never confirm in the same turn you show the preview to a human. - Consent is giver-authoritative: agents may read consent state but cannot grant it. ## REST Base https://ravetell.com — Authorization: Bearer rvt_live_… - GET /api/campaigns list campaigns - POST /api/campaigns create (returns share_url) - GET /api/campaigns/{id} detail - PATCH /api/campaigns/{id} edit / archive / reactivate - GET /api/campaigns/{id}/responses responses incl. transcript + consent - PATCH /api/campaigns/{id}/responses/{rid} owner edits - GET/POST /api/webhooks webhook registry - POST /api/webhooks/{id}/test | /redeliver delivery tools 429 responses carry Retry-After. ## Webhooks (push) Events: testimonial.approved (full text + attribution + consent in payload), testimonial.consent_updated, campaign.created, campaign.updated. Envelope: { id: "evt_…", type, createdAt, account_id, data } — dedupe on id. Signature header: Ravetell-Signature: t=,v1= where v1 = HMAC-SHA256(secret, `${t}.${rawBody}`); reject |now - t| > 300s. Delivery: at-least-once with gaps (retries 0/2/6s, then manual redeliver; 7-day log). Register: POST /api/webhooks { url (https only), events[] } → whsec_… secret shown once. Cap: 5 webhooks/account. ## Human docs https://ravetell.com/developers