GitHub Actions "Unexpected input(s), valid inputs are ..." (action input typo)
Actions validate the keys in with: against their declared inputs. Passing an undeclared key (a typo or a removed input) triggers a warning listing the valid inputs.
What this error means
A step warns "Unexpected input(s) '<key>', valid inputs are [...]" and the intended option silently has no effect because the action never received it.
Warning: Unexpected input(s) 'node_versions', valid inputs are ['always-auth', 'node-version', 'cache']Diagnose it: print the context before you change anything
Most workflow-expression bugs are not syntax errors, they are an expression reading something that is empty. GitHub resolves a missing property to an empty string instead of failing the run, so a wrong reference looks like a logic bug rather than a mistake. Dump the contexts first and you will usually see the answer immediately.
- name: Dump contexts
run: |
echo '--- github ---' ; echo '${{ toJSON(github) }}'
echo '--- needs ---' ; echo '${{ toJSON(needs) }}'
echo '--- steps ---' ; echo '${{ toJSON(steps) }}'
echo '--- matrix ---' ; echo '${{ toJSON(matrix) }}'
echo '--- inputs ---' ; echo '${{ toJSON(inputs) }}'Check the context is allowed where you used it
Contexts are not available everywhere. The same expression can be valid in a step if and invalid in a job if, which is why an expression that works in one workflow fails when moved.
| Where you wrote it | Contexts available there |
|---|---|
run-name | github, inputs, vars |
concurrency | github, inputs, vars |
Top-level env | github, secrets, inputs, vars |
jobs.<id>.if | github, needs, vars, inputs |
jobs.<id>.steps.if | github, needs, strategy, matrix, job, runner, env, vars, steps, inputs |
jobs.<id>.outputs | Full access, including secrets |
Reusable workflow outputs | github, jobs, vars, inputs |
Common causes
Misspelled input name
The with: key does not match a declared input (node_versions vs node-version), so it is ignored.
Input from a different action version
The key existed in another version of the action but not the one referenced.
How to fix it
Match keys to the action's declared inputs
- Read the listed valid inputs in the warning.
- Correct the spelling/casing of the with: key.
- Confirm the input exists in the pinned action version.
- uses: actions/setup-node@v4
with:
node-version: 20
cache: npmCatch it before it reaches CI
Every failure in this cluster is statically detectable. actionlint parses workflow expressions, checks context availability against the same rules above, and validates needs references, so these bugs never need to cost you a run.
# one-off
docker run --rm -v "$(pwd):/repo" --workdir /repo rhysd/actionlint:latest -color
# as a job, before anything expensive runs
- uses: actions/checkout@v4
- run: |
bash <(curl -s https://raw.githubusercontent.com/rhysd/actionlint/main/scripts/download-actionlint.bash)
./actionlint -colorHow to prevent it
- Copy input names exactly from the action's documentation.
- Treat unexpected-input warnings as errors in review.
- Re-check inputs after bumping an action version.