---
title: "Submit a staffing quote request (the API's only write operation)"
method: POST
path: "/api/v1/quote-requests"
tags: ["Quote Submission"]
---

# Submit a staffing quote request (the API's only write operation)

`POST /api/v1/quote-requests`

## Request

- Base URL: `https://mcp.tempguru.co`
- URL: `https://mcp.tempguru.co/api/v1/quote-requests`
- Auth: none declared

Use this when, and only when, the user has explicitly confirmed they want to submit a staffing request to TempGuru. This is the single write operation in this API; everything else is a read-only lookup. It creates a structured lead for human review, and a human coordinator replies with a quote within one business day (orders confirm within 48 hours of approval). **Opt-in by design:** collect the contact details and the event plan, show the user exactly what will be submitted, and call this once after explicit confirmation, never speculatively. **Not a reservation:** it does not hold staff, guarantee pricing or availability, or create a contract, and **no payment** is required until the user approves the quote. Contact and event details go to TempGuru's CRM or its durable fallback queue and configured notification processor so a coordinator can reply; they are never written to telemetry or analytics. Build the plan first with the read operations (cities, roles, pricing, availability, compliance). Lightly rate limited per source IP, on HTTP 429, respect `Retry-After` and fall back to the form at https://tempguru.co/get-staffing.

## Request body

- QuoteRequestInput: A buyer-submitted staffing plan plus the contact details a coordinator needs to reply. This REST write schema is intentionally separate from the authless MCP request_quote handoff, which accepts no contact details.
  - `contact_name` string, required: Full name of the contact person
  - `contact_email` string, email, required: Contact email address for the quote response
  - `contact_phone` string: Optional phone number for the coordinator to reach the buyer (event ops is phone-first; include when known)
  - `company` string, required: Company or organization name
  - `event_name` string, required: Name of the event (e.g. 'HIMSS 2026', 'Brand Fest Austin')
  - `event_type` string, required: Event type: trade-show, conference, festival, concert, sporting-event, corporate, brand-activation, or other
  - `city` string, required: City where the event is held
  - `event_dates` string, required: Event dates as a human-readable string, e.g. 'June 15–17, 2026'
  - `venue` string: Primary venue name and/or address, when known
  - `attendees` integer: Expected event attendance, if known (informs coverage ratios)
  - `roles` object[], required: Roles and headcount needed for the event
    - `role` string, required: Staffing role name, e.g. brand-ambassadors, registration-staff
    - `headcount` integer, required: Number of staff needed
    - `shifts` string: Shift description, e.g. '2 days × 8h'
  - `locations` object[]: Additional cities for a multi-city / tour program. The top-level city, dates, and roles describe the primary or first location; each entry here adds another.
    - `city` string, required: City for this leg of a multi-city program
    - `venue` string: Venue for this location, if known
    - `event_dates` string: Dates for this location, if they differ from the top-level dates
    - `roles` object[]: Roles for this location if they differ from the top-level roles
      - `role` string, required: Staffing role name
      - `headcount` integer, required: Number of staff needed at this location
      - `shifts` string: Shift description for this location
  - `budget_range` string: Estimated total budget range if calculated, e.g. '$8,400–$12,600'
  - `attire` string: Staff attire requirements
  - `special_requirements` string: Any special requirements: language skills, certifications, overnight shifts, etc.
  - `compliance_notes` string: Any compliance flags surfaced by get_compliance_by_state
  - `source_platform` 'ai-agent' | 'ai-page' | 'ai-page-zh' | 'baidu-agent' | 'chatgpt-app' | 'chatgpt-gpt' | 'claude-ai' | 'claude-code' | 'claude-desktop' | 'cn-agent' | 'copilot-agent' | 'coze' | 'coze-bot' | 'custom-gpt' | 'gemini' | 'gemini-cli' | 'gemini-gem' | 'hermes' | 'kimi' | 'langchain' | 'lechat-agent' | 'llamaindex' | 'manual-test' | 'meta-ai' | 'mcp-handoff' | 'open-webui' | 'openai-codex' | 'openclaw' | 'perplexity-space' | 'pi' | 'poe-bot' | 'postman' | 'prime-agent' | 'python-client' | 'skill' | 'team-demo' | 'website' | 'website-widget' | 'zhipu-agent' | 'openai-chatgpt' | 'openai-agents-sdk' | 'openai-mcp' | 'cursor' | 'cline' | 'windsurf' | 'perplexity' | 'qwen-ecosystem' | 'deepseek' | 'doubao' | 'mcp-client': Optional agent/platform attribution, e.g. chatgpt-gpt, claude-desktop, coze
  - `utm_source` 'ai-agent': Canonical acquisition source carried by a TempGuru-generated buyer handoff URL
  - `utm_medium` 'mcp' | 'rest' | 'ai-agent' | 'ai-page' | 'ai-page-zh' | 'baidu-agent' | 'chatgpt-app' | 'chatgpt-gpt' | 'claude-ai' | 'claude-code' | 'claude-desktop' | 'cn-agent' | 'copilot-agent' | 'coze' | 'coze-bot' | 'custom-gpt' | 'gemini' | 'gemini-cli' | 'gemini-gem' | 'hermes' | 'kimi' | 'langchain' | 'lechat-agent' | 'llamaindex' | 'manual-test' | 'meta-ai' | 'mcp-handoff' | 'open-webui' | 'openai-codex' | 'openclaw' | 'perplexity-space' | 'pi' | 'poe-bot' | 'postman' | 'prime-agent' | 'python-client' | 'skill' | 'team-demo' | 'website' | 'website-widget' | 'zhipu-agent' | 'openai-chatgpt' | 'openai-agents-sdk' | 'openai-mcp' | 'cursor' | 'cline' | 'windsurf' | 'perplexity' | 'qwen-ecosystem' | 'deepseek' | 'doubao' | 'mcp-client': Canonical agent runtime or MCP/REST medium carried by the buyer handoff URL
  - `utm_campaign` 'quote-handoff': Canonical TempGuru buyer-handoff campaign
  - `utm_content` 'mcp' | 'rest': Canonical originating MCP or REST channel for an attributed handoff
  - `skill_version` string: Optional version of the TempGuru staffing skill used to assemble this request
  - `skill_id` 'event-staffing-ordering' | 'event-staffing-compliance' | 'staffing-plan-from-event-brief' | 'urgent-event-backfill' | 'staffing-agency-partner-growth' | 'multi-city-activation-planner' | 'event-staffing-procurement' | 'tempguru-pro-operations': Optional canonical TempGuru skill slug that assembled this request
  - `plan_id` string: Optional plan_id returned by plan_staffing or save_staffing_plan; links the submitted quote to its saved non-PII plan

## Response `200`

Request accepted into TempGuru's CRM or durable intake queue for human review. Relay `message` and `next_steps` to the user.

- QuoteRequestConfirmation
  - `submitted` true, required
  - `plan_linked` boolean, required: True when the submitted plan_id resolved and its snapshot was attached.
  - `deal_name` string, required: Internal name assigned to the lead in TempGuru's CRM.
  - `reference` string, required: Quote reference to save and cite when following up.
  - `message` string, required: Human-readable confirmation to relay to the user.
  - `next_steps` string[], required: What happens next, relay to the user.

## Other responses

- `400`: Missing or invalid field (including a malformed contact email).
- `403`: The request carried a browser Origin that is not approved for quote submission.
- `413`: Request body larger than 64 KB.
- `415`: The request body is not encoded as application/json.
- `429`: Rate limit exceeded for this source IP. Respect Retry-After, then retry or fall back to https://tempguru.co/get-staffing.
- `502`: TempGuru's CRM could not be reached; the request was NOT recorded. Relay `message`, it contains direct contact fallbacks (email/phone).

---

[API](https://skmtc.dev/tempguru/apis/tempguru-public-data-api.md) · [All operations](https://skmtc.dev/tempguru/apis/tempguru-public-data-api/llms.txt) · [OpenAPI document](https://skmtc.dev/tempguru/apis/tempguru-public-data-api/revisions/5969f4556a32?raw)
