All integrations

Wit.ai

AI · AI

Intents, entities, and traits extracted from text, and the Wit app behind them.

Acts as the person, not as itself

Each user connects their own account. Every call carries both identities — the agent and the person it is acting for — so the agent can never reach past what that individual can already do.

Credentials never touch the agent

Tokens live in the vault and attach server-side at call time. The agent holds a session, not a secret, and revoking access does not mean rotating a key.

Every call on the record

Who asked, which agent acted, which action ran, and the verdict that let it through — one audit trail across every integration, not one per vendor.

What an agent can do

Each action is granted on its own. An agent allowed to read is not thereby allowed to write, and the scope beside each row is what the acting user must have connected for it to run at all.

witai_delete_apps_by_app_idWRITE

Delete an app. DELETE /apps/{app_id}. PERMANENTLY delete a Wit app with its intents, entities, traits and training data. Works only on the app this connection's token was minted in -- any other app answers 400 `Access token does not match` (measured 2026-09-16). Deleting that app also kills the credential this connection runs on.

api
witai_delete_apps_by_app_id_tags_by_tag_nameWRITE

Delete an app version. DELETE /apps/{app_id}/tags/{tag_name}. Remove a saved version tag. The app's live state is untouched.

api
witai_delete_entities_by_entity_nameWRITE

Delete an entity. DELETE /entities/{entity_name}. Remove an entity, its roles, keywords and synonyms from the app.

api
witai_delete_entities_by_entity_name_by_role_nameWRITE

Delete an entity role. DELETE /entities/{entity_name}:{role_name}. Remove one ROLE from an entity. The colon in the path is wit.ai's own spelling, not a defect: pywit's `delete_role` builds exactly `/entities/<entity>:<role>`, and measured 2026-09-16 it answered 200 `{"deleted":"<entity>:<role>"}`. Deleting an entity's LAST role deletes the entity with it.

api
witai_delete_entities_by_entity_name_keywords_by_keyword_nameWRITE

Delete a keyword from an entity. DELETE /entities/{entity_name}/keywords/{keyword_name}. Remove one keyword and all of its synonyms.

api
witai_delete_entities_by_entity_name_keywords_by_keyword_name_synonyms_by_synonym_nameWRITE

Delete a synonym from a keyword. DELETE /entities/{entity_name}/keywords/{keyword_name}/synonyms/{synonym_name}. Remove one spelling from a keyword, leaving the keyword itself.

api
witai_delete_intents_by_intent_nameWRITE

Delete an intent. DELETE /intents/{intent_name}. Remove an intent from the app. Utterances trained on it lose their label; the app retrains.

api
witai_delete_utterancesWRITE

Delete training utterances. DELETE /utterances. Remove sentences from the app's training set. The body is a JSON ARRAY of `{text}` objects -- the utterances are named in the BODY, not the path.

api
witai_get_appsREAD

List apps. GET /apps. Every Wit app on the account this token's app belongs to. `limit` is REQUIRED -- measured 2026-09-16, omitting it answers 400 `{"code":"bad-request","error":"Invalid limit"}`, which is a 400 that is NOT an auth failure. Only the entry with `is_app_for_token: true` can be written to by this connection.

api
witai_get_apps_by_app_idREAD

Get an app. GET /apps/{app_id}. One app's settings and training status.

api
witai_get_apps_by_app_id_tagsREAD

List app versions. GET /apps/{app_id}/tags. The app's saved version tags. Measured 2026-09-16: wit.ai answers an array of ARRAYS -- one inner array per version lineage.

api
witai_get_apps_by_app_id_tags_by_tag_nameREAD

Get an app version. GET /apps/{app_id}/tags/{tag_name}. One saved version tag. The path segment is the tag's NAME: measured 2026-09-16 the tag object carries `name` and no id at all, and GET, PUT and DELETE all resolve the same name. pywit spells this parameter `tag_id` here and `tag_name` on the PUT and DELETE; this build uses `tag_name` throughout.

api
witai_get_entitiesREAD

List entities. GET /entities. Every entity in the app, including the Wit built-ins it uses, as `{id, name}`.

api
witai_get_entities_by_entity_nameREAD

Get an entity. GET /entities/{entity_name}. One entity with its roles, lookup strategies and keyword list.

api
witai_get_exportREAD

Export the app. GET /export. Ask wit.ai for a download link to a ZIP of the app's whole definition. The BYTES are not fetched: the result is wit.ai's own `uri`, a short-lived PRE-SIGNED link on Meta's CDN that needs no credential and expires -- treat it as sensitive and fetch it promptly.

api
witai_get_intentsREAD

List intents. GET /intents. Every intent in the app, as `{id, name}`. Also the connection's health probe.

api
witai_get_intents_by_intent_nameREAD

Get an intent. GET /intents/{intent_name}. One intent and the entities associated with it.

api
witai_get_languageREAD

Detect the language of a sentence. GET /language. Return the locales wit.ai believes a sentence is written in, with a confidence for each. Independent of the app's training.

api
witai_get_messageREAD

Extract meaning from a sentence. GET /message. Run the app's trained model over one sentence and return the intents, entities and traits it detects. This is the app's main inference call and the only text one; the audio siblings (/speech, /dictation, /converse) are not available as tools.

api
witai_get_traitsREAD

List traits. GET /traits. Every trait in the app, as `{id, name}`.

api
witai_get_traits_by_trait_nameREAD

Get a trait. GET /traits/{trait_name}. One trait with its possible values.

api
witai_get_utterancesREAD

List training utterances. GET /utterances. The app's training set, with each sentence's intent, entity spans and traits. `limit` is REQUIRED.

api
witai_post_appsWRITE

Create an app. POST /apps. Create a new Wit app on this account and return its id. WIT.AI ALSO RETURNS THE NEW APP'S SERVER ACCESS TOKEN, and this connector REMOVES it before the result is returned -- a live credential in a tool result would reach every transcript and log downstream. Copy the new app's token from its Settings page in the Wit.ai console when you connect it.

api
witai_post_apps_by_app_id_tagsWRITE

Save an app version. POST /apps/{app_id}/tags. Freeze the app's current state under a version tag, which GET /message can then run with its `tag` parameter. Measured 2026-09-16: while the app is training this answers 400 `Please save a version after training is done` -- wait for GET /apps/{app_id} to report `training_status: done`.

api
witai_post_entitiesWRITE

Create an entity. POST /entities. Add an entity to the app. Wit.ai names are lowercase, and a name a Wit built-in already uses is prefixed `wit$` (for example `wit$location`).

api
witai_post_entities_by_entity_name_keywordsWRITE

Add a keyword to an entity. POST /entities/{entity_name}/keywords. Append one keyword, with its synonyms, to a keyword-lookup entity.

api
witai_post_entities_by_entity_name_keywords_by_keyword_name_synonymsWRITE

Add a synonym to a keyword. POST /entities/{entity_name}/keywords/{keyword_name}/synonyms. Append one more spelling that resolves to an existing keyword.

api
witai_post_eventWRITE

Send a Composer event. POST /event. Advance a Wit Composer flow by one turn: the session is named in the query string and the caller's message in the body. MEASURED 2026-09-16 -- against an app with NO Composer flow configured, wit.ai answers HTTP 500 `{"code":"wit"}` to node-wit's own body shape, so this tool is only usable on an app whose Composer flow has been built in the Wit.ai console.

api
witai_post_intentsWRITE

Create an intent. POST /intents. Add an intent to the app. Wit.ai names are lowercase, and a name a Wit built-in already uses is prefixed `wit$` (for example `wit$location`).

api
witai_post_traitsWRITE

Create a trait. POST /traits. Add a trait and its values to the app. Wit.ai names are lowercase, and a name a Wit built-in already uses is prefixed `wit$` (for example `wit$location`).

api
witai_post_traits_by_trait_name_valuesWRITE

Add a value to a trait. POST /traits/{trait_name}/values. Append one more possible value to an existing trait.

api
witai_post_utterancesWRITE

Train on utterances. POST /utterances. Add annotated sentences to the app's training set and schedule a retrain. The body is a JSON ARRAY. Every intent, entity and trait named in it must already exist.

api
witai_put_apps_by_app_idWRITE

Update an app. PUT /apps/{app_id}. Change an app's name, language, privacy or timezone. Only fields you send are changed. Works only on the app this connection's token was minted in -- any other app answers 400 `Access token does not match`.

api
witai_put_apps_by_app_id_tags_by_tag_nameWRITE

Update an app version. PUT /apps/{app_id}/tags/{tag_name}. Rename a version tag, change its description, or move it onto another version.

api
witai_put_entities_by_entity_nameWRITE

Update an entity. PUT /entities/{entity_name}. REPLACE an entity's definition. The body is the whole new entity, not a patch: a field left out is cleared, and `name` renames it. Measured 2026-09-16 -- sending one role replaced the entity's role list entirely.

api

Put Wit.ai behind one governed endpoint.

Same permissions, same audit trail, whatever else you connect next.