eCoC — REST API Reference

Contact: {{CONTACT_EMAIL}} Version: 1.2 (released 2026/05/13) Status: Alpha

Overview

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.

Before you start

To 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.

Quick Start

Environment Values

Use the environment-specific scope and host that match the target environment:

EnvironmentScopeHost
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.

  1. Get a token using your Client Credentials:

    • tenant: 37e4cd23-987e-4c94-a17d-c1ea08f6ebd9
    • client_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]

    Requesting a Token

    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-urlencoded

    Body (form-data) [Preprod environment]

    • client_id: {{manufacturer-client-id}}
    • client_secret: {{manufacturer-secret}}
    • grant_type: client_credentials
    • scope: api://7d84c5ec-ed94-4082-b329-9a7e0b92034f/.default

    Example cURL [Preprod environment]

    bash
    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.

  2. POST your IVI XML to the ingest endpoint with the required headers.

    [Preprod environment]

    bash
    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).


Base URL

All traffic must target the hostname for the selected environment.

EnvironmentHost
Preprodhttps://ecoc-api-preprod.vehicle-certification-agency.gov.uk
Prodhttps://ecoc-api.vehicle-certification-agency.gov.uk

Authentication

Scheme: OAuth 2.0 — Client Credentials

Audience/Scope: use the environment-specific scope for the target environment:

EnvironmentScope
Preprodapi://7d84c5ec-ed94-4082-b329-9a7e0b92034f/.default
Prodapi://7f347c17-ecb9-4abc-b595-1040951a27ad/.default

In addition to Bearer auth, the API requires identification headers (x-manufacturer-id, x-contact-id).


Required Headers

HeaderRequiredValue / FormatNotes
AuthorizationYesBearer <access_token>OAuth2
Content-TypeYesapplication/xmlXML payload only
x-manufacturer-idYesGUIDmanufacturer-id (provided to you on registration)
x-contact-idYesGUIDcontact-id (provided to you on registration)
x-correlation-idRecommendedGUIDFor traceability (generated by you, or the system will generate one and provide it in the response if this header is not included)

Endpoint Summary

1) Ingest IVI document

POST /ingest

Body: IVI v2 XML (application/xml).

Sample minimal body (truncated):

xml
<?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]

bash
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

Response 202 (example)

json
{
    "status": "accepted",
    "correlationId": "b1f8e13e-24ab-4cf8-9877-60ddd7375da6",
    "location": "2026/03/04/b1f8e13e-24ab-4cf8-9877-60ddd7375da6",
    "iviReferenceId": "59c6696a-6e55-4539-80f1-8917986cf37f"
}

Errors (Shape)

For 422 Unprocessable Entity, an example error body shape:

json
{
  "error": "validation_failed",
  "message": "The actual length is greater than the MaxLength value",
  "details": [ { "field": "...", "issue": "..." } ]
}

2) Submission status lookup (batch)

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.

Submission Statuses

sequenceDiagram actor Manufacturer participant API as eCoC API participant System as eCoC System Manufacturer->>API: POST /api/ingest
(XML payload) alt Invalid XML / missing headers API-->>Manufacturer: 400 / 415 / 422 Error else Duplicate active submission API-->>Manufacturer: 409 Conflict else Valid API-->>Manufacturer: 202 Accepted
{ correlationId, location } Note over Manufacturer,System: Record status: Received end loop Poll for status Manufacturer->>API: POST /api/submissions
["correlationId"] API-->>Manufacturer: { statuscode: "Received" } end Note over System: System processes XML
in the background Note over Manufacturer,System: Record status: Processing loop Poll for status Manufacturer->>API: POST /api/submissions
["correlationId"] API-->>Manufacturer: { statuscode: "Processing" } end alt Processing succeeds Note over Manufacturer,System: Record status: Succeeded Manufacturer->>API: POST /api/submissions
["correlationId"] API-->>Manufacturer: { statuscode: "Succeeded" } else Processing fails Note over Manufacturer,System: Record status: Failed Manufacturer->>API: POST /api/submissions
["correlationId"] API-->>Manufacturer: { statuscode: "Failed" } Manufacturer->>API: POST /api/ingest
(corrected XML payload) API-->>Manufacturer: 202 Accepted
{ correlationId } Note over Manufacturer,System: Resubmission queued end

Headers

Request Body

json
[
  "{{correlation_id_1}}",
  "{{correlation_id_2}}",
  "{{correlation_id_3}}"
]

Response 200 (example)

json
{
  "{{correlation_id_1}}": {
    "ceox_iviversionnumber": 1,
    "ceox_typeapprovalnumber": "...",
    "ceox_vehiclecategory": "M1",
    "ceox_vehicleidentificationnumber": "...",
    "statuscode": 200,
    "createdon": "2026-03-03T17:11:56Z"
  }
}

Errors


Backoff and Retries

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.

1) Retry Only When Appropriate

Clients should retry only when receiving one of the following:

Do not retry:

2) Use Exponential Backoff with Jitter

Apply controlled retry spacing:

AttemptBase DelayBackoff with Jitter
11s0.8–1.3s
22s1.6–2.6s
34s3.2–5.2s
48s6.4–10.4s
516s12.8–20.8s

3) Avoid Synchronous Burst Retries


Observability