About Typeform
Typeform is a conversational form and survey platform with a REST API that covers form design, response collection, theming, and webhook delivery. Connecting Typeform to Serval enables workflows that read and create forms, pull form responses into your CRM or warehouse, manage themes and images, and register webhooks that fire on every new submission.What the Typeform integration enables
| Capability | Description | Typeform scope required |
|---|---|---|
| Account info | Read the connected user’s email, language, and account ID | accounts:read |
| Form management | List, create, update, and delete forms; perform JSON Patch updates on existing forms | forms:read, forms:write |
| Response collection | Pull paginated responses for a form, filter by date range or token, delete specific responses | responses:read, responses:write |
| Webhooks | List, create, update, and delete webhooks per form, addressed by tag | webhooks:read, webhooks:write |
| Workspaces | List, create, update, and delete workspaces, including searching by name | workspaces:read, workspaces:write |
| Themes | List, create, update, and delete themes used across forms | themes:read, themes:write |
| Images | List, upload, and delete images stored in the account for use across forms | images:read, images:write |
Prerequisites
- A Typeform account with permission to register apps in the Typeform Developer Apps panel.
Serval uses the “bring your own app” model for Typeform. Each team that connects Typeform registers their own Typeform app as part of the connection flow below, which means you control the app’s scopes, audit logs, and rate-limit budget. Serval does not share a global Typeform app across customers.
Connect Typeform to Serval
The Typeform app registration form requires the Redirect URI up front — you cannot save the app and add it later. Because of that, the connection flow interleaves between Serval and Typeform: start the connection in Serval to reveal the Redirect URI, register your Typeform app with that URI, then come back to Serval with the resulting Client ID and Client Secret to finish. Have both browser tabs open before you start. The full sequence:Start the connection in Serval to reveal the Redirect URI
In Serval, navigate to Apps → Available → Typeform and click Connect. The Connect Typeform modal opens with a Redirect URI at the top (environment-specific, something like
https://svflow-auth-config.api.serval.com/typeform/oauth/callback).Click Copy to grab the URI. Leave this modal open — you’ll come back to it once you have your Typeform credentials.Register a Typeform app with the Redirect URI
In a new tab, log in at Typeform and click the icon drop-down menu next to your organization name in the upper-left corner. Under the Organization section, click Developer Apps, then click Register a new app.Fill in the form:
- App name — for example,
Serval Integration. - App website — your company website. This is metadata Typeform shows on the consent screen and does not affect the OAuth flow.
- Redirect URI(s) — paste the URI you copied from the Serval Connect modal. This field is required at registration.
- Developer email — your email; Typeform contacts you here about the app.
Approve the OAuth 2.0 scopes on the new app
Still in the Typeform Developer Apps panel, open the app you just registered and approve every scope Serval requests:Copy the Client ID from the same panel — you’ll paste it into Serval next, alongside the Client Secret you copied at registration time.
accounts:readforms:readforms:writeimages:readimages:writethemes:readthemes:writeworkspaces:readworkspaces:writeresponses:readresponses:writewebhooks:readwebhooks:writeoffline
The
offline scope is required for Serval to refresh access tokens automatically. Without it, Typeform issues access tokens that expire after one week and the connection would need to be reauthorized every week. With offline, Typeform issues a refresh token alongside the access token and Serval uses it transparently.Finish the connection in Serval
Switch back to the Serval Connect Typeform modal you left open in step 1 and:
- Paste the Client ID from the Typeform Developer Apps panel.
- Paste the Client Secret you copied when you registered the app.
- Click Connect to Typeform.
The integration is keyed on the Typeform
user_id of the account that authorized the app. Reconnecting the same Typeform account later — for example, after rotating the Client Secret or expanding scopes — updates the existing Serval connection in place, preserving any workflows already wired to it. Reconnecting with a different Typeform account creates a new, separate connection.Updating scopes
If you approve a new OAuth scope on your Typeform app after you’ve already connected Serval, the existing connection keeps using the scopes it was originally granted. To pick up new scopes:- In the Typeform Developer Apps panel, confirm the new scope is approved on your app.
- In Serval, open the connected Typeform integration and click Reconnect.
- Typeform will show the consent screen again with the expanded scope list — approve it to refresh the grant.
Troubleshooting
'Typeform rejected the client credentials' or 'invalid_client' at the end of the OAuth flow
'Typeform rejected the client credentials' or 'invalid_client' at the end of the OAuth flow
This almost always means the Client Secret Serval has does not match the one Typeform has on file. The most common causes:
- Someone clicked Regenerate client secret in the Edit app panel after the old one was pasted into Serval. Typeform invalidates the previous secret immediately.
- The secret was copied with a leading or trailing character — Typeform shows the secret only once, so a typo can slip through unnoticed.
- The Client ID and Client Secret pasted into Serval belong to different Typeform apps.
The OAuth flow fails with 'invalid_scope'
The OAuth flow fails with 'invalid_scope'
Typeform rejects the authorize step if any scope Serval requests is not approved on your Typeform app. Open the app in the Developer Apps panel, confirm every scope listed in the Approve the OAuth 2.0 scopes step above is enabled, save your changes, and try connecting again.
The connection works initially but breaks after about a week
The connection works initially but breaks after about a week
This indicates the
offline scope was not granted, so Typeform did not issue a refresh token alongside the access token. Typeform access tokens expire after one week by default — without a refresh token, the connection cannot recover automatically.To fix: confirm the offline scope is approved on your Typeform app, then reconnect in Serval. The new authorize step will include offline in the requested scopes and Typeform will issue a refresh token.An API call returns HTTP 403 even though the connection is healthy
An API call returns HTTP 403 even though the connection is healthy
Each Typeform endpoint requires a specific scope (see the table at the top of this page). A 403 on a particular endpoint means the connection’s granted scopes do not include the one that endpoint needs. Approve the missing scope on your Typeform app and reconnect in Serval to refresh the grant.

