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
| Prefix | Document |
|---|---|
| Protocol | OData V4.01 Part 1: Protocol |
| Url | OData V4.01 Part 2: URL Conventions |
| Json | OData JSON Format V4.01 |
| Csdl | OData CSDL XML Representation V4.01 |
| Agg | OData Data Aggregation Extension V4.0 |
Legend
| Symbol | Meaning |
|---|---|
4.0 | Present since OData 4.0 |
4.01 | Added 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:
| Value | Meaning |
|---|---|
Server | The service has to provide or honour it |
Client | The consumer has to send, follow or tolerate it |
Both | Obligations 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:
| Value | Meaning |
|---|---|
Core | Part of the core protocol or data model, not gated by a conformance level at all |
Min | Minimal conformance level — every conformant service |
Int | Intermediate conformance level and upwards |
Adv | Advanced conformance level and upwards |
Upd | A 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:
| Value | Meaning |
|---|---|
MUST | Mandatory at the stated conformance level |
SHOULD | Recommended; a service may omit it, so a client cannot rely on it |
MAY | Entirely 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
| # | Area | What it covers | Spec |
|---|---|---|---|
| 1 | Data model & schema | Types, properties, relationships, containers, annotations | Protocol - Data Model |
| 2 | Service model | Entity-ids, read/edit URLs, transient entities, namespaces | Protocol - Service Model |
| 3 | Versioning & extensibility | Protocol/model versioning, extension points | Protocol - Versioning |
| 4 | Formats & JSON payloads | Format negotiation, control information, payload shapes | Json - Format Design |
| 5 | Header fields & preferences | Request/response headers, Prefer and Preference-Applied | Protocol - Header Fields |
| 6 | Status codes & errors | Success/error codes, error body, in-stream errors | Protocol - Status Codes |
| 7 | Context URL | @odata.context per payload kind | Protocol - Context URL |
| 8 | Resource addressing | Service root, key predicates, path segments, casts | Url - Resource Path |
| 9 | Querying data | $select/$expand, $filter, ordering, paging, counting | Protocol - Requesting Data |
| 10 | Change tracking (delta) | track-changes, delta links, delta payloads | Protocol - Requesting Changes |
| 11 | Data modification | Create/update/delete, relationships, streams, collections | Protocol - Data Modification |
| 12 | Operations | Functions and actions, binding, overload resolution | Protocol - Operations |
| 13 | Asynchronous requests | respond-async, status monitor, result retrieval | Protocol - Asynchronous Requests |
| 14 | Batch requests | Multipart and JSON batch, change sets, dependencies | Protocol - Batch Requests |
| 15 | Aggregation ($apply) | Transformation pipeline, aggregate methods, grouping | Agg |
| 16 | Security & conformance | Authentication, conformance levels, interoperable clients | Protocol - Conformance |
1. Data Model & Schema
The model is described in CSDL and consumed by clients through $metadata. Everything a service exposes is
declared here.
| Feature | Description | Since | Role | Conformance | Requirement | Spec |
|---|---|---|---|---|---|---|
| Entity type | Structured type with an identity (key) | 4.0 | – | Core | – | Csdl - Entity Type |
| Complex type | Structured type without identity, used as a property value | 4.0 | – | Core | – | Csdl - Complex Type |
| Enumeration type | Named primitive constants, optionally flags | 4.0 | – | Core | – | Csdl - Enumeration Type |
| Type definition | Named alias/specialization of a primitive type | 4.0 | – | Core | – | Csdl - Type Definition |
| Structural property | Primitive, complex, enum or collection-valued property | 4.0 | – | Core | – | Csdl - Structural Property |
| Navigation property | Typed relationship to another entity type | 4.0 | – | Core | – | Csdl - Navigation Property |
| Entity container | Declares the exposed entity sets, singletons and imports | 4.0 | – | Core | – | Csdl - Entity Container |
| Action & function declaration | Signature, binding, return type, overloads | 4.0 | – | Core | – | Csdl - Action and Function |
| Annotations & vocabularies | Terms applied to model elements | 4.0 | – | Core | – | Csdl - Vocabulary and Annotation |
| CSDL XML representation | $metadata as XML | 4.0 | Server | Adv | MUST | Csdl - XML Representation |
| CSDL JSON representation | $metadata as JSON | 4.01 | Server | – | SHOULD | Csdl - CSDL Document |
| Schema versioning | Model evolution, $schemaversion | 4.01 | Server | – | MAY | Protocol - Model Versioning |
1.1 Keys & Identity
| Feature | Description | Since | Role | Conformance | Requirement | Spec |
|---|---|---|---|---|---|---|
| Simple key | Single key property | 4.0 | – | Core | – | Csdl - Entity Type |
| Composite key | Several properties forming the key | 4.0 | – | Core | – | Csdl - Entity Type |
| Alternate keys | Additional unique identifiers besides the canonical key | 4.0 | Server | – | MAY | Url - Addressing Entities |
| Entity-id | Durable, globally unique identity of an entity | 4.0 | – | Core | – | Protocol - Entity-Ids and Entity References |
1.2 Relationships
| Feature | Description | Since | Role | Conformance | Requirement | Spec |
|---|---|---|---|---|---|---|
| Single-valued navigation | To-one relationship | 4.0 | – | Core | – | Csdl - Navigation Property |
| Collection-valued navigation | To-many relationship | 4.0 | – | Core | – | Csdl - Navigation Property |
| Partner navigation | Bidirectional relationship declaration | 4.0 | – | Core | – | Csdl - Navigation Property |
| Referential constraint | Dependent/principal property pairs | 4.0 | – | Core | – | Csdl - Navigation Property |
| Containment navigation | Child entities addressed only through the parent | 4.0 | – | Core | – | Csdl - Navigation Property |
| Navigation property binding | Maps a navigation to a concrete target set | 4.0 | – | Core | – | Csdl - Entity Container |
| Integrity constraints on modification | Behavior when a constraint would be violated | 4.0 | – | Core | – | Protocol - Handling of Integrity Constraints |
1.3 Inheritance & Open Types
| Feature | Description | Since | Role | Conformance | Requirement | Spec |
|---|---|---|---|---|---|---|
| Type inheritance | Derived entity and complex types | 4.0 | – | Core | – | Csdl - Entity Type |
| Abstract types | Types that cannot be instantiated | 4.0 | – | Core | – | Csdl - Entity Type |
| Open types | Instances may carry undeclared (dynamic) properties | 4.0 | – | Core | – | Protocol - Properties Not Advertised in Metadata |
| Untyped values | Values without a declared EDM type | 4.01 | – | Core | – | Json - Untyped Value |
2. Service Model
| Feature | Description | Since | Role | Conformance | Requirement | Spec |
|---|---|---|---|---|---|---|
| Service root & service document | Entry point listing entity sets, singletons, imports | 4.0 | Server | Min | MUST | Protocol - Service Document Request |
| Metadata document | $metadata, the CSDL of the service | 4.0 | Server | Adv | MUST | Protocol - Metadata Document Request |
| Entity references | Referring to an entity by its id instead of its value | 4.0 | – | Core | – | Protocol - Entity-Ids and Entity References |
| Read URLs & edit URLs | Distinct URLs for reading and modifying an entity | 4.0 | Server | Upd | MUST | Protocol - Read URLs and Edit URLs |
| Transient entities | Entities without a durable id (e.g. operation results) | 4.01 | – | Core | – | Protocol - Transient Entities |
| Default namespaces | Omitting the namespace when unambiguous | 4.01 | Server | Min | MUST | Protocol - Default Namespaces |
3. Versioning & Extensibility
| Feature | Description | Since | Role | Conformance | Requirement | Spec |
|---|---|---|---|---|---|---|
| Protocol versioning | OData-Version / OData-MaxVersion negotiation | 4.0 | Both | Min | MUST | Protocol - Protocol Versioning |
| Model versioning | Evolving the schema without breaking clients | 4.0 | Server | – | MAY | Protocol - Model Versioning |
| Custom query options | Service-specific options without $ prefix | 4.0 | Server | – | MAY | Url - Custom Query Options |
| Query option extensibility | Rules for extending the option space | 4.0 | Both | Min | MUST | Protocol - Query Option Extensibility |
| Payload extensibility | Additional content in payloads | 4.0 | Both | Min | MUST | Protocol - Payload Extensibility |
| Action/function extensibility | Adding operations without breaking clients | 4.0 | Both | Min | MUST | Protocol - Action/Function Extensibility |
| Vocabulary extensibility | Defining and applying custom terms | 4.0 | Both | Min | MUST | Protocol - Vocabulary Extensibility |
| Header field extensibility | Custom headers | 4.0 | Both | Min | MUST | Protocol - Header Field Extensibility |
| Format extensibility | Additional payload formats | 4.0 | Both | Min | MUST | Protocol - Format Extensibility |
4. Formats & JSON Payloads
| Feature | Description | Since | Role | Conformance | Requirement | Spec |
|---|---|---|---|---|---|---|
| Format negotiation | Accept header and $format query option | 4.0 | Both | Min | MUST | Protocol - Formats |
$format | Format as a query option instead of a header | 4.0 | Server | – | MAY | Protocol - $format |
| Metadata level | odata.metadata=full / minimal / none | 4.0 | Both | – | MAY | Json - Amount of Control Information |
| Number representation | IEEE754Compatible for Edm.Int64 / Edm.Decimal | 4.0 | Server | – | MAY | Json - Representation of Numbers |
| Relative URLs | Shortened URLs resolved against the context | 4.0 | – | Core | – | Json - Relative URLs |
| Payload ordering constraints | Required ordering of control information | 4.0 | Server | Min | MUST | Json - Payload Ordering Constraints |
| Instance annotations | @ns.term on objects, arrays and primitives | 4.0 | Server | – | MAY | Json - 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 information | Meaning | Since | Role | Conformance | Requirement | Spec |
|---|---|---|---|---|---|---|
@odata.context | Describes the shape of the payload | 4.0 | Server | Min | MUST | Protocol - Context URL |
@odata.metadataEtag | ETag of the metadata document | 4.0 | Server | – | MAY | Json - Control Information |
@odata.type | Type of the instance, for derived/ambiguous types | 4.0 | Server | Min | MUST | Json - Control Information |
@odata.count | Total count of a collection | 4.0 | Server | Min | MUST | Json - Control Information |
@odata.nextLink | Link to the next page (server-driven paging) | 4.0 | Server | Min | MUST | Json - Control Information |
@odata.deltaLink | Link for subsequent change tracking | 4.0 | Server | – | MAY | Json - Delta Payload |
@odata.id | Entity-id of the instance | 4.0 | Server | – | MAY | Json - Control Information |
@odata.editLink / @odata.readLink | Edit and read URL of the instance | 4.0 | Server | Upd | MUST | Json - Control Information |
@odata.etag | Concurrency token of the instance | 4.0 | Server | – | MAY | Json - Control Information |
@odata.navigationLink / @odata.associationLink | Links to a related entity and its reference | 4.0 | Server | – | MAY | Json - Navigation Link |
@odata.mediaEditLink, @odata.mediaReadLink, @odata.mediaContentType, @odata.mediaEtag | Media stream links and metadata | 4.0 | Server | – | MAY | Json - Media Entity |
@odata.bind | Binds a navigation property to an existing entity | 4.0 | Server | – | MAY | Json - Bind Operation |
@odata.removed | Marks a deleted entity in a delta payload | 4.0 | Server | – | MAY | Json - Delta Payload |
Prefix-less form (@context, @count, …) | Short spelling of all control information | 4.01 | Server | Min | MUST | Json - Control Information |
4.2 Payload Shapes
| Payload | Description | Since | Role | Conformance | Requirement | Spec |
|---|---|---|---|---|---|---|
| Service document | List of exposed resources | 4.0 | Server | Min | MUST | Json - Service Document |
| Entity | Single entity | 4.0 | Server | Min | MUST | Json - Entity |
| Collection of entities | Entity set or navigation collection | 4.0 | Server | Min | MUST | Json - Collection of Entities |
| Structural property | Primitive, complex, and collections thereof | 4.0 | Server | Min | MUST | Json - Structural Property |
| Entity reference | $ref payload carrying only the entity-id | 4.0 | Server | – | MAY | Json - Entity Reference |
| Expanded navigation property | Related entities inlined | 4.0 | Server | Adv | MUST | Json - Expanded Navigation Property |
| Stream property & media entity | Binary content and its links | 4.0 | Server | – | MAY | Json - Stream Property |
| Operation response | Result of a function or action | 4.0 | Server | – | MAY | Json - Individual Property or Operation Response |
| Collection of operation responses | Results of several operations | 4.01 | Server | – | MAY | Json - Collection of Operation Responses |
| Delta payload | Changes since a delta link | 4.0 | Server | – | MAY | Json - Delta Payload |
| Collection ETag | ETag covering a whole collection | 4.01 | Server | – | MAY | Json - Collection ETag |
5. Header Fields & Preferences
| Header | Direction | Description | Since | Role | Conformance | Requirement | Spec |
|---|---|---|---|---|---|---|---|
Content-Type | both | Payload format incl. parameters | 4.0 | Both | Min | MUST | Protocol - Content-Type |
Content-Encoding | both | Compression | 4.0 | Both | – | MAY | Protocol - Content-Encoding |
Content-Language | both | Natural language of the payload | 4.0 | Both | – | MAY | Protocol - Content-Language |
Content-Length | both | Payload size | 4.0 | Both | – | MAY | Protocol - Content-Length |
OData-Version | both | Version of the payload | 4.0 | Both | Min | MUST | Protocol - OData-Version |
Accept | request | Requested format | 4.0 | Client | Min | MUST | Protocol - Accept |
Accept-Charset | request | Requested charset | 4.0 | Client | – | MAY | Protocol - Accept-Charset |
Accept-Language | request | Requested language | 4.0 | Client | – | MAY | Protocol - Accept-Language |
If-Match | request | Optimistic concurrency for update/delete | 4.0 | Client | Upd | MUST | Protocol - If-Match |
If-None-Match | request | Conditional read, upsert protection | 4.0 | Client | – | MAY | Protocol - If-None-Match |
OData-Isolation | request | snapshot isolation across requests | 4.0 | Client | – | MAY | Protocol - Isolation |
OData-MaxVersion | request | Highest version the client understands | 4.0 | Client | Min | MUST | Protocol - OData-MaxVersion |
Prefer | request | Behavioral hints, see 5.1 | 4.0 | Client | – | MAY | Protocol - Prefer |
ETag | response | Concurrency token | 4.0 | Server | – | MAY | Protocol - ETag |
Location | response | URL of a created or async resource | 4.0 | Server | Upd | MUST | Protocol - Location |
OData-EntityId | response | Entity-id when no body is returned | 4.0 | Server | Upd | MUST | Protocol - OData-EntityId |
OData-Error | response | Signals an in-stream error | 4.01 | Server | – | MAY | Protocol - OData-Error |
Preference-Applied | response | Which preferences were honored | 4.0 | Server | – | MAY | Protocol - Preference-Applied |
Retry-After | response | Delay before polling again | 4.0 | Server | – | MAY | Protocol - Retry-After |
AsyncResult | response | Status of an asynchronous request | 4.0 | Server | – | MAY | Protocol - AsyncResult |
Vary | response | Cache-relevant request headers | 4.0 | Server | – | MAY | Protocol - Vary |
5.1 Preferences
All preferences are hints: a service may ignore them, and reports what it applied via Preference-Applied.
| Preference | Effect | Since | Role | Conformance | Requirement | Spec |
|---|---|---|---|---|---|---|
allow-entityreferences | Service may return entity references instead of entities | 4.0 | Both | – | MAY | Protocol - allow-entityreferences |
callback | Asynchronous notification via a callback URL | 4.0 | Both | – | MAY | Protocol - callback |
continue-on-error | Batch continues after a failing request | 4.0 | Both | – | MAY | Protocol - continue-on-error |
include-annotations | Which instance annotations to include | 4.0 | Both | – | MAY | Protocol - include-annotations |
maxpagesize | Hint for the server-driven page size | 4.0 | Both | – | MAY | Protocol - maxpagesize |
omit-values=nulls|defaults | Omit null/default values from the payload | 4.01 | Both | – | MAY | Protocol - omit-values |
return=representation|minimal | Whether modifications return the full entity | 4.0 | Both | – | MAY | Protocol - return |
respond-async | Process the request asynchronously | 4.0 | Both | – | MAY | Protocol - respond-async |
track-changes | Request a delta link for change tracking | 4.0 | Both | – | MAY | Protocol - track-changes |
wait | How long the client will wait for a response | 4.0 | Both | – | MAY | Protocol - wait |
6. Status Codes & Error Handling
| Feature | Description | Since | Role | Conformance | Requirement | Spec |
|---|---|---|---|---|---|---|
200 OK | Request succeeded with a body | 4.0 | Server | Min | MUST | Protocol - 200 OK |
201 Created | Entity created | 4.0 | Server | Upd | MUST | Protocol - 201 Created |
202 Accepted | Asynchronous processing started | 4.0 | Server | – | MAY | Protocol - 202 Accepted |
204 No Content | Success without a body | 4.0 | Server | Min | MUST | Protocol - 204 No Content |
3xx / 304 Not Modified | Redirection and conditional-read result | 4.0 | Server | – | MAY | Protocol - 3xx Redirection |
404, 405, 406, 410, 412, 424 | Client error responses | 4.0 | Server | Min | MUST | Protocol - Client Error Responses |
501 Not Implemented | Unsupported feature | 4.0 | Server | Min | MUST | Protocol - 501 Not Implemented |
| Error response body | code, message, target, details, innererror | 4.0 | Server | Min | MUST | Protocol - Error Response Body |
| In-stream errors | Failure after the response body has started | 4.0 | Server | – | MAY | Protocol - In-Stream Errors |
| Error in a success payload | Error information alongside partial results | 4.01 | Server | – | MAY | Json - 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 for | Since | Role | Conformance | Requirement | Spec |
|---|---|---|---|---|---|
| Service document | 4.0 | Server | Min | MUST | Protocol - Service Document |
| Collection of entities / single entity | 4.0 | Server | Min | MUST | Protocol - Collection of Entities |
| Singleton | 4.0 | Server | Min | MUST | Protocol - Singleton |
| Derived entities (collection and single) | 4.0 | Server | – | MAY | Protocol - Collection of Derived Entities |
Projected entities ($select) | 4.0 | Server | Int | MUST | Protocol - Collection of Projected Entities |
Expanded entities ($expand) | 4.0 | Server | Adv | MUST | Protocol - Collection of Expanded Entities |
Entity references ($ref) | 4.0 | Server | – | MAY | Protocol - Collection of Entity References |
| Property value | 4.0 | Server | Int | MUST | Protocol - Property Value |
| Complex or primitive type (and collections) | 4.0 | Server | Min | MUST | Protocol - Complex or Primitive Type |
| Operation result | 4.0 | Server | – | MAY | Protocol - Operation Result |
| Delta payload and its items | 4.0 | Server | – | MAY | Protocol - Delta Payload Response |
$all / $crossjoin responses | 4.0 | Server | – | MAY | Protocol - $all Response |
8. Resource Addressing
How a URL identifies a resource. Query options are covered in section 9.
| Feature | Syntax | Since | Role | Conformance | Requirement | Spec |
|---|---|---|---|---|---|---|
| Service root | https://host/service/ | 4.0 | Server | Min | MUST | Url - Service Root URL |
| Metadata endpoint | /$metadata | 4.0 | Server | Adv | MUST | Url - Addressing the Model |
| Batch endpoint | /$batch | 4.0 | Server | Adv | MUST | Url - Addressing the Batch Endpoint |
| Entity set & singleton | /Products, /Me | 4.0 | Server | Min | MUST | Url - Addressing Entities |
| Canonical key predicate | /Products(1), /Products('abc') | 4.0 | Server | Min | MUST | Url - Addressing Entities |
| Composite key | /OrderItems(OrderID=1,ItemNo=2) | 4.0 | Server | Min | MUST | Url - Addressing Entities |
| Key-as-segment | /Products/1 | 4.0 | Server | – | MAY | Url - Addressing Entities |
| Navigation path | /Orders(1)/Items | 4.0 | Server | Min | MUST | Url - Addressing Entities |
| Property access | /Products(1)/Name | 4.0 | Server | Int | MUST | Url - Addressing a Property |
| Raw value | /Products(1)/Name/$value | 4.0 | Server | Int | MUST | Url - Addressing a Property Value |
| Media stream | /Products(1)/$value | 4.0 | Server | Int | MUST | Url - Addressing the Media Stream |
| Entity references | /Orders(1)/Items/$ref | 4.0 | Server | Upd | MUST | Url - Addressing References |
| Count of a collection | /Products/$count | 4.0 | Server | Adv | MUST | Url - Addressing the Count |
| Type cast segment | /Products/Namespace.DiscountedProduct | 4.0 | Server | Int | MUST | Url - Addressing Derived Types |
| Member of a collection | /Products(1)/Tags addressed by value | 4.01 | Server | – | MAY | Url - Addressing a Member |
| Member of an ordered collection | /Tags/$index(2) | 4.01 | Server | – | MAY | Url - Addressing a Member of an Ordered Collection |
| Subset of a collection | /Items/$filter(@expr) | 4.01 | Server | – | MAY | Url - Addressing a Subset |
| Each member | /Products/$each | 4.01 | Server | – | MAY | Url - Addressing Each Member |
| Cross join | /$crossjoin(Products,Categories) | 4.0 | Server | – | MAY | Url - Cross Join |
| All entities | /$all | 4.0 | Server | – | MAY | Url - Addressing All Entities |
| Resolve an entity-id | /$entity?$id=… | 4.0 | Server | – | MAY | Protocol - Resolving an Entity-Id |
| Operation invocation | /Products(1)/Namespace.Rate | 4.0 | Server | – | MAY | Url - Addressing Operations |
| Query options in the body | POST /Products/$query with text/plain body | 4.01 | Server | – | MAY | Url - Passing Query Options in the Request Body |
9. Querying Data
| Feature | Description | Since | Role | Conformance | Requirement | Spec |
|---|---|---|---|---|---|---|
| Shaping the result | $select and $expand, see 9.1 | 4.0 | Server | Int | MUST | Protocol - Specifying Properties to Return |
| Filtering | $filter, see 9.2 | 4.0 | Server | Int | MUST | Protocol - $filter |
| Sorting, paging, counting | $orderby, $top, $skip, $count, see 9.3 | 4.0 | Server | Adv | MUST | Protocol - Querying Collections |
| Free-text search | $search with its own expression grammar | 4.0 | Server | Adv | MUST | Protocol - $search |
| Computed properties | $compute adds derived properties to the result | 4.01 | Server | – | SHOULD | Protocol - $compute |
| Aggregation | $apply, see section 15 | 4.0 | Server | – | MAY | Agg |
| Parameter aliases | @name placeholders reused across options | 4.0 | Server | Int | MUST | Url - Parameter Aliases |
| Custom query options | Service-defined, without $ prefix | 4.0 | Server | – | MAY | Url - Custom Query Options |
| Individual entities & properties | Reading a single entity, property or raw value | 4.0 | Server | Min | MUST | Protocol - Requesting Individual Entities |
| Related entities | Reading across a navigation property | 4.0 | Server | Min | MUST | Protocol - Requesting Related Entities |
| Entity references | Reading $ref instead of entities | 4.0 | Server | – | MAY | Protocol - Requesting Entity References |
| Schema version selection | $schemaversion | 4.01 | Server | – | MAY | Protocol - $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.
| Feature | Syntax | Since | Role | Conformance | Requirement | Spec |
|---|---|---|---|---|---|---|
| Select properties | $select=Name,Price | 4.0 | Server | Int | MUST | Protocol - $select |
| Select all | $select=* | 4.0 | Server | Int | MUST | Protocol - $select |
| Select with type cast | $select=Namespace.SubType/Prop | 4.0 | Server | Int | MUST | Protocol - $select |
| Select an operation | $select=Namespace.Action advertises it | 4.0 | Server | – | MAY | Protocol - $select |
| Expand a navigation property | $expand=Category | 4.0 | Server | Adv | MUST | Protocol - $expand |
| Expand all | $expand=* | 4.0 | Server | – | MAY | Protocol - $expand |
| Expand references | $expand=Items/$ref | 4.0 | Server | Adv | MUST | Protocol - $expand |
| Expand a count | $expand=Items/$count | 4.0 | Server | – | MAY | Protocol - $expand |
| Expand with type cast | $expand=Namespace.SubType/Nav | 4.0 | Server | Adv | MUST | Protocol - $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 option | Applies to | Since | Role | Conformance | Requirement | Spec |
|---|---|---|---|---|---|---|
$select | Related entities | 4.0 | Server | – | SHOULD | Protocol - Expand Options |
$expand | Further nesting, recursively | 4.0 | Server | – | MAY | Protocol - Expand Options |
$filter | Collection-valued navigation only | 4.0 | Server | Adv | MUST | Protocol - Expand Options |
$orderby | Collection-valued navigation only | 4.0 | Server | – | SHOULD | Protocol - Expand Options |
$top / $skip | Collection-valued navigation only | 4.0 | Server | – | SHOULD | Protocol - Expand Options |
$count | Collection-valued navigation only | 4.0 | Server | – | SHOULD | Protocol - Expand Options |
$search | Collection-valued navigation only | 4.0 | Server | – | SHOULD | Protocol - Expand Options |
$compute | Related entities | 4.01 | Server | – | MAY | Protocol - Expand Options |
$apply | Collection-valued navigation only | 4.0 | Server | – | MAY | Agg |
$levels | Recursive expansion depth ($levels=3, $levels=max) | 4.0 | Server | – | SHOULD | Protocol - 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
| Group | Operators | Since | Role | Conformance | Requirement | Spec |
|---|---|---|---|---|---|---|
| Comparison | eq, ne, gt, ge, lt, le | 4.0 | Server | Int | MUST | Protocol - Built-in Filter Operations |
| Logical | and, or, not | 4.0 | Server | – | SHOULD | Protocol - Built-in Filter Operations |
| Arithmetic | add, sub, mul, div, mod | 4.0 | Server | – | SHOULD | Protocol - Built-in Filter Operations |
| Integer division | divby | 4.01 | Server | – | SHOULD | Protocol - Built-in Filter Operations |
| Grouping | ( … ) | 4.0 | Server | Int | MUST | Protocol - Built-in Filter Operations |
| Membership | in — value against a list | 4.01 | Server | Int | MUST | Protocol - Built-in Filter Operations |
| Enum/flag test | has | 4.0 | Server | – | SHOULD | Protocol - Built-in Filter Operations |
9.2.2 Built-in Functions
| Group | Functions | Since | Role | Conformance | Requirement | Spec |
|---|---|---|---|---|---|---|
| String | concat, contains, endswith, startswith, indexof, length, substring, tolower, toupper, trim | 4.0 | Server | – | SHOULD | Protocol - Built-in Query Functions |
| String (4.01) | matchesPattern, substring with two arguments | 4.01 | Server | – | SHOULD | Protocol - Built-in Query Functions |
| Collection | hassubset, hassubsequence | 4.01 | Server | – | SHOULD | Protocol - Built-in Query Functions |
| Date & time | year, month, day, hour, minute, second, fractionalseconds, date, time, totaloffsetminutes, totalseconds, now, mindatetime, maxdatetime | 4.0 | Server | – | SHOULD | Protocol - Built-in Query Functions |
| Arithmetic | round, floor, ceiling | 4.0 | Server | – | SHOULD | Protocol - Built-in Query Functions |
| Type | cast, isof | 4.0 | Server | – | SHOULD | Protocol - Built-in Query Functions |
| Conditional | case | 4.0 | Server | – | SHOULD | Protocol - Built-in Query Functions |
| Geo | geo.distance, geo.intersects, geo.length | 4.0 | Server | – | MAY | Protocol - Built-in Query Functions |
9.2.3 Lambda Operators & Path Expressions
| Feature | Syntax | Since | Role | Conformance | Requirement | Spec |
|---|---|---|---|---|---|---|
any | Items/any(i: i/Price gt 10) | 4.0 | Server | Adv | MUST | Protocol - Built-in Filter Operations |
all | Items/all(i: i/InStock) | 4.0 | Server | Adv | MUST | Protocol - Built-in Filter Operations |
any without a predicate | Items/any() — collection is non-empty | 4.0 | Server | Adv | MUST | Protocol - Built-in Filter Operations |
$it | The current instance | 4.0 | Server | – | MAY | Protocol - Built-in Filter Operations |
$this | The current instance inside a lambda | 4.01 | Server | – | MAY | Protocol - Built-in Filter Operations |
$root | Absolute reference to the service root | 4.0 | Server | – | MAY | Protocol - Built-in Filter Operations |
| Parameter alias | $filter=Name eq @n&@n='X' | 4.0 | Server | Int | MUST | Protocol - Parameter Aliases |
9.3 Ordering, Paging & Counting
| Feature | Syntax | Since | Role | Conformance | Requirement | Spec |
|---|---|---|---|---|---|---|
| Sorting | $orderby=Name desc,Price asc | 4.0 | Server | Adv | MUST | Protocol - $orderby |
| Client-driven paging | $top=10&$skip=20 | 4.0 | Server | Int | MUST | Protocol - $top |
| Inline count | $count=true | 4.0 | Server | Adv | MUST | Protocol - $count |
| Count of a collection | /Products/$count as a raw value | 4.0 | Server | Adv | MUST | Protocol - Requesting the Number of Items |
| Server-driven paging | @odata.nextLink, maxpagesize preference | 4.0 | Server | Min | MUST | Protocol - Server-Driven Paging |
| Skip token | Opaque continuation inside nextLink | 4.0 | Server | Min | MUST | Protocol - Server-Driven Paging |
| Member of an ordered collection | $index | 4.01 | Server | – | MAY | Protocol - Requesting an Individual Member |
10. Change Tracking (Delta)
| Feature | Description | Since | Role | Conformance | Requirement | Spec |
|---|---|---|---|---|---|---|
| Request change tracking | Prefer: track-changes | 4.0 | Both | – | MAY | Protocol - track-changes |
| Delta link | @odata.deltaLink returned with the result | 4.0 | Server | – | MAY | Protocol - Delta Links |
| Using a delta link | Fetching changes since the previous response | 4.0 | Client | – | MAY | Protocol - Using Delta Links |
| Delta payload | Added/changed entities, deletions, link changes | 4.0 | Server | – | MAY | Protocol - Delta Payloads |
| Deleted entity | @removed with a reason | 4.0 | Server | – | MAY | Json - Delta Payload |
| Added / deleted link | Relationship changes as their own entries | 4.0 | Server | – | MAY | Json - Added Link |
| Nested delta in expanded properties | Delta inside $expand | 4.01 | Server | – | MAY | Json - Delta Responses |
11. Data Modification
| Feature | Method | Since | Role | Conformance | Requirement | Spec |
|---|---|---|---|---|---|---|
| Create an entity | POST to an entity set | 4.0 | Server | Upd | MUST | Protocol - Create an Entity |
| Update an entity | PATCH (merge) | 4.0 | Server | Upd | MUST | Protocol - Update an Entity |
| Replace an entity | PUT (full replace) | 4.0 | Server | – | SHOULD | Protocol - Update an Entity |
| Upsert | PATCH/PUT on a non-existing key | 4.0 | Server | Upd | MUST | Protocol - Upsert an Entity |
| Delete an entity | DELETE | 4.0 | Server | Upd | MUST | Protocol - Delete an Entity |
| Optimistic concurrency | If-Match / If-None-Match with ETags | 4.0 | Server | Upd | MUST | Protocol - Use of ETags |
| Returning results | Prefer: return=representation|minimal | 4.0 | Server | – | MAY | Protocol - Returning Results |
DateTimeOffset handling | Normalization rules on modification | 4.0 | Server | Min | MUST | Protocol - Handling of DateTimeOffset |
| Undeclared properties | Behavior for open/dynamic properties | 4.0 | Server | – | MAY | Protocol - Properties Not Advertised |
11.1 Related Entities & Relationships
| Feature | Description | Since | Role | Conformance | Requirement | Spec |
|---|---|---|---|---|---|---|
| Deep insert | Create an entity together with related ones | 4.0 | Server | – | SHOULD | Protocol - Create Related Entities |
| Bind on create | @odata.bind / @id to link existing entities | 4.0 | Server | – | MAY | Protocol - Link to Related Entities |
| Deep update | Nested changes inside PATCH | 4.01 | Server | – | SHOULD | Protocol - Update Related Entities |
| Add a reference | POST to …/Nav/$ref | 4.0 | Server | Upd | MUST | Protocol - Add a Reference |
| Remove a reference | DELETE on …/Nav/$ref | 4.0 | Server | Upd | MUST | Protocol - Remove a Reference |
| Change a single-valued reference | PUT on …/Nav/$ref | 4.0 | Server | Upd | MUST | Protocol - Change the Reference |
| Replace all references | PUT on a collection-valued …/Nav/$ref | 4.0 | Server | – | SHOULD | Protocol - Replace all References |
11.2 Properties, Values & Collections
| Feature | Description | Since | Role | Conformance | Requirement | Spec |
|---|---|---|---|---|---|---|
| Update a primitive property | PUT on the property URL | 4.0 | Server | – | SHOULD | Protocol - Update a Primitive Property |
| Set a value to null | DELETE on the property URL | 4.0 | Server | – | SHOULD | Protocol - Set a Value to Null |
| Update a complex property | PATCH/PUT on the property URL | 4.0 | Server | – | SHOULD | Protocol - Update a Complex Property |
| Update a collection property | Replace the whole collection | 4.0 | Server | – | MAY | Protocol - Update a Collection Property |
| Update a collection of entities | Delta-style collection update | 4.01 | Server | – | MAY | Protocol - Update a Collection of Entities |
| Update members of a collection | PATCH via $each | 4.01 | Server | – | MAY | Protocol - Update Members of a Collection |
| Delete members of a collection | DELETE via $each | 4.01 | Server | – | MAY | Protocol - Delete Members of a Collection |
| Ordered collections | Managing members by position | 4.01 | Server | – | MAY | Protocol - Managing Members of an Ordered Collection |
| Positional insert | $index on insert | 4.01 | Server | – | MAY | Protocol - Positional Inserts |
11.3 Media Entities & Streams
| Feature | Description | Since | Role | Conformance | Requirement | Spec |
|---|---|---|---|---|---|---|
| Create a media entity | POST the stream, then patch the properties | 4.0 | Server | – | MAY | Protocol - Create a Media Entity |
| Update a media stream | PUT on /$value | 4.0 | Server | – | MAY | Protocol - Update a Media Entity Stream |
| Delete a media entity | DELETE on the entity | 4.0 | Server | – | MAY | Protocol - Delete a Media Entity |
| Update a stream property | PUT on the stream property | 4.0 | Server | – | MAY | Protocol - Update Stream Values |
| Delete a stream property | DELETE on the stream property | 4.0 | Server | – | MAY | Protocol - Delete Stream Values |
12. Operations (Functions & Actions)
| Feature | Description | Since | Role | Conformance | Requirement | Spec |
|---|---|---|---|---|---|---|
| Function | Side-effect free, GET, composable | 4.0 | Server | – | MAY | Protocol - Functions |
| Action | May have side effects, POST, not composable | 4.0 | Server | – | MAY | Protocol - Actions |
| Unbound operation | Invoked via an import at the service root | 4.0 | Server | – | MAY | Protocol - Operations |
| Bound operation | Bound to an entity, collection or complex type | 4.0 | Server | – | MAY | Protocol - Binding an Operation |
| Function parameters in the URL | /Rate(value=4) | 4.0 | Server | – | MAY | Protocol - Invoking a Function |
| Inline parameter syntax | Parameters as query options | 4.01 | Server | – | MAY | Protocol - Inline Parameter Syntax |
| Action parameters in the body | JSON object with named parameters | 4.0 | Server | – | MAY | Protocol - Invoking an Action |
| Overload resolution | Selecting among overloads by parameter names | 4.0 | Server | – | MAY | Protocol - Function overload resolution |
| Composable functions | Further path segments and options on the result | 4.0 | Server | – | MAY | Protocol - Functions |
| Operation advertisement | Available operations announced in the payload | 4.0 | Server | – | MAY | Protocol - Advertising Available Operations |
13. Asynchronous Requests
| Feature | Description | Since | Role | Conformance | Requirement | Spec |
|---|---|---|---|---|---|---|
| Request async processing | Prefer: respond-async | 4.0 | Both | – | SHOULD | Protocol - respond-async |
| Status monitor | 202 Accepted plus Location for polling | 4.0 | Server | – | MAY | Protocol - Asynchronous Requests |
| Polling interval | Retry-After | 4.0 | Client | – | MAY | Protocol - Retry-After |
| Fetching the result | Final response once processing finished | 4.0 | Client | – | MAY | Protocol - Asynchronous Requests |
| Cancellation | DELETE on the status monitor | 4.0 | Client | – | MAY | Protocol - Asynchronous Requests |
| Callback | Prefer: callback instead of polling | 4.0 | Both | – | MAY | Protocol - callback |
| Asynchronous batch | Async processing of a batch request | 4.0 | Server | – | MAY | Protocol - Asynchronous Batch Requests |
14. Batch Requests
| Feature | Description | Since | Role | Conformance | Requirement | Spec |
|---|---|---|---|---|---|---|
| Multipart batch | multipart/mixed body | 4.0 | Both | Adv | MUST | Protocol - Multipart Batch Format |
| JSON batch | Batch as a JSON document | 4.01 | Both | – | MAY | Json - Batch Requests and Responses |
| Change sets | Group of modifications treated atomically | 4.0 | Server | Adv | MUST | Protocol - Multipart Batch Request Body |
| Request identification | id per request | 4.01 | Client | – | MAY | Protocol - Identifying Individual Requests |
| Request dependencies | dependsOn between requests | 4.01 | Client | – | MAY | Protocol - Request Dependencies |
| Referencing new entities | $<id> referring to a previous result | 4.0 | Client | Adv | MUST | Protocol - Referencing New Entities |
| Referencing an ETag | Using an ETag from an earlier response | 4.0 | Client | – | MAY | Protocol - Referencing an ETag |
| Referencing response values | Using values from earlier response bodies | 4.01 | Client | – | MAY | Protocol - Referencing Values from Response Bodies |
| Continue on error | Prefer: continue-on-error | 4.0 | Client | – | MAY | Protocol - continue-on-error |
| Batch headers | Headers applying to the batch as a whole | 4.0 | Both | Adv | MUST | Protocol - 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.
| Transformation | Description | Role | Conformance | Requirement | Spec |
|---|---|---|---|---|---|
aggregate | Aggregate values with sum, min, max, average, countdistinct, $count | Server | – | MAY | Agg - aggregate |
groupby | Group by properties, optionally with a nested transformation | Server | – | MAY | Agg - groupby |
filter | Filter within the pipeline | Server | – | MAY | Agg - filter |
compute | Add computed properties | Server | – | MAY | Agg - compute |
expand | Expand within the pipeline | Server | – | MAY | Agg - groupby with navigation |
concat | Concatenate several result sets | Server | – | MAY | Agg - concat |
identity | Neutral transformation | Server | – | MAY | Agg - identity |
orderby | Order within the pipeline | Server | – | MAY | Agg - orderby |
skip / top | Paging within the pipeline | Server | – | MAY | Agg - top |
topcount / bottomcount | Top or bottom N by an expression | Server | – | MAY | Agg - topcount/bottomcount |
toppercent / bottompercent | Top or bottom N percent | Server | – | MAY | Agg - toppercent/bottompercent |
topsum / bottomsum | Members contributing to a share of a sum | Server | – | MAY | Agg - topsum/bottomsum |
search | Free-text search within the pipeline | Server | – | MAY | Agg - search |
join / outerjoin | Join across navigation properties | Server | – | MAY | Agg - join/outerjoin |
traverse | Traverse a recursive hierarchy | Server | – | MAY | Agg - traverse |
ancestors / descendants | Hierarchy navigation | Server | – | MAY | Agg - ancestors/descendants |
| Custom aggregates | Service-defined aggregation methods | Server | – | MAY | Agg - Custom Aggregates |
16. Security & Conformance
| Feature | Description | Since | Role | Conformance | Requirement | Spec |
|---|---|---|---|---|---|---|
| Authentication | Not prescribed; delegated to HTTP mechanisms | 4.0 | – | Core | – | Protocol - Authentication |
| Security considerations | Injection, information disclosure, resource exhaustion | 4.0 | – | Core | – | Protocol - Security Considerations |
| 4.0 conformance levels | Minimal, Intermediate, Advanced | 4.0 | – | Core | – | Protocol - OData 4.0 Conformance Levels |
| 4.01 conformance levels | Revised level definitions | 4.01 | – | Core | – | Protocol - OData 4.01 Conformance Levels |
| Interoperable clients | What a client must tolerate to be interoperable | 4.0 | – | Core | – | Protocol - Interoperable OData Clients |