This API allows the submission of eCoC data records to the VCA eCoC system. It also allows the consumer to query the async processing status of previous submissions.
The VCA Ingest API accepts InitialVehicleInformation (IVI) v2 XML documents and queues them for downstream processing. Successful submissions return 202 Accepted. Validation errors and header issues return structured errors and appropriate HTTP status codes. All traffic is served via Azure Front Door.
application/xmlTo get started, you will be provided with the following credentials/information:
| Parameter | Description |
|---|---|
tenant |
VCA Tenant ID for auth. |
manufacturer-client-id |
Your organisation's GUID used when obtaining auth tokens for the API. |
manufacturer-secret |
Your organisation's secret used when obtaining auth tokens for the API. |
scope |
OAuth scope for token acquisition. This will differ between our test and production environments. |
manufacturer-id |
Your registered manufacturer ID (GUID), this ties your submissions to your organisation to enable you to view statuses in our Portal. |
contact-id |
Your registered contact ID (GUID), this ties your submissions to a specific user identity which you can then log into the Portal with to view your submissions' statuses. |
Use the environment-specific scope and host that match the target environment:
| Environment | Scope | Host |
|---|---|---|
| Preprod | api://7d84c5ec-ed94-4082-b329-9a7e0b92034f/.default |
https://ecoc-api-preprod.vehicle-certification-agency.gov.uk |
| Prod | api://7f347c17-ecb9-4abc-b595-1040951a27ad/.default |
https://ecoc-api.vehicle-certification-agency.gov.uk |
The examples below use Preprod values. For Prod, replace the scope and host with the values from the table above.
Get a token using your Client Credentials:
tenant: 37e4cd23-987e-4c94-a17d-c1ea08f6ebd9client_id: {{manufacturer-client-id}}client_secret: {{manufacturer-secret}}scope: use the environment-specific value from the table above. Example: api://7d84c5ec-ed94-4082-b329-9a7e0b92034f/.default [Preprod environment]To obtain an access token, send a POST request to the token endpoint:
https://login.microsoftonline.com/37e4cd23-987e-4c94-a17d-c1ea08f6ebd9/oauth2/v2.0/token
Headers
Content-Type: application/x-www-form-urlencodedBody (form-data) [Preprod environment]
client_id: {{manufacturer-client-id}}client_secret: {{manufacturer-secret}}grant_type: client_credentialsscope: api://7d84c5ec-ed94-4082-b329-9a7e0b92034f/.defaultExample cURL [Preprod environment]
curl -X POST "https://login.microsoftonline.com/37e4cd23-987e-4c94-a17d-c1ea08f6ebd9/oauth2/v2.0/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "client_id={{manufacturer-client-id}}" \
-d "client_secret={{manufacturer-secret}}" \
-d "grant_type=client_credentials" \
-d "scope=api://7d84c5ec-ed94-4082-b329-9a7e0b92034f/.default"
Use the token in
Authorization: Bearer <token>for all requests.
POST your IVI XML to the ingest endpoint with the required headers.
[Preprod environment]
curl -X POST "https://ecoc-api-preprod.vehicle-certification-agency.gov.uk/api/ingest" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/xml" \
-H "x-manufacturer-id: {{manufacturer-id}}" \
-H "x-contact-id: {{contact-id}}" \
-H "x-correlation-id: $(uuidgen)" \
--data-binary @ivi.xml -i
Expected: 202 Accepted on success. Validation issues return 4xx with details (see Errors).
All traffic must target the hostname for the selected environment.
| Environment | Host |
|---|---|
| Preprod | https://ecoc-api-preprod.vehicle-certification-agency.gov.uk |
| Prod | https://ecoc-api.vehicle-certification-agency.gov.uk |
Scheme: OAuth 2.0 — Client Credentials
Audience/Scope: use the environment-specific scope for the target environment:
| Environment | Scope |
|---|---|
| Preprod | api://7d84c5ec-ed94-4082-b329-9a7e0b92034f/.default |
| Prod | api://7f347c17-ecb9-4abc-b595-1040951a27ad/.default |
Authorization: Bearer <token>In addition to Bearer auth, the API requires identification headers (
x-manufacturer-id,x-contact-id).
| Header | Required | Value / Format | Notes |
|---|---|---|---|
Authorization | Yes | Bearer <access_token> | OAuth2 |
Content-Type | Yes | application/xml | XML payload only |
x-manufacturer-id | Yes | GUID | manufacturer-id (provided to you on registration) |
x-contact-id | Yes | GUID | contact-id (provided to you on registration) |
x-correlation-id | Recommended | GUID | For traceability (generated by you, or the system will generate one and provide it in the response if this header is not included) |
POST /ingest
Body: IVI v2 XML (application/xml).
Sample minimal body (truncated):
<?xml version="1.0" encoding="UTF-8"?>
<InitialVehicleInformation xmlns="http://eu.ereg.initialvehicleinformation.v2"
xmlns:sig="http://www.w3.org/2000/09/xmldsig#">
<Header>
<IviReferenceId>...</IviReferenceId>
<IviVersionNumberXsd>2.0</IviVersionNumberXsd>
<IviVersionNumber>1</IviVersionNumber>
<IviVersionDateTime>2025-12-12T10:30:00Z</IviVersionDateTime>
<IntendedCountryRegistration>D</IntendedCountryRegistration>
<DesignatedTypeApprovalCountry>e1</DesignatedTypeApprovalCountry>
</Header>
<CocDataGroup>
<Type>...</Type>
<Variant>...</Variant>
<Version>...</Version>
<TypeApprovalNumber>...</TypeApprovalNumber>
<TypeApprovalIssueDate>...</TypeApprovalIssueDate>
<VehicleIdentificationNumber>{{vin}}</VehicleIdentificationNumber>
<!-- ...other groups/tables... -->
</CocDataGroup>
</InitialVehicleInformation>
cURL [Preprod environment]
curl -s -X POST "https://ecoc-api-preprod.vehicle-certification-agency.gov.uk/api/ingest" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/xml" \
-H "x-manufacturer-id: {{manufacturer-id}}" \
-H "x-contact-id: {{contact-id}}" \
--data-binary @ivi.xml -i
Responses
Content-Type (must be application/xml).error and message fields.Response 202 (example)
{
"status": "accepted",
"correlationId": "b1f8e13e-24ab-4cf8-9877-60ddd7375da6",
"location": "2026/03/04/b1f8e13e-24ab-4cf8-9877-60ddd7375da6",
"iviReferenceId": "59c6696a-6e55-4539-80f1-8917986cf37f"
}
For 422 Unprocessable Entity, an example error body shape:
{
"error": "validation_failed",
"message": "The actual length is greater than the MaxLength value",
"details": [ { "field": "...", "issue": "..." } ]
}
POST /submissions
Submit a JSON array of correlation IDs to retrieve status/metadata for multiple accepted submissions.
Note that this endpoint is for retrieving metadata/status only, not the original IVI document.
This will only return results for correlation IDs that were accepted (i.e. returned 202 Accepted
on submission); any invalid/unknown correlation IDs will be ignored in the response.
Headers
Authorization: Bearer <token>Content-Type: application/jsonRequest Body
[
"{{correlation_id_1}}",
"{{correlation_id_2}}",
"{{correlation_id_3}}"
]
Response 200 (example)
{
"{{correlation_id_1}}": {
"ceox_iviversionnumber": 1,
"ceox_typeapprovalnumber": "...",
"ceox_vehiclecategory": "M1",
"ceox_vehicleidentificationnumber": "...",
"statuscode": 200,
"createdon": "2026-03-03T17:11:56Z"
}
}
Errors
Content-Type.
When calling this API, you may occasionally receive 429 Too Many Requests if traffic exceeds
allowed limits. Because the endpoint does not issue Retry-After headers, clients must implement
their own backoff behaviour to ensure stability and prevent overwhelming the service.
Clients should retry only when receiving one of the following:
503 Service Unavailable504 Gateway TimeoutDo not retry:
4xx validation errors403 responseApply controlled retry spacing:
delay = baseDelay × 2attempt| Attempt | Base Delay | Backoff with Jitter |
|---|---|---|
| 1 | 1s | 0.8–1.3s |
| 2 | 2s | 1.6–2.6s |
| 3 | 4s | 3.2–5.2s |
| 4 | 8s | 6.4–10.4s |
| 5 | 16s | 12.8–20.8s |
x-correlation-id for end-to-end tracing (echoed in logs and responses where applicable).X-Azure-Ref for debugging any issues.