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.