diff --git a/doc/api/errors.md b/doc/api/errors.md
index 946b86b6615bfd..738abdb3597550 100644
--- a/doc/api/errors.md
+++ b/doc/api/errors.md
@@ -1340,6 +1340,14 @@ strict compliance with the API specification (which in some cases may accept
`func(undefined)` and `func()` are treated identically, and the
[`ERR_INVALID_ARG_TYPE`][] error code may be used instead.
+
+### ERR_MISSING_DYNAMIC_INSTANTIATE_HOOK
+
+> Stability: 1 - Experimental
+
+An [ES6 module][] loader hook specified `format: 'dynamic'` but did not provide
+a `dynamicInstantiate` hook.
+
### ERR_MISSING_MESSAGE_PORT_IN_TRANSFER_LIST
diff --git a/lib/internal/errors.js b/lib/internal/errors.js
index ae99fe9fdffef0..c3f1c374011b05 100644
--- a/lib/internal/errors.js
+++ b/lib/internal/errors.js
@@ -747,6 +747,9 @@ E('ERR_MISSING_ARGS',
}
return `${msg} must be specified`;
}, TypeError);
+E('ERR_MISSING_DYNAMIC_INSTANTIATE_HOOK',
+ 'The ES Module loader may not return a format of \'dynamic\' when no ' +
+ 'dynamicInstantiate function was provided', Error);
E('ERR_MISSING_MODULE', 'Cannot find module %s', Error);
E('ERR_MODULE_RESOLUTION_LEGACY',
'%s not found by import in %s.' +
diff --git a/lib/internal/modules/esm/loader.js b/lib/internal/modules/esm/loader.js
index 2fa10c7eab9b44..89f40939e7a4f3 100644
--- a/lib/internal/modules/esm/loader.js
+++ b/lib/internal/modules/esm/loader.js
@@ -5,7 +5,7 @@ const {
ERR_INVALID_RETURN_PROPERTY,
ERR_INVALID_RETURN_PROPERTY_VALUE,
ERR_INVALID_RETURN_VALUE,
- ERR_MISSING_DYNAMIC_INTSTANTIATE_HOOK,
+ ERR_MISSING_DYNAMIC_INSTANTIATE_HOOK,
ERR_UNKNOWN_MODULE_FORMAT
} = require('internal/errors').codes;
const { URL } = require('url');
@@ -118,7 +118,7 @@ class Loader {
let loaderInstance;
if (format === 'dynamic') {
if (typeof this._dynamicInstantiate !== 'function')
- throw new ERR_MISSING_DYNAMIC_INTSTANTIATE_HOOK();
+ throw new ERR_MISSING_DYNAMIC_INSTANTIATE_HOOK();
loaderInstance = async (url) => {
debug(`Translating dynamic ${url}`);