VDA 4905 Delivery Instruction

VDA 4905 is the delivery instruction (Lieferabruf) of the German Association of the Automotive Industry. Car manufacturers send it to suppliers with forecast and call-off quantities per part and plant.

It is a fixed-length format: 128-character records identified by a three-digit record type. 511 is the header, each 512 group covers one part with 513 and 514 call-off dates and quantities, and 519 is the trailer with record counts.

At a glance

Standard
VDA
Version
4905/2
Sent by
Automotive manufacturer to supplier
Responses
VDA 4913 delivery note (ASN)
ediFabric .NET template
TS4905 in EdiFabric.Templates.Vda
OpenEDI definition
View VDA 4905 in the spec library

VDA 4905 structure

The full VDA 4905 layout from its OpenEDI definition, the same model ediFabric uses to parse, validate and generate it: 1 loop and 8 segment positions, in file order. Loops are shaded and their segments indented; Max use is how many times a segment or loop may repeat.

Segment / loop Name Usage Max use
511HeaderMandatory1
512 loopDelivery instruction dataMandatory1
512Delivery instruction dataMandatory1
513Call-off dates and quantitiesMandatory1
514Additional call-off dates and quantitiesOptional>1
515Manufacturing and material releaseOptional1
517Packaging dataOptional>1
518Delivery instruction textOptional5
519TrailerMandatory1

Mandatory segments must be sent, Optional ones only when the data applies. Trading partners often add their own rules in companion guides - ediFabric templates can be adjusted to match. Open the element-level definition in the EdiNation spec library.

Sample VDA 4905 file

A delivery instruction for one part with call-off dates, quantities and text records. Paste it into EdiNation to see every element named and validated.

5110259012    00323625 0002200023121115111231                                                                                   
5120103 187      121115186      1211091514280009100                               CGF-56026482A 13     STL                      
51301121113432701        0000003460000000019427121115000000000000000                                                            
5150100000013021300000000000000001303150000000000                               000000                                          
5180107-08140295/04                          23-09140029                                                                        
51801                                                                                                                           
5190100000010000001000000100000000000000000000200000010000001

The same VDA 4905 as JSON

ediFabric turns every loop, segment and element into a named field. This is the transaction from the sample, in the JSON that ediFabric Native and Cloud return and accept.

{
  "S511": {
    "RecordType_01": "511",
    "Version_02": "02",
    "CustomerCode_03": "59012",
    "SupplierCode_04": "00323625",
    "TransmissionNumberOld_05": "00022",
    "TransmissionNumberNew_06": "00023",
    "TransmissionDate_07": "121115",
    "StartingDate_08": "111231"
  },
  "S512Loop": [
    {
      "S512": {
        "RecordType_01": "512",
        "Version_02": "01",
        "CustomerPlantCode_03": "03",
        "DeliveryCallOffNumberNew_04": "187",
        "DeliveryCallOffDateNew_05": "121115",
        "DeliveryCallOffNumberOld_06": "186",
        "DeliveryCallOffDateOld_07": "121109",
        "ArticleCodeCustomer_08": "1514280009100",
        "OrderNumber_10": "CGF-56026482",
        "DockGate_11": "A 13",
        "QuantityUnitOfMeasure_13": "ST",
        "DeliveryFrequency_14": "L"
      },
      "S513": {
        "RecordType_01": "513",
        "Version_02": "01",
        "DateOfLastRecordedReceipt_03": "121113",
        "LastRecordedDeliveryNoteNumber_04": "432701",
        "QuantityLastRecordedReceipt_06": "000000346000",
        "CommulativeFigureReceipt_07": "0000019427",
        "CallOffDate1_08": "121115",
        "CallOffQuantity1_09": "000000000",
        "CallOffDate2_10": "000000"
      },
      "S515": {
        "RecordType_01": "515",
        "Version_02": "01",
        "ManufacturingReleaseStartDate_03": "000000",
        "ManufacturingReleaseFinalDate_04": "130213",
        "ManufacturingReleaseCumulatedRequirements_05": "0000000000",
        "MaterialReleaseStartDate_06": "000000",
        "MaterialReleaseFinalDate_07": "130315",
        "MaterialReleaseCumulatedRequirements_08": "0000000000",
        "DatePlanningHorizon_11": "000000"
      },
      "S518": [
        {
          "RecordType_01": "518",
          "Version_02": "01",
          "DeliveryInstructionText1_03": "07-08140295/04",
          "DeliveryInstructionText2_04": "23-09140029"
        },
        {
          "RecordType_01": "518",
          "Version_02": "01"
        }
      ]
    }
  ],
  "S519": {
    "RecordType_01": "519",
    "Version_02": "01",
    "CounterRecordType511_03": "0000001",
    "CounterRecordType512_04": "0000001",
    "CounterRecordType513_05": "0000001",
    "CounterRecordType514_06": "0000000",
    "CounterRecordType517_07": "0000000",
    "CounterRecordType518_08": "0000002",
    "CounterRecordType519_09": "0000001",
    "CounterRecordType515_10": "0000001"
  }
}

Parse and validate a VDA 4905 file

Read the file into typed objects with ediFabric .NET, or post it to the ediFabric Cloud REST API from any language and get JSON back.

using EdiFabric.Templates.Vda;

License.SetSerial("YOUR_SERIAL_KEY");

using (var stream = File.OpenRead(@"C:\edi\Vda_4905_02.txt"))
using (var reader = new VdaReader(stream, MessageContextFactory))
{
    var items = await reader.ReadToEndAsync();
    foreach (var transaction in items.OfType<TS4905>())
    {
        if (transaction.IsValid(out MessageErrorContext errors))
            Console.WriteLine($"{transaction.S511.TransmissionNumberNew_06} is valid");
        else
            Console.WriteLine(string.Join(Environment.NewLine, errors.Flatten()));
    }
}

static MessageContext MessageContextFactory(string segment)
{
    if (!segment.StartsWith("51102"))
        return null;
    return new MessageContext("4905", segment.Substring(29, 5), "1", null, "VDA", null,
        segment.Substring(15, 9), "", segment.Substring(6, 9), "",
        mc => Assembly.Load(new AssemblyName("EdiFabric.Templates.Vda")));
}
curl -X POST 'https://api.edination.com/v2/vda/read' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SERIAL_KEY' \
-H 'Content-Type: application/octet-stream' \
--data-binary '@Vda_4905_02.txt'

Generate a VDA 4905 file

Populate a TS4905 object in .NET, or post JSON in the shape shown above to ediFabric Cloud, and get a valid VDA 4905 file back.

using EdiFabric.Templates.Vda;

License.SetSerial("YOUR_SERIAL_KEY");

var transaction = new TS4905();

//  511 header: customer 59012 sends call-off transmission 00023 to supplier 00323625
transaction.S511 = new S511();
transaction.S511.RecordType_01 = "511";
transaction.S511.Version_02 = "02";
transaction.S511.CustomerCode_03 = "59012";
transaction.S511.SupplierCode_04 = "00323625";
transaction.S511.TransmissionNumberOld_05 = "00022";
transaction.S511.TransmissionNumberNew_06 = "00023";
transaction.S511.TransmissionDate_07 = "121115";

//  512 call-off for plant 03, replacing call-off 186 with call-off 187
transaction.S512Loop = new List<TS4905_S512Loop>();
var callOff = new TS4905_S512Loop();
callOff.S512 = new S512();
callOff.S512.RecordType_01 = "512";
callOff.S512.Version_02 = "01";
callOff.S512.CustomerPlantCode_03 = "03";
callOff.S512.DeliveryCallOffNumberNew_04 = "187";
callOff.S512.DeliveryCallOffDateNew_05 = "121115";
callOff.S512.DeliveryCallOffNumberOld_06 = "186";
callOff.S512.DeliveryCallOffDateOld_07 = "121109";
transaction.S512Loop.Add(callOff);

// ... set the remaining loops and segments the same way

using (var stream = new MemoryStream())
{
    using (var writer = new VdaWriter(stream, Environment.NewLine))
        writer.Write(transaction);
    Console.WriteLine(Encoding.UTF8.GetString(stream.ToArray()));
}
# the JSON returned by /read, edited or produced by your application
curl -X POST 'https://api.edination.com/v2/vda/write' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SERIAL_KEY' \
-H 'Content-Type: application/json' \
--data-binary '@Vda_4905_02.json' \
-o 'Vda_4905_02.txt'

VDA 4905 questions

Is VDA 4905 still used?

Yes, across the German automotive supply chain, although many OEMs are moving to the EDIFACT-based Global DELFOR and VDA 4984.

How are the records structured?

Every record is 128 characters. The first three digits are the record type (511 to 519) and the next two the record version. Fields are positional with fixed widths.

What does the supplier send back?

The shipment is announced with a VDA 4913 delivery note and transport data message.

How do I parse and generate VDA 4905 files in .NET?

In .NET, install EdiFabric and EdiFabric.Templates.Vda, read the file with VdaReader into TS4905 objects and write them back with VdaWriter. From any other language, post the file to the ediFabric Cloud REST API, which returns the same structure as JSON and converts JSON back to VDA.

Parse your first VDA 4905 in five minutes

The Community plan is free forever and needs no credit card. It includes ediFabric .NET, Native and Cloud.