RESTJSONToken authAsync webhooks

Cloud Tuning API

Integrate our ECU processing engine directly into your platform. Your customer uploads an ECU file on your site; you send the file plus the solutions you want; we return the corrected file — checksum and RSA fixed automatically — with no manual handling of any web UI.

Base URL: https://www.davincideluxe.fr/api/v1/cloud

View API pricing & plans →

Uses your existing DaVinci Deluxe account. Subscribe with the normal Stripe checkout — your API key is generated automatically and appears in your profile.

Authentication

Every request is authenticated with a secret API key sent as a Bearer token. Generate your key in your dashboard at /profile#api after activating an API plan. The raw key is shown once — store it securely; we only keep a hash.

Authorization: Bearer dvc_live_xxxxxxxxxxxxxxxxxxxxxxxx
Keys are scoped to your account. Create multiple keys (staging / production) and revoke any instantly from the dashboard. A revoked or suspended key returns 401 / 403.

Quick start

Submit a file with the solutions you want and a callback URL. You get a job_id back immediately, then a signed webhook when the corrected file is ready.

# 1. Submit a job (multipart)
curl -X POST https://www.davincideluxe.fr/api/v1/cloud/jobs \
  -H "Authorization: Bearer dvc_live_xxxxx" \
  -F "file=@/path/to/original.bin" \
  -F "ecu_brand=Bosch" \
  -F "ecu_model=EDC17C64" \
  -F "fuel_type=diesel" \
  -F 'services=["DPF","EGR","ADBLUE","DTC"]' \
  -F 'tuning_options=["Stage 1"]' \
  -F "webhook_url=https://yourapp.com/hooks/davinci"

# → { "ok": true, "job_id": 1234, "status": "uploaded", "webhook_will_fire": true }

Endpoints

Submit a job

POST/api/v1/cloud/jobs

Content-Type: multipart/form-data. Send the binary in the file field.

FieldTypeRequiredDescription
filefilerequiredThe original (virgin) ECU dump. Max 50 MB. Do not upload a previously tuned output.
ecu_brandstringrequiredECU manufacturer, e.g. Bosch, Continental, Delphi.
ecu_familystringfamily/modelECU family, e.g. EDC17, MED17.
ecu_modelstringfamily/modelSpecific model, e.g. EDC17C64.
fuel_typestringoptionaldiesel or petrol.
servicesJSON array / CSVservices or tuning_optionsAnti-pollution & correction solutions — see Solutions.
tuning_optionsJSON array / CSVservices or tuning_optionsPerformance tuning presets (Stage 1/2/3, Pops & Bangs, Hardcut, etc.).
dtc_codesstringoptionalSpecific DTC codes to remove, e.g. P2002,P0401.
webhook_urlstring (https)recommendedPublic HTTPS URL we POST to when the job finishes. Private / loopback / metadata addresses are rejected.
metadatastringoptionalUp to 2 KB of your own reference data, echoed back in the webhook.
// 200 OK
{
  "ok": true,
  "job_id": 1234,
  "status": "uploaded",
  "webhook_will_fire": true
}

Job status

GET/api/v1/cloud/jobs/{id}

Poll for progress if you are not using webhooks. Status moves through uploaded → processing → done (or error).

{
  "ok": true,
  "job_id": 1234,
  "status": "done",
  "result_url": "https://www.davincideluxe.fr/api/v1/cloud/jobs/1234/result"
}

Download result

GET/api/v1/cloud/jobs/{id}/result

Streams the corrected binary (checksum + RSA already applied). Available once status = done.

List jobs

GET/api/v1/cloud/jobs

Returns your recent jobs with status and timestamps.

Health

GET/api/v1/cloud/health

Authenticated liveness check. Also returns your subscription status headers.

Solutions covered

Two families are available. Deletes / corrections go in the services array; performance tuning presets go in the tuning_options array. You can combine both in a single job.

Anti-pollution & corrections — services

  • DPF / FAP
  • EGR
  • AdBlue / SCR
  • DTC removal
  • Lambda / O2
  • Flaps / Swirl
  • NOx
  • Start & Stop
  • Hot Start fix
  • Readiness / OBD

Performance tuning — tuning_options

  • Stage 1
  • Stage 1+
  • Stage 2
  • Stage 3
  • Eco Tune
  • Pops & Bangs
  • Pops & Bangs (switchable)
  • Launch Control
  • Hardcut / RPM limiter
  • E85 conversion
Send the values as catalog strings, e.g. tuning_options=["Stage 1","Pops & Bangs"] and services=["DPF","EGR","DTC"]. Availability of a given preset depends on the specific ECU; if a combination is not supported for a file, the job is rejected with a clear reason (and never silently charged).
Checksum & RSA: correction is applied automatically to every output file. You never need to post-process the result.

Supported ECUs & vehicles

Coverage is ECU-specific. Which services are available for a given file depends on the exact ECU hardware. When you submit a job, any service that is not supported for that ECU is returned in the rejection reason — and is never charged. The full, always-current reference is also published here: DaVinci Deluxe Supported List (PDF).

ECU hardware

  • Bosch EDC15 / EDC16 / EDC17
  • Bosch MED9 / MED17 / ME17 / MEDC17
  • Bosch MG1 / MD1
  • Continental · Siemens SID (201–807 EVO)
  • Continental SIMOS 8 / 12 / 18
  • Continental PCR 2.1 / PPD 1.x
  • BMW MSD80–90 / MSV / MEVD17
  • Delphi DCM3.x / 6.x / 7.x
  • Delphi CRD2 / CRD3 / DDCR
  • Denso
  • Magneti Marelli MJD / IAW / 8GMK
  • Valeo VD46.x / VD56.x / J34 / V34
  • Visteon DCU102
  • ZF (transmission)

Vehicle brands

  • Alfa Romeo
  • Audi · VW · Seat · Skoda
  • BMW · Mini
  • Chery
  • Chrysler · Dodge · Jeep
  • Citroën · Peugeot · DS
  • Dacia
  • Deutz
  • Ferrari
  • Fiat · Lancia
  • Ford
  • Geely
  • Great Wall
  • Honda
  • Hyundai · Kia
  • Isuzu
  • Iveco · CNH
  • JAC
  • Jaguar · Land Rover
  • Kubota
  • Mahindra
  • MAN
  • Maserati
  • Maxus · LDV
  • Mazda
  • Mercedes-Benz · Smart
  • Mitsubishi
  • Nissan
  • Opel · Chevrolet · Vauxhall
  • Renault
  • SsangYong
  • Subaru
  • Suzuki
  • Toyota · Lexus
  • Volvo

New ECUs are added continuously. If you do not see a specific ECU, submit it anyway — if we cannot process it, the job is rejected with a clear reason and no charge.

Webhooks (async callbacks)

If you set webhook_url, we POST a JSON event the moment the job reaches a terminal state — job.completed or job.failed. Delivery is retried automatically (60s, 5min, 30min, up to 4 attempts) on any non-2xx response.

POST https://yourapp.com/hooks/davinci
X-DvC-Event: job.completed
X-DvC-Signature: sha256=<hmac_hex>
X-DvC-Delivery-Attempt: 1

{
  "event": "job.completed",
  "job_id": 1234,
  "status": "done",
  "ecu_brand": "Bosch",
  "ecu_model": "EDC17C64",
  "services_applied": ["DPF","EGR","Stage 1"],
  "result_url": "https://www.davincideluxe.fr/api/v1/cloud/jobs/1234/result",
  "completed_at": "2026-06-20T10:30:00.000Z",
  "metadata": "your-reference"
}

Verifying the signature

Every webhook is signed with your per-key webhook secret (whsec_..., shown once when you create the key). Compute an HMAC-SHA256 of the raw request body with that secret and compare it to the X-DvC-Signature header.

// Node.js (Express) -- verify a DaVinci webhook
const crypto = require('crypto');

app.post('/hooks/davinci',
  express.raw({ type: 'application/json' }), (req, res) => {
    const sig = req.headers['x-dvc-signature'] || '';
    const expected = 'sha256=' + crypto
      .createHmac('sha256', process.env.DAVINCI_WEBHOOK_SECRET)
      .update(req.body)              // raw Buffer, not parsed JSON
      .digest('hex');
    if (sig !== expected) return res.sendStatus(400);

    const evt = JSON.parse(req.body.toString());
    // evt.event === 'job.completed' -> download evt.result_url with your API key
    res.sendStatus(200);
  });
Always verify on the raw body before JSON parsing — re-serializing changes the bytes and the signature will not match.

Rate limits & file size

LimitValue
Request burst60 requests / minute
Max file size50 MB
Daily volumeNo hard cap on active plans — contact us to size high volume

Your subscription state is returned on every authenticated call so your integration always knows access is live:

X-DvC-Subscription-Status: active
X-DvC-Subscription-Period-End: 2026-07-20T00:00:00.000Z

Errors

StatusCodeMeaning
400missing_ecu_info / no_services_selected / invalid_webhook_urlBad or incomplete request.
401invalid_api_key / api_key_revokedMissing, malformed, or revoked key.
402no_active_api_subscription / subscription_payment_issueNo active API plan — renew to restore access.
403account_suspendedAccount suspended.
429rate_limitedBurst limit exceeded — retry after a short delay.

Support

Integration help, sandbox keys, or volume pricing: [email protected] or message us on WhatsApp. We typically reply same-day.

All processing is performed on files you are authorized to modify.