The Google Forms connector lets your AI agent act in each user's Google Forms account. Each user signs in to Google Forms once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 10 tools.
- Tools
- 10
- What they doRead · write · destructive
- 4 · 5 · 14 read5 write1 destructive
- Users sign in with
- OAuth
- OAuth app
- Your own Google app
What you can do
- Create and edit forms: create new forms and add, edit, move, or delete questions and other items
- Read form responses: list all submitted responses or fetch a single respondent’s answers
- Inspect form structure: get a form’s title, description, and full list of questions
- Control publishing: publish or unpublish a form and open or close it to new responses
- Watch for changes: create, renew, list, and delete notifications for new responses or form edits
Setup
Install the SDK
Terminal window npm install @scalekit-sdk/node dotenvTerminal window pip install scalekit-sdk-python python-dotenvSet your credentials
Add your Scalekit credentials to your
.envfile. Find values in app.scalekit.com > Developers > API Credentials..env SCALEKIT_ENVIRONMENT_URL=<your-environment-url>SCALEKIT_CLIENT_ID=<your-client-id>SCALEKIT_CLIENT_SECRET=<your-client-secret>Create the Google Forms connection
In AgentKit > Connections, create a Google Forms connection and copy its redirect URI. The name you give it is the
connection_nameyour code passes. See Configure connections.Register a Google OAuth app
Google Forms connections use your own OAuth app. Register one with Google and add the redirect URI you copied.
Then enter the app's Client ID and Client Secret on the Google Forms connection.
Console steps with screenshots
Register your Scalekit environment with the Google Forms connector so Scalekit handles the authentication flow and token lifecycle for you. The connection name you create will be used to identify and invoke the connection programmatically. Then complete the configuration in your application as follows:
-
Set up auth redirects
-
In Scalekit dashboard, go to AgentKit > Connections > Create Connection. Find Google Forms and click Create. Click Use your own credentials and copy the redirect URI. It looks like
https://<SCALEKIT_ENVIRONMENT_URL>/sso/v1/oauth/<CONNECTION_ID>/callback.
-
Navigate to Google Cloud Console → APIs & Services → Credentials. Select + Create Credentials, then OAuth client ID. Choose Web application from the Application type menu.

-
Under Authorized redirect URIs, click + Add URI, paste the redirect URI, and click Create.

-
-
Enable the Google Forms API
- In Google Cloud Console, go to APIs & Services → Library. Search for “Google Forms API” and click Enable.
-
Get client credentials
- Google provides your Client ID and Client Secret after you create the OAuth client ID in step 1.
-
Add credentials in Scalekit
-
In Scalekit dashboard, go to AgentKit > Connections and open the connection you created.
-
Enter your credentials:
- Client ID (from above)
- Client Secret (from above)
- Permissions (scopes — see Google API Scopes reference)

-
Click Save.
-
-
Authorize a user and make your first call
quickstart.mts import { ScalekitClient } from '@scalekit-sdk/node'import 'dotenv/config'import { createInterface } from 'node:readline/promises'const scalekit = new ScalekitClient(process.env.SCALEKIT_ENVIRONMENT_URL,process.env.SCALEKIT_CLIENT_ID,process.env.SCALEKIT_CLIENT_SECRET,)const actions = scalekit.actionsconst connector = 'googleforms'const identifier = 'user_123'// Generate an authorization link for the userconst { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })console.log('Authorize Google Forms:', link)const rl = createInterface({ input: process.stdin, output: process.stdout })await rl.question('Press Enter after authorizing...')rl.close()// Make your first callconst result = await actions.executeTool({connector,identifier,toolName: 'googleforms_get_form',toolInput: { form_id: 'YOUR_FORM_ID' },})console.log(result)Terminal window npx tsx quickstart.mtsquickstart.py import osfrom scalekit import ScalekitClientfrom dotenv import load_dotenvload_dotenv()scalekit_client = ScalekitClient(env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),client_id=os.getenv("SCALEKIT_CLIENT_ID"),client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),)actions = scalekit_client.actionsconnection_name = "googleforms"identifier = "user_123"# Generate an authorization link for the userlink_response = actions.get_authorization_link(connection_name=connection_name,identifier=identifier,)print("Authorize Google Forms:", link_response.link)input("Press Enter after authorizing...")# Make your first callresult = actions.execute_tool(tool_input={"form_id":"YOUR_FORM_ID"},tool_name="googleforms_get_form",connection_name=connection_name,identifier=identifier,)print(result)Terminal window python quickstart.pyEach user signs in once. See Authorize a user for the full flow and statuses.
Tools
Pass the exact name toexecute_toolgoogleforms_get_formGet the structure and metadata of a Google Form including its title, description, and all questions.Read-onlyGet Google Form
Get the structure and metadata of a Google Form including its title, description, and all questions.
Inputs
form_idstringrequired- The ID of the Google Form to retrieve
googleforms_get_responseGet a single response submitted to a Google Form by its response ID.Read-onlyGet Google Form Response
Get a single response submitted to a Google Form by its response ID. Returns the respondent's answers for all questions.
Inputs
form_idstringrequired- The ID of the Google Form
response_idstringrequired- The ID of the specific response to retrieve
googleforms_list_responsesList all responses submitted to a Google Form.Read-onlyList Google Form Responses
List all responses submitted to a Google Form. Returns response IDs, submission timestamps, and answer values for each respondent.
Inputs
form_idstringrequired- The ID of the Google Form to list responses for
filterstring- Filter responses by submission time. Format: timestamp > 2026-01-01T00:00:00Z
page_sizeinteger- Maximum number of responses to return (max 5000)
page_tokenstring- Token for retrieving the next page of results
googleforms_list_watchesList the watches configured on a Google Form.Read-onlyList Form Watches
List the watches configured on a Google Form. A form can have at most one active watch per event type (SCHEMA or RESPONSES) per project.
Inputs
form_idstringrequired- The ID of the Google Form whose watches to list
googleforms_batch_update_formApply a batch of update requests to a Google Form in a single atomic call.WriteBatch Update Form
Apply a batch of update requests to a Google Form in a single atomic call. This is the only way to add, edit, move, or delete questions and other items on a form. Returns a reply for each request in the same order they were submitted.
Inputs
form_idstringrequired- The ID of the Google Form to update
requestsarrayrequired- Ordered list of update requests to apply. Each item is a Forms API Request object, e.g. {"createItem": {...}} or {"updateFormInfo": {...}}
include_form_in_responseboolean- Whether the response should include the updated form, including its full item list
required_revision_idstring- If set, the update is rejected unless the form's current revision ID matches this value, protecting against concurrent edits
googleforms_create_formCreate a new Google Form with a title and optional document title.WriteCreate Google Form
Create a new Google Form with a title and optional document title. Returns the new form's ID and metadata.
Inputs
titlestringrequired- The title of the form shown to respondents
document_titlestring- The title of the document shown in Google Drive (defaults to the form title if not provided)
googleforms_create_watchCreate a watch on a Google Form that publishes a Cloud Pub/Sub notification when the form's schema changes or a new response is submitted.WriteCreate Form Watch
Create a watch on a Google Form that publishes a Cloud Pub/Sub notification when the form's schema changes or a new response is submitted. Watches expire seven days after creation unless renewed, and a form allows at most one watch per event type per project.
Inputs
event_typestringrequired- The type of form event that triggers a notification. One of: 'SCHEMA' (form content/settings changes) or 'RESPONSES' (a new response is submitted).one of
SCHEMARESPONSES form_idstringrequired- The ID of the Google Form to watch
topic_namestringrequired- The fully qualified name of the Cloud Pub/Sub topic to publish notifications to
watch_idstring- Optional ID to assign to the new watch (4-63 lowercase letters, digits, or hyphens). If omitted, one is auto-generated.
googleforms_renew_watchRenew an existing watch on a Google Form for another seven days from now.WriteRenew Form Watch
Renew an existing watch on a Google Form for another seven days from now. Watches expire seven days after creation (or after the last renewal) unless renewed again.
Inputs
form_idstringrequired- The ID of the Google Form the watch belongs to
watch_idstringrequired- The ID of the watch to renew
googleforms_set_publish_settingsUpdate a Google Form's publish settings: whether the form is published and whether it is currently accepting responses.WriteSet Form Publish Settings
Update a Google Form's publish settings: whether the form is published and whether it is currently accepting responses. Legacy forms created before publish settings existed are not supported.
- Idempotent
Inputs
form_idstringrequired- The ID of the Google Form to update
is_publishedbooleanrequired- Whether the form is published and viewable by anyone with the link
is_accepting_responsesboolean- Whether the form is currently accepting responses. Can only be true if the form is published.
update_maskstring- Optional field mask limiting which publishSettings fields to update, e.g. 'publishState'. If omitted, all provided fields are updated.
googleforms_delete_watchDelete a watch from a Google Form, immediately stopping Pub/Sub notifications for that event type.DestructiveDelete Form Watch
Delete a watch from a Google Form, immediately stopping Pub/Sub notifications for that event type. This cannot be undone; a new watch would need to be created to resume notifications.
- Idempotent
Inputs
form_idstringrequired- The ID of the Google Form the watch belongs to
watch_idstringrequired- The ID of the watch to delete
No tools match.
Workflows
Proxy API call
const result = await actions.request({ connectionName: 'googleforms', identifier: 'user_123', path: '/v1/forms', method: 'GET',});console.log(result);result = actions.request( connection_name='googleforms', identifier='user_123', path="/v1/forms", method="GET")print(result)Execute a tool
const result = await actions.executeTool({ connector: 'googleforms', identifier: 'user_123', toolName: 'googleforms_create_form', toolInput: {},});console.log(result);result = actions.execute_tool( connection_name='googleforms', identifier='user_123', tool_name='googleforms_create_form', tool_input={},)print(result)Google OAuth consent screen verification
Before you use your own Google OAuth credentials in production, understand what end users see on Google’s consent screen when they authorize a connected account.
| Audience type | Consent screen behavior | When to use |
|---|---|---|
| Internal | Shows your App Name and logo from Branding settings | Only users in your Google Workspace or Cloud Identity organization can authorize the connector |
| External | Shows {env_name}.scalekit.dev until Google verifies your app | Any user with a Google account can authorize the connector |
Why External is required for most AgentKit connectors:
- Internal restricts authorization to users in your Google Workspace or Cloud Identity organization. Users with
@gmail.comor other Google accounts outside your organization cannot complete OAuth. - External is required when end users outside your organization authorize tool access through connected accounts.
- Organization-managed OAuth clients follow the same rules as personal or developer OAuth clients. Switching to an org-owned client does not bypass Google verification.
- Until Google completes verification of your External app, users see
scalekit.devon the consent screen. After verification, your App Name and logo appear.
During development:
- Add Test users under APIs & Services → OAuth consent screen while publishing status is Testing.
- On unverified apps, users can click Advanced → Go to app (unsafe) to proceed during testing.
- Google Workspace admins may need to allowlist your OAuth client.
For Google’s verification requirements and timeline, refer to Google’s OAuth consent screen verification guide.