Skip to main content

OData V4 Feature Matrix

A structured inventory of everything the OData V4 (4.0 / 4.01) protocol defines — independent of any implementation. This document describes the specification only; it makes no statement about any client or server library.

The companion document odata-v1-v3.md does the same for OData 1.0, 2.0 and 3.0 — those three share one normative specification and one continuous lineage, so they are covered together, with the break placed where it actually is: between 3.0 and 4.0. Coverage of a concrete implementation is tracked separately — for odata2ts itself see feature support.

Scope

  • Covers the complete protocol: not only what a client sends and receives, but also the data model (CSDL), service obligations, conformance levels and security considerations.
  • JSON is the payload format described here. Atom/XML is a defined but rarely used alternative format and is not broken down; CSDL is covered in both its XML and JSON representation.
  • The OData Protocol specification (Part 1) provides the backbone of this document; URL syntax, payload shapes and schema details are pulled in from Parts 2, the JSON Format and the CSDL specification.

Sources

PrefixDocument
ProtocolOData V4.01 Part 1: Protocol
UrlOData V4.01 Part 2: URL Conventions
JsonOData JSON Format V4.01
CsdlOData CSDL XML Representation V4.01
AggOData Data Aggregation Extension V4.0

Legend

SymbolMeaning
4.0Present since OData 4.0
4.01Added in OData 4.01

Required vs. optional — the Role, Conformance and Requirement columns

OData has no flat required/optional split. It defines three conformance levels plus an orthogonal Updatable qualifier, and grades each rule as MUST / SHOULD / MAY. Those are independent axes, so the matrix carries them in three columns.

Role — on whom the obligation falls:

ValueMeaning
ServerThe 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

The conformance levels are defined for services, so most rows are Server. Client marks the places where the protocol puts the duty on the consumer — following a nextLink or a delta link, polling an async status monitor, composing batch dependencies. For header rows the value follows the Direction column.

Conformance — at which level the feature is demanded, i.e. the weakest level that requires it:

ValueMeaning
CorePart of the core protocol or data model, not gated by a conformance level at all
MinMinimal conformance level — every conformant service
IntIntermediate conformance level and upwards
AdvAdvanced conformance level and upwards
UpdA service that supports modification (Updatable OData Service)
–No level demands it; support is entirely at the service's discretion

Requirement — how hard the demand is, in the sense of RFC 2119:

ValueMeaning
MUSTMandatory at the stated conformance level
SHOULDRecommended; a service may omit it, so a client cannot rely on it
MAYEntirely optional
–Not applicable — the row describes a Core construct, which is not phrased as a service obligation

The two columns combine: Min + MUST is the hard floor every service meets, while – + MAY is never guaranteed. Two combinations never occur, by construction: SHOULD alongside a conformance level, since a recommendation is not a level requirement; and a graded requirement on a Core row, since those describe what the protocol is rather than what a service has to do. A client that must work against arbitrary services can rely on Core and Min alone.

Values are derived from Protocol §13.1 (4.0) and §13.2 (4.01); where the two versions differ, the stricter one is shown.

How to read this document

The matrix is multi-level. The Overview summarizes the protocol into coarse areas. Each area then has its own section listing its features, and the genuinely complex ones — nested $expand, the $filter expression language, $apply transformations, the schema elements — are broken down one level further into their own subsections.


Overview​

#AreaWhat it coversSpec
1Data model & schemaTypes, properties, relationships, containers, annotationsProtocol - Data Model
2Service modelEntity-ids, read/edit URLs, transient entities, namespacesProtocol - Service Model
3Versioning & extensibilityProtocol/model versioning, extension pointsProtocol - Versioning
4Formats & JSON payloadsFormat negotiation, control information, payload shapesJson - Format Design
5Header fields & preferencesRequest/response headers, Prefer and Preference-AppliedProtocol - Header Fields
6Status codes & errorsSuccess/error codes, error body, in-stream errorsProtocol - Status Codes
7Context URL@odata.context per payload kindProtocol - Context URL
8Resource addressingService root, key predicates, path segments, castsUrl - Resource Path
9Querying data$select/$expand, $filter, ordering, paging, countingProtocol - Requesting Data
10Change tracking (delta)track-changes, delta links, delta payloadsProtocol - Requesting Changes
11Data modificationCreate/update/delete, relationships, streams, collectionsProtocol - Data Modification
12OperationsFunctions and actions, binding, overload resolutionProtocol - Operations
13Asynchronous requestsrespond-async, status monitor, result retrievalProtocol - Asynchronous Requests
14Batch requestsMultipart and JSON batch, change sets, dependenciesProtocol - Batch Requests
15Aggregation ($apply)Transformation pipeline, aggregate methods, groupingAgg
16Security & conformanceAuthentication, conformance levels, interoperable clientsProtocol - Conformance

1. Data Model & Schema​

The model is described in CSDL and consumed by clients through $metadata. Everything a service exposes is declared here.

FeatureDescriptionSinceRoleConformanceRequirementSpec
Entity typeStructured type with an identity (key)4.0–Core–Csdl - Entity Type
Complex typeStructured type without identity, used as a property value4.0–Core–Csdl - Complex Type
Enumeration typeNamed primitive constants, optionally flags4.0–Core–Csdl - Enumeration Type
Type definitionNamed alias/specialization of a primitive type4.0–Core–Csdl - Type Definition
Structural propertyPrimitive, complex, enum or collection-valued property4.0–Core–Csdl - Structural Property
Navigation propertyTyped relationship to another entity type4.0–Core–Csdl - Navigation Property
Entity containerDeclares the exposed entity sets, singletons and imports4.0–Core–Csdl - Entity Container
Action & function declarationSignature, binding, return type, overloads4.0–Core–Csdl - Action and Function
Annotations & vocabulariesTerms applied to model elements4.0–Core–Csdl - Vocabulary and Annotation
CSDL XML representation$metadata as XML4.0ServerAdvMUSTCsdl - XML Representation
CSDL JSON representation$metadata as JSON4.01Server–SHOULDCsdl - CSDL Document
Schema versioningModel evolution, $schemaversion4.01Server–MAYProtocol - Model Versioning

1.1 Keys & Identity​

FeatureDescriptionSinceRoleConformanceRequirementSpec
Simple keySingle key property4.0–Core–Csdl - Entity Type
Composite keySeveral properties forming the key4.0–Core–Csdl - Entity Type
Alternate keysAdditional unique identifiers besides the canonical key4.0Server–MAYUrl - Addressing Entities
Entity-idDurable, globally unique identity of an entity4.0–Core–Protocol - Entity-Ids and Entity References

1.2 Relationships​

FeatureDescriptionSinceRoleConformanceRequirementSpec
Single-valued navigationTo-one relationship4.0–Core–Csdl - Navigation Property
Collection-valued navigationTo-many relationship4.0–Core–Csdl - Navigation Property
Partner navigationBidirectional relationship declaration4.0–Core–Csdl - Navigation Property
Referential constraintDependent/principal property pairs4.0–Core–Csdl - Navigation Property
Containment navigationChild entities addressed only through the parent4.0–Core–Csdl - Navigation Property
Navigation property bindingMaps a navigation to a concrete target set4.0–Core–Csdl - Entity Container
Integrity constraints on modificationBehavior when a constraint would be violated4.0–Core–Protocol - Handling of Integrity Constraints

1.3 Inheritance & Open Types​

FeatureDescriptionSinceRoleConformanceRequirementSpec
Type inheritanceDerived entity and complex types4.0–Core–Csdl - Entity Type
Abstract typesTypes that cannot be instantiated4.0–Core–Csdl - Entity Type
Open typesInstances may carry undeclared (dynamic) properties4.0–Core–Protocol - Properties Not Advertised in Metadata
Untyped valuesValues without a declared EDM type4.01–Core–Json - Untyped Value

2. Service Model​

FeatureDescriptionSinceRoleConformanceRequirementSpec
Service root & service documentEntry point listing entity sets, singletons, imports4.0ServerMinMUSTProtocol - Service Document Request
Metadata document$metadata, the CSDL of the service4.0ServerAdvMUSTProtocol - Metadata Document Request
Entity referencesReferring to an entity by its id instead of its value4.0–Core–Protocol - Entity-Ids and Entity References
Read URLs & edit URLsDistinct URLs for reading and modifying an entity4.0ServerUpdMUSTProtocol - Read URLs and Edit URLs
Transient entitiesEntities without a durable id (e.g. operation results)4.01–Core–Protocol - Transient Entities
Default namespacesOmitting the namespace when unambiguous4.01ServerMinMUSTProtocol - Default Namespaces

3. Versioning & Extensibility​

FeatureDescriptionSinceRoleConformanceRequirementSpec
Protocol versioningOData-Version / OData-MaxVersion negotiation4.0BothMinMUSTProtocol - Protocol Versioning
Model versioningEvolving the schema without breaking clients4.0Server–MAYProtocol - Model Versioning
Custom query optionsService-specific options without $ prefix4.0Server–MAYUrl - Custom Query Options
Query option extensibilityRules for extending the option space4.0BothMinMUSTProtocol - Query Option Extensibility
Payload extensibilityAdditional content in payloads4.0BothMinMUSTProtocol - Payload Extensibility
Action/function extensibilityAdding operations without breaking clients4.0BothMinMUSTProtocol - Action/Function Extensibility
Vocabulary extensibilityDefining and applying custom terms4.0BothMinMUSTProtocol - Vocabulary Extensibility
Header field extensibilityCustom headers4.0BothMinMUSTProtocol - Header Field Extensibility
Format extensibilityAdditional payload formats4.0BothMinMUSTProtocol - Format Extensibility

4. Formats & JSON Payloads​

FeatureDescriptionSinceRoleConformanceRequirementSpec
Format negotiationAccept header and $format query option4.0BothMinMUSTProtocol - Formats
$formatFormat as a query option instead of a header4.0Server–MAYProtocol - $format
Metadata levelodata.metadata=full / minimal / none4.0Both–MAYJson - Amount of Control Information
Number representationIEEE754Compatible for Edm.Int64 / Edm.Decimal4.0Server–MAYJson - Representation of Numbers
Relative URLsShortened URLs resolved against the context4.0–Core–Json - Relative URLs
Payload ordering constraintsRequired ordering of control information4.0ServerMinMUSTJson - Payload Ordering Constraints
Instance annotations@ns.term on objects, arrays and primitives4.0Server–MAYJson - Instance Annotations

4.1 Control Information​

Metadata carried inside the payload. In 4.0 every name is prefixed (@odata.context); 4.01 allows the short form (@context), and consumers must accept both.

Control informationMeaningSinceRoleConformanceRequirementSpec
@odata.contextDescribes the shape of the payload4.0ServerMinMUSTProtocol - Context URL
@odata.metadataEtagETag of the metadata document4.0Server–MAYJson - Control Information
@odata.typeType of the instance, for derived/ambiguous types4.0ServerMinMUSTJson - Control Information
@odata.countTotal count of a collection4.0ServerMinMUSTJson - Control Information
@odata.nextLinkLink to the next page (server-driven paging)4.0ServerMinMUSTJson - Control Information
@odata.deltaLinkLink for subsequent change tracking4.0Server–MAYJson - Delta Payload
@odata.idEntity-id of the instance4.0Server–MAYJson - Control Information
@odata.editLink / @odata.readLinkEdit and read URL of the instance4.0ServerUpdMUSTJson - Control Information
@odata.etagConcurrency token of the instance4.0Server–MAYJson - Control Information
@odata.navigationLink / @odata.associationLinkLinks to a related entity and its reference4.0Server–MAYJson - Navigation Link
@odata.mediaEditLink, @odata.mediaReadLink, @odata.mediaContentType, @odata.mediaEtagMedia stream links and metadata4.0Server–MAYJson - Media Entity
@odata.bindBinds a navigation property to an existing entity4.0Server–MAYJson - Bind Operation
@odata.removedMarks a deleted entity in a delta payload4.0Server–MAYJson - Delta Payload
Prefix-less form (@context, @count, …)Short spelling of all control information4.01ServerMinMUSTJson - Control Information

4.2 Payload Shapes​

PayloadDescriptionSinceRoleConformanceRequirementSpec
Service documentList of exposed resources4.0ServerMinMUSTJson - Service Document
EntitySingle entity4.0ServerMinMUSTJson - Entity
Collection of entitiesEntity set or navigation collection4.0ServerMinMUSTJson - Collection of Entities
Structural propertyPrimitive, complex, and collections thereof4.0ServerMinMUSTJson - Structural Property
Entity reference$ref payload carrying only the entity-id4.0Server–MAYJson - Entity Reference
Expanded navigation propertyRelated entities inlined4.0ServerAdvMUSTJson - Expanded Navigation Property
Stream property & media entityBinary content and its links4.0Server–MAYJson - Stream Property
Operation responseResult of a function or action4.0Server–MAYJson - Individual Property or Operation Response
Collection of operation responsesResults of several operations4.01Server–MAYJson - Collection of Operation Responses
Delta payloadChanges since a delta link4.0Server–MAYJson - Delta Payload
Collection ETagETag covering a whole collection4.01Server–MAYJson - Collection ETag

5. Header Fields & Preferences​

HeaderDirectionDescriptionSinceRoleConformanceRequirementSpec
Content-TypebothPayload format incl. parameters4.0BothMinMUSTProtocol - Content-Type
Content-EncodingbothCompression4.0Both–MAYProtocol - Content-Encoding
Content-LanguagebothNatural language of the payload4.0Both–MAYProtocol - Content-Language
Content-LengthbothPayload size4.0Both–MAYProtocol - Content-Length
OData-VersionbothVersion of the payload4.0BothMinMUSTProtocol - OData-Version
AcceptrequestRequested format4.0ClientMinMUSTProtocol - Accept
Accept-CharsetrequestRequested charset4.0Client–MAYProtocol - Accept-Charset
Accept-LanguagerequestRequested language4.0Client–MAYProtocol - Accept-Language
If-MatchrequestOptimistic concurrency for update/delete4.0ClientUpdMUSTProtocol - If-Match
If-None-MatchrequestConditional read, upsert protection4.0Client–MAYProtocol - If-None-Match
OData-Isolationrequestsnapshot isolation across requests4.0Client–MAYProtocol - Isolation
OData-MaxVersionrequestHighest version the client understands4.0ClientMinMUSTProtocol - OData-MaxVersion
PreferrequestBehavioral hints, see 5.14.0Client–MAYProtocol - Prefer
ETagresponseConcurrency token4.0Server–MAYProtocol - ETag
LocationresponseURL of a created or async resource4.0ServerUpdMUSTProtocol - Location
OData-EntityIdresponseEntity-id when no body is returned4.0ServerUpdMUSTProtocol - OData-EntityId
OData-ErrorresponseSignals an in-stream error4.01Server–MAYProtocol - OData-Error
Preference-AppliedresponseWhich preferences were honored4.0Server–MAYProtocol - Preference-Applied
Retry-AfterresponseDelay before polling again4.0Server–MAYProtocol - Retry-After
AsyncResultresponseStatus of an asynchronous request4.0Server–MAYProtocol - AsyncResult
VaryresponseCache-relevant request headers4.0Server–MAYProtocol - Vary

5.1 Preferences​

All preferences are hints: a service may ignore them, and reports what it applied via Preference-Applied.

PreferenceEffectSinceRoleConformanceRequirementSpec
allow-entityreferencesService may return entity references instead of entities4.0Both–MAYProtocol - allow-entityreferences
callbackAsynchronous notification via a callback URL4.0Both–MAYProtocol - callback
continue-on-errorBatch continues after a failing request4.0Both–MAYProtocol - continue-on-error
include-annotationsWhich instance annotations to include4.0Both–MAYProtocol - include-annotations
maxpagesizeHint for the server-driven page size4.0Both–MAYProtocol - maxpagesize
omit-values=nulls|defaultsOmit null/default values from the payload4.01Both–MAYProtocol - omit-values
return=representation|minimalWhether modifications return the full entity4.0Both–MAYProtocol - return
respond-asyncProcess the request asynchronously4.0Both–MAYProtocol - respond-async
track-changesRequest a delta link for change tracking4.0Both–MAYProtocol - track-changes
waitHow long the client will wait for a response4.0Both–MAYProtocol - wait

6. Status Codes & Error Handling​

FeatureDescriptionSinceRoleConformanceRequirementSpec
200 OKRequest succeeded with a body4.0ServerMinMUSTProtocol - 200 OK
201 CreatedEntity created4.0ServerUpdMUSTProtocol - 201 Created
202 AcceptedAsynchronous processing started4.0Server–MAYProtocol - 202 Accepted
204 No ContentSuccess without a body4.0ServerMinMUSTProtocol - 204 No Content
3xx / 304 Not ModifiedRedirection and conditional-read result4.0Server–MAYProtocol - 3xx Redirection
404, 405, 406, 410, 412, 424Client error responses4.0ServerMinMUSTProtocol - Client Error Responses
501 Not ImplementedUnsupported feature4.0ServerMinMUSTProtocol - 501 Not Implemented
Error response bodycode, message, target, details, innererror4.0ServerMinMUSTProtocol - Error Response Body
In-stream errorsFailure after the response body has started4.0Server–MAYProtocol - In-Stream Errors
Error in a success payloadError information alongside partial results4.01Server–MAYJson - Error Information in a Success Payload

7. Context URL​

@odata.context tells the consumer how to interpret the payload. The specification defines a distinct form per payload kind.

Context forSinceRoleConformanceRequirementSpec
Service document4.0ServerMinMUSTProtocol - Service Document
Collection of entities / single entity4.0ServerMinMUSTProtocol - Collection of Entities
Singleton4.0ServerMinMUSTProtocol - Singleton
Derived entities (collection and single)4.0Server–MAYProtocol - Collection of Derived Entities
Projected entities ($select)4.0ServerIntMUSTProtocol - Collection of Projected Entities
Expanded entities ($expand)4.0ServerAdvMUSTProtocol - Collection of Expanded Entities
Entity references ($ref)4.0Server–MAYProtocol - Collection of Entity References
Property value4.0ServerIntMUSTProtocol - Property Value
Complex or primitive type (and collections)4.0ServerMinMUSTProtocol - Complex or Primitive Type
Operation result4.0Server–MAYProtocol - Operation Result
Delta payload and its items4.0Server–MAYProtocol - Delta Payload Response
$all / $crossjoin responses4.0Server–MAYProtocol - $all Response

8. Resource Addressing​

How a URL identifies a resource. Query options are covered in section 9.

FeatureSyntaxSinceRoleConformanceRequirementSpec
Service roothttps://host/service/4.0ServerMinMUSTUrl - Service Root URL
Metadata endpoint/$metadata4.0ServerAdvMUSTUrl - Addressing the Model
Batch endpoint/$batch4.0ServerAdvMUSTUrl - Addressing the Batch Endpoint
Entity set & singleton/Products, /Me4.0ServerMinMUSTUrl - Addressing Entities
Canonical key predicate/Products(1), /Products('abc')4.0ServerMinMUSTUrl - Addressing Entities
Composite key/OrderItems(OrderID=1,ItemNo=2)4.0ServerMinMUSTUrl - Addressing Entities
Key-as-segment/Products/14.0Server–MAYUrl - Addressing Entities
Navigation path/Orders(1)/Items4.0ServerMinMUSTUrl - Addressing Entities
Property access/Products(1)/Name4.0ServerIntMUSTUrl - Addressing a Property
Raw value/Products(1)/Name/$value4.0ServerIntMUSTUrl - Addressing a Property Value
Media stream/Products(1)/$value4.0ServerIntMUSTUrl - Addressing the Media Stream
Entity references/Orders(1)/Items/$ref4.0ServerUpdMUSTUrl - Addressing References
Count of a collection/Products/$count4.0ServerAdvMUSTUrl - Addressing the Count
Type cast segment/Products/Namespace.DiscountedProduct4.0ServerIntMUSTUrl - Addressing Derived Types
Member of a collection/Products(1)/Tags addressed by value4.01Server–MAYUrl - Addressing a Member
Member of an ordered collection/Tags/$index(2)4.01Server–MAYUrl - Addressing a Member of an Ordered Collection
Subset of a collection/Items/$filter(@expr)4.01Server–MAYUrl - Addressing a Subset
Each member/Products/$each4.01Server–MAYUrl - Addressing Each Member
Cross join/$crossjoin(Products,Categories)4.0Server–MAYUrl - Cross Join
All entities/$all4.0Server–MAYUrl - Addressing All Entities
Resolve an entity-id/$entity?$id=…4.0Server–MAYProtocol - Resolving an Entity-Id
Operation invocation/Products(1)/Namespace.Rate4.0Server–MAYUrl - Addressing Operations
Query options in the bodyPOST /Products/$query with text/plain body4.01Server–MAYUrl - Passing Query Options in the Request Body

9. Querying Data​

FeatureDescriptionSinceRoleConformanceRequirementSpec
Shaping the result$select and $expand, see 9.14.0ServerIntMUSTProtocol - Specifying Properties to Return
Filtering$filter, see 9.24.0ServerIntMUSTProtocol - $filter
Sorting, paging, counting$orderby, $top, $skip, $count, see 9.34.0ServerAdvMUSTProtocol - Querying Collections
Free-text search$search with its own expression grammar4.0ServerAdvMUSTProtocol - $search
Computed properties$compute adds derived properties to the result4.01Server–SHOULDProtocol - $compute
Aggregation$apply, see section 154.0Server–MAYAgg
Parameter aliases@name placeholders reused across options4.0ServerIntMUSTUrl - Parameter Aliases
Custom query optionsService-defined, without $ prefix4.0Server–MAYUrl - Custom Query Options
Individual entities & propertiesReading a single entity, property or raw value4.0ServerMinMUSTProtocol - Requesting Individual Entities
Related entitiesReading across a navigation property4.0ServerMinMUSTProtocol - Requesting Related Entities
Entity referencesReading $ref instead of entities4.0Server–MAYProtocol - Requesting Entity References
Schema version selection$schemaversion4.01Server–MAYProtocol - $schemaversion

9.1 $select & $expand​

$select narrows the properties returned; $expand inlines related entities. Both accept paths, and $expand additionally carries nested query options, which is what makes it the most complex option in the protocol.

FeatureSyntaxSinceRoleConformanceRequirementSpec
Select properties$select=Name,Price4.0ServerIntMUSTProtocol - $select
Select all$select=*4.0ServerIntMUSTProtocol - $select
Select with type cast$select=Namespace.SubType/Prop4.0ServerIntMUSTProtocol - $select
Select an operation$select=Namespace.Action advertises it4.0Server–MAYProtocol - $select
Expand a navigation property$expand=Category4.0ServerAdvMUSTProtocol - $expand
Expand all$expand=*4.0Server–MAYProtocol - $expand
Expand references$expand=Items/$ref4.0ServerAdvMUSTProtocol - $expand
Expand a count$expand=Items/$count4.0Server–MAYProtocol - $expand
Expand with type cast$expand=Namespace.SubType/Nav4.0ServerAdvMUSTProtocol - $expand

9.1.1 Nested Expand Options​

Options applied inside an $expand, in parentheses and separated by ; — e.g. $expand=Items($select=Name;$filter=Price gt 10;$top=5). They apply to the related collection, not the parent.

Nested optionApplies toSinceRoleConformanceRequirementSpec
$selectRelated entities4.0Server–SHOULDProtocol - Expand Options
$expandFurther nesting, recursively4.0Server–MAYProtocol - Expand Options
$filterCollection-valued navigation only4.0ServerAdvMUSTProtocol - Expand Options
$orderbyCollection-valued navigation only4.0Server–SHOULDProtocol - Expand Options
$top / $skipCollection-valued navigation only4.0Server–SHOULDProtocol - Expand Options
$countCollection-valued navigation only4.0Server–SHOULDProtocol - Expand Options
$searchCollection-valued navigation only4.0Server–SHOULDProtocol - Expand Options
$computeRelated entities4.01Server–MAYProtocol - Expand Options
$applyCollection-valued navigation only4.0Server–MAYAgg
$levelsRecursive expansion depth ($levels=3, $levels=max)4.0Server–SHOULDProtocol - Expand Option $levels

9.2 $filter Expression Language​

A boolean expression evaluated per item. Operands are property paths, literals, parameter aliases and function calls; $it, $this and lambda range variables provide access to the current instance.

9.2.1 Operators​

GroupOperatorsSinceRoleConformanceRequirementSpec
Comparisoneq, ne, gt, ge, lt, le4.0ServerIntMUSTProtocol - Built-in Filter Operations
Logicaland, or, not4.0Server–SHOULDProtocol - Built-in Filter Operations
Arithmeticadd, sub, mul, div, mod4.0Server–SHOULDProtocol - Built-in Filter Operations
Integer divisiondivby4.01Server–SHOULDProtocol - Built-in Filter Operations
Grouping( … )4.0ServerIntMUSTProtocol - Built-in Filter Operations
Membershipin — value against a list4.01ServerIntMUSTProtocol - Built-in Filter Operations
Enum/flag testhas4.0Server–SHOULDProtocol - Built-in Filter Operations

9.2.2 Built-in Functions​

GroupFunctionsSinceRoleConformanceRequirementSpec
Stringconcat, contains, endswith, startswith, indexof, length, substring, tolower, toupper, trim4.0Server–SHOULDProtocol - Built-in Query Functions
String (4.01)matchesPattern, substring with two arguments4.01Server–SHOULDProtocol - Built-in Query Functions
Collectionhassubset, hassubsequence4.01Server–SHOULDProtocol - Built-in Query Functions
Date & timeyear, month, day, hour, minute, second, fractionalseconds, date, time, totaloffsetminutes, totalseconds, now, mindatetime, maxdatetime4.0Server–SHOULDProtocol - Built-in Query Functions
Arithmeticround, floor, ceiling4.0Server–SHOULDProtocol - Built-in Query Functions
Typecast, isof4.0Server–SHOULDProtocol - Built-in Query Functions
Conditionalcase4.0Server–SHOULDProtocol - Built-in Query Functions
Geogeo.distance, geo.intersects, geo.length4.0Server–MAYProtocol - Built-in Query Functions

9.2.3 Lambda Operators & Path Expressions​

FeatureSyntaxSinceRoleConformanceRequirementSpec
anyItems/any(i: i/Price gt 10)4.0ServerAdvMUSTProtocol - Built-in Filter Operations
allItems/all(i: i/InStock)4.0ServerAdvMUSTProtocol - Built-in Filter Operations
any without a predicateItems/any() — collection is non-empty4.0ServerAdvMUSTProtocol - Built-in Filter Operations
$itThe current instance4.0Server–MAYProtocol - Built-in Filter Operations
$thisThe current instance inside a lambda4.01Server–MAYProtocol - Built-in Filter Operations
$rootAbsolute reference to the service root4.0Server–MAYProtocol - Built-in Filter Operations
Parameter alias$filter=Name eq @n&@n='X'4.0ServerIntMUSTProtocol - Parameter Aliases

9.3 Ordering, Paging & Counting​

FeatureSyntaxSinceRoleConformanceRequirementSpec
Sorting$orderby=Name desc,Price asc4.0ServerAdvMUSTProtocol - $orderby
Client-driven paging$top=10&$skip=204.0ServerIntMUSTProtocol - $top
Inline count$count=true4.0ServerAdvMUSTProtocol - $count
Count of a collection/Products/$count as a raw value4.0ServerAdvMUSTProtocol - Requesting the Number of Items
Server-driven paging@odata.nextLink, maxpagesize preference4.0ServerMinMUSTProtocol - Server-Driven Paging
Skip tokenOpaque continuation inside nextLink4.0ServerMinMUSTProtocol - Server-Driven Paging
Member of an ordered collection$index4.01Server–MAYProtocol - Requesting an Individual Member

10. Change Tracking (Delta)​

FeatureDescriptionSinceRoleConformanceRequirementSpec
Request change trackingPrefer: track-changes4.0Both–MAYProtocol - track-changes
Delta link@odata.deltaLink returned with the result4.0Server–MAYProtocol - Delta Links
Using a delta linkFetching changes since the previous response4.0Client–MAYProtocol - Using Delta Links
Delta payloadAdded/changed entities, deletions, link changes4.0Server–MAYProtocol - Delta Payloads
Deleted entity@removed with a reason4.0Server–MAYJson - Delta Payload
Added / deleted linkRelationship changes as their own entries4.0Server–MAYJson - Added Link
Nested delta in expanded propertiesDelta inside $expand4.01Server–MAYJson - Delta Responses

11. Data Modification​

FeatureMethodSinceRoleConformanceRequirementSpec
Create an entityPOST to an entity set4.0ServerUpdMUSTProtocol - Create an Entity
Update an entityPATCH (merge)4.0ServerUpdMUSTProtocol - Update an Entity
Replace an entityPUT (full replace)4.0Server–SHOULDProtocol - Update an Entity
UpsertPATCH/PUT on a non-existing key4.0ServerUpdMUSTProtocol - Upsert an Entity
Delete an entityDELETE4.0ServerUpdMUSTProtocol - Delete an Entity
Optimistic concurrencyIf-Match / If-None-Match with ETags4.0ServerUpdMUSTProtocol - Use of ETags
Returning resultsPrefer: return=representation|minimal4.0Server–MAYProtocol - Returning Results
DateTimeOffset handlingNormalization rules on modification4.0ServerMinMUSTProtocol - Handling of DateTimeOffset
Undeclared propertiesBehavior for open/dynamic properties4.0Server–MAYProtocol - Properties Not Advertised
FeatureDescriptionSinceRoleConformanceRequirementSpec
Deep insertCreate an entity together with related ones4.0Server–SHOULDProtocol - Create Related Entities
Bind on create@odata.bind / @id to link existing entities4.0Server–MAYProtocol - Link to Related Entities
Deep updateNested changes inside PATCH4.01Server–SHOULDProtocol - Update Related Entities
Add a referencePOST to …/Nav/$ref4.0ServerUpdMUSTProtocol - Add a Reference
Remove a referenceDELETE on …/Nav/$ref4.0ServerUpdMUSTProtocol - Remove a Reference
Change a single-valued referencePUT on …/Nav/$ref4.0ServerUpdMUSTProtocol - Change the Reference
Replace all referencesPUT on a collection-valued …/Nav/$ref4.0Server–SHOULDProtocol - Replace all References

11.2 Properties, Values & Collections​

FeatureDescriptionSinceRoleConformanceRequirementSpec
Update a primitive propertyPUT on the property URL4.0Server–SHOULDProtocol - Update a Primitive Property
Set a value to nullDELETE on the property URL4.0Server–SHOULDProtocol - Set a Value to Null
Update a complex propertyPATCH/PUT on the property URL4.0Server–SHOULDProtocol - Update a Complex Property
Update a collection propertyReplace the whole collection4.0Server–MAYProtocol - Update a Collection Property
Update a collection of entitiesDelta-style collection update4.01Server–MAYProtocol - Update a Collection of Entities
Update members of a collectionPATCH via $each4.01Server–MAYProtocol - Update Members of a Collection
Delete members of a collectionDELETE via $each4.01Server–MAYProtocol - Delete Members of a Collection
Ordered collectionsManaging members by position4.01Server–MAYProtocol - Managing Members of an Ordered Collection
Positional insert$index on insert4.01Server–MAYProtocol - Positional Inserts

11.3 Media Entities & Streams​

FeatureDescriptionSinceRoleConformanceRequirementSpec
Create a media entityPOST the stream, then patch the properties4.0Server–MAYProtocol - Create a Media Entity
Update a media streamPUT on /$value4.0Server–MAYProtocol - Update a Media Entity Stream
Delete a media entityDELETE on the entity4.0Server–MAYProtocol - Delete a Media Entity
Update a stream propertyPUT on the stream property4.0Server–MAYProtocol - Update Stream Values
Delete a stream propertyDELETE on the stream property4.0Server–MAYProtocol - Delete Stream Values

12. Operations (Functions & Actions)​

FeatureDescriptionSinceRoleConformanceRequirementSpec
FunctionSide-effect free, GET, composable4.0Server–MAYProtocol - Functions
ActionMay have side effects, POST, not composable4.0Server–MAYProtocol - Actions
Unbound operationInvoked via an import at the service root4.0Server–MAYProtocol - Operations
Bound operationBound to an entity, collection or complex type4.0Server–MAYProtocol - Binding an Operation
Function parameters in the URL/Rate(value=4)4.0Server–MAYProtocol - Invoking a Function
Inline parameter syntaxParameters as query options4.01Server–MAYProtocol - Inline Parameter Syntax
Action parameters in the bodyJSON object with named parameters4.0Server–MAYProtocol - Invoking an Action
Overload resolutionSelecting among overloads by parameter names4.0Server–MAYProtocol - Function overload resolution
Composable functionsFurther path segments and options on the result4.0Server–MAYProtocol - Functions
Operation advertisementAvailable operations announced in the payload4.0Server–MAYProtocol - Advertising Available Operations

13. Asynchronous Requests​

FeatureDescriptionSinceRoleConformanceRequirementSpec
Request async processingPrefer: respond-async4.0Both–SHOULDProtocol - respond-async
Status monitor202 Accepted plus Location for polling4.0Server–MAYProtocol - Asynchronous Requests
Polling intervalRetry-After4.0Client–MAYProtocol - Retry-After
Fetching the resultFinal response once processing finished4.0Client–MAYProtocol - Asynchronous Requests
CancellationDELETE on the status monitor4.0Client–MAYProtocol - Asynchronous Requests
CallbackPrefer: callback instead of polling4.0Both–MAYProtocol - callback
Asynchronous batchAsync processing of a batch request4.0Server–MAYProtocol - Asynchronous Batch Requests

14. Batch Requests​

FeatureDescriptionSinceRoleConformanceRequirementSpec
Multipart batchmultipart/mixed body4.0BothAdvMUSTProtocol - Multipart Batch Format
JSON batchBatch as a JSON document4.01Both–MAYJson - Batch Requests and Responses
Change setsGroup of modifications treated atomically4.0ServerAdvMUSTProtocol - Multipart Batch Request Body
Request identificationid per request4.01Client–MAYProtocol - Identifying Individual Requests
Request dependenciesdependsOn between requests4.01Client–MAYProtocol - Request Dependencies
Referencing new entities$<id> referring to a previous result4.0ClientAdvMUSTProtocol - Referencing New Entities
Referencing an ETagUsing an ETag from an earlier response4.0Client–MAYProtocol - Referencing an ETag
Referencing response valuesUsing values from earlier response bodies4.01Client–MAYProtocol - Referencing Values from Response Bodies
Continue on errorPrefer: continue-on-error4.0Client–MAYProtocol - continue-on-error
Batch headersHeaders applying to the batch as a whole4.0BothAdvMUSTProtocol - Batch Request Headers

15. Aggregation ($apply)​

Defined by the Data Aggregation Extension, not by the core protocol. $apply is a pipeline: each transformation consumes the previous result set.

TransformationDescriptionRoleConformanceRequirementSpec
aggregateAggregate values with sum, min, max, average, countdistinct, $countServer–MAYAgg - aggregate
groupbyGroup by properties, optionally with a nested transformationServer–MAYAgg - groupby
filterFilter within the pipelineServer–MAYAgg - filter
computeAdd computed propertiesServer–MAYAgg - compute
expandExpand within the pipelineServer–MAYAgg - groupby with navigation
concatConcatenate several result setsServer–MAYAgg - concat
identityNeutral transformationServer–MAYAgg - identity
orderbyOrder within the pipelineServer–MAYAgg - orderby
skip / topPaging within the pipelineServer–MAYAgg - top
topcount / bottomcountTop or bottom N by an expressionServer–MAYAgg - topcount/bottomcount
toppercent / bottompercentTop or bottom N percentServer–MAYAgg - toppercent/bottompercent
topsum / bottomsumMembers contributing to a share of a sumServer–MAYAgg - topsum/bottomsum
searchFree-text search within the pipelineServer–MAYAgg - search
join / outerjoinJoin across navigation propertiesServer–MAYAgg - join/outerjoin
traverseTraverse a recursive hierarchyServer–MAYAgg - traverse
ancestors / descendantsHierarchy navigationServer–MAYAgg - ancestors/descendants
Custom aggregatesService-defined aggregation methodsServer–MAYAgg - Custom Aggregates

16. Security & Conformance​

FeatureDescriptionSinceRoleConformanceRequirementSpec
AuthenticationNot prescribed; delegated to HTTP mechanisms4.0–Core–Protocol - Authentication
Security considerationsInjection, information disclosure, resource exhaustion4.0–Core–Protocol - Security Considerations
4.0 conformance levelsMinimal, Intermediate, Advanced4.0–Core–Protocol - OData 4.0 Conformance Levels
4.01 conformance levelsRevised level definitions4.01–Core–Protocol - OData 4.01 Conformance Levels
Interoperable clientsWhat a client must tolerate to be interoperable4.0–Core–Protocol - Interoperable OData Clients