VDA 4905 Delivery Instruction Last updated: 2026-09-29
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
TS4905inEdiFabric.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 |
|---|---|---|---|
511 | Header | Mandatory | 1 |
| 512 loop | Delivery instruction data | Mandatory | 1 |
512 | Delivery instruction data | Mandatory | 1 |
513 | Call-off dates and quantities | Mandatory | 1 |
514 | Additional call-off dates and quantities | Optional | >1 |
515 | Manufacturing and material release | Optional | 1 |
517 | Packaging data | Optional | >1 |
518 | Delivery instruction text | Optional | 5 |
519 | Trailer | Mandatory | 1 |
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'
Complete ediFabric .NET example
A complete C# program for the VDA 4905, built on TS4905 in EdiFabric.Templates.Vda. The same code is in the ediFabric .NET examples on GitHub.
Parse VDA 4905 Delivery Instruction
using EdiFabric.Core.Model.Edi;
using EdiFabric.Examples.VDA.Common;
using EdiFabric.Framework;
using EdiFabric.Framework.Readers;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
namespace EdiFabric.Examples.VDA.Read
{
class ReadVDA
{
public static void Run()
{
Debug.WriteLine("******************************");
Debug.WriteLine(MethodBase.GetCurrentMethod().Name);
Debug.WriteLine("******************************");
// 1. Load to a stream
Stream ediStream = File.OpenRead(Directory.GetCurrentDirectory() + @"\..\..\..\Files\Vda_4905_02.txt");
// 2. Read a single transaction
List<IEdiItem> ediItems;
using (var ediReader = new VdaReader(ediStream, MessageContextFactory))
{
ediItems = ediReader.ReadToEnd().ToList();
}
}
private static MessageContext MessageContextFactory(string segment)
{
var id = segment.Substring(0, 5);
switch (id)
{
case "51102":
return From4905(segment);
}
return null;
}
private static MessageContext From4905(string segment)
{
var newControlNumber = segment.Substring(29, 5);
var sender = segment.Substring(15, 9);
var receiver = segment.Substring(6, 9);
return new MessageContext("4905", newControlNumber, "1", null, "VDA", null, sender, "", receiver, "", mc => Assembly.Load(new AssemblyName("EdiFabric.Templates.Vda")));
}
}
}Generate VDA 4905 Delivery Instruction
using EdiFabric.Examples.VDA.Common;
using EdiFabric.Framework.Writers;
using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
namespace EdiFabric.Examples.VDA.Write
{
class WriteVDA
{
public static void Run()
{
Debug.WriteLine("******************************");
Debug.WriteLine(MethodBase.GetCurrentMethod().Name);
Debug.WriteLine("******************************");
// 1. Construct the document
var deliveryInstruction = TS4905Builder.BuildDeliveryInstruction(22, 23);
using (var stream = new MemoryStream())
{
using (var writer = new VdaWriter(stream, Environment.NewLine))
{
// 2. Write it out
writer.Write(deliveryInstruction);
}
Debug.Write(stream.LoadToString());
}
}
}
}using EdiFabric.Templates.Vda;
using System.Collections.Generic;
namespace EdiFabric.Examples.VDA.Common
{
public class TS4905Builder
{
public static TS4905 BuildDeliveryInstruction(int oldNumber, int newNumber)
{
var result = new TS4905();
// Header record delivery instruction
result.S511 = new S511();
result.S511.RecordType_01 = "511";
result.S511.Version_02 = "02";
result.S511.CustomerCode_03 = "59012";
result.S511.SupplierCode_04 = "00323625";
result.S511.TransmissionNumberOld_05 = oldNumber.ToString();
result.S511.TransmissionNumberNew_06 = newNumber.ToString();
result.S511.TransmissionDate_07 = "121115";
result.S511.StartingDate_08 = "111231";
// Repeating 512 Groups
result.S512Loop = new List<TS4905_S512Loop$gt;();
// Begin 512 Group
var s512Loop = new TS4905_S512Loop();
// Unique data to the article codes
s512Loop.S512 = new S512();
s512Loop.S512.RecordType_01 = "512";
s512Loop.S512.Version_02 = "01";
s512Loop.S512.CustomerPlantCode_03 = "03";
s512Loop.S512.DeliveryCallOffNumberNew_04 = "187";
s512Loop.S512.DeliveryCallOffDateNew_05 = "121115";
s512Loop.S512.DeliveryCallOffNumberOld_06 = "186";
s512Loop.S512.DeliveryCallOffDateOld_07 = "121109";
s512Loop.S512.ArticleCodeCustomer_08 = "1514280009100";
s512Loop.S512.OrderNumber_10 = "CGF-56026482";
s512Loop.S512.DockGate_11 = "A 13";
s512Loop.S512.QuantityUnitOfMeasure_13 = "ST";
s512Loop.S512.DeliveryFrequency_14 = "L";
// Reconciliation and call-off data
s512Loop.S513 = new S513();
s512Loop.S513.RecordType_01 = "513";
s512Loop.S513.Version_02 = "01";
s512Loop.S513.DateOfLastRecordedReceipt_03 = "121113";
s512Loop.S513.LastRecordedDeliveryNoteNumber_04 = "432701";
s512Loop.S513.QuantityLastRecordedReceipt_06 = "000000346000";
s512Loop.S513.CommulativeFigureReceipt_07 = "0000019427";
s512Loop.S513.CallOffDate1_08 = "121115";
// Complementary data delivery call
s512Loop.S515 = new S515();
s512Loop.S515.RecordType_01 = "515";
s512Loop.S515.Version_02 = "01";
s512Loop.S515.ManufacturingReleaseFinalDate_04 = "130213";
s512Loop.S515.MaterialReleaseFinalDate_07 = "130315";
// Repeating 518
s512Loop.S518 = new List<S518Loop$gt;();
// Text data 1
var s5181 = new S518();
s5181.RecordType_01 = "518";
s5181.Version_02 = "01";
s5181.DeliveryInstructionText1_03 = "07-08140295/04";
s5181.DeliveryInstructionText2_04 = "23-09140029";
s512Loop.S518.Add(s5181);
// Text data 2
var s5182 = new S518();
s5182.RecordType_01 = "518";
s5182.Version_02 = "01";
s512Loop.S518.Add(s5182);
// End 512 Group
result.S512Loop.Add(s512Loop);
// Trailer record delivery instruction
result.S519 = new S519();
result.S519.RecordType_01 = "519";
result.S519.Version_02 = "01";
result.S519.CounterRecordType511_03 = "1";
result.S519.CounterRecordType512_04 = "1";
result.S519.CounterRecordType513_05 = "1";
result.S519.CounterRecordType518_08 = "2";
result.S519.CounterRecordType519_09 = "1";
result.S519.CounterRecordType515_10 = "1";
return result;
}
}
}More operations in ediFabric .NET
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.
Resources
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 with one serial key.
Sign up free Validate EDI files free