Errors & fixes

Tableau Extensions API error codes

Every error code the Tableau Extensions API can throw, when it fires, and how to fix it.

Eric SummersUpdated 2026-09-18markdown

When the Extensions API rejects a call, it throws an error carrying one of these codes. Reading the code tells you exactly what went wrong. These are transcribed from the vendored API library, with the trigger and fix for each.

Error codes

Code String value When it fires Fix
APINotInitialized api-not-initialized You called an Extensions API method before initializeAsync resolved. Await tableau.extensions.initializeAsync() before any other API call.
DialogAlreadyOpen dialog-already-open You called displayDialogAsync while a dialog is already open. Track dialog state and open at most one at a time.
DialogClosedByUser dialog-closed-by-user The user closed the configure dialog without saving. This is normal, not a bug. Catch it and treat it as a cancel, not an error.
INITIALIZATION_ERROR initialization-error initializeAsync itself failed, often because the manifest points at a URL that never loads the API library. Confirm the extension page loads lib/tableau.extensions.1.latest.js and that the source URL is reachable.
INTERNAL_ERROR internal-error The all-caps alias of InternalError from older builds. Treat as InternalError: retry and simplify.
InternalError internal-error Tableau hit an unexpected internal state. Retry; if it persists, simplify the call that triggered it and file a repro.
InvalidDomainDialog invalid-dialog-domain The dialog URL is not on the same domain as the extension. Serve the dialog from the extension origin.
InvalidParameter invalid-parameter An argument was the wrong type or shape. Check the argument against the API signature.
MISSING_ENUM_MAPPING missing-enum-mapping The API received a value it could not map to a known enum member. Pass a valid enum member (see the enums reference).
MISSING_PARAMETER missing-parameter A required argument was omitted (all-caps alias). Pass the required argument.
MissingFilter missing-filter You referenced a filter that does not exist on the worksheet. List filters first and match the field name exactly.
MissingParameter missing-parameter A required argument was omitted. Pass the required argument.
PERMISSION_DENIED permission-denied The extension lacks the permission for what it tried (often full data access). Declare the needed permission in the manifest and have the user approve it.
PRES_MODEL_PARSING_ERROR pres-model-parsing-error Tableau could not parse the presentation model, often after a malformed settings blob. Clear or fix the extension settings; avoid storing invalid JSON.
ServerError server-error Tableau Server or Cloud returned an error for a data request. Check the data source is reachable and the extension has data permissions.
SettingSaveInProgress setting-save-in-progress You called settings.saveAsync while a previous save is still running. Await the previous saveAsync before the next.
UNKNOWN_VERB_ID unknown-verb-id An internal command id was not recognized, usually a version mismatch. Update to a current API library version.
UnsupportedEventName unsupported-event-name You subscribed to an event name the API does not know. Use an event from the TableauEventType enum.
UnsupportedMethodForDataSourceType unsupported-method-for-data-source-type The method does not apply to this data source type. Guard the call by data source type.
VERSION_NOT_CONFIGURED version-not-configured The API version could not be negotiated with the host. Ensure the manifest min-api-version is set and the API library loaded.
VISIBILITY_ERROR visibility-error The all-caps alias of VisibilityError. Treat as VisibilityError.
VisibilityError visibility-error A visibility operation was invalid, e.g. a zone that is not togglable. Check the object supports visibility changes before toggling.

FAQ

My extension throws APINotInitialized. Why?

You called an API method before initializeAsync resolved. Await it first.

Is DialogClosedByUser a bug?

No. It fires when someone closes the configure dialog without saving. Catch it and treat it as a cancel.