The DumpsterVibes API and MCP server
Connect your own website, office software or assistant tools to your company: look up bookings and customers, check dates and prices, book a roll-off dumpster, move or cancel one, and see what is owed. Every key belongs to one company and sees only that company's records.
API keys
An owner or admin makes keys in the dashboard under Tools → Connected Services → API keys: name the key, tick what it may do, and choose when it expires. The key is shown once — we keep only a fingerprint of it, so it can't be shown again. Revoke a key there and it stops working at once. A key also stops when the person who made it leaves the team or stops being an owner or admin.
Keys start dvk_live_. They act on your company's real records, so treat one like a password.
No key can charge or refund a card. A booking made through the API is paid by a pay link texted and emailed to the customer, on a net-terms customer's monthly invoice, or later by the office.
Scopes
bookings:read— Read bookingsbookings:write— Create, reschedule and cancel bookingscustomers:read— Read customerscustomers:write— Add and edit customersavailability:read— Check delivery dates and sizes for a ZIPquotes:read— Price a rentalinvoices:read— Read invoices and balances
Making requests
Send the key in the Authorization header. A key in the address is never read. Bodies and answers are JSON. Browsers can't call the API directly (no CORS): call it from your server.
curl https://dumpstervibes.com/api/v1/bookings?status=confirmed \
-H "Authorization: Bearer dvk_live_…"Every change needs an Idempotency-Key header: any unique string (a UUID is fine) per intended change. Send the same key again to retry safely — you get the first answer back, with Idempotent-Replayed: true, and nothing happens twice. A key is remembered for 24 hours; reusing it for a different request answers 409.
Lists are newest first and paged: pass limit (up to 100) and the next_cursor from the previous page as cursor.
Endpoints
The full contract is the OpenAPI 3.1 document at /api/v1/openapi.json, which most API tools can import.
| Call | What it does | Scope |
|---|---|---|
| GET /api/v1/bookings | List bookings | bookings:read |
| POST /api/v1/bookings | Create a booking | bookings:write |
| GET /api/v1/bookings/{id} | Get a booking | bookings:read |
| POST /api/v1/bookings/{id}/reschedule | Move a delivery or pickup | bookings:write |
| POST /api/v1/bookings/{id}/cancel | Cancel a booking | bookings:write |
| GET /api/v1/customers | List or search customers | customers:read |
| POST /api/v1/customers | Add a customer | customers:write |
| GET /api/v1/customers/{id} | Get a customer | customers:read |
| PATCH /api/v1/customers/{id} | Edit a customer | customers:write |
| GET /api/v1/availability | Delivery dates and sizes for a ZIP | availability:read |
| GET /api/v1/quotes | Price a rental | quotes:read |
| GET /api/v1/invoices | List invoices | invoices:read |
| GET /api/v1/invoices/{id} | Get an invoice and its balance | invoices:read |
Examples
Dates and sizes for a ZIP, then a price:
curl "https://dumpstervibes.com/api/v1/availability?zip=30041" -H "Authorization: Bearer $DV_KEY"
curl "https://dumpstervibes.com/api/v1/quotes?size_id=<size id>&zip=30041&delivery_date=2026-11-10&pickup_date=2026-11-20" \
-H "Authorization: Bearer $DV_KEY"Book it and text the customer a pay link:
curl -X POST https://dumpstervibes.com/api/v1/bookings \
-H "Authorization: Bearer $DV_KEY" \
-H "Idempotency-Key: 6f1d2c9e-order-1042" \
-H "content-type: application/json" \
-d '{
"customer": { "name": "Ada Lovelace", "phone": "770-555-0100", "email": "ada@example.com" },
"size_id": "<size id>",
"address": "1 Main St", "city": "Cumming", "state": "GA", "zip": "30041",
"delivery_date": "2026-11-10",
"terms_accepted": true,
"payment": "pay_link"
}'Move the delivery, or cancel an unpaid booking:
curl -X POST https://dumpstervibes.com/api/v1/bookings/<booking id>/reschedule \
-H "Authorization: Bearer $DV_KEY" -H "Idempotency-Key: move-1042-a" \
-H "content-type: application/json" -d '{ "delivery_date": "2026-11-12" }'
curl -X POST https://dumpstervibes.com/api/v1/bookings/<booking id>/cancel \
-H "Authorization: Bearer $DV_KEY" -H "Idempotency-Key: cancel-1042-a" \
-H "content-type: application/json" -d '{ "reason": "Customer changed plans" }'A booking runs through the same rules as your office booking desk: your prices, your service area, your calendar and each size's stock. A closed or full day answers 409 date_unavailable, an address outside your area 409 out_of_area, and an address we couldn't verify 409 address_unverified — resend with "confirm_address": true to book it as typed. A booking with a payment on it is cancelled in the dashboard, where you decide the refund.
MCP server
The same key works with the remote MCP server at https://dumpstervibes.com/api/mcp (streamable HTTP). Add it to any MCP client as a custom connector with the header Authorization: Bearer dvk_live_…. In a client that reads a JSON config:
{
"mcpServers": {
"dumpstervibes": {
"type": "http",
"url": "https://dumpstervibes.com/api/mcp",
"headers": { "Authorization": "Bearer dvk_live_…" }
}
}
}The client sees only the tools the key's scopes allow. Tools that change something act for your company exactly as your office would, and each one asks for an idempotency_key so a retry never books twice.
search_bookings(bookings:read) — Lists your company's bookings, newest first. Filter by status, customer or delivery date range. Read only.get_booking(bookings:read) — One of your company's bookings by its id or booking number, with dates, address and price. Read only.check_availability(availability:read) — Whether your company serves a ZIP, the delivery days open there, and your sizes with prices and rental lengths. Read only.get_quote(quotes:read) — Prices a rental with your company's checkout pricing (size or rental length, area fees, mileage, pickup fee, tax). Read only.create_booking(bookings:write) — Books a roll-off dumpster for your company through the office booking desk's own rules. This makes a real change for your company, exactly as if your office did it. No card is charged: payment is "pay_link" (the customer is texted and emailed a link), "invoice" (a net-terms customer's monthly bill) or "unpaid".reschedule_booking(bookings:write) — Moves a booking's delivery or pickup to another open day, with the dispatch board's checks. This makes a real change for your company, exactly as if your office did it. Send one of delivery_date or pickup_date.cancel_booking(bookings:write) — Cancels a booking that hasn't been delivered and has no payment on it. This makes a real change for your company, exactly as if your office did it. Nothing is refunded; a paid booking is cancelled in the dashboard.find_customer(customers:read) — Searches your company's customers by name, company, email or phone. Read only.add_customer(customers:write) — Adds a customer to your company's book. This makes a real change for your company, exactly as if your office did it. With a phone, say whether they agreed to service texts (text_consent).list_unpaid_invoices(invoices:read) — Your company's open and sent invoices with what is still owed on each. Read only.
Webhooks
To hear about changes as they happen — a new booking, a finished job, a paid invoice, a new customer — set up webhooks under Tools → Connected Services → Webhooks & Ad Tracking. They work with Zapier, Make or your own server, and every delivery is signed. Open webhooks (sign in first).
Limits and errors
Each key may make 120 requests a minute, and all of a company's keys together 300. Past that the answer is 429 with a Retry-After header.
Errors are JSON: { "error": { "code": "…", "message": "…" } }. A 503 is our fault and safe to retry; nothing was changed. A 404 means the record isn't at your company.
- 400
bad_request - 400
idempotency_key_required - 401
unauthorized - 403
forbidden - 403
insufficient_scope - 404
not_found - 409
conflict - 409
idempotency_key_reused - 409
idempotency_in_flight - 409
date_unavailable - 409
out_of_area - 409
address_unverified - 409
payment_collected - 409
not_scheduled - 429
rate_limited - 503
unavailable