Semantics
Lands a structured request in the provider's lead inbox. The provider's qualification pipeline runs automatically — scoring fit + urgency, suggesting follow-up timing. The contact details and service interest are persisted as a Lead row addressable later via `get_lead_status`.
Invariants
- Email is required. The lead is reachable later by email.
- AI qualification produces `urgency` and `fit` fields asynchronously; immediate response returns the lead_id without waiting for qualification.
- Submitting the same `(provider, email, service_id, message)` within 60s returns the same lead_id (idempotent window).
When to use
When the user has expressed interest in a service and wants the provider to follow up. Different from `request_quote` — `submit_request` is for vague interest; `request_quote` is when scope and budget are known.
Input schema
{
"type": "object",
"required": [
"name",
"email",
"message"
],
"properties": {
"name": {
"type": "string",
"minLength": 1
},
"email": {
"type": "string",
"format": "email"
},
"phone": {
"type": "string"
},
"budget": {
"type": "string"
},
"source": {
"type": "string",
"description": "Where the request originated (e.g. 'agent-claude')."
},
"message": {
"type": "string",
"maxLength": 5000,
"minLength": 1
},
"timeline": {
"type": "string",
"description": "Free-text desired timeline."
},
"service_id": {
"type": "string",
"description": "Optional service the lead is asking about. From list_services."
},
"agent_vendor": {
"type": "string"
}
},
"additionalProperties": false
}Output schema
{
"type": "object",
"required": [
"ok"
],
"properties": {
"ok": {
"type": "boolean"
},
"error": {
"enum": [
"invalid_email",
"invalid_input",
"tenant_not_found"
],
"type": "string"
},
"status": {
"enum": [
"new",
"qualified",
"contacted",
"won",
"lost",
"spam"
],
"type": "string"
},
"lead_id": {
"type": "string"
},
"qualification": {
"type": "object",
"properties": {
"fit": {
"enum": [
"weak",
"ok",
"strong"
],
"type": "string"
},
"summary": {
"type": "string"
},
"urgency": {
"enum": [
"low",
"medium",
"high",
"critical"
],
"type": "string"
}
}
},
"owner_response_expected_within_hours": {
"type": "number"
}
}
}