Setup
Point your form at a Collector endpoint. Fields need a name. Replace FORM_ID with the public ID from your form page.
Install with AI
Paste this into Cursor, Claude, or ChatGPT. On a live form page the prompt already includes your endpoint and honeypot name.
Integrate this Collector form into the existing website. Match the current layout, copy, and field labels. Do not invent a new page unless I ask.
Submit URL (POST only):
https://collector.stephenakintayofoundation.org/v1/forms/FORM_ID/submit
Embed script (required when the form has file inputs):
https://collector.stephenakintayofoundation.org/v1/forms/FORM_ID/embed.js
Rules:
- Every input needs a name attribute. Collector stores whatever named fields you send (email, message, name, etc.).
- Keep this hidden honeypot field exactly, unstyled and off-screen, so bots fill it and humans do not:
<input type="text" name="website" tabindex="-1" autocomplete="off" aria-hidden="true">
- HTML forms: method="POST" action=the URL above. Add enctype="multipart/form-data" if the form has a file input.
- After the form, include: <script src="https://collector.stephenakintayofoundation.org/v1/forms/FORM_ID/embed.js" defer></script>
Required for file inputs. The script uploads attachments to Cloudinary from the browser. Do not POST file bytes to the submit URL — hosts reject bodies over ~4.5 MB (Vercel 413).
- AJAX/JSON: fetch POST with Content-Type application/json. JSON cannot carry file bytes. Use the HTML form plus the embed script for attachments.
- Allowed files: jpg, jpeg, png, gif, webp, pdf, txt, csv, docx. Empty file inputs are ignored.
- No origin allowlist is set, so any site origin may POST. If this form is only for one website, add that origin in Collector.
- After a successful HTML POST, Collector redirects to its thank-you page. JSON clients receive { ok: true, requestId } instead of a redirect.
- On JSON errors, show the message field and keep the requestId for support.
Prefer wiring the existing contact form. If there is no form yet, add a simple email + message form in the natural place on the page.HTML POST
<form action="https://collector.stephenakintayofoundation.org/v1/forms/FORM_ID/submit" method="POST" enctype="multipart/form-data"> <input type="email" name="email" required> <textarea name="message" required></textarea> <input type="file" name="attachment"> <input type="text" name="website" tabindex="-1" autocomplete="off" aria-hidden="true"> <button type="submit">Send</button> </form> <script src="https://collector.stephenakintayofoundation.org/v1/forms/FORM_ID/embed.js" defer></script>
AJAX / JSON
await fetch("https://collector.stephenakintayofoundation.org/v1/forms/FORM_ID/submit", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ email, message })
});
// JSON cannot carry file bytes. For attachments, use the HTML form plus embed.js.Files
File inputs must include the embed script after the form. That script uploads attachments directly to Cloudinary in the browser, then submits only the text fields. If the script is missing, the file is posted to Collector's host, which rejects bodies over about 4.5 MB (Vercel 413). Allowed: images, PDF, TXT, CSV, DOCX. Empty file fields are ignored. JSON fetch cannot send file bytes. Free accounts: 5 MB per file, 200 MB total. Free keeps submissions for 90 days.
Spam
Keep the hidden honeypot field. We also rate-limit, size-limit, and score obvious spam. Quarantined messages do not use your submission quota.
Request IDs
Every response includes a request ID. Share that with support. We can look it up without opening the message body by default.