> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended** (the `-y` flags skip prompts, so the command runs without an interactive terminal):
> ```bash
> npx -y @scalekit-inc/cli setup -y
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup -y
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for other Agent Skills-compatible agents in `~/.agents/skills`.
> Skills: integrate-agentkit, implement-saaskit, add-mcp-oauth, implement-sso, implement-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Connect AI agents to Fillout

The Fillout connector lets your AI agent act in each user's Fillout account. Each user connects their own Fillout access token once, and Scalekit sends it with every call, so your agent never handles credentials. It comes with 6 tools.

**Authentication:** Bearer Token
**Categories:** Productivity
**Tools:** 6: 4 read, 1 write, 1 destructive
**Users sign in with:** Access token
**Built by:** Scalekit connector
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=FILLOUT)

## Setup

1. ### Install the SDK

   **Node.js**

   ```bash
   npm install @scalekit-sdk/node dotenv
   ```

   **Python**

   ```bash
   pip install scalekit-sdk-python python-dotenv
   ```

2. ### Set your credentials

   Add your Scalekit credentials to your `.env` file. Find values in **[app.scalekit.com](https://app.scalekit.com)** > **Developers** > **API Credentials**.

   ```sh title=".env"
   SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
   SCALEKIT_CLIENT_ID=<your-client-id>
   SCALEKIT_CLIENT_SECRET=<your-client-secret>
   ```

3. ### Create the Fillout connection

   In **AgentKit > Connections**, create a Fillout connection. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

4. ### Authorize a user and make your first call

   **Node.js** (`quickstart.mts`)

   ```typescript
   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.actions

   const connector = 'fillout'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize Fillout:', link)
   const rl = createInterface({ input: process.stdin, output: process.stdout })
   await rl.question('Press Enter after authorizing...')
   rl.close()

   // Make your first call
   const result = await actions.executeTool({
     connector,
     identifier,
     toolName: 'fillout_forms_list',
     toolInput: {},
   })
   console.log(result)
   ```

   ```bash
   npx tsx quickstart.mts
   ```

   **Python** (`quickstart.py`)

   ```python
   import os
   from scalekit import ScalekitClient
   from dotenv import load_dotenv
   load_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.actions

   connection_name = "fillout"
   identifier = "user_123"

   # Generate an authorization link for the user
   link_response = actions.get_authorization_link(
       connection_name=connection_name,
       identifier=identifier,
   )
   print("Authorize Fillout:", link_response.link)
   input("Press Enter after authorizing...")

   # Make your first call
   result = actions.execute_tool(
       tool_input={},
       tool_name="fillout_forms_list",
       connection_name=connection_name,
       identifier=identifier,
   )
   print(result)
   ```

   ```bash
   python quickstart.py
   ```

   Each user opens the link once and enters their Fillout credentials there. See [Authorize a user](/agentkit/tools/authorize/) for the full flow and statuses.

## Tools

Pass the exact name to `execute_tool`, with an input like each tool's example. To ask for a tool that's missing, use the [request form](https://scalekitsupport.portal.usepylon.com/forms/request-a-connector-tool).

**Node.js**

```typescript
const result = await actions.executeTool({
  toolName: 'fillout_form_get',
  toolInput: {
    form_id: 'foAdHjd1Duus',
  },
  connector: 'fillout',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="fillout_form_get",
    tool_input={
        "form_id": "foAdHjd1Duus",
    },
    connection_name="fillout",
    identifier="user_123",
)
```

`result.data` is the app's response as JSON, and `result.execution_id` (`executionId` in Node.js) is the ID of the call.

### `fillout_form_get`

Get Form · Read-only

Get one Fillout form's metadata by its public ID.
Returns id, name and questions (each with id, name and type), plus calculations, URL parameters, scheduling fields, payment fields and quiz settings when the form uses them.
Use fillout_form_get to learn a form's question IDs before reading or creating submissions. Use fillout_forms_list to find the form ID.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `form_id` (`string`, required): Public ID of the form, as returned in formId by fillout_forms_list. Example: "foAdHjd1Duus".

Example input: `{"form_id":"foAdHjd1Duus"}`

### `fillout_forms_list`

List Forms · Read-only

List every form in the connected Fillout account.
Returns an array of forms, each with its formId (public ID) and name.
Use fillout_forms_list to find a form ID. Use fillout_form_get for a form's questions and other metadata.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `fillout_submission_get`

Get Submission · Read-only

Get one submission of a Fillout form by its submission ID.
Returns submission with submissionId, submissionTime, lastUpdatedAt and question answers, plus calculations, URL parameters, scheduling, payments, quiz and login data when present.
Use fillout_submission_get when you have the submission ID. Use fillout_submissions_list to browse or search a form's submissions.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `form_id` (`string`, required): Public ID of the form the submission belongs to, as returned in formId by fillout_forms_list. Example: "foAdHjd1Duus".
- `submission_id` (`string`, required): ID of the submission, as returned in submissionId by fillout_submissions_list. Example: "abc123-def456".
- `include_edit_link` (`boolean`, optional): Set to true to add an editLink to the submission, a URL where it can be edited.

Example input: `{"form_id":"foAdHjd1Duus","submission_id":"abc123-def456"}`

### `fillout_submissions_list`

List Submissions · Read-only

List submissions for one Fillout form, with optional date range, status, text search, sort order and offset pagination.
Returns responses (each with submissionId, submissionTime, lastUpdatedAt and question answers, plus calculations, URL parameters, scheduling, payments, quiz and login data when present), totalResponses and pageCount.
Use fillout_submissions_list to browse or search a form's submissions. Use fillout_submission_get when you already have a submission ID.
Get the form ID from fillout_forms_list first.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `form_id` (`string`, required): Public ID of the form whose submissions to list, as returned in formId by fillout_forms_list. Example: "foAdHjd1Duus".
- `after_date` (`string`, optional): Only return submissions submitted after this ISO 8601 date-time. Example: "2024-05-01T00:00:00.000Z".
- `before_date` (`string`, optional): Only return submissions submitted before this ISO 8601 date-time. Example: "2024-06-01T00:00:00.000Z".
- `include_edit_link` (`boolean`, optional): Set to true to add an editLink to each submission, a URL where the submission can be edited.
- `include_preview` (`boolean`, optional): Set to true to also return preview submissions, which were made while previewing the form in the Fillout editor.
- `limit` (`integer`, optional): Maximum number of submissions to return in this page, from 1 to 150. Fillout uses 50 when omitted. Example: 100.
- `offset` (`integer`, optional): Zero-based position to start from, for paging through results. Fillout uses 0 when omitted. To get the next page, add the limit to the previous offset (for example offset 50 with limit 50 gives the second page); pageCount in the response tells you how many pages exist.
- `search` (`string`, optional): Only return submissions whose answers contain this text. Example: "jane@example.com".
- `sort` (`string`, optional): Sort order by submission time: "asc" (oldest first) or "desc" (newest first). Fillout uses "asc" when omitted. One of: `asc`, `desc`.
- `status` (`string`, optional): Which submissions to return: "finished" (completed submissions) or "in_progress" (started but not yet submitted). Fillout returns only finished submissions when omitted. One of: `finished`, `in_progress`.

Example input: `{"form_id":"foAdHjd1Duus"}`

### `fillout_submissions_create`

Create Submissions · Write

Add up to 10 new submissions to a Fillout form in one call, as if respondents had filled it in.
Returns submissions, the created submissions with their new submissionId, submissionTime and answers.
Use fillout_submissions_create to import or record responses. Use fillout_submissions_list to read existing ones.
Call fillout_form_get first to get the form's question IDs.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `form_id` (`string`, required): Public ID of the form to add submissions to, as returned in formId by fillout_forms_list. Example: "foAdHjd1Duus".
- `submissions` (`array`, required): The submissions to create, from 1 to 10. Each submission needs a questions list that pairs a question ID (from fillout_form_get) with the answer value for that question. Each one can also carry URL parameter values (id, name, value), a submissionTime and lastUpdatedAt as ISO 8601 date-times, scheduling and payment answers, and a login object with the respondent's verified email. Example: [{"questions": [{"id": "5mJ9", "value": "Jane Doe"}, {"id": "kPq2", "value": "jane@example.com"}], "urlParameters": [{"id": "utm_source", "name": "utm_source", "value": "newsletter"}], "submissionTime": "2024-05-01T12:00:00.000Z"}].

Example input: `{"form_id":"foAdHjd1Duus","submissions":[]}`

### `fillout_submission_delete`

Delete Submission · Destructive

Permanently delete one submission from a Fillout form.
Returns an empty success response; the submission cannot be recovered.
Use fillout_submission_delete to remove a single submission. Use fillout_submission_get first to confirm it is the right one.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `form_id` (`string`, required): Public ID of the form the submission belongs to, as returned in formId by fillout_forms_list. Example: "foAdHjd1Duus".
- `submission_id` (`string`, required): ID of the submission to delete, as returned in submissionId by fillout_submissions_list. Example: "abc123-def456". Deletion is permanent.

Example input: `{"form_id":"foAdHjd1Duus","submission_id":"abc123-def456"}`

## Related

Other Productivity connectors ([all 144](/agentkit/connectors/?category=productivity)):

- [Slack](/agentkit/connectors/slack/): Scalekit connector, OAuth, 96 tools
- [Microsoft 365](/agentkit/connectors/microsoft365/): Scalekit connector, OAuth, 317 tools
- [Notion](/agentkit/connectors/notion/): Scalekit connector, OAuth, 51 tools


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
