Skip to main content

OData V1–V3 Feature Matrix

This document lists the features of OData 1.0, 2.0 and 3.0, independent of any client library. It is the counterpart to odata-v4.md and follows the same structure.

Why one document for three versions. The normative specification, [MS-ODATA], describes 1.0, 2.0 and 3.0 in a single text and does not mention 4.0 at all. The three versions form one continuous lineage: 2.0 and 3.0 add to their predecessor rather than replacing it, and a 3.0 service is still a 2.0 service. The real break is between 3.0 and 4.0 — new specification family (OASIS), $links becomes $ref, DataServiceVersion becomes OData-Version, conformance levels appear. Splitting this document at that boundary follows the sources; splitting it per version would cut one source into three overlapping pieces.

Scope & assumptions

  • The Versions column carries the whole version story, so a feature's history is visible in place.
  • Only the JSON formats are detailed. All three versions also define an Atom/XML format — in V1 and V2 it is the default — but it is referenced here, not broken down.
  • The full protocol is described, not just the client's share: schema constructs and server obligations included.
  • Where the prose documentation and the ABNF grammar disagree, the ABNF wins. This matters: the V3 URL Conventions page never mentions lambda operators, while the V3 ABNF defines anyExpr and allExpr.

Sources

PrefixDocument
MS[MS-ODATA]: Open Data Protocol — normative for 1.0–3.0
V2:UriOData 2.0 URI Conventions
V2:OpsOData 2.0 Operations
V2:JsonOData 2.0 JSON Format
V2:BatchOData 2.0 Batch Processing
V3:CoreOData 3.0 Core Protocol
V3:UriOData 3.0 URL Conventions
V3:CsdlOData 3.0 CSDL
V3:AbnfOData 3.0 ABNF
V3:JsonOData 3.0 JSON Verbose Format

The odata.org pages are single long documents without stable section anchors, so the Spec column links at page level: the prefix names the document, the row names the feature.

Legend

ValueMeaning
1.0+Present since 1.0 and still current in 3.0
2.0+Added in 2.0, still current in 3.0
3.0Added in 3.0
1.0–2.0Present in 1.0 and 2.0, but superseded in 3.0 — the replacement has its own row

Required vs. optional — the Role and Requirement columns

Unlike V4, OData V1–V3 have no conformance levels — no Minimal/Intermediate/Advanced grading, no Updatable qualifier. The obligation is therefore expressed on two axes.

Roleon whom the obligation falls:

ValueMeaning
ServerThe data service has to provide or honour it
ClientThe consumer has to send, follow or tolerate it
BothObligations on both sides
Not an obligation: a modelling construct or a definition

Requirementhow hard the obligation is, per RFC 2119:

ValueMeaning
MUSTMandatory
SHOULDRecommended; may be omitted, so the other side cannot rely on it
MAYEntirely optional
Not applicable — the row describes a construct, not an obligation

The single most important thing to know about this table. Across all three versions, almost the entire query surface is graded MAY. MS-ODATA phrases it per capability — "A data service MAY support the binary equality operator", "… MAY support the substringof method", "… MAY support the $inlinecount system query option". There is no level at which $filter, $top or even eq becomes mandatory, and the prescribed answer to an unsupported option is 501 Not Implemented. In V4 those same features are MUST from the Intermediate conformance level. A V1–V3 client can assume nothing about a service's query capabilities and must either discover them by trying or know its target service. This is the sharpest practical difference to V4.

How to read this document

The matrix is multi-level. The Overview summarizes the protocol into coarse areas; each area is a section with its own table, split further where a topic has real depth. Read the overview for orientation, then descend only where needed.


Overview

#AreaWhat it coversSpec
1Data model & schemaTypes, properties, associations, containers, vocabulariesV3:Csdl
2Service modelService root, service document, metadata documentV3:Core
3Versioning & extensibilityDataServiceVersion negotiation, custom optionsV3:Core
4Formats & payloadsFormat negotiation, JSON Verbose, JSON LightV2:Json
5Header fieldsRequest and response headersV3:Core
6Status codes & errorsStatus codes, error payloadsV2:Ops
7Resource addressingURI construction, path segmentsV2:Uri
8Querying dataSystem query options and the filter languageV3:Uri
9Data modificationInsert, update, delete, links, mediaV2:Ops
10OperationsService operations, actions, functionsV3:Csdl
11Batch requestsMultipart batch, change setsV2:Batch
12SecurityTransport, the d wrapper rationaleV2:Json
13Not in V1–V3What V4 adds on top

1. Data Model & Schema

The model grows noticeably across the three versions: 1.0 and 2.0 share a compact EDM, while 3.0 adds enumeration types, collection-valued properties, geospatial types and vocabularies.

FeatureDescriptionVersionsRoleRequirementSpec
Entity typeStructured type with a key1.0+MS
Complex typeStructured type without identity; cannot hold navigation properties1.0+MS
Structural propertyPrimitive- or complex-typed property1.0+MS
Navigation propertyTraversal of an association1.0+MS
Entity containerGroups entity sets, association sets and function imports1.0+MS
Entity setNamed collection of entities of one type1.0+MS
Primitive typesBinary, Boolean, Byte, DateTime, Decimal, Double, Single, Guid, Int16/32/64, SByte, String, Time, DateTimeOffset1.0+MS
FacetsNullable, MaxLength, Precision, Scale, FixedLength, …1.0+MS
ConcurrencyModeMarks a property as a concurrency token1.0+V3:Csdl
Enumeration typeedm:EnumType as a schema element3.0V3:Csdl
Collection-valued propertyCollection(Edm.String), collections of complex types3.0V3:Csdl
Geospatial typesEdm.Geography* and Edm.Geometry*3.0V3:Csdl
Named resource streamAdditional binary stream on an entity, besides the media resource3.0V3:Core
Container inheritanceedm:Extends on an entity container3.0V3:Csdl
CSDL representationSchema as XML; there is no JSON representation of the schema before V41.0+ServerMUSTV3:Csdl
Custom annotationsForeign-namespace markup in the schema, ignorable by clients1.0+ClientMAYMS

1.1 Keys & Identity

FeatureDescriptionVersionsRoleRequirementSpec
Entity keyOne or more non-nullable properties declared as Key1.0+MS
Composite keySet(A=1,B='x')1.0+V2:Uri
Canonical URIEvery entity has one, surfaced as __metadata.uri1.0+ServerMUSTV2:Json
Concurrency tokenSurfaced as an ETag1.0+ServerMAYV2:Ops
Alternate keysnot before V4

1.2 Relationships

Relationships are modelled explicitly, through Association and AssociationSet. A navigation property points at an association rather than at a target set. This indirection disappears in V4, and it is what lets a V1–V3 model expose one entity type through several entity sets unambiguously.

FeatureDescriptionVersionsRoleRequirementSpec
AssociationNamed relationship between two entity types1.0+V3:Csdl
Association endOne side, with role name and multiplicity (1, 0..1, *)1.0+V3:Csdl
Association setBinds an association to concrete entity sets1.0+V3:Csdl
Referential constraintPrincipal/dependent ends and the participating properties1.0+V3:Csdl
Cascade deleteOnDelete on an association end1.0+ServerMAYV3:Csdl
Containmentedm:ContainsTarget — the target is contained in the source entity3.0V3:Csdl

1.3 Inheritance

FeatureDescriptionVersionsRoleRequirementSpec
Entity type inheritanceBaseType on an entity type1.0+V3:Csdl
Complex type inheritanceBaseType on a complex type1.0+V3:Csdl
Abstract typesAbstract="true"1.0+V3:Csdl
Type in the payload__metadata.type, mandatory once the entry is not the base type1.0+ServerMUSTV2:Json
Type cast in a path.../Namespace.SubType as a path segment3.0ServerMAYV3:Uri

1.4 Vocabularies & Annotations

Introduced in 3.0 and the direct ancestor of V4's vocabulary mechanism.

FeatureDescriptionVersionsRoleRequirementSpec
edm:ValueTermDeclares a term that can be annotated onto model elements3.0V3:Csdl
edm:AnnotationsApplies terms to model elements3.0V3:Csdl
Instance annotationsAnnotations carried in the payload rather than the model3.0ServerMAYV3:Core

2. Service Model

FeatureDescriptionVersionsRoleRequirementSpec
Service rootBase URI all resource paths are relative to1.0+V2:Uri
Service documentLists the entity sets at the service root1.0+ServerMUSTV2:Uri
Metadata documentThe CSDL schema at $metadata1.0+ServerMUSTV3:Csdl
Read URICanonical URI used to read an entity1.0+ServerMUSTV2:Json
Edit URIURI used to modify an entity1.0+ServerMUSTV2:Ops
Singletonnot before V4

3. Versioning & Extensibility

Version negotiation is a genuine handshake here, unlike V4 where the version is effectively fixed by the service. 3.0 completes it by adding a lower bound.

FeatureDescriptionVersionsRoleRequirementSpec
DataServiceVersion (request)Version of the payload the client sends1.0+ClientMUSTV2:Ops
DataServiceVersion (response)Version of the payload the server returns1.0+ServerMUSTV2:Ops
MaxDataServiceVersionHighest version the client can process2.0+ClientSHOULDV2:Ops
MinDataServiceVersionLowest version the client will accept3.0ClientMAYV3:Core
Version-dependent payloadsThe same resource is serialized differently per version — most visibly the results wrapper2.0+ServerMUSTV2:Json
Custom query optionsOptions without a $ prefix, defined by the service1.0+ServerMAYV2:Uri
Reserved namesNames starting with $ are reserved for the protocol1.0+BothMUSTV2:Uri
Custom headersHeaders outside the protocol, ignored by conforming implementations1.0+BothMAYV2:Ops

4. Formats & Payloads

The format story is where 3.0 breaks most visibly with its predecessors: it introduces a new, compact JSON representation and demotes the old one to an opt-in.

FeatureDescriptionVersionsRoleRequirementSpec
Atom/XML formatThe default format in 1.0 and 2.01.0+ServerMUSTV2:Ops
JSON VerboseThe JSON representation of 1.0/2.0; in 3.0 only on request via odata=verbose1.0+ServerMUSTV3:Json
JSON LightCompact JSON with selectable metadata level; the default JSON of 3.03.0ServerMUSTV3:Core
Metadata levelodata=nometadata / minimalmetadata / fullmetadata3.0ClientMAYV3:Core
Format negotiationVia the Accept header1.0+BothMUSTV2:Ops
$formatOverrides Accept from within the URI2.0+ServerMAYV2:Uri
The d wrapperResponses only, JSON Verbose only — makes the payload valid JSON but not a valid JavaScript statement1.0+ServerMUSTV2:Json
Request payloadsSent without the d wrapper1.0+ClientMUSTV2:Json
Primitive value mappingEDM types onto JSON literals; DateTime as /Date(ticks)/ in JSON Verbose1.0+BothMUSTV2:Json

4.1 JSON Verbose: Reserved Names

There are no @odata.* annotations before V4. Metadata travels in reserved members prefixed with a double underscore.

Reserved nameMeaningVersionsRoleRequirementSpec
__metadataObject carrying the metadata of an entry1.0+ServerSHOULDV2:Json
__metadata.uriCanonical URI — not optional within __metadata1.0+ServerMUSTV2:Json
__metadata.typeEntity type name; mandatory when the entry is not the base type of a hierarchy1.0+ServerMUSTV2:Json
__metadata.etagConcurrency token1.0+ServerMAYV2:Json
__metadata.edit_media, media_src, content_typeMedia resource links1.0+ServerMUSTV2:Json
__deferredPlaceholder for a navigation property that was not expanded1.0+ServerMUSTV2:Json
resultsWraps a collection array so the collection can carry metadata2.0+ServerMUSTV2:Json
__countTotal count of the collection, as a string2.0+ServerMUSTV2:Json
__nextLink to the next partial listing under server-driven paging2.0+ServerMUSTV2:Json

4.2 Payload Shapes

PayloadShapeVersionsRoleRequirementSpec
Single entry{"d": { …properties… }}1.0+ServerMUSTV2:Json
Collection (1.0 shape){"d": [ … ]}1.0–2.0ServerMUSTV2:Json
Collection (2.0 shape){"d": {"results": [ … ], "__count": "…", "__next": "…"}}2.0+ServerMUSTV2:Json
Expanded navigation propertyThe related entry or collection inline, in place of __deferred1.0+ServerMUSTV2:Json
Primitive / complex property{"d": {"PropertyName": …}}1.0+ServerMUSTV2:Json
Raw valueUnwrapped media type of the value itself, via $value1.0+ServerMUSTV2:Uri
Links{"d": {"uri": "…"}} or a collection thereof, via $links1.0+ServerMUSTV2:Ops
Error{"error": {"code": "…", "message": {…}}}not wrapped in d1.0+ServerMUSTV2:Ops

5. Header Fields

HeaderDirectionMeaningVersionsRoleRequirementSpec
DataServiceVersionbothVersion of this payload1.0+BothMUSTV2:Ops
MaxDataServiceVersionrequestHighest version the client accepts2.0+ClientSHOULDV2:Ops
MinDataServiceVersionrequestLowest version the client accepts3.0ClientMAYV3:Core
Content-TypebothMedia type of the payload1.0+BothMUSTV2:Ops
AcceptrequestRequested response format1.0+ClientSHOULDV2:Ops
Accept-Charset, Accept-LanguagerequestCharacter set and language negotiation1.0+ClientMAYV2:Ops
If-MatchrequestConcurrency check on update and delete1.0+ClientMUSTV2:Ops
If-None-MatchrequestConditional read1.0+ClientMAYV2:Ops
ETagresponseConcurrency token of the resource1.0+ServerMAYV2:Ops
LocationresponseURI of a newly created entity1.0+ServerMUSTV2:Ops
Preferrequestreturn-content / return-no-content — whether the response carries the entity3.0ClientMAYV3:Core
Preference-AppliedresponseWhich preference the server honoured3.0ServerSHOULDV3:Core
X-HTTP-MethodrequestTunnels MERGE/DELETE/PUT through POST1.0+ClientMAYV2:Ops
SlugrequestSuggested name when creating a media resource1.0+ClientMAYV2:Ops

6. Status Codes & Error Handling

CodeUsed forVersionsRoleRequirementSpec
200 OKSuccessful read, or update returning content1.0+ServerMUSTV2:Ops
201 CreatedEntity created, with Location1.0+ServerMUSTV2:Ops
202 AcceptedAccepted for processing1.0+ServerMAYV2:Ops
204 No ContentSuccessful update or delete without a body1.0+ServerMUSTV2:Ops
304 Not ModifiedConditional read matched1.0+ServerMAYV2:Ops
400, 404, 405, 412, 500Client and server errors1.0+ServerMUSTV2:Ops
501 Not ImplementedThe standard answer to an unsupported query option1.0+ServerMUSTV2:Ops
Error payloadMachine-readable code plus a language-tagged message1.0+ServerMUSTV2:Ops
In-stream errorError raised after the response has begun1.0+ServerMAYV2:Ops

7. Resource Addressing

FeatureExampleVersionsRoleRequirementSpec
Service root/OData.svc/1.0+ServerMUSTV2:Uri
Metadata/OData.svc/$metadata1.0+ServerMUSTV2:Uri
Entity set/Products1.0+ServerMUSTV2:Uri
Key predicate/Products(1), /Customers('ALFKI')1.0+ServerMUSTV2:Uri
Composite key/OrderItems(OrderID=1,ItemNo=2)1.0+ServerMUSTV2:Uri
Navigation path/Products(1)/Category1.0+ServerMUSTV2:Uri
Property access/Products(1)/Name1.0+ServerMUSTV2:Uri
Raw value/Products(1)/Name/$value1.0+ServerMUSTV2:Uri
Count of a collection/Products/$count — a bare integer2.0+ServerMAYV2:Uri
Links/Products(1)/$links/Category — addresses the relationship1.0+ServerMUSTV2:Uri
Media resource/Products(1)/$value on a media link entry1.0+ServerMAYV2:Uri
Named stream/Products(1)/Thumbnail on a named resource stream3.0ServerMAYV3:Core
Type cast segment/Products/Namespace.DiscountedProduct3.0ServerMAYV3:Uri
Service operation/GetProductsByRating?rating=41.0+ServerMAYV2:Uri
Batch endpoint/$batch2.0+ServerMAYV2:Batch

8. Querying Data

Every system query option is MAY. A service supporting none of them is still conforming; the prescribed answer to an unsupported option is 501 Not Implemented.

OptionEffectVersionsRoleRequirementSpec
$filterRestrict the result set by a boolean expression1.0+ServerMAYV2:Uri
$expandInline related entities instead of __deferred1.0+ServerMAYV2:Uri
$selectRestrict the returned properties2.0+ServerMAYV2:Uri
$orderbySort the result set1.0+ServerMAYV2:Uri
$top / $skipClient-driven paging1.0+ServerMAYV2:Uri
$skiptokenContinuation token for server-driven paging; produced by the server2.0+ServerMAYV2:Uri
$inlinecountallpages or none; adds __count to the payload2.0+ServerMAYV2:Uri
$formatChoose the response format from the URI2.0+ServerMAYV2:Uri
Custom query optionsService-defined, without a $ prefix1.0+ServerMAYV2:Uri
$searchnot before V4

8.1 $select & $expand

The decisive limitation, and it holds through all three versions: $expand carries no nested query options. The V3 grammar is expandItem = [qualifiedEntityTypeName "/"] navigationPropertyName *(…) — paths and type casts only, with no place to put options. An expanded collection therefore comes back whole, or not at all.

FeatureExampleVersionsRoleRequirementSpec
Select properties$select=Name,Price2.0+ServerMAYV2:Uri
Select all$select=*2.0+ServerMAYV2:Uri
Expand a navigation property$expand=Category1.0+ServerMAYV2:Uri
Expand several$expand=Category,Supplier1.0+ServerMAYV2:Uri
Expand a path$expand=Products/Supplier — more than one level1.0+ServerMAYV2:Uri
Select through an expand$select=Name,Category/Name with $expand=Category2.0+ServerMAYV2:Uri
Type cast inside expand$expand=Namespace.SubType/NavProp3.0ServerMAYV3:Uri
Nested query options in $expandnot before V4
$levelsnot before V4

8.2 $filter Expression Language

Everything here is graded MAY in MS-ODATA, down to the individual operator and function — the wording is uniform ("A data service MAY support …"), so it is stated once rather than repeated per row.

8.2.1 Operators

GroupOperatorsVersionsRoleRequirementSpec
Comparisoneq, ne, gt, ge, lt, le1.0+ServerMAYV2:Uri
Logicaland, or, not1.0+ServerMAYV2:Uri
Arithmeticadd, sub, mul, div, mod1.0+ServerMAYV2:Uri
UnaryNegation1.0+ServerMAYV2:Uri
Grouping( ) for precedence1.0+ServerMAYV2:Uri
Member accessAddress/City1.0+ServerMAYV2:Uri
Null comparisonAgainst the null literal; there is no isnull/coalesce1.0+ServerMAYV2:Uri

8.2.2 Built-in Functions

GroupFunctionsVersionsRoleRequirementSpec
Stringsubstringof, endswith, startswith, length, indexof, replace, substring, tolower, toupper, trim, concat1.0+ServerMAYV2:Uri
Dateday, hour, minute, month, second, year1.0+ServerMAYV2:Uri
Mathround, floor, ceiling1.0+ServerMAYV2:Uri
Type testisof1.0+ServerMAYV2:Uri
Type castcast3.0ServerMAYV3:Abnf
Date offsetgetTotalOffsetMinutes3.0ServerMAYMS
Geospatialgeo.distance, geo.length, geo.intersects3.0ServerMAYV3:Abnf

8.2.3 Lambda Operators

Added in 3.0. Worth noting how this was established: the V3 URL Conventions page never mentions them, but the V3 ABNF defines anyExpr, allExpr and lambdaPredicateExpr. The grammar is the normative source.

FeatureDescriptionVersionsRoleRequirementSpec
anyAt least one member of a collection satisfies the predicate3.0ServerMAYV3:Abnf
allEvery member satisfies the predicate3.0ServerMAYV3:Abnf
any without a predicateThe collection is non-empty3.0ServerMAYV3:Abnf
$it, $rootnot before V4

8.3 Ordering, Paging & Counting

FeatureDescriptionVersionsRoleRequirementSpec
Sorting$orderby=Name desc,Price asc1.0+ServerMAYV2:Uri
Client-driven paging$top with $skip1.0+ServerMAYV2:Uri
Server-driven pagingPartial listing plus __next2.0+ServerMAYV2:Json
Following a next linkClient requests the __next URI unchanged2.0+ClientMUSTV2:Json
Inline count$inlinecount=allpages produces __count2.0+ServerMAYV2:Uri
Count as a path segment/Products/$count, plain text2.0+ServerMAYV2:Uri

9. Data Modification

FeatureMethodVersionsRoleRequirementSpec
Create an entityPOST to an entity set1.0+ServerMUSTV2:Ops
Replace an entityPUT — properties not supplied are reset to their defaults1.0+ServerMUSTV2:Ops
Partial updatePATCH (MERGE) — 1.0/2.0 define the custom method MERGE; 3.0 introduces PATCH and supersedes MERGE, which remains only for backward compatibility1.0+ServerMUSTV3:Core
Delete an entityDELETE on the edit URI1.0+ServerMUSTV2:Ops
Optimistic concurrencyIf-Match carrying the ETag on update and delete1.0+BothMUSTV2:Ops
Method tunnelingPOST plus X-HTTP-Method where intermediaries block verbs1.0+ClientMAYV2:Ops
Links on PUTLinks are not part of the structured data and are not reset by PUT; merge semantics apply to them either way1.0+ServerSHOULDV2:Ops
Controlling the responsePrefer: return-content / return-no-content3.0ClientMAYV3:Core
Upsertnot before V4

Relationship management runs through the $links segment — the direct ancestor of V4's $ref. A link is a JSON object with a uri member.

FeatureDescriptionVersionsRoleRequirementSpec
Read linksGET /Products(1)/$links/Category1.0+ServerMUSTV2:Ops
Add a linkPOST to the $links URI of a collection-valued navigation property1.0+ServerMUSTV2:Ops
Change a linkPUT to the $links URI of a single-valued navigation property1.0+ServerMUSTV2:Ops
Remove a linkDELETE on the $links URI1.0+ServerMUSTV2:Ops
Deep insertCreate an entity together with related ones in one POST1.0+ServerMAYV2:Ops
Bind on createReference an existing entity in the insert payload, via a link1.0+ServerMAYV2:Ops

9.2 Properties & Values

FeatureDescriptionVersionsRoleRequirementSpec
Update a primitive propertyPUT on the property URI1.0+ServerMAYV2:Ops
Update a complex propertyPUT or PATCH (MERGE) on the property URI1.0+ServerMAYV2:Ops
Update a raw valuePUT on the $value URI1.0+ServerMAYV2:Ops
Set a value to nullDELETE on the property URI1.0+ServerMAYV2:Ops
Update a collection propertyReplace the whole collection value3.0ServerMAYV3:Core

9.3 Media & Streams

FeatureDescriptionVersionsRoleRequirementSpec
Media link entryEntity whose content is a binary stream (media_src, edit_media)1.0+ServerMAYV2:Json
Create a media resourcePOST of the binary content to the entity set, optionally with Slug1.0+ServerMAYV2:Ops
Read / update a media resourceGET on media_src, PUT on edit_media1.0+ServerMAYV2:Ops
Named resource streamAdditional named streams besides the media resource3.0ServerMAYV3:Core

10. Operations

1.0 and 2.0 know exactly one kind of server-defined operation. 3.0 splits it in two — but through an attribute, not through separate schema elements: a FunctionImport with IsSideEffecting="true" is an Action, one without is a Function. The dedicated <Action> and <Function> elements only arrive in V4.

FeatureDescriptionVersionsRoleRequirementSpec
Service operationDeclared as FunctionImport in the metadata document1.0+ServerMAYV2:Ops
HTTP methodGET or POST, fixed by the declaration1.0+ServerMUSTV2:Ops
ParametersQuery options; primitive types only before 3.01.0+ClientMUSTV2:Ops
Return valuesPrimitive, complex, entity or a collection thereof; may return nothing1.0+ServerMAYV2:Ops
Query options on the result$filter and friends applied to the returned collection1.0+ServerMAYV2:Uri
ActionFunctionImport with edm:IsSideEffecting="true"3.0ServerMAYV3:Csdl
FunctionFunctionImport without side effects3.0ServerMAYV3:Csdl
Bindingedm:IsBindable / edm:IsAlwaysBindable — the operation is invocable on a resource3.0ServerMAYV3:Csdl
Advertisement in the payloadAvailable actions announced in the entry3.0ServerMAYV3:Core
Composable functionsnot before V4

11. Batch Requests

FeatureDescriptionVersionsRoleRequirementSpec
Batch endpointPOST to /$batch2.0+ServerMAYV2:Batch
Multipart formatmultipart/mixed with a boundary; the only batch format before V42.0+BothMUSTV2:Batch
Query operationsRetrievals as individual parts2.0+ServerMUSTV2:Batch
Change setGroup of modifications, executed atomically2.0+ServerMUSTV2:Batch
OrderingParts are processed in the order given2.0+ServerMUSTV2:Batch
Content-ID referencingRefer to an entity created earlier in the same change set2.0+ClientMAYV2:Batch
Error handlingA failing change set is rolled back as a whole2.0+ServerMUSTV2:Batch
JSON batchnot before V4

12. Security

FeatureDescriptionVersionsRoleRequirementSpec
Transport securityHTTPS; the protocol defines no authentication scheme of its own1.0+BothSHOULDV2:Ops
AuthenticationLeft to HTTP — Basic, OAuth, cookies are all outside the protocol1.0+BothMAYV2:Ops
The d wrapperExists for security: the response is valid JSON but not a valid JavaScript statement, so it cannot be executed via cross-site scripting1.0+ServerMUSTV2:Json

13. Not in OData V1–V3

Everything below exists in V4 and has no equivalent in any of the three earlier versions. Read one way it is the list of reasons to move to V4; read the other way, the list of things a V1–V3 client never has to implement.

Data model

  • Type definitions, singletons, open types, untyped values
  • Navigation property binding — V1–V3 use Association / AssociationSet instead
  • Vocabularies with defined semantics (Core.*, Capabilities.*); V3 has the mechanism but not the standard terms
  • CSDL as JSON
  • Alternate keys, key-as-segment

Querying

  • Nested query options inside $expand — the single most consequential gap, and it holds for all three versions
  • $search, $compute, $apply (aggregation), $index, $levels
  • $it, $this, $root; parameter aliases
  • $all, $crossjoin, $entity, $filter as a path segment, $each
  • A large part of the string and date function set (has, matchesPattern, fractionalseconds, date arithmetic, …)

Payloads & protocol

  • @odata.* control information and its prefix-less 4.01 form — V1–V3 use __-prefixed reserved names
  • Context URLs — no equivalent concept
  • Delta payloads and change tracking
  • Asynchronous requests (respond-async, status monitors); the Prefer header exists from 3.0, but not for async
  • JSON batch
  • $ref — V1–V3 have $links; @odata.bind
  • Upsert, deep update, set-based updates, positional inserts
  • Conformance levels — there is no graded notion of "a conforming service" before V4
  • OData-Version / OData-MaxVersion — V1–V3 use DataServiceVersion / MaxDataServiceVersion / MinDataServiceVersion