Send a message from the website contact form to the Site Qwality inbox.
POST
/contact
const url = 'https://api.siteqwality.com/contact';const options = { method: 'POST', headers: {'Content-Type': 'application/json'}, body: '{"name":"example","email":"example","topic":"sales","message":"example","turnstile_response":"example","website":"example","elapsed_ms":4200}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.siteqwality.com/contact \ --header 'Content-Type: application/json' \ --data '{ "name": "example", "email": "example", "topic": "sales", "message": "example", "turnstile_response": "example", "website": "example", "elapsed_ms": 4200 }'Public and unauthenticated. Any refusal (bot checks, validation, rate limit, Turnstile) returns the same 400 with the same message, so the cause is not revealed.
Request Body required
Section titled “Request Body required ” Media type application/json
object
name
required
1 to 100 characters.
string
email
required
A valid address, 254 characters at most.
string
topic
required
string
message
required
1 to 5000 characters, at most two links.
string
turnstile_response
Cloudflare Turnstile token. Required wherever Turnstile is configured.
string | null
website
Honeypot. Real visitors never see the field, so it must be empty.
string
elapsed_ms
required
Milliseconds between rendering the form and submitting it. At least 3000.
Read as a float so a fractional performance.now() delta is not a
silent failure, but it is an integer on the wire contract.
integer format: int64
Example
4200Responses
Section titled “ Responses ”Message sent
Message refused. The body is the same generic message for every cause.
Internal server error