Marketing-site contact / early-access capture
const url = 'https://www.tovarifinancial.com/contact';const options = { method: 'POST', headers: {'Content-Type': 'application/json'}, body: '{"email":"example","firstName":"example","lastName":"example","budgetingApps":["example"],"happiness":"example","features":"example","submissionId":"example","website":"example"}'};
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://www.tovarifinancial.com/contact \ --header 'Content-Type: application/json' \ --data '{ "email": "example", "firstName": "example", "lastName": "example", "budgetingApps": [ "example" ], "happiness": "example", "features": "example", "submissionId": "example", "website": "example" }'UNAUTHENTICATED, and served by its OWN REST API (ContactApi) rather than the app API: it writes to a dedicated DynamoDB table, touches no Postgres, and has no org context or row-level security. Only email is required. Values the server does not recognise in the enumerated fields are DROPPED rather than rejected, so a benign marketing-page change never 400s a lead. submissionId is the client-supplied idempotency handle — this route deliberately does NOT use X-Idempotency-Key — and re-sending the same one answers 200 instead of 201 rather than storing a second row. A bounded, safe-charset value is honoured; anything else is ignored and the server mints an id.
Request Bodyrequired
Section titled “Request Bodyrequired”object
The only required field. Lower-cased and format-checked.
Unrecognised values are silently dropped rather than rejected.
One of unhappy, okay, happy. Anything else is stored as empty rather than rejected.
Optional client-generated id, [A-Za-z0-9._-] only. Re-sending one answers 200 rather than creating a second submission.
HONEYPOT. A human leaves it empty; a non-empty value is accepted with a 201 and stored nowhere.
Examplegenerated
{ "email": "example", "firstName": "example", "lastName": "example", "budgetingApps": [ "example" ], "happiness": "example", "features": "example", "submissionId": "example", "website": "example"}Responses
Section titled “Responses”An identical submissionId was already stored — the replay is a success, not a conflict
object
object
Examplegenerated
{ "data": { "id": "example" }, "message": "example", "requestId": "example", "timestamp": "2026-04-15T12:00:00Z"}Stored (or accepted and discarded, for a honeypot hit)
object
Examplegenerated
{ "data": { "id": "example" }, "message": "example", "requestId": "example", "timestamp": "2026-04-15T12:00:00Z"}Validation failed — see errorCode / fieldErrors
object
Machine-readable error code (AUTH_ERROR_CODES).
Optional field-level validation errors, keyed by field name.
object
Example
{ "errorCode": "INVALID_EMAIL_FORMAT"}Internal error (no internal detail leaked)
object
Machine-readable error code (AUTH_ERROR_CODES).
Optional field-level validation errors, keyed by field name.
object
Example
{ "errorCode": "INVALID_EMAIL_FORMAT"}