Value provided in ExpressionAttributeValues unused in expressions

TL;DR — You supplied a value placeholder in ExpressionAttributeValues (e.g. :status) that no expression references. DynamoDB requires every declared :value to be used in a KeyConditionExpression, FilterExpression, UpdateExpression, or ConditionExpression. Remove the orphan value — or fix the expression that was meant to use it.

What it means

ValidationException: 1 validation error detected: Value provided in ExpressionAttributeValues unused in
expressions: keys: {:status}

# what the engine actually returns, reproduced against DynamoDB Local:
ValidationException: 1 validation error detected: Value provided in ExpressionAttributeValues unused in expressions: keys: {:status}

ExpressionAttributeValues is the substitution map for the literal values your expressions compare against (:status, :min, …). DynamoDB enforces a two-way contract: every :placeholder used in an expression must be declared, and every declared placeholder must be used. A leftover value that no expression references triggers this HTTP 400 ValidationException — client-side and not retryable until the maps match.

Why it happens

  • A stale value after editing the expression — you dropped #s = :status from the expression but left :status in the values map.
  • Copy-paste drift — reusing a values map from a previous request that had more conditions than the current one.
  • A generated request that over-declares — a builder added :v for a filter clause that was later removed.
  • A name-vs-value mix-up — you meant #status (a name alias) but declared :status (a value).
  • A typo — the expression uses :stat while the map declares :status.

How to fix it

  1. Delete the unused value the message names from ExpressionAttributeValues.
  2. Keep values in lock-step with the expression — declare a :placeholder only when an expression references it.
  3. Confirm names vs values: placeholders go in ExpressionAttributeValues; # aliases go in ExpressionAttributeNames.
  4. Build the expression and its maps together so no value is left dangling.
  5. Search the expression string for every :key in your map. A single-character typo (:stat vs :status) leaves the declared value unused.

Query it in DynoTable

DynoTable generates ExpressionAttributeValues from the filter rows you configure — every :placeholder in the output is referenced in the expression string. Open a table with ⌘K, add filters in the query panel, and copy the emitted maps into your SDK call to eliminate orphan values.

When debugging a failing request, paste the expression into the Expression Builder and compare its value map to yours. Profile switching (⌘P) and Test Connection on Settings → Profiles confirm you are testing against the same table. See Connect to AWS and Install.

Sources

References

Last verified 2026-07-13 against the official AWS documentation linked above.

Work with DynamoDB without the Console

A fast DynamoDB desktop client that runs the real SQL DynamoDB can’t — JOINs, GROUP BY, aggregates — with visual editing and an AI agent on your own Bedrock keys.

Free 30-day trial, no credit card — then the Free plan with no time limit.