Skip to main content
POST
Setup Dealer
POST /v1/dealers/setup
v1.0 schema lock. The response shape on this page is the locked v1.0 contract. We will never remove a documented field, never rename a field, and never change a field’s type without bumping to v2 (see Versioning). New fields may be added additively; your client must tolerate unknown keys. This endpoint has two distinct success-response variants: async job creation (HTTP 202 — the standard flow) and reactivation (HTTP 200 — when an inactive subscription exists for the URL).
Onboard a new dealership. Detects the website provider, generates the configuration, creates the subscription, and triggers the first inventory import. If the dealership was previously deleted (subscription deactivated), calling setup again will reactivate the existing subscription instead of creating a duplicate.

How It Works

  1. POST this endpoint. You get back HTTP 202 with a setup_id in well under a second.
  2. The setup job (provider detection, AI config validation, subscription creation) runs in the background — typically 60 seconds, up to ~10 minutes for heavily bot-protected sites.
  3. Poll GET /v1/dealers/setup/{setup_id} until status is "completed" or "failed". Recommended polling interval: 5 seconds.
  4. Or skip polling: subscribe to the setup.complete webhook before calling setup.

Request Body

Example

Response — HTTP 202 Accepted

Poll for completion (every 5 seconds):
See Get Setup Status for the full response shape of every status value (pending, running, completed, failed). When status is "completed", the poll response carries the detected provider, provider_confidence, config, vehicle_counts, and the new dealership_id / configuration_id / subscription_id. setup_status on the completed poll response is "active" when detection and validation both pass. If detection succeeds but the test scrape has issues (e.g. missing critical fields), the status is "needs_manual_review" — imports are still created but may need attention, and the poll response includes a human-readable requires_review_reason.
status: "completed" means detection and configuration are done — NOT that inventory is available. Poll until inventory_status: "available", or subscribe to the import.complete webhook. See Get Setup Status for details.
Inventory is automatically refreshed every 12 hours. This is the default schedule for all new dealerships and is not configurable via the API.

Reactivation

If you previously deleted a dealership and call setup again with the same URL, the existing subscription is reactivated. This completes inline (no detection runs) and returns HTTP 200:

Errors

Detection failures (e.g. the website provider could not be identified) no longer surface as POST errors — the POST succeeds with 202, and the failure is reported on the poll response as status: "failed" with an error message and, when available, a failure_mode classification.

Body

application/json
api_key
string
required
dealership_url
string
required
dealer_name
string | null
city
string | null
state
string | null
street_address
string | null
phone_number
string | null
async_mode
boolean | null
default:false

Response

Successful Response