當您自行構建網站前端時,無需為了製作「聯絡我們」或「預約諮詢」表單而額外串接第三方表單服務。您可以直接在後台「營銷 › 網上表單」建立表單,再從自建前端透過 Content Delivery API 讀取題目並提交回答。
表單提交後,Kanorio 會自動為您完成防機械人驗證、垃圾訊息過濾、建立或合併顧客聯絡人、寄送填表者確認信與團隊通知信,並觸發 customers.form.submitted Webhook。
完整端點與錯誤碼規格(SSOT):有關表單三支端點的參數、欄位結構與錯誤碼,請查閱 Content Delivery API 參考頁(Forms 分組)。
formId。https://www.example.com)加入「允許的來源」(本機開發 localhost 預設放行,無需設定)。GET /api/v1/forms/{id})在頁面載入或構建時讀取表單的標題、題目欄位(fields)、私隱權與營銷同意勾選設定(consent),以及表單目前是否開放收件(availability):
availability.accepting 為 false(例如表單已封存或已超過截止時間),前端可直接顯示關閉提示,不必渲染輸入框。field.id 對齊後台設定即可。GET /api/v1/forms/{id}/challenge)為了在不要求訪客輸入繁瑣圖形驗證碼的前提下擋下自動化垃圾機械人,Kanorio 採用輕量級簽章工作量證明(Proof-of-Work)挑戰:
GET /api/v1/forms/{id}/challenge(此端點為 no-store,每次回傳全新挑戰)。solution(或使用 @kanorio/sdk 內建的輔助函式),連同答案一起提交。POST /api/v1/forms/{id}/submit)將訪客填寫的 answers(以題目 id 為鍵的物件)、防灌水解答與營銷同意狀態 POST 至 /api/v1/forms/{id}/submit:
async function submitContactForm(siteUrl: string, formId: string, answers: Record<string, unknown>) { // 1. 取得防灌水挑戰並完成計算 const challengeRes = await fetch(`${siteUrl}/api/v1/forms/${formId}/challenge`, { cache: "no-store", }); const challenge = await challengeRes.json(); const token = await solveFormChallenge(challenge); // 2. 提交表單答案 const res = await fetch(`${siteUrl}/api/v1/forms/${formId}/submit`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ answers, challengeToken: token, marketingConsent: true, pagePath: window.location.pathname, }), }); if (!res.ok) { const { error } = await res.json(); throw new Error(error?.message ?? "提交失敗"); } return res.json(); }
當 /submit 回傳 200 OK 後,Kanorio 會在背景自動執行:
customers.form.submitted 事件,系統會立即將答案推送至您的外部系統或自動化流程。可以。若由您的伺服器轉發,請保留訪客的真實來源資訊或直接在瀏覽器端完成挑戰與提交,確保每站每訪客 IP 的防濫用限流能精準保護您的表單額度。