Skip to content

Marketing-site contact / early-access capture

POST
/contact
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.

Media typeapplication/json
object
email
required

The only required field. Lower-cased and format-checked.

string
<= 254 characters
firstName
string
<= 100 characters
lastName
string
<= 100 characters
budgetingApps

Unrecognised values are silently dropped rather than rejected.

Array<string>
<= 20 items
happiness

One of unhappy, okay, happy. Anything else is stored as empty rather than rejected.

string
features
string
<= 2000 characters
submissionId

Optional client-generated id, [A-Za-z0-9._-] only. Re-sending one answers 200 rather than creating a second submission.

string
<= 64 characters
website

HONEYPOT. A human leaves it empty; a non-empty value is accepted with a 201 and stored nowhere.

string
Examplegenerated
{
"email": "example",
"firstName": "example",
"lastName": "example",
"budgetingApps": [
"example"
],
"happiness": "example",
"features": "example",
"submissionId": "example",
"website": "example"
}

An identical submissionId was already stored — the replay is a success, not a conflict

Media typeapplication/json
object
data
required
object
id
required
string
message
string
requestId
required
string
timestamp
required
string format: date-time
Examplegenerated
{
"data": {
"id": "example"
},
"message": "example",
"requestId": "example",
"timestamp": "2026-04-15T12:00:00Z"
}

Stored (or accepted and discarded, for a honeypot hit)

Media typeapplication/json
object
data
required
One of:
object
id
required

The stored submission id — submissionId when a valid one was sent, else a server-minted uuid.

string
message
string
requestId
required
string
timestamp
required
string format: date-time
Examplegenerated
{
"data": {
"id": "example"
},
"message": "example",
"requestId": "example",
"timestamp": "2026-04-15T12:00:00Z"
}

Validation failed — see errorCode / fieldErrors

Media typeapplication/json
object
errorCode
required

Machine-readable error code (AUTH_ERROR_CODES).

string
Allowed values: INVALID_EMAIL_FORMAT USER_ALREADY_EXISTS INVALID_INVITE_CODE WRONG_PASSWORD USER_NOT_FOUND AUTHENTICATION_FAILED EXPIRED_CODE INVALID_CODE INVALID_PASSWORD VALIDATION_ERROR SIGNUP_FAILED DATABASE_ERROR SERVICE_UNAVAILABLE PLAID_ERROR IDEMPOTENCY_CONFLICT ACCOUNT_ALREADY_LINKED NOT_FOUND
message
required
string
fieldErrors

Optional field-level validation errors, keyed by field name.

object
key
additional properties
Array<string>
requestId
required
string
timestamp
required
string format: date-time
Example
{
"errorCode": "INVALID_EMAIL_FORMAT"
}

Internal error (no internal detail leaked)

Media typeapplication/json
object
errorCode
required

Machine-readable error code (AUTH_ERROR_CODES).

string
Allowed values: INVALID_EMAIL_FORMAT USER_ALREADY_EXISTS INVALID_INVITE_CODE WRONG_PASSWORD USER_NOT_FOUND AUTHENTICATION_FAILED EXPIRED_CODE INVALID_CODE INVALID_PASSWORD VALIDATION_ERROR SIGNUP_FAILED DATABASE_ERROR SERVICE_UNAVAILABLE PLAID_ERROR IDEMPOTENCY_CONFLICT ACCOUNT_ALREADY_LINKED NOT_FOUND
message
required
string
fieldErrors

Optional field-level validation errors, keyed by field name.

object
key
additional properties
Array<string>
requestId
required
string
timestamp
required
string format: date-time
Example
{
"errorCode": "INVALID_EMAIL_FORMAT"
}