01Getting started & authentication
The MightyAutomation API is project-scoped: every request acts on the project your API key belongs to. There is no project parameter on any route — the project is resolved from the key itself, so a key can never address another tenant.
All endpoints are served over HTTPS at base URL:
https://mightyautomation.com
Getting an API key
- Sign in to MightyAutomation and open your project.
- Go to Integrations → Zapier & other tools → Set up.
- Click Generate Zapier key and copy it — it is shown once. Keys look like mva_zapier_….
Authenticating requests
Send the key as a Bearer token on every request:
curl https://mightyautomation.com/api/agent/me \ -H "Authorization: Bearer mva_zapier_YOUR_KEY"
Errors & limits
- Errors return { "ok": false, "error": "<code>" } — 401 invalid_api_key, 403 insufficient_scope, 429 rate_limited.
- Rate limit: ~60 requests/minute per key.
- Validate any key with GET /api/agent/me — it returns the bound project name.
02Contacts
Create, search, and update CRM contacts. The upsert matches on email (case-insensitive); tags are merged, never replaced, and notes are appended.
| Endpoint | What it does |
|---|---|
| GET /api/agent/contacts | List contacts, newest first. Query: email (find one), created_after, limit (≤200), offset. |
| POST /api/agent/contacts | Create or update a contact by email. Body: email (required), first_name, last_name, phone, company, lifecycle, pipeline_stage, source, tags[], notes, custom. |
| GET /api/agent/contacts/{id} | Contact detail with recent activity and upcoming events. |
| PATCH /api/agent/contacts/{id} | Update fields: pipeline_stage, lifecycle, tags, phone, names, do_not_contact. |
| POST /api/agent/contacts/{id}/notes | Append a note to the contact timeline. Body: { "content": "…" }. |
| POST /api/agent/contacts/tags | Add tags. Locate by contact_id or email; body requires tags[]. |
Example — upsert a lead
curl -X POST https://mightyautomation.com/api/agent/contacts \
-H "Authorization: Bearer mva_zapier_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"email": "jane@example.com",
"first_name": "Jane",
"last_name": "Doe",
"phone": "+15551234567",
"company": "Acme Inc",
"tags": ["inbound-lead"],
"notes": "Came in via Zapier"
}'
→ { "ok": true, "created": true, "contact_id": "…", "events": ["contact_created"] }03Leads & pipeline
Search leads with CRM filters and read the project's pipeline stages (needed for valid pipeline_stage values and the Stage Changed trigger).
| Endpoint | What it does |
|---|---|
| GET /api/agent/leads | Lead search. Query: q, stage, lifecycle, has_phone=true, limit/offset. |
| GET /api/agent/pipeline-stages | Pipeline stage names in board order. |
04Events & REST-hook webhooks
MightyAutomation records a project-scoped event feed for everything that matters in the CRM and forms. Subscribe an HTTPS endpoint and we POST each event to it as it happens — this is the contract the native Zapier app uses for its triggers.
| Endpoint | What it does |
|---|---|
| GET /api/agent/events | Event feed, newest first. Query: type, since, limit (≤100). |
| POST /api/agent/hooks | Subscribe a target URL to an event type. Body: { "event_type": "…", "target_url": "https://…" } — or * for all types. |
| GET /api/agent/hooks | List active subscriptions (with delivery status). |
| DELETE /api/agent/hooks/{id} | Unsubscribe (idempotent). |
Event types
contact_createdtag_addedentered_stagelifecycle_changedform_submittedactivity_loggedappointment_bookedappointment_rescheduledappointment_cancelledappointment_completedappointment_no_showcall_completedcall_outcome
Delivery payload
Each delivery POSTs one event object: id, type, occurred_at, contact (expanded contact), and data (event-specific fields). Any 2xx is a success; subscriptions that fail repeatedly are quarantined automatically.
05Automations & scheduling
| Endpoint | What it does |
|---|---|
| GET /api/agent/automations | List the project's automations (id, name, status). |
| POST /api/agent/enroll | Enroll a contact in an automation. Locate the automation by automation_id or automation_name; the contact by contact_id or email. |
| GET /api/agent/appointments | Upcoming appointments (optional from/to). |
| GET /api/agent/booking-links | Booking links the project exposes. |
06Files & media
Import a remote file (e.g. an image or document URL from Notion, a form tool, or an email attachment) into the project's Media Assets.
| Endpoint | What it does |
|---|---|
| POST /api/agent/files | Body: url (required, https), name, contact_id (optional — attaches a note to that contact). |
07Inbound webhooks
For tools that can only send data — Zapier's Webhooks by Zapier, Make, a form backend, or a custom app — each project can mint named inbound webhook URLs from Integrations → Custom Webhooks. No API key needed: the token in the URL is the credential.
| Endpoint | What it does |
|---|---|
| POST /api/hooks/{token} | Custom webhook endpoint created in the dashboard. Accepts any JSON (or form-encoded) body up to 32 KB. Each endpoint is configured with one target: crm_contact (upsert by email; unmapped fields are preserved on the contact), form (runs the payload through an existing platform form — validation, spam checks, notifications and automations all fire), automation (enroll the contact in a chosen automation), or log (capture only — inspect the payload first). Optional Authorization: Bearer enforcement and token rotation are built in; every delivery is recorded and can be replayed from the dashboard. |
| POST /api/inbound-hook/{token} | The legacy single catch-hook (one per project) — same CRM upsert behavior, still supported. |
| POST /api/forms/{formId}/{token}/submit | Submit directly into a specific platform form — JSON { "email": "…", "name": "…" } or FormData. The full pipeline fires: validation, spam scoring, notifications, CRM contact creation, automations. Off-platform sites can be allow-listed via the form's External origins setting (CORS preflight supported). |
Example — Zapier "Webhooks by Zapier → POST" to a custom webhook
curl -X POST https://mightyautomation.com/api/hooks/wk_your_token_here \
-H "Content-Type: application/json" \
-d '{
"email": "jane@example.com",
"first_name": "Jane",
"phone": "+15551234567",
"plan": "annual"
}'
→ { "ok": true, "detail": "created contact 5f1b…" }
(field_mapping on the hook can rename any payload keys first)08Connect with Zapier (no code)
The native Mighty Automation app on Zapier wraps this API — no URLs or JSON needed:
- In Zapier, create a Zap and search for Mighty Automation.
- Paste your mva_zapier_… key when asked to connect an account.
- Triggers: New Contact, Contact Tagged, Form Submitted, Pipeline Stage Changed, Appointment Booked.
- Actions: Create or Update Contact, Add Tag, Add Note, Enroll in Automation, Import File.
- Search: Find Contact (with find-or-create).
Endpoints the Zapier app uses
Every operation in the app maps to the public API surface documented above — nothing private or unpublished:
| Endpoint | What it does |
|---|---|
| GET /api/agent/me | Auth test — validates the API key and returns the bound project (also the Zapier connection label). |
| POST /api/agent/hooks | All 5 instant triggers subscribe here — REST hooks for contact_created, tag_added, form_submitted, entered_stage, appointment_booked. Sample polling uses GET /api/agent/events?type=…; unsubscribe is DELETE /api/agent/hooks/{id}. |
| GET /api/agent/pipeline-stages | Hidden trigger List Stages — powers the Pipeline Stage dropdown. |
| GET /api/agent/automations | Hidden trigger List Automations — powers the Automation dropdown. |
| GET /api/agent/contacts | Hidden trigger List Contacts — powers the Contact ID dropdowns. Also the Find Contact search (?email=). |
| POST /api/agent/contacts | Action Create or Update Contact — upsert by email, then re-reads GET /api/agent/contacts/{id} for the full record. |
| POST /api/agent/contacts/tags | Action Add Tag to Contact — merge tags by email or contact id. |
| POST /api/agent/contacts/{id}/notes | Action Add Note to Contact — appends to the CRM timeline. |
| POST /api/agent/enroll | Action Enroll Contact in Automation. |
| POST /api/agent/files | Action Import File to Media Library. |
Example — instant trigger lifecycle
# Subscribe (when the Zap turns on)
POST https://mightyautomation.com/api/agent/hooks
{ "event_type": "appointment_booked", "target_url": "https://hooks.zapier.com/…" }
→ { "ok": true, "id": "sub_…" }
# We then POST each event to the target URL as it happens:
{
"id": "evt_…",
"type": "appointment_booked",
"occurred_at": "2026-01-20T16:00:00Z",
"contact": { "email": "jane@example.com", "first_name": "Jane", … },
"data": {
"title": "Discovery Call",
"scheduled_at": "2026-01-20T16:00:00Z",
"meeting_url": "https://meet.google.com/abc-defg"
}
}Example — Enroll Contact in Automation
POST https://mightyautomation.com/api/agent/enroll
{ "automation_id": "a1b2…", "email": "jane@example.com" }
→ { "ok": true, "status": "succeeded", "run_id": "r_…" }Example — Find Contact (search)
GET https://mightyautomation.com/api/agent/contacts?email=jane%40example.com
→ { "ok": true, "contacts": [ { "id": "c8b2…", "email": "jane@example.com", … } ] }09Machine-readable spec
The full API is described as OpenAPI 3 at GET /api/agent/openapi.json — feed it to any OpenAPI-aware tool, AI agent, or integration copilot to discover every pathway programmatically.
Questions: support@mightyautomation.com.