typeform
typeform.
Typeform workspaces the token can access (read only), across
setup & usage
in Typeform: Account → Personal tokens → Generate a new token, then paste it into oto (format tfp_…). The token carries its scopes, and each call needs its own:
us) unless the account stores its responses in the EU — then eu (api.eu.typeform.com) or eu2 (api.typeform.eu, the newer EU data center, whose tokens are distinct). Ask the account owner if unsureGET /forms?page_size=1): it checks the token and its forms:read scope, nothing is writtentypeform_forms(op="list"), or typeform_forms(op="list", search="NPS"); by workspace → typeform_workspaces() then typeform_forms(op="list", workspace_id="…")typeform_forms(op="get", form_id="…"): each question with its id, ref, type, title and choicestypeform_responses(form_id="…") — 25 newest, each as {question title: value}typeform_responses(form_id="…", since="2026-09-28T00:00:00")before=<next_before> until next_before is gone; total_items says how many there aretypeform_responses(form_id="…", response_type=["partial"])typeform_responses(form_id="…", query="Lyon")typeform_responses_summary(form_id="…"): answer rate per question, choice counts, numeric stats, NPS, responses per day — computed by oto, no text answer read. truncated: true = the oldest responses were not counted (raise max_pages or narrow since)typeform_forms(op="create", definition={"title": "…", "fields": [{"title": "…", "type": "nps"}], "settings": {"is_public": false}}). ⚠️ without `settings.is_public: false` the form is public at once: anyone with its link can answertypeform_forms(op="update", form_id="…", operations=[{"op": "replace", "path": "/settings/is_public", "value": true}]) (false to unpublish); /title, /theme, /workspace work the same way, fields untouchedtypeform_forms(op="get", form_id="…", full=True), edit the definition, then typeform_forms(op="replace", form_id="…", definition=…). ⚠️ a field left out is deleted with its answers: keep each field's idtypeform_forms(op="delete", form_id="…") — the form and all its responsestypeform_delete_responses(form_id="…", response_ids=["…"]) (1 to 1000). The deletion is asynchronous; ids that match nothing are ignored by Typeform — the preview says which ones existtypeform_webhooks(form_id="…", op="upsert", tag="crm", url="https://…", enabled=true, event_types=["form_response"], secret="…"). Every new response, with all its answers, is POSTed theretypeform_webhooks(form_id="…"); pause one with op="upsert" and enabled=false, remove it with op="delete"typeform_forms op replace and delete, typeform_delete_responses, typeform_webhooks op upsert and delete first return a preview (dry_run: true) read from Typeform — the fields that would disappear, the responses at stake, the ids that exist, the webhook before and after — and write nothing. The same call with confirm=True writes. Show the preview to the person before confirming.
typeform_responses, typeform_responses_summary and typeform_delete_responses read the form first and refuse when its responses live on another host, naming the setting to change. With titles=False, typeform_responses skips that checkcompleted (default) filters on submission time, partial on the last save, started on landingtitle [field id], never mergedfile_url): it points to Typeform and needs the token to download — not served herefull=True. upsert replaces the webhook whole: pass the secret again, or it may be droppedfull=True returns Typeform's raw payload (metadata, tokens, field types) when the readable view is not enoughserved: workspaces (read), forms (read, create, edit, publish, replace, delete), responses (read, statistics, delete), webhooks (read, create, replace, delete). Not served: themes, images, workspace management, translations, file downloads.
this connector accepts multiple comptes: each stored credential becomes a named account (one name per compte), at your level, your team's or your org's.
_account="<name>" on the tool; list them: oto_identity(op='list', connector='typeform') (scope='org' or scope='group' for the org's or team's)oto_identity(op='set', connector='typeform', identity_id='<name>'); rename: op='rename' with new_name_account) and adding upoutils
utilisation
claude plugin marketplace add otomata-tech/oto-plugin — mcp + skill configurés.pipx install oto-cli puis oto typeform …