Service Reference
DynamoDB
DynamoDB accepts AWS JSON 1.0 and Smithy RPC v2 CBOR. JSON operations are identified by the X-Amz-Target header (e.g. DynamoDB_20120810.PutItem); CBOR operations use...
DynamoDB
AWS docs: https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/Welcome.html
DynamoDB accepts AWS JSON 1.0 and Smithy RPC v2 CBOR. JSON operations are
identified by the X-Amz-Target header (e.g. DynamoDB_20120810.PutItem);
CBOR operations use /service/DynamoDB/operation/<Operation> with
Smithy-Protocol: rpc-v2-cbor.
All data types are supported in the request/response format. The emulator stores items in their DynamoDB JSON wire format internally to avoid serialisation round-trip issues.
Tables are region-scoped
A DynamoDB table is a regional resource, and Overcast models it as one. A table
created in us-east-1 is invisible from eu-west-1: ListTables does not
report it, DescribeTable answers ResourceNotFoundException, and the same
table name can exist independently in both regions with entirely separate
items, GSI index entries, ItemCount and stream records. Deleting the table in
one region leaves the same-named table in the other untouched.
The region comes from the request, exactly as on AWS — the SigV4 credential
scope, a regional endpoint hostname, or OVERCAST_DEFAULT_REGION when the
request names none. A create in one region and a list in another therefore
correctly disagree; that is the emulated behaviour, not a bug.
Upgrading an existing database. Before this, item rows, GSI index entries and stream records were keyed by table name alone, so same-named tables in different regions shared them. A startup migration rewrites existing rows to the region their table was created in, which is already recorded on disk, so single-region data carries over untouched. If the same table name existed in two regions, those regions genuinely shared one set of rows and nothing on disk says which write came from where: the rows are assigned to the alphabetically first of those regions and the others start out empty.
Known limitations
- GSI consistency: real DynamoDB GSIs are eventually consistent; the emulator is immediately consistent — items are visible in GSI queries the instant they are written. Asking for a strongly consistent read on a GSI (
ConsistentRead=truewith a GSIIndexName) is still rejected with aValidationException, exactly as AWS does, so code written against the emulator cannot come to depend on a read mode AWS has no way to serve. - TTL expiry is not enforced in real-time. Items with expired TTL are removed by a background sweeper (runs hourly), not lazily on read.
- PartiQL (
ExecuteStatement,ExecuteTransaction,BatchExecuteStatement) is explicitly out of scope for v1. - Every other modeled DynamoDB operation — global tables, backups, exports and imports, resource policies, contributor insights, PartiQL — answers
501 Not Implementedwithx-emulator-unsupported: true, in DynamoDB’s own AWS JSON 1.0 error envelope. Only anX-Amz-Targetnaming no AWS operation at all gets400 UnknownOperationException. The endpoint tables below name the global-table operations explicitly; the rest follow the same rule without being listed one by one.
Summary
| Category | ✅ Supported | ❌ Unsupported |
|---|---|---|
| Table management | 7 | 1 |
| Item operations | 6 | |
| Query & scan | 2 | |
| Transactions | 2 | |
| Tags | 3 | |
| Streams interoperability | 1 | |
| Global tables | 6 |
Endpoints
Table management
| Operation | Status | Notes | AWS Docs |
|---|---|---|---|
CreateTable | ✅ Supported | Includes GSI/LSI definitions; an omitted BillingMode defaults to PROVISIONED, which requires ProvisionedThroughput on the table and on every GSI, while PAY_PER_REQUEST rejects it | docs |
DeleteTable | ✅ Supported | docs | |
DescribeTable | ✅ Supported | docs | |
ListTables | ✅ Supported | Region-scoped — lists only tables in the request’s region; Limit (default/max 100) and ExclusiveStartTableName honored; LastEvaluatedTableName echoed when more tables remain | docs |
UpdateTable | ✅ Supported | BillingMode, ProvisionedThroughput, GSI create/delete/update-throughput, AttributeDefinitions, StreamSpecification | docs |
DescribeTimeToLive | ✅ Supported | docs | |
UpdateTimeToLive | ✅ Supported | TTL-based item expiry; sweeper deletes expired items hourly | docs |
RestoreTableFromBackup | ❌ Unsupported | docs |
Item operations
| Operation | Status | Notes | AWS Docs |
|---|---|---|---|
PutItem | ✅ Supported | Includes ConditionExpression, ReturnValues (ALL_OLD); records AWS/DynamoDB CloudWatch metrics SuccessfulRequestLatency, ConsumedWriteCapacityUnits, UserErrors/SystemErrors (service-metrics-platform.md phase 2) | docs |
GetItem | ✅ Supported | Includes ProjectionExpression; records SuccessfulRequestLatency, ConsumedReadCapacityUnits, UserErrors/SystemErrors | docs |
UpdateItem | ✅ Supported | SET/REMOVE/ADD/DELETE clauses; all ReturnValues variants; upsert; records SuccessfulRequestLatency, ConsumedWriteCapacityUnits, UserErrors/SystemErrors | docs |
DeleteItem | ✅ Supported | ConditionExpression, ReturnValues (ALL_OLD); records SuccessfulRequestLatency, ConsumedWriteCapacityUnits, UserErrors/SystemErrors | docs |
BatchGetItem | ✅ Supported | Up to 100 items across tables; records SuccessfulRequestLatency/ConsumedReadCapacityUnits per table touched | docs |
BatchWriteItem | ✅ Supported | Up to 25 put/delete operations; records SuccessfulRequestLatency/ConsumedWriteCapacityUnits per table touched | docs |
Query & scan
| Operation | Status | Notes | AWS Docs |
|---|---|---|---|
Query | ✅ Supported | KeyConditionExpression, FilterExpression, Limit (applied before FilterExpression per AWS semantics), ExclusiveStartKey/LastEvaluatedKey pagination, ScanIndexForward, Select=COUNT; ConsistentRead=true on a GSI is rejected as AWS does; records SuccessfulRequestLatency and ConsumedReadCapacityUnits (with GlobalSecondaryIndexName when IndexName names a real GSI) | docs |
Scan | ✅ Supported | FilterExpression, Limit (applied before FilterExpression per AWS semantics), ExclusiveStartKey/LastEvaluatedKey pagination, parallel scan (Segment/TotalSegments), Select=COUNT; ConsistentRead=true on a GSI is rejected as AWS does; records SuccessfulRequestLatency and ConsumedReadCapacityUnits (with GlobalSecondaryIndexName when IndexName names a real GSI) | docs |
Transactions
| Operation | Status | Notes | AWS Docs |
|---|---|---|---|
TransactGetItems | ✅ Supported | Up to 100 items across tables; records SuccessfulRequestLatency/ConsumedReadCapacityUnits per table (2x weighted, matching AWS’s transactional-read capacity accounting) | docs |
TransactWriteItems | ✅ Supported | Put, Update, Delete, ConditionCheck; all-or-nothing; records SuccessfulRequestLatency/ConsumedWriteCapacityUnits per table (2x weighted, matching AWS’s transactional-write capacity accounting) | docs |
Tags
| Operation | Status | Notes | AWS Docs |
|---|---|---|---|
TagResource | ✅ Supported | Merges tags; max 50; validates key/value lengths | docs |
ListTagsOfResource | ✅ Supported | Returns tags as Key/Value array | docs |
UntagResource | ✅ Supported | Removes specified keys; idempotent on missing keys | docs |
Streams interoperability
| Operation | Status | Notes | AWS Docs |
|---|---|---|---|
GetShardIterator | ✅ Supported | TRIM_HORIZON, LATEST, AT/AFTER_SEQUENCE_NUMBER | docs |
Global tables
| Operation | Status | Notes | AWS Docs |
|---|---|---|---|
CreateGlobalTable | ❌ Unsupported | Overcast emulates a single region | docs |
DescribeGlobalTable | ❌ Unsupported | Overcast emulates a single region | docs |
DescribeGlobalTableSettings | ❌ Unsupported | Overcast emulates a single region | docs |
ListGlobalTables | ❌ Unsupported | Overcast emulates a single region | docs |
UpdateGlobalTable | ❌ Unsupported | Overcast emulates a single region | docs |
UpdateGlobalTableSettings | ❌ Unsupported | Overcast emulates a single region | docs |