API Documentation
Complete reference for the RepairSnap Vehicle Damage Estimation API. Everything you need to integrate vehicle damage cost estimation into your application.
Getting Started
Get your first estimate in three steps.
Sign up
Create a free account at app.repairsnap.cc. No credit card required.
Get your API key
Go to the Developer Dashboard and generate a test key. Test keys (rs_test_) return mock data instantly for free.
Make your first request
Send a photo of vehicle damage and get back a cost estimate.
curl -X POST https://api.repairsnap.cc/v1/estimates \ -H "Authorization: Bearer rs_test_YOUR_KEY" \ -F photo=@damage.jpg
Tip: Test keys (rs_test_) return realistic mock data with no usage limits. Use them for development and testing. Switch to a live key (rs_live_) for real AI-powered estimates.
Data API: Need repair cost data without submitting a photo? The Data API provides read-only access to vehicle repair costs, state labor rates, and damage type cost ranges at $0.01/call. Same API key, same authentication.
Authentication
All API requests require a Bearer token in the Authorization header.
Authorization: Bearer rs_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ
Key Prefixes
| Prefix | Environment | Description |
|---|---|---|
rs_test_ | Sandbox | Returns realistic mock data instantly. No usage limits. Free. |
rs_live_ | Production | Processes real AI estimates. Counts against your usage quota. |
Endpoints
/v1/estimates Create a new damage estimate.
URL: https://api.repairsnap.cc/v1/estimates
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
photo | File / Base64 | Required | JPEG, PNG, or WebP. Max 10MB. |
additional_photos | File[] | Optional | Up to 4 additional photos for multi-angle assessment. |
vehicle_make | String | Optional | Vehicle make (e.g. "Toyota"). Improves accuracy. |
vehicle_model | String | Optional | Vehicle model (e.g. "Camry"). |
vehicle_year | Number | Optional | Vehicle model year (e.g. 2022). |
state | String | Optional | US state code (e.g. "CA"). Defaults to CA. Affects labor rates. |
callback_url | URL | Optional | Webhook URL. Receives POST when estimate completes or fails. |
Request (multipart/form-data)
curl -X POST https://api.repairsnap.cc/v1/estimates \ -H "Authorization: Bearer rs_live_YOUR_KEY" \ -F photo=@damage.jpg \ -F vehicle_make=Toyota \ -F vehicle_model=Camry \ -F vehicle_year=2022 \ -F state=CA
Request (application/json with base64)
curl -X POST https://api.repairsnap.cc/v1/estimates \ -H "Authorization: Bearer rs_live_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "photo": "data:image/jpeg;base64,/9j/4AAQ...", "vehicle_make": "Toyota", "vehicle_model": "Camry", "vehicle_year": 2022, "state": "CA" }'
Response (202 Accepted)
{
"id": "est_a1b2c3d4",
"status": "processing",
"estimated_seconds": 15,
"poll_url": "https://api.repairsnap.cc/v1/estimates/est_a1b2c3d4",
"created_at": "2026-03-21T10:30:00Z"
} /v1/estimates/{id} Retrieve an estimate by ID. Response format depends on processing status.
Processing response
{
"id": "est_a1b2c3d4",
"status": "processing",
"stage": "damage_detection",
"progress": 0.4,
"estimated_remaining_seconds": 8
} Complete response
{
"id": "est_a1b2c3d4",
"status": "complete",
"vehicle": {
"make": "Toyota",
"model": "Camry",
"year": 2022
},
"damage": {
"areas": [
{
"type": "dent",
"severity": "moderate",
"location": "front_bumper",
"confidence": 0.87
},
{
"type": "scratch",
"severity": "minor",
"location": "front_fender_left",
"confidence": 0.92
}
]
},
"cost": {
"total_min": 128000,
"total_max": 192000,
"currency": "USD",
"unit": "cents",
"breakdown": {
"parts_oem": 65000,
"body_labor": 48000,
"paint_labor": 24000,
"adas_calibration": 35000
},
"line_items": [
{
"description": "Front bumper cover - R&R",
"repair_type": "replace",
"parts_cost": 45000,
"labor_hours": 3.5,
"labor_cost": 28000,
"paint_hours": 2.0,
"paint_cost": 16000
}
]
},
"adas": {
"required": true,
"calibrations": [
{
"system": "forward_collision_warning",
"type": "static",
"cost": 35000
}
]
},
"data_sources": [
{ "name": "State Labor Rate Survey (CA)", "data_points": 247 },
{ "name": "Toyota Camry Parts Database", "data_points": 156 }
],
"processing_time_ms": 12400
} Failed response
{
"id": "est_a1b2c3d4",
"status": "failed",
"error": {
"code": "no_damage_detected",
"message": "No vehicle damage was detected in the submitted photo."
}
} /v1/estimates/{id}/insurance Returns the estimate in insurance-industry format with operation codes, part types, and line-item breakdowns.
Response
{
"estimate_id": "est_a1b2c3d4",
"format": "insurance",
"vehicle": { "make": "Toyota", "model": "Camry", "year": 2022 },
"line_items": [
{
"line": 1,
"operation": "REPLACE",
"description": "Front bumper cover",
"part_type": "OEM",
"part_cost": 45000,
"labor_hours": 3.5,
"labor_rate": 8000,
"labor_cost": 28000,
"paint_hours": 2.0,
"paint_rate": 8000,
"paint_cost": 16000,
"subtotal": 89000
},
{
"line": 2,
"operation": "SUBLET",
"description": "Forward Collision Warning - Static Calibration",
"part_cost": 35000,
"subtotal": 35000
}
],
"totals": {
"parts": 80000,
"labor": 28000,
"paint": 16000,
"sublet": 35000,
"gross_total": 159000
}
} Operation Codes
| Code | Description |
|---|---|
REPAIR | Repair existing part |
REPLACE | Replace with new part |
REFINISH | Paint/refinish panel |
BLEND | Blend adjacent panel |
R&I | Remove and install |
SUBLET | Sublet work (ADAS calibration, mechanical) |
Data API
Read-only access to RepairSnap's vehicle repair cost database, state labor rates, and damage type cost ranges. No photo upload required.
Pricing: List endpoints (GET /v1/vehicles, GET /v1/states, GET /v1/damage-types) are FREE. Detail endpoints (GET /v1/vehicles/:make/:model, GET /v1/labor-rates/:state, GET /v1/damage-types/:type) cost $0.01 per call. AI estimate endpoints (POST /v1/estimates) are billed at your plan rate. All endpoints require a Bearer token.
/v1/vehicles List all supported vehicles.
Returns all vehicles in the RepairSnap database grouped by make, with model names and year ranges.
Request
curl https://api.repairsnap.cc/v1/vehicles \ -H "Authorization: Bearer rs_live_YOUR_KEY"
Response (200 OK)
{
"data": [
{
"make": "Toyota",
"models": [
{
"model": "Camry",
"years": "2020-2024",
"dataQuality": "high"
},
{
"model": "RAV4",
"years": "2019-2024",
"dataQuality": "high"
}
]
},
{
"make": "BMW",
"models": [
{
"model": "3 Series",
"years": "2019-2024",
"dataQuality": "high"
}
]
}
],
"meta": {
"totalMakes": 15,
"totalModels": 39
}
} /v1/vehicles/{make}/{model} Get repair cost data for a specific vehicle.
Returns full repair cost data including parts pricing, labor rates, common repairs, and severity cost ranges.
Parameters
| Parameter | Type | Description |
|---|---|---|
make | String | Vehicle make (e.g., Toyota, BMW, Mercedes-Benz) |
model | String | Vehicle model (e.g., Camry, 3-Series) |
Request
curl https://api.repairsnap.cc/v1/vehicles/Toyota/Camry \ -H "Authorization: Bearer rs_live_YOUR_KEY"
Response (200 OK)
{
"data": {
"vehicle": {
"make": "Toyota",
"model": "Camry",
"years": "2020-2024"
},
"sources": ["OEM parts pricing", "Body shop surveys"],
"laborRates": {
"body": 65,
"paint": 68,
"mechanical": 75
},
"commonRepairs": [
{
"name": "Front bumper replacement",
"costRange": [80000, 150000]
}
],
"partsPricing": [...],
"severityCostRanges": {...},
"commonDamagePatterns": [...]
}
} 404 Not Found
Returned when the make/model combination is not in our database. Use GET /v1/vehicles to see all supported vehicles.
/v1/labor-rates/{state} Get labor rates for a state.
Returns body, paint, mechanical, and frame labor rates ($/hr) for a specific US state from our 4,000+ body shop survey.
Parameters
| Parameter | Type | Description |
|---|---|---|
state | String | Two-letter US state code (e.g., CA, TX, NY) |
Request
curl https://api.repairsnap.cc/v1/labor-rates/CA \ -H "Authorization: Bearer rs_live_YOUR_KEY"
Response (200 OK)
{
"data": {
"state": "CA",
"body": 75,
"paint": 78,
"mechanical": 85,
"frame": 80,
"metroPremium": 1.15,
"generalLaborRate": 72,
"source": "4,000+ body shop survey"
}
} Response Fields
| Field | Description |
|---|---|
body | Body labor rate ($/hr) |
paint | Paint/refinish labor rate ($/hr) |
mechanical | Mechanical labor rate ($/hr) |
frame | Frame labor rate ($/hr) |
metroPremium | Metro area cost multiplier (e.g., 1.15 means 15% above state average) |
generalLaborRate | General auto repair rate ($/hr) |
/v1/damage-types/{type} Get cost ranges by severity for a damage type.
Returns cost ranges (in cents), repair methods, and descriptions for each severity level of a specific damage type.
Parameters
| Parameter | Type | Description |
|---|---|---|
type | String | Damage type identifier |
Valid damage types
scratch dent crack paint_chip glass_break lamp_damage missing_part rust structural Request
curl https://api.repairsnap.cc/v1/damage-types/dent \ -H "Authorization: Bearer rs_live_YOUR_KEY"
Response (200 OK)
{
"data": {
"type": "dent",
"name": "Dent",
"description": "Body panel deformation from impact, ranging from door dings to large creases.",
"severities": [
{
"severity": "minor",
"minCents": 7500,
"maxCents": 25000,
"avgCents": 15000,
"repairMethods": ["PDR (Paintless Dent Repair)"],
"description": "Small door dings, 1-2 inch dents without paint damage"
},
{
"severity": "moderate",
"minCents": 20000,
"maxCents": 75000,
"avgCents": 45000,
"repairMethods": ["PDR", "Body filler and repaint", "Glue pull repair"],
"description": "Larger dents 3-6 inches, may have minor paint damage"
},
{
"severity": "severe",
"minCents": 50000,
"maxCents": 200000,
"avgCents": 120000,
"repairMethods": ["Panel replacement", "Major body work and repaint"],
"description": "Large creases, buckled panels, requires replacement"
}
]
}
} Note: All cost values are in cents (USD). Divide by 100 to get dollars. For example, 7500 = $75.00.
/v1/states List all states with rate summaries.
Returns all US states with body shop labor rate summaries sorted alphabetically, plus national average rates.
Request
curl https://api.repairsnap.cc/v1/states \ -H "Authorization: Bearer rs_live_YOUR_KEY"
Response (200 OK)
{
"data": [
{
"state": "AL",
"body": 52,
"paint": 54,
"mechanical": 60,
"frame": 58,
"generalLaborRate": 50
},
{
"state": "CA",
"body": 75,
"paint": 78,
"mechanical": 85,
"frame": 80,
"generalLaborRate": 72
}
],
"meta": {
"totalStates": 51,
"nationalAverages": {
"body": 58,
"paint": 60,
"mechanical": 65,
"frame": 62
}
}
} Webhooks
Instead of polling, provide a callback_url when creating an estimate. We will POST to that URL when the estimate completes or fails.
Webhook Headers
| Header | Description |
|---|---|
Content-Type | application/json |
X-RepairSnap-Signature | HMAC-SHA256 signature of the request body |
Webhook Payload
{
"event": "estimate.completed",
"estimate_id": "est_a1b2c3d4",
"status": "complete",
"total_min": 128000,
"total_max": 192000,
"timestamp": "2026-03-21T10:30:15Z"
} Events
| Event | Description |
|---|---|
estimate.completed | Estimate processing completed successfully |
estimate.failed | Estimate processing failed |
Signature Verification
Verify webhook signatures using HMAC-SHA256 to ensure requests come from RepairSnap. The signature is in the X-RepairSnap-Signature header.
import hmac, hashlib def verify_signature(payload_body, signature, secret): expected = hmac.new( secret.encode('utf-8'), payload_body, hashlib.sha256 ).hexdigest() return hmac.compare_digest( f"sha256={expected}", signature ) # In your webhook handler: sig = request.headers['X-RepairSnap-Signature'] if not verify_signature(request.body, sig, WEBHOOK_SECRET): return Response(status=401)
import { createHmac, timingSafeEqual } from 'crypto'; function verifySignature(body, signature, secret) { const expected = 'sha256=' + createHmac('sha256', secret) .update(body) .digest('hex'); return timingSafeEqual( Buffer.from(signature), Buffer.from(expected) ); } // In your webhook handler: const sig = req.headers['x-repairsnap-signature']; if (!verifySignature(req.body, sig, WEBHOOK_SECRET)) { return res.status(401).send('Invalid signature'); }
Retry Policy
If your webhook endpoint returns a non-2xx status, we retry up to 3 times with exponential backoff:
- 1st retry: 5 seconds
- 2nd retry: 30 seconds
- 3rd retry: 5 minutes
Error Codes
All errors follow the RFC 9457 Problem Details format.
Error response format
{
"type": "https://repairsnap.cc/errors/rate-limit-exceeded",
"title": "Rate Limit Exceeded",
"status": 429,
"detail": "You have exceeded the rate limit of 5 requests per minute."
} HTTP Errors
| Status | Error | Description |
|---|---|---|
400 | Bad Request | Missing required parameters or invalid format |
401 | Unauthorized | Missing, invalid, or revoked API key |
402 | Payment Required | Free usage limit exceeded. Purchase credits or subscribe. |
404 | Not Found | Estimate ID does not exist |
429 | Rate Limited | Too many requests. Check Retry-After header. |
500 | Server Error | Internal server error. Retry the request. |
Estimate Errors
These appear in the error.code field when an estimate fails.
| Code | Description |
|---|---|
no_damage_detected | No vehicle damage was detected in the submitted photo |
not_a_vehicle | The photo does not appear to contain a vehicle |
image_quality_too_low | Image resolution or quality is insufficient for analysis |
processing_error | Internal processing error. Retry the request. |
Rate Limits
| Plan | Rate Limit | Usage Limit |
|---|---|---|
| Credit Packs | 5 requests/minute | Per-credit (5 for $4.99, 10 for $8.99, 25 for $19.99) |
| Monthly ($25/mo) | 30 requests/minute | 50/month included, $0.50/request overage |
| Business ($100/mo) | 60 requests/minute | 250/month included, $0.40/request overage |
Rate Limit Headers
Every API response includes rate limit headers:
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests per minute for your plan |
X-RateLimit-Remaining | Remaining requests in the current minute window |
X-RateLimit-Reset | Unix timestamp when the rate limit resets |
429 Response
When rate limited, the response includes a Retry-After header with the number of seconds to wait.
Code Examples
Full working examples for submitting an estimate, polling for the result, and parsing the response.
# 1. Submit estimate RESPONSE=$(curl -s -X POST https://api.repairsnap.cc/v1/estimates \ -H "Authorization: Bearer rs_live_YOUR_KEY" \ -F photo=@damage.jpg \ -F vehicle_make=Toyota \ -F vehicle_model=Camry \ -F vehicle_year=2022 \ -F state=CA) ESTIMATE_ID=$(echo $RESPONSE | jq -r .id) echo "Estimate $ESTIMATE_ID queued" # 2. Poll for result while true; do RESULT=$(curl -s https://api.repairsnap.cc/v1/estimates/$ESTIMATE_ID \ -H "Authorization: Bearer rs_live_YOUR_KEY") STATUS=$(echo $RESULT | jq -r .status) if [ "$STATUS" = "complete" ]; then break; fi if [ "$STATUS" = "failed" ]; then echo "Error: $(echo $RESULT | jq -r .error.message)" exit 1 fi sleep 2 done # 3. Parse the response echo $RESULT | jq '.cost | "Repair: $\(.total_min/100) - $\(.total_max/100)"'
Ready to integrate?
Get your API key and start building in minutes. Test keys return mock data instantly.