Vetch for multi-location practices is now in private beta · Join the waitlist →
VetchVetch
Developer docs

Ship the integration this week.

REST + webhooks, OAuth and service tokens, TypeScript and Python SDKs, a sandbox seeded with a real clinic. Three steps to your first webhook below.

Get a sandbox key Jump to quickstart
Full reference at docs.vetch.vet.
Quickstart · 5 minutes

Three steps. One real webhook firing into your app.

  1. Authenticate

    Install the SDK and set your key.

    Service tokens are easiest for backend integrations. OAuth is required for end-user-facing apps.

    terminalcurl
    # Install the SDK
    npm install @vetch/sdk # or: pip install vetch-sdk
     
    # Export your sandbox token (never commit this).
    export OTIS_API_KEY='sk_sandbox_2k8jqx…'
  2. First call

    List today's appointments.

    Cursor-paginated, JSON, idempotent. The same call works in sandbox and production with a different key.

    POST /v1/appointments.listTypeScript
    import { Vetch } from '@vetch/sdk'
     
    const vetch = new Vetch({ apiKey: process.env.OTIS_API_KEY })
     
    const page = await vetch.vetointments.list({
    on: 'today',
    limit: 50,
    })
     
    // → { data: [{ id: 'appt_…', start: '2026-05-12T14:30Z', … }, …], next_cursor: '…' }
  3. Subscribe

    Catch a webhook the moment a chart signs.

    Signed payloads (HMAC-SHA256), automatic retries with exponential backoff, 30-day replay.

    POST /your-app/vetch-eventsTypeScript
    import { verifyWebhook } from '@vetch/sdk'
     
    export async function POST(req: Request) {
    const event = await verifyWebhook(req, process.env.OTIS_WEBHOOK_SECRET)
     
    if (event.type === 'chart.signed') {
    // event.data is the full chart payload, signed and timestamped.
    await postToReferringDvm(event.data)
    }
     
    return new Response('ok', { status: 200 })
    }
API surface

Eight resources cover the day.

Webhooks

Events the moment they fire.

60+ events across the platform. Signed payloads, automatic retries with exponential backoff, replay any event from the last 30 days from the dashboard or via API.

Idempotent. The same `Idempotency-Key` returns the same response for 24 hours — safe to retry.
  • appointment.bookedNew appointment created — covers self-book + staff-booked.
  • appointment.rescheduledTime, doctor, or room changed; original payload included.
  • chart.signedA licensed professional signed a SOAP. Final, locked.
  • payment.capturedCard or ACH cleared. Includes Stripe charge ID + invoice link.
  • payment.refundedFull or partial refund processed. Cause + initiator in metadata.
  • message.receivedInbound SMS/email/portal message arrived. Channel + thread context.
  • message.repliedA staff member or Vetch sent a reply. Includes whether Vetch drafted it.
  • recall.dueRecall window opened for a patient — annual, dental, recheck, etc.
  • inventory.lowStock dipped below reorder threshold. Item + location + level.
SDKs

Typed end-to-end. Generated nightly from the same OpenAPI spec.

TypeScript

v1
npm install @vetch/sdk
TypeScript
import { Vetch } from '@vetch/sdk'
const vetch = new Vetch({ apiKey: process.env.OTIS_API_KEY })

Python

v1
pip install vetch-sdk
Python
from vetch import Vetch
vetch = Vetch(api_key=os.environ['OTIS_API_KEY'])

Build it before the call ends.

Most production integrations ship in under a week. Bring us a real use case and we'll pair on it for the first hour.

Get a sandbox key Talk to engineering