---
title: "Submit an application"
method: POST
path: "/api/public/v1/applications"
tags: ["Applications"]
---

# Submit an application

`POST /api/public/v1/applications`

## Request

- Base URL: `https://www.vaheroesph.com`
- URL: `https://www.vaheroesph.com/api/public/v1/applications`
- Auth: none required

WRITE. Validates and stores a job application. Rate limited to 5 submissions per 10 minutes per client, protected by an anti-spam honeypot field, and idempotent: resubmitting identical content returns the original receipt with 200 instead of creating a duplicate. Submissions are stored privately and are never readable through this API.

## Request body

- ApplicationRequest: Fields accepted when submitting a job application. Unknown properties are rejected.
  - `fullName` string, required: Applicant's full name.
  - `email` string, email, required: Contact email address.
  - `phone` string: Optional contact phone number.
  - `heroPathSlug` 'general-va' | 'highlevel' | 'executive-assistant' | 'loan-processing' | 'bookkeeping-va' | 'shopify-va' | 'loan-officer': Optional slug of the Hero Path the applicant is interested in.
  - `message` string: Optional message from the applicant.
  - `website` string: Anti-spam honeypot. Must be empty or omitted; any value rejects the request.

## Response `200`

An identical submission already existed; the original receipt is returned (idempotent).

- SubmissionReceipt: Confirmation that a submission was stored. Deliberately echoes none of the submitted personal data and exposes no internal database fields.
  - `data` object, required: Receipt for the stored submission. Never echoes the submitted content.
    - `id` string, uuid, nullable, required: Identifier of the stored submission.
    - `createdAt` string, date-time, nullable, required: When the submission was stored.
    - `status` 'received', required: Always "received".
    - `duplicate` boolean, required: True when an identical submission already existed; no new record was created.

## Other responses

- `201`: Submission stored.
- `400`: One or more query parameters are invalid.
- `413`: Request body larger than 32 KB.
- `422`: The request body failed server-side validation.
- `429`: Too many submissions from this client.
- `500`: Unexpected server error.
- `504`: The backend did not respond in time.

---

[API](https://skmtc.dev/vaheroesph/apis/va-heroes-ph-public-content-api.md) · [All operations](https://skmtc.dev/vaheroesph/apis/va-heroes-ph-public-content-api/llms.txt) · [OpenAPI document](https://skmtc.dev/vaheroesph/apis/va-heroes-ph-public-content-api/revisions/65ddf4d10897?raw)
