Get your dream built 10x faster

How to integrate Typeform with OpenClaw

We build custom applications 5x faster and cheaper 🚀

Book a Free Consultation
4.9
Clutch rating 🌟
600+
Happy partners
17+
Countries served
190+
Team members
Matt Graham, CEO of Rapid Developers

Book a call with an Expert

Stuck on an error? Book a 30-minute call with an engineer and get a direct fix + next steps. No pressure, no commitment.

How to integrate Typeform with OpenClaw

Direct answer: Build a small, externally-hosted webhook receiver that validates Typeform signatures and stores or forwards events, configure OAuth (or a personal access token) to call Typeform’s REST API from your integration code, and connect that external service to your OpenClaw skill by installing/configuring the skill through ClawHub and placing tokens/credentials into the platform’s secret store. Keep the webhook server and any persistent state outside the agent runtime (agents are ephemeral); the agent/skill should focus on processing events or fetching additional Typeform data via authenticated API calls. Debug by checking webhook delivery logs, API responses, token scopes/expiration, and the skill invocation path in ClawHub and your runtime logs.

 

Overview and constraints

 

  • What runs where: Run a public webhook receiver and any persistent store (database, queue) outside the agent runtime. The OpenClaw skill/agent should receive validated, minimal events or be called to enrich/process events. Don’t rely on agents to be long-lived or directly accept incoming webhooks.
  • Authentication: Use Typeform OAuth or a Typeform personal access token. Store client_id/client_secret or API keys in ClawHub’s secret/store (or another secure secret manager) and never embed them in code.
  • APIs only: All integration logic uses Typeform REST endpoints (webhooks + forms/responses endpoints). Configure webhooks in Typeform so Typeform pushes user submissions to your publicly reachable endpoint.

 

High-level steps

 

  • Register an OAuth app in Typeform (or generate a personal token) and note client_id, client_secret, redirect URI.
  • Provision a public HTTPS webhook endpoint (server or serverless) that accepts POSTs from Typeform, captures the raw body, and validates the webhook signature.
  • Install/configure the OpenClaw skill via ClawHub and place OAuth credentials/API keys into the platform secret store or environment variables the skill uses.
  • When a webhook arrives: validate signature, persist the event (or enqueue), then either: (a) call the OpenClaw skill runtime API to hand off the event, or (b) let the OpenClaw agent poll/fetch the persisted event. The handoff must be an explicit API call.
  • When the skill needs more detail (full responses, form metadata), call Typeform’s REST API using the stored access token. Implement token refresh if using OAuth.

 

Concrete components and responsibilities

 

  • Webhook receiver (external): Public HTTPS endpoint. Verifies signature, acknowledges quickly (200), persists or forwards events, and implements backoff/retry for downstream failures.
  • Persistent store / queue (external): Holds events for retry, audit, deduplication, and for the agent to fetch at leisure.
  • OpenClaw skill (agent-side): Stateless processing: validate business rules and call other services, triggered by webhook-forward events or by polling the persistent store. Use the skill to orchestrate workflows, not to host the webhook.
  • Secrets manager/ClawHub: Holds OAuth client\_id/secret, access/refresh tokens, webhook secret. Configure the skill to read from secrets at runtime.

 

Typeform OAuth and token lifecycle (summary)

 

  • Direct users through Typeform’s authorization URL to get a code (authorization\_code flow) or use a personal access token for server-to-server integrations.
  • Exchange the authorization code at Typeform’s token endpoint to obtain an access token and (if provided) a refresh token.
  • Store the tokens securely. Implement token refresh by calling the token endpoint with grant_type=refresh_token when the access token expires.
  • Ensure the token has the necessary scopes (read:responses, write:webhooks, etc.). Verify scopes during development.

 

Example code: webhook receiver, signature verification, and creating a webhook

 

Notes: replace placeholders (YOUR_TYPEFORM_CLIENT_ID, CLIENT_SECRET, FORM\_ID, etc.). Confirm the exact signature header format and encoding with Typeform docs and adjust the verification encoding if needed.

// <b>//</b> Example: Node.js + Express webhook receiver and Typeform API calls
const express = require('express');
const fetch = require('node-fetch');
const crypto = require('crypto');

const app = express();

// <b>//</b> We need raw body for HMAC verification
app.use(express.raw({ type: 'application/json' }));

const TYPEFORM_WEBHOOK_SECRET = process.env.TYPEFORM_WEBHOOK_SECRET; // <b>//</b> configured in Typeform webhook and in your secrets manager
const TYPEFORM_BEARER = process.env.TYPEFORM_BEARER; // <b>//</b> access token (or your mechanism to fetch a token)

// <b>//</b> Raw webhook endpoint
app.post('/typeform/webhook', async (req, res) => {
  const raw = req.body; // <b>//</b> Buffer
  const header = req.get('Typeform-Signature') || req.get('typeform-signature') || '';

  // <b>//</b> Compute HMAC SHA256 of the raw payload using your webhook secret
  const hmac = crypto.createHmac('sha256', TYPEFORM_WEBHOOK_SECRET);
  hmac.update(raw);
  const signature = hmac.digest('base64'); // <b>//</b> confirm encoding expected by Typeform

  // <b>//</b> Many providers prefix with "sha256=", adjust if required by Typeform
  const expected = 'sha256=' + signature;

  const safeEqual = (() => {
    try {
      const a = Buffer.from(header);
      const b = Buffer.from(expected);
      if (a.length !== b.length) return false;
      return crypto.timingSafeEqual(a, b);
    } catch (e) {
      return false;
    }
  })();

  if (!safeEqual) {
    // <b>//</b> signature mismatch - log and return 401
    console.warn('Invalid signature', header, expected);
    return res.status(401).send('invalid signature');
  }

  // <b>//</b> Parse the JSON (we used raw middleware)
  let body;
  try {
    body = JSON.parse(raw.toString('utf8'));
  } catch (err) {
    console.error('Bad JSON', err);
    return res.status(400).send('bad json');
  }

  // <b>//</b> Acknowledge quickly
  res.status(200).send('ok');

  // <b>//</b> Persist or enqueue body for downstream processing.
  // <b>//</b> Example: push to database or message queue so your OpenClaw skill can pick it up.
  // saveEventToDb(body);
});
// <b>//</b> Example: fetch form responses from Typeform using the REST API
async function fetchResponses(formId) {
  const url = `https://api.typeform.com/forms/${formId}/responses`;
  const resp = await fetch(url, {
    method: 'GET',
    headers: {
      'Authorization': `Bearer ${TYPEFORM_BEARER}`,
      'Accept': 'application/json'
    }
  });
  if (!resp.ok) {
    // <b>//</b> Handle errors. Log resp.status and resp.text() to debug.
    throw new Error(`Typeform API error ${resp.status}: ${await resp.text()}`);
  }
  return resp.json();
}
// <b>//</b> Example: create/enable a webhook on a form (PUT). Confirm exact request body with Typeform docs.
async function registerWebhook(formId, webhookTag, webhookUrl, webhookSecret) {
  const url = `https://api.typeform.com/forms/${formId}/webhooks/${encodeURIComponent(webhookTag)}`;
  const body = {
    url: webhookUrl,
    enabled: true,
    secret: webhookSecret
  };

  const resp = await fetch(url, {
    method: 'PUT',
    headers: {
      'Authorization': `Bearer ${TYPEFORM_BEARER}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify(body)
  });

  if (!resp.ok) {
    throw new Error(`Failed to register webhook: ${resp.status} ${await resp.text()}`);
  }
  return resp.json();
}

 

Integrating with OpenClaw (practical)

 

  • Install and configure the skill via ClawHub: In ClawHub, install your Typeform integration skill and configure environment variables/secrets (client_id, client_secret, webhook secret, tokens). The skill should be designed to accept events or to poll your persistent store.
  • Authentication placement: Keep long-lived tokens or refresh tokens in ClawHub’s secret store (or another secrets manager). The running skill can read them at runtime; do not embed credentials in source control.
  • Event flow: Typeform -> your webhook receiver (external) -> validate & persist -> notify skill runtime via explicit API call or let the skill poll the store. Everything is explicit: HTTP calls, queue messages, or SDK calls. Don’t assume automatic delivery into the agent runtime.
  • Invocation: If you call the OpenClaw skill directly, use the platform’s documented runtime API or SDK to invoke a skill endpoint, passing a validated payload or an identifier that the skill can use to fetch the persisted event.

 

Security, reliability, and operational notes

 

  • Validate signatures: Always verify the webhook signature and reject invalid requests. Log mismatches for investigation.
  • Acknowledge quickly: Return 200 fast; do heavy work asynchronously so Typeform sees a timely success.
  • Idempotency: Webhooks can be retried — deduplicate using event IDs.
  • Token rotation/refresh: Implement token refresh for OAuth flows and rotate secrets regularly.
  • Least privilege: Request only the scopes your skill needs.
  • Observability: Log incoming webhooks, signature checks, API errors, and skill invocation traces. Correlate Typeform event IDs with your internal IDs for debugging.
  • Rate limits: Be ready to respect Typeform rate limits — back off and retry with exponential backoff on 429s or 5xx responses.
  • Secrets: Never send secrets back to the client or include them in logs. Use secure storage in ClawHub or a cloud secrets manager.

 

Debug checklist when something breaks

 

  • Confirm webhook delivery in Typeform’s dashboard and inspect delivery status/errors.
  • Check your webhook receiver logs for raw request, headers, and signature verification results.
  • Verify the webhook secret stored in Typeform exactly matches your secret (no extra whitespace).
  • Inspect API responses when calling Typeform endpoints — log body and status. Check for expired tokens or missing scopes.
  • Confirm the skill is installed and that its runtime can access secrets. Check ClawHub or your platform logs for invocation traces and failures.
  • If the skill doesn’t see events, confirm the persistence/queue has the events and that the skill can fetch them (network, permissions, and credentials).

Book Your Free 30‑Minute Migration Call

Speak one‑on‑one with a senior engineer about your no‑code app, migration goals, and budget. In just half an hour you’ll leave with clear, actionable next steps—no strings attached.

Book a Free Consultation

Troubleshooting Typeform and OpenClaw Integration

1

Why does the OpenClaw Typeform Connector return 401 Unauthorized during OAuth token exchange or connector setup?

The connector returns 401 Unauthorized because the OAuth token exchange is failing authentication — usually due to wrong/missing client credentials, a redirect URI mismatch, using the wrong token endpoint or auth method, an expired/used authorization code, or because the OpenClaw skill/environment variables storing the client_id/client_secret are incorrect or unset.

 

Key Causes & Troubleshooting

 

Check these in order:

  • Credentials — confirm client_id/client_secret in env vars match Typeform app.
  • Redirect URI — must exactly match the URI registered at Typeform.
  • Token request — ensure you call Typeform’s token URL with correct method and Authorization (Basic or body) and proper content-type.
  • Auth code — one-time, short-lived; don’t reuse.
  • Logs — capture token endpoint response and OpenClaw skill logs to see error details.

2

Why are Typeform webhooks not reaching the OpenClaw Webhook Listener or failing signature/verification checks?

The most common causes are: wrong endpoint URL or HTTP method, network/firewall or TLS blocking, Typeform webhook disabled or returning non-2xx so Typeform retries but stops, proxy or body-parsing middleware that changes the raw request (breaking HMAC verification), and a mismatched webhook secret/header name or signature algorithm used during verification.

 

Troubleshoot Checklist

 

Check these in order:

  • Endpoint & method: exact URL and POST expected by OpenClaw Webhook Listener.
  • Network/TLS: firewall, NAT, or TLS cert problems.
  • Delivery status: inspect Typeform delivery logs for HTTP status and error details.
  • Raw body: signature checks need the raw request bytes; body-parsers that JSON-parse first will change it.
  • Secret/header: confirm the secret in ClawHub env vars matches Typeform’s webhook secret and you’re reading the correct header.
  • Retries & rate limits: repeated failures can be throttled.
const crypto = require('crypto')
app.post('/webhook', express.raw({type:'application/json'}), (req,res)=>{
// compute HMAC on raw body
const sig = crypto.createHmac('sha256', process.env.TYPEFORM_SECRET).update(req.body).digest('base64')
if (sig !== req.header('Typeform-Signature')) return res.status(401).end()
res.status(200).end()
})

3

Why are Typeform response fields (nested answers, choice arrays) not mapping correctly in OpenClaw Field Mapping and Transformation?

Direct answer: Typeform answers are nested JSON objects and arrays (answer objects, choice arrays, labels vs ids). OpenClaw’s Field Mapping fails when you target a scalar path but the payload has an array/object shape or when the mapping expression doesn’t address array indexing or property names exactly — you must inspect the real webhook JSON and use a path/transform that flattens or selects the correct element.

 

Why this happens and how to fix it

 
  • Shape mismatch: Typeform returns arrays for multiple choices and nested answer objects; map to the exact property (e.g. answers[0].text or answers[].choice.label).
  • Wrong path syntax: Use the same path language OpenClaw accepts (JSONPath or explicit dot/array index) and handle arrays.
  • Label vs id: Typeform choice items may carry id and label—pick the field you need.
  • Solution: Inspect the raw webhook JSON, write a transformation that flattens arrays (select by index or join values), or add a small skill/transform function to normalize before mapping.

4

Why does the OpenClaw Sync Job for Typeform fail with 429 rate-limit errors or queue/timeout failures and not retry successfully?

The Sync Job fails because requests to Typeform are being rate-limited and the OpenClaw job/queue retry behavior isn’t respecting the API’s backoff guidance or capacity limits: retries are too aggressive (no exponential backoff/jitter or honoring Retry-After), concurrency bursts exhaust Typeform quotas, and job timeouts/queue limits drop or fail jobs instead of pacing and requeuing reliably.

 

What to check and fix

 

Inspect logs and Typeform responses (look for 429 and Retry-After), then:

  • Honor Retry-After and implement exponential backoff + jitter in the skill.
  • Throttle concurrency so parallel workers don’t exceed account limits.
  • Persist retry state outside the ephemeral runtime if long delays are needed.
  • Increase job timeouts and make retries idempotent.
Book a Free Consultation

Still stuck?
Copy this prompt into ChatGPT and get a clear, personalized explanation.

This prompt helps an AI assistant understand your setup and guide you through the fix step by step, without assuming technical knowledge.

AI AI Prompt


Recognized by the best

Trusted by 600+ businesses globally

From startups to enterprises and everything in between, see for yourself our incredible impact.

RapidDev was an exceptional project management organization and the best development collaborators I've had the pleasure of working with.

They do complex work on extremely fast timelines and effectively manage the testing and pre-launch process to deliver the best possible product. I'm extremely impressed with their execution ability.

Arkady
CPO, Praction
Working with Matt was comparable to having another co-founder on the team, but without the commitment or cost.

He has a strategic mindset and willing to change the scope of the project in real time based on the needs of the client. A true strategic thought partner!

Donald Muir
Co-Founder, Arc
RapidDev are 10/10, excellent communicators - the best I've ever encountered in the tech dev space.

They always go the extra mile, they genuinely care, they respond quickly, they're flexible, adaptable and their enthusiasm is amazing.

Mat Westergreen-Thorne
Co-CEO, Grantify
RapidDev is an excellent developer for custom-code solutions.

We’ve had great success since launching the platform in November 2023. In a few months, we’ve gained over 1,000 new active users. We’ve also secured several dozen bookings on the platform and seen about 70% new user month-over-month growth since the launch.

Emmanuel Brown
Co-Founder, Church Real Estate Marketplace
Matt’s dedication to executing our vision and his commitment to the project deadline were impressive. 

This was such a specific project, and Matt really delivered. We worked with a really fast turnaround, and he always delivered. The site was a perfect prop for us!

Samantha Fekete
Production Manager, Media Production Company
The pSEO strategy executed by RapidDev is clearly driving meaningful results.

Working with RapidDev has delivered measurable, year-over-year growth. Comparing the same period, clicks increased by 129%, impressions grew by 196%, and average position improved by 14.6%. Most importantly, qualified contact form submissions rose 350%, excluding spam.

Appreciation as well to Matt Graham for championing the collaboration!

Michael W. Hammond
Principal Owner, OCD Tech

We put the rapid in RapidDev

Need a dedicated strategic tech and growth partner? Discover what RapidDev can do for your business! Book a call with our team to schedule a free, no-obligation consultation. We’ll discuss your project and provide a custom quote at no cost.Â