← capabilitiesleads.write

submit_request

leads.submit_request · v0.1.0

Submit a structured inbound request (lead) to a LeadKit provider.

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"
    }
  }
}

Recent conformance runs

passprovidertestmswhen
leadkit:ridgeline-roofingrejects_missing_message005-18 19:52
leadkit:ridgeline-roofingrejects_invalid_email005-18 19:52
leadkit:ridgeline-roofinghappy_path19205-18 19:52
leadkit:north-bureaurejects_missing_message005-18 19:52
leadkit:north-bureaurejects_invalid_email005-18 19:52
leadkit:north-bureauhappy_path17805-18 19:52
leadkit:june-fieldingrejects_missing_message005-18 19:52
leadkit:june-fieldingrejects_invalid_email005-18 19:52
leadkit:june-fieldinghappy_path74705-18 19:52