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_idWRITEDelete 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.
witai_delete_apps_by_app_id_tags_by_tag_nameWRITEDelete an app version. DELETE /apps/{app_id}/tags/{tag_name}. Remove a saved version tag. The app's live state is untouched.
witai_delete_entities_by_entity_nameWRITEDelete an entity. DELETE /entities/{entity_name}. Remove an entity, its roles, keywords and synonyms from the app.
witai_delete_entities_by_entity_name_by_role_nameWRITEDelete 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.
witai_delete_entities_by_entity_name_keywords_by_keyword_nameWRITEDelete a keyword from an entity. DELETE /entities/{entity_name}/keywords/{keyword_name}. Remove one keyword and all of its synonyms.
witai_delete_entities_by_entity_name_keywords_by_keyword_name_synonyms_by_synonym_nameWRITEDelete 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.
witai_delete_intents_by_intent_nameWRITEDelete an intent. DELETE /intents/{intent_name}. Remove an intent from the app. Utterances trained on it lose their label; the app retrains.
witai_delete_utterancesWRITEDelete 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.
witai_get_appsREADList 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.
witai_get_apps_by_app_idREADGet an app. GET /apps/{app_id}. One app's settings and training status.
witai_get_apps_by_app_id_tagsREADList 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.
witai_get_apps_by_app_id_tags_by_tag_nameREADGet 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.
witai_get_entitiesREADList entities. GET /entities. Every entity in the app, including the Wit built-ins it uses, as `{id, name}`.
witai_get_entities_by_entity_nameREADGet an entity. GET /entities/{entity_name}. One entity with its roles, lookup strategies and keyword list.
witai_get_exportREADExport 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.
witai_get_intentsREADList intents. GET /intents. Every intent in the app, as `{id, name}`. Also the connection's health probe.
witai_get_intents_by_intent_nameREADGet an intent. GET /intents/{intent_name}. One intent and the entities associated with it.
witai_get_languageREADDetect 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.
witai_get_messageREADExtract 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.
witai_get_traitsREADList traits. GET /traits. Every trait in the app, as `{id, name}`.
witai_get_traits_by_trait_nameREADGet a trait. GET /traits/{trait_name}. One trait with its possible values.
witai_get_utterancesREADList training utterances. GET /utterances. The app's training set, with each sentence's intent, entity spans and traits. `limit` is REQUIRED.
witai_post_appsWRITECreate 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.
witai_post_apps_by_app_id_tagsWRITESave 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`.
witai_post_entitiesWRITECreate 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`).
witai_post_entities_by_entity_name_keywordsWRITEAdd a keyword to an entity. POST /entities/{entity_name}/keywords. Append one keyword, with its synonyms, to a keyword-lookup entity.
witai_post_entities_by_entity_name_keywords_by_keyword_name_synonymsWRITEAdd a synonym to a keyword. POST /entities/{entity_name}/keywords/{keyword_name}/synonyms. Append one more spelling that resolves to an existing keyword.
witai_post_eventWRITESend 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.
witai_post_intentsWRITECreate 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`).
witai_post_traitsWRITECreate 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`).
witai_post_traits_by_trait_name_valuesWRITEAdd a value to a trait. POST /traits/{trait_name}/values. Append one more possible value to an existing trait.
witai_post_utterancesWRITETrain 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.
witai_put_apps_by_app_idWRITEUpdate 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`.
witai_put_apps_by_app_id_tags_by_tag_nameWRITEUpdate an app version. PUT /apps/{app_id}/tags/{tag_name}. Rename a version tag, change its description, or move it onto another version.
witai_put_entities_by_entity_nameWRITEUpdate 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.
Often connected alongside
Put Wit.ai behind one governed endpoint.
Same permissions, same audit trail, whatever else you connect next.