Skip to content
contact.
FeaturesHow it worksDocsContact
Log inGet started

Guides

  • Getting started
  • Embedding
  • Field types and schema
  • File uploads
  • Delivery and integrations
  • Spam protection and limits
  • API reference
  • Troubleshooting & FAQ

Operations

  • Admin & self-hosting
Open dashboard →
API REFERENCE

API reference.

The public API has two endpoints for your forms. All responses are JSON, and errors follow the problem-details shape (type, title, status, detail).

Base URL

https://contact.kirandhakal.me

Endpoints

Method & pathPurposeAuth
POST /v1/forms/{publicKey}/submissionsCreate a submissionPublic key + allowed origin
POST /v1/forms/{publicKey}/uploadUpload a file, returns an uploadIdPublic key + allowed origin
GET /v1/submissions/{submissionId}Read a submission backBearer response token

Request headers

HeaderRequiredNotes
Content-Type: application/jsonYes (submissions)Omit for multipart uploads.
Idempotency-KeyRecommendedA unique value per submission; reuse on retry.
OriginBrowser requestsSet by the browser; must be allowlisted.

Create a submission

POST a JSON object whose keys match the form schema. See Embedding for full examples.

// 202 Accepted (first time) / 200 OK (idempotent replay)
{
  "status": "accepted",
  "message": "Thanks! We received your message.",
  "submissionId": "8c2f…-uuid",
  "responseUrl": "https://contact.kirandhakal.me/v1/submissions/8c2f…-uuid",
  "responseToken": "43-character-access-token"
}

On a first-time success Contact returns 202 with a submissionId, a responseUrl, and a responseToken. Replaying the same Idempotency-Key returns 200 without a new ID. Store the token if you want to let the submitter read the submission back; it is shown only once.

Upload a file

POST multipart/form-data with a single file part. The response includes uploadId, a temporary url, filename, mimetype, size, and expiresAt. Send the uploadId as a field value when you submit. See File uploads.

Read a submission

GET /v1/submissions/{submissionId} with Authorization: Bearer <responseToken> returns the submission’s id, status, payload, and createdAt. The request origin must still be allowlisted, and responses are never cached.

Status codes

CodeMeaningTypical cause
202AcceptedSubmission stored and delivery queued.
200OKIdempotent replay of an existing submission.
400Bad requestMalformed body or invalid idempotency key.
401UnauthorizedMissing or invalid response token.
403ForbiddenOrigin not in the allowlist; uploads disabled.
404Not foundUnknown or disabled form; expired submission.
413Payload too largeFile exceeds the size limit; storage quota reached.
422UnprocessableSchema validation failed; bad upload reference.
429Too many requestsRate limit or workspace allowance reached.
500Server errorUnexpected failure; safe to retry.
502Bad gatewayObject storage unavailable during upload.

Error body

Validation failures include an errors array with path, message, and keyword for each problem. Some errors also include a machine-readable code such as CONSENT_REQUIRED, INVALID_UPLOAD_REFERENCE, FILE_TOO_LARGE, UNSUPPORTED_FILE_TYPE, or STORAGE_QUOTA_EXCEEDED.

Previous Spam protection and limitsNextTroubleshooting & FAQ
contact.

Your frontend. Our form backend.

How to useIntegrationsContactTermsPrivacy policy
© 2026 ContactDesigned & developed by Kiran Dhakal