Team roles
Owners, admins, editors and viewers in one workspace.
Send every response to Google Sheets, Slack, Discord or your own endpoint. Embed forms on your site, print QR codes that count scans, and let AI agents work with your forms over MCP.
Response #128 · 10:53
Where responses go
Google Sheets
Paste one Apps Script into your sheet and connect it. Each response appends a row with a column per question; new questions add columns, and retries never duplicate a row.
Webhooks
Each completed response is POSTed as JSON and signed with HMAC-SHA256 over the timestamp and body. Failed deliveries retry with backoff, up to five attempts.
content-type: application/json
x-webhook-id: 9b1f0c52-…-4e7a
x-webhook-timestamp: 1792658192000
x-signature-256: sha256=9f2c41…e71a
{
"type": "form.submission.completed",
"createdAt": "2026-10-22T10:53:12.004Z",
"data": {
"formId": "5d0c…", "submissionId": "a71e…",
"answers": { "t_evt_ticket": { "type": "single_choice", "value": "t_evt_ticket_full" } },
"fields": [{ "label": "Which pass do you want?", "value": "Full event" }]
}
}Chat
Paste a Slack or Discord incoming-webhook URL and SOYL sends a tidy message with the answers and a link to the response, instead of raw JSON.
New response: Workshop registration
New response: Workshop registration
Verify a webhook
The signature covers the timestamp and the exact body, so a replayed or edited request fails. Use the secret shown once when you add the webhook.
const { createHmac, timingSafeEqual } = require("node:crypto");
// rawBody: the request body exactly as received (a string)
function isFromSoyl(secret, rawBody, headers) {
const timestamp = headers["x-webhook-timestamp"];
const expected = "sha256=" + createHmac("sha256", secret)
.update(`${timestamp}.${rawBody}`)
.digest("hex");
const given = headers["x-signature-256"] || "";
const fresh = Math.abs(Date.now() - Number(timestamp)) < 5 * 60 * 1000;
return fresh && given.length === expected.length &&
timingSafeEqual(Buffer.from(given), Buffer.from(expected));
}Embed
One script tag. Inline embeds resize to fit; popups and sliders open over your page in the form’s colours. Pass hidden fields with data-soyl-hidden.
<div data-soyl-form="your-form" data-soyl-title="Workshop registration"></div>
<script src="https://forms.soylai.com/embed.js" async></script>QR codes
Download any form’s QR code as PNG or SVG for posters, tables and counters. Scans are tagged, so results show how many visits and completions came from the code.
Traffic sources
| Source | Visits | Done | Rate |
|---|---|---|---|
| QR code | 128 | 97 | 76% |
| 84 | 51 | 61% | |
| direct | 61 | 44 | 72% |
Illustrative numbers. Tag any link with ?src=name to track it.
The Android app’s scanner opens SOYL forms straight from a code.
Built, switching on soon
These are built and waiting on setup with the platforms they connect to. They're off until then.
API & MCP
Connect Claude, ChatGPT or any MCP client with a workspace API key. Agents can list your forms, read a schema, draft a new form in your brand, fetch a share QR and read response stats.
# Draft a form in your brand (costs 1 AI credit; never auto-published)
curl https://forms.soylai.com/api/mcp \
-H "Authorization: Bearer $SOYL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": {
"name": "draft_form",
"arguments": {
"description": "Design workshop registration in Pune, ₹499 a seat",
"length": "short"
}
}
}'Building a website or backend integration? Use the REST API and its documentation.
FAQ
Something else? Email support@soylai.com.
Open your form’s integrations, copy the short Apps Script SOYL gives you into your sheet, deploy it as a web app and paste its URL back. Every new response then appends a row with a column per question.
Each request carries x-webhook-timestamp and x-signature-256. Recompute HMAC-SHA256 over “timestamp.body” with the webhook’s secret, compare it in constant time, and reject anything older than five minutes.
1 on Free, 5 on Starter and 20 on Pro. Google Sheets, Slack and Discord connections each count as one.
Yes, on every plan. A REST API at /api/v1 lists forms, reads and syncs responses and submits responses from your own server, with an OpenAPI spec and full documentation on the Developers page. AI agents can also use the MCP server at /api/mcp. Both authenticate with a workspace API key.
Yes, on every plan. Add one script tag and a div or button: inline embeds resize to fit, popups and sliders open over your page, and hidden fields can be passed through.
Sheets, webhooks, embeds and QR codes on every plan. Start free, no card needed.