diff --git a/doc/api/errors.md b/doc/api/errors.md
index c0773caf7c9bbc..222bbd810c90e6 100644
--- a/doc/api/errors.md
+++ b/doc/api/errors.md
@@ -1312,6 +1312,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 51bf07adf3d91b..14f4c3eb72a6d1 100644
--- a/lib/internal/errors.js
+++ b/lib/internal/errors.js
@@ -725,6 +725,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');
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 b3023fcd4f8e36..41de3f48740dcb 100644
--- a/lib/internal/modules/esm/loader.js
+++ b/lib/internal/modules/esm/loader.js
@@ -93,7 +93,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}`);