Examples

Start quickly with curl examples for the current public v1 records and webhook registration.

IntermediateownermanagerdeveloperUpdated 2026-03-19

Examples

These examples use curl, but the same request shapes work in Postman, Zapier, Make, or your own backend.

Set your key first:

export CEPRO_API_KEY="ce_live_xxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"

Create A Lead

curl https://app.cleanestimate.pro/api/v1/leads \
  -X POST \
  -H "Authorization: Bearer $CEPRO_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: lead-demo-001" \
  -d '{
    "customer_name": "Taylor Morgan",
    "customer_email": "taylor@example.com",
    "customer_phone": "+15551234567",
    "service_address": "123 Main St",
    "city": "Charlotte",
    "state": "NC",
    "zip": "28202",
    "service_interest": ["house-wash"],
    "notes": "Requested a Saturday estimate"
  }'

List Leads

curl "https://app.cleanestimate.pro/api/v1/leads?limit=25&sort=created_at&order=desc&status=new" \
  -H "Authorization: Bearer $CEPRO_API_KEY"

Create A Client

curl https://app.cleanestimate.pro/api/v1/clients \
  -X POST \
  -H "Authorization: Bearer $CEPRO_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: client-demo-001" \
  -d '{
    "name": "Taylor Morgan",
    "email": "taylor@example.com",
    "phone": "+15551234567",
    "address_line1": "123 Main St",
    "city": "Charlotte",
    "state": "NC",
    "zip": "28202"
  }'

Write Notes To Clients, Leads, And Jobs

The current public v1 API supports note fields on clients, leads, and jobs. You can send notes when you create the record or patch notes onto an existing record later.

Add Notes To A Client

curl https://app.cleanestimate.pro/api/v1/clients \
  -X POST \
  -H "Authorization: Bearer $CEPRO_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: client-notes-demo-001" \
  -d '{
    "name": "Taylor Morgan",
    "email": "taylor@example.com",
    "phone": "+15551234567",
    "notes": "Prefers text first. Side gate code is 4421.",
    "status": "active"
  }'
curl https://app.cleanestimate.pro/api/v1/clients/CLIENT_ID \
  -X PATCH \
  -H "Authorization: Bearer $CEPRO_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: client-notes-update-001" \
  -d '{
    "notes": "Requested Friday afternoon appointments only."
  }'

Add Notes To A Lead

curl https://app.cleanestimate.pro/api/v1/leads \
  -X POST \
  -H "Authorization: Bearer $CEPRO_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: lead-notes-demo-001" \
  -d '{
    "customer_name": "Taylor Morgan",
    "customer_email": "taylor@example.com",
    "customer_phone": "+15551234567",
    "service_address": "123 Main St",
    "city": "Charlotte",
    "state": "NC",
    "zip": "28202",
    "notes": "Requested Saturday estimate. Interested in house wash and driveway.",
    "source": "api"
  }'
curl https://app.cleanestimate.pro/api/v1/leads/LEAD_ID \
  -X PATCH \
  -H "Authorization: Bearer $CEPRO_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: lead-notes-update-001" \
  -d '{
    "notes": "Left voicemail. Follow up tomorrow morning."
  }'

Create An Estimate

curl https://app.cleanestimate.pro/api/v1/estimates \
  -X POST \
  -H "Authorization: Bearer $CEPRO_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: estimate-demo-001" \
  -d '{
    "customer_name": "Taylor Morgan",
    "customer_email": "taylor@example.com",
    "customer_phone": "+15551234567",
    "address_line1": "123 Main St",
    "city": "Charlotte",
    "state": "NC",
    "zip": "28202",
    "services": [
      {
        "service_slug": "house_wash",
        "enabled": true,
        "sqft": 2400,
        "stories": 2
      }
    ],
    "addons": [],
    "custom_items": [],
    "dirtiness_level": "light"
  }'

Update An Estimate

curl https://app.cleanestimate.pro/api/v1/estimates/ESTIMATE_ID \
  -X PATCH \
  -H "Authorization: Bearer $CEPRO_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: estimate-update-demo-001" \
  -d '{
    "customer_phone": "+15559876543",
    "assigned_rep_id": "00000000-0000-0000-0000-000000000123",
    "status": "sent",
    "expires_at": "2026-04-19T00:00:00.000Z"
  }'

PATCH /api/v1/estimates/:id is intentionally narrow. Use it for customer/contact metadata, address/property details, assignment, draft/sent status, source, and expires_at. If the service selection or pricing inputs change, create a fresh estimate instead of trying to reprice through this endpoint.

Register A Webhook Destination

curl https://app.cleanestimate.pro/api/v1/webhooks \
  -X POST \
  -H "Authorization: Bearer $CEPRO_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: webhook-demo-001" \
  -d '{
    "name": "Ops Sync",
    "url": "https://example.com/cepro/webhooks",
    "events": ["lead.created", "estimate.created", "job.completed"]
  }'

The create response includes the webhook secret once. Store it immediately so you can verify signatures later.

ce_test_... keys cannot call /api/v1/webhooks in v1. Use a live key when you are ready to register real outbound destinations.

Create A Job

curl https://app.cleanestimate.pro/api/v1/jobs \
  -X POST \
  -H "Authorization: Bearer $CEPRO_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: job-demo-001" \
  -d '{
    "client_id": "00000000-0000-0000-0000-000000000001",
    "service_type": "house_wash",
    "scheduled_date": "2026-03-20",
    "scheduled_time_start": "09:00:00",
    "scheduled_time_end": "11:00:00",
    "customer_name": "Taylor Morgan",
    "service_address": "123 Main St",
    "service_city": "Charlotte",
    "service_state": "NC",
    "service_zip": "28202"
  }'
curl https://app.cleanestimate.pro/api/v1/jobs/JOB_ID \
  -X PATCH \
  -H "Authorization: Bearer $CEPRO_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: job-notes-update-001" \
  -d '{
    "notes": "Customer requested a 30-minute arrival call.",
    "access_notes": "Use side gate. Code 4421.",
    "special_instructions": "Park on the street, not in the driveway."
  }'

List Invoices

curl "https://app.cleanestimate.pro/api/v1/invoices?limit=25&sort=created_at&order=desc&status=sent" \
  -H "Authorization: Bearer $CEPRO_API_KEY"

Webhook routes are live-only in the current public v1 surface. Use a ce_live_... key for /api/v1/webhooks.

Pull The OpenAPI Spec

curl https://app.cleanestimate.pro/api/v1/openapi.json

Use the OpenAPI file for:

  • Swagger UI
  • Postman import
  • SDK generation
  • Contract validation in CI

Was this article helpful?

Still need help? Contact support