---
title: "Submit Site Intake"
method: POST
path: "/site-intake"
tags: ["site-intake"]
---

# Submit Site Intake

`POST /site-intake`

## Request

- Base URL: `https://api.verdun.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.verdun.ai/site-intake`
- Auth: none declared

Store passwords, then email the fixed inbox; both must succeed. The receipt
to the submitter is best-effort.

## Request body

- CreateSiteIntakeRequest
  - `submitter` Submitter, required
    - `name` string, required: Full name of the person submitting.
    - `company` string, required: Their company (customer or dealer).
    - `email` string, email, required: Reply-To for the internal email; receives the receipt.
    - `phone` string, required: Phone number to reach the submitter.
  - `sites` Site[], required: Sites to onboard.
    - `name` string, required: Site name as it should appear on reports.
    - `address` string, required: Street address.
    - `city` string, required: City.
    - `state` string, required: State.
    - `zip_code` string, required: ZIP code.
    - `hours` union, required: When the site should be watched.
      - SameHours
        - `mode` 'same', required: The same hours on every watched day.
        - `all_day` boolean, required: Watched around the clock on the chosen days.
        - `start` string: Start time, 24-hour HH:MM (unless all_day).
        - `end` string: End time, 24-hour HH:MM; earlier than start means overnight.
        - `days` string[], required: Weekdays watched, each at most once.
      - ByDayHours
        - `mode` 'by_day', required: Different hours on different days.
        - `days` DayHours[], required: One row per weekday, each at most once.
          - `day` 'Mon' | 'Tue' | 'Wed' | 'Thu' | 'Fri' | 'Sat' | 'Sun', required: Weekday this row covers; hours belong to the day they start.
          - `monitored` boolean, required: Whether the site is watched on this day.
          - `all_day` boolean, required: Watched for the full 24 hours; start/end are then ignored.
          - `start` string: Start time, 24-hour HH:MM.
          - `end` string: End time, 24-hour HH:MM; earlier than start means overnight.
    - `connection` Connection, required
      - `vpn` boolean, required: Customer prefers a site-to-site VPN over forwarded ports.
      - `cellular` boolean, required: Site runs on cellular or a trailer (bandwidth-limited).
      - `recorder` string: NVR/VMS or camera brand.
      - `host` string: Public IP or hostname of the recorder or cameras.
      - `port` string: Forwarded port(s), e.g. RTSP 554.
      - `username` string: Recorder login (ideally a view-only account for Verdun).
      - `password` string, password: Recorder password; stored in Secrets Manager, never emailed.
      - `camera_count` string: Number of cameras, as stated by the customer.
      - `tech_contact` string: Who to ask about cameras/network when details are missing.
      - `cameras` Camera[]: Per-camera rows, usually from an imported spreadsheet.
        - `name` string: Camera label or channel name.
        - `host` string: Camera IP or hostname, when not reached through the recorder.
        - `port` string: Camera port(s), when not the recorder's.
        - `username` string: Camera login, when not the recorder's.
        - `password` string, password: Camera password; stored in Secrets Manager, never emailed.
        - `notes` string: Anything specific to this camera.
    - `details` SiteDetails, required
      - `property_type` string: Site type (platform SiteType value).
      - `holidays` string[]: Holiday catalog keys to watch around the clock.
      - `concerns` string[]: What the customer is most worried about.
      - `response` string: Preferred response when someone shouldn't be there.
      - `normal_activity` string: Normal activity operators should ignore.
      - `camera_notes` string: Cameras needing special handling.
      - `pause_code` string: Wants a staff pause code: yes, no, or unsure.
      - `speakers` string: Speakers on site: yes, no, or unsure.
      - `speaker_list` Speaker[]: Speaker details when speakers is yes.
        - `name` string: Speaker name or location.
        - `host` string: Speaker IP or hostname.
        - `port` string: Speaker port (usually 443).
        - `username` string: Speaker login.
        - `password` string, password: Speaker password; stored in Secrets Manager, never emailed.
        - `model` string: Speaker model, e.g. Axis C1310-E.
        - `covers` string: Cameras this speaker covers.
      - `guard` string: Guard on site: yes, no, or unsure.
      - `guard_company` string: Guard company, when guard is yes.
      - `guard_phone` string: Guard dispatch phone, when guard is yes.
      - `guard_notes` string: Guard uniform and patrol times.
      - `police_direct_dispatch_line` string: Direct police dispatch line, if the customer has one.
      - `police_notes` string: Alarm permit number or other police notes.
  - `contacts` Contact[]: Call list, in order.
    - `order` integer, required: Position in the call list, 1 = called first.
    - `first_name` string, required: First name.
    - `last_name` string: Last name.
    - `role` string: Role, e.g. General manager.
    - `phone` string, required: Mobile phone.
    - `afterhours_phone` string: After-hours phone; defaults to the mobile phone.
    - `email` string: Email; contacts with one get the nightly report.
    - `preference` 'call' | 'text' | 'email': How they prefer to be reached.
    - `site` string: Site name this contact is for; empty means all sites.
    - `app_access` boolean: Wants a login to the Verdun app.
  - `client` Client, required
    - `end_customer` string: Dealer's client business name; internal only.
    - `app_branding` string: Dealer wants its name and logo on the app: yes, no, or discuss.
  - `reporting` Reporting, required
    - `emails` string: Extra nightly-report recipients, comma separated.
    - `send_local_time` string: Nightly report time, site-local HH:MM.
    - `start_date` string: Requested monitoring start date.
    - `current_provider` string: Current monitoring company, if switching.
    - `cutover_date` string: When the current provider's service ends.
    - `parallel_run` boolean: Run alongside the current provider before switching.
    - `notes` string: Anything else.
  - `imported_from` string: Spreadsheet file name, when the form was filled by import.
  - `authorized` true, required: Submitter confirmed they may grant Verdun access.
  - `contact_reference` string: Honeypot; leave empty.

## Response `200`

Successful Response

- CreateSiteIntakeResponse
  - `status` 'ok': Onboarding details accepted.

## Other responses

- `413`: Request body exceeds the 1 MiB limit.
- `422`: Validation Error
- `429`: Too many submissions from this IP, or from all sources this hour.
- `502`: Passwords could not be stored or the Verdun inbox did not accept the email.

---

[API](https://skmtc.dev/verdun/apis/verdun-api.md) - [All operations](https://skmtc.dev/verdun/apis/verdun-api/llms.txt) - [OpenAPI document](https://skmtc.dev/verdun/apis/verdun-api/revisions/35a2a6ebedda?raw)
