Score leads
Sales reps waste their best hours on leads that were never going to buy, while a serious buyer sits three rows down in the same spreadsheet unopened. This endpoint reads what a lead actually wrote — a form field, a chat transcript, a cold email reply — and returns a ranked score so the right conversation happens first.
Run it online
Run this on our servers with your account. Free tools run in your browser; this one bills your KIT balance per the price above.
The problem: every lead looks the same in a CRM
A CRM row treats 'just looking, thanks' and 'we need this live before our board meeting' as identical objects until a human reads both. Sales teams with real volume can't read every submission carefully, so scoring by field length, source, or a static rulebook becomes the default — and it misses intent that only shows up in the language itself.
What it reads and what it returns
You POST the lead's text — a form response, a chat log, an inbound email — and the task extracts signals like urgency, budget language, decision-making authority and stated problem fit, then returns a numeric score plus the reasoning behind it. That reasoning matters more than the number: a rep can glance at why a lead scored high and open the call already knowing what to ask.
Who actually needs this
Sales development teams fielding more inbound than they can triage by hand, marketing teams trying to prove which channels bring buyers rather than browsers, and founders doing their own sales who need to know which of twenty overnight signups to call first. It fits anywhere text arrives faster than a human can read it with full attention.
Lead scoring didn't start with software
Sales teams have ranked prospects informally for as long as sales has existed — a good rep always had a gut sense of who was serious. Formal lead scoring emerged as marketing automation scaled inbound volume past what gut instinct could track; this endpoint applies that same judgment to the raw text a lead leaves behind, at whatever volume arrives.
Fitting into an automated funnel
Because scores return as structured data through a webhook, they slot straight into CRM fields, routing rules or Slack alerts — a high score can trigger an immediate notification while a low score quietly enters a nurture sequence, all without a rep touching a single unscored lead.
What you can do with it
Triaging overnight inbound
A SaaS team wakes up to forty demo requests and uses scores to call the five that show real urgency and budget language first.
Proving channel quality to marketing
A revenue team compares average scores by traffic source to show which campaigns bring buyers instead of just volume.
Solo founders doing their own sales
A founder fielding signups directly uses the score to decide which five conversations to personally take this week.
Routing chat transcripts to the right rep
A support-turned-sales chat gets scored automatically so high-intent conversations escalate to a closer instead of sitting in a general queue.
FAQ
How does the lead scoring API work?
You POST the lead's written text to /text/lead-score, the task runs asynchronously, and you get back a numeric score with the reasoning behind it via webhook or signed link.
Is it free to try?
There's no free tier — free tiers get abused and slow everyone down. Access runs on a prepaid ForHosting KIT balance: top up from $10.00 (it never expires) and each request is charged at its published price, so a call with no balance returns HTTP 402. No subscription, no tokens, no invented credits, and a failed task is never charged.
What kind of text can I score?
Any inbound text tied to a lead: contact form fields, chat transcripts, cold email replies or survey responses.
Does it replace my CRM's lead scoring rules?
It complements rule-based scoring by adding a language-driven signal from the actual text, which you can combine with firmographic or behavioral rules already in your CRM.
Can I score leads in bulk?
Yes, requests are priced per request plus per item, so a batch of leads can be submitted and scored together.
Am I charged if scoring fails?
No. Failed tasks retry automatically up to three times and are never charged; you pay only for scores actually delivered.
How do I get the score back into my system?
Via a signed webhook, which is recommended for automated routing, or a signed link valid for 24 hours for manual review.
Does this work for languages other than English?
The endpoint reads the text as written, so scoring quality depends on there being enough written signal in the language submitted.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, and soon from our app, email and Telegram.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/text/lead-score \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"items":["valor-1","valor-2"]}'const res = await fetch("https://api.kit.forhosting.com/text/lead-score", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"items": [
"valor-1",
"valor-2"
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/text/lead-score",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"items": [
"valor-1",
"valor-2"
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/text/lead-score", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"items":["valor-1","valor-2"]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"items":["valor-1","valor-2"]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/text/lead-score", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"items": [
"valor-1",
"valor-2"
]
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "text.lead_score",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_tokens | 20000 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
422 | task_failed | The task failed after 3 retries. You are never charged for it. |