Job Posting Analysis
Read a job posting from a URL or text: title, skills, salary range, remote policy, benefits, culture signals and red flags.
job-posting-analyze Example
{
"title": null,
"company": null,
"summary": "This job posting is invalid and contains no actual job description, requirements, or details. It cannot be meaningfully analyzed. A complete resubmission with actual job posting content is required.",
"benefits": [],
"location": null,
"red_flags": [
"Job posting contains no substantive content",
"Insufficient information to evaluate the position"
],
"source_url": "https://example.com",
"salary_range": {
"max": null,
"min": null,
"period": "annual",
"currency": null
},
"remote_policy": "not-specified",
"salary_source": "estimated",
"culture_signals": [],
"employment_type": null,
"required_skills": [],
"seniority_level": null,
"experience_years": {
"max": null,
"min": null
},
"preferred_skills": [],
"education_requirement": null
} Inputs
| Field | Type | Required | What it is |
|---|---|---|---|
url | string | No | — |
text | string | No | — |
Output fields
How reliably each field appears in a successful answer.
| Field | Type | Appears |
|---|---|---|
title | string | Always (present in every successful answer) |
red_flags | array | Always (present in every successful answer) |
salary_range | object | Always (present in every successful answer) |
culture_signals | array | Always (present in every successful answer) |
required_skills | array | Always (present in every successful answer) |
How to call it
The same tool through each route. MCP clients reach it through Strale’s server at https://api.strale.io/mcp; the call below is what the agent sends.
# Needs an API key. max_price_cents caps what this call may cost.
curl -X POST https://api.strale.io/v1/do \
-H "Authorization: Bearer $STRALE_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"capability_slug": "job-posting-analyze",
"inputs": {
"text": "Senior Software Engineer — Remote (EU)\nWe are looking for a Senior Software Engineer to join our platform team.\nResponsibilities: Design and build scalable APIs, mentor junior engineers.\nRequirements: 5+ years experience, TypeScript/Node.js expertise, PostgreSQL.\nSalary: €80,000–€110,000. Benefits: stock options, 30 days PTO, health insurance.\nApply at: careers@example.com"
},
"max_price_cents": 20
}' {
"tool": "strale_execute",
"arguments": {
"slug": "job-posting-analyze",
"inputs": {
"text": "Senior Software Engineer — Remote (EU)\nWe are looking for a Senior Software Engineer to join our platform team.\nResponsibilities: Design and build scalable APIs, mentor junior engineers.\nRequirements: 5+ years experience, TypeScript/Node.js expertise, PostgreSQL.\nSalary: €80,000–€110,000. Benefits: stock options, 30 days PTO, health insurance.\nApply at: careers@example.com"
},
"max_price_cents": 20
}
} import { Strale } from "straleio";
const strale = new Strale({ apiKey: process.env.STRALE_API_KEY! });
const result = await strale.do({
capability_slug: "job-posting-analyze",
inputs: {
"text": "Senior Software Engineer — Remote (EU)\nWe are looking for a Senior Software Engineer to join our platform team.\nResponsibilities: Design and build scalable APIs, mentor junior engineers.\nRequirements: 5+ years experience, TypeScript/Node.js expertise, PostgreSQL.\nSalary: €80,000–€110,000. Benefits: stock options, 30 days PTO, health insurance.\nApply at: careers@example.com"
},
max_price_cents: 20,
}); import os
from straleio import Strale, DoRequest
strale = Strale(api_key=os.environ["STRALE_API_KEY"])
result = strale.do(DoRequest(
capability_slug="job-posting-analyze",
inputs={
"text": "Senior Software Engineer — Remote (EU)\nWe are looking for a Senior Software Engineer to join our platform team.\nResponsibilities: Design and build scalable APIs, mentor junior engineers.\nRequirements: 5+ years experience, TypeScript/Node.js expertise, PostgreSQL.\nSalary: €80,000–€110,000. Benefits: stock options, 30 days PTO, health insurance.\nApply at: careers@example.com",
},
max_price_cents=20,
)) # No account. The first request answers 402 with the price in USDC;
# an x402 client pays it from your wallet and repeats the request.
curl -i 'https://api.strale.io/x402/v2/job-posting-analyze?text=Senior+Software+Engineer+%E2%80%94+Remote+%28EU%29%0AWe+are+looking+for+a+Senior+Software+Engineer+to+join+our+platform+team.%0AResponsibilities%3A+Design+and+build+scalable+APIs%2C+mentor+junior+engineers.%0ARequirements%3A+5%2B+years+experience%2C+TypeScript%2FNode.js+expertise%2C+PostgreSQL.%0ASalary%3A+%E2%82%AC80%2C000%E2%80%93%E2%82%AC110%2C000.+Benefits%3A+stock+options%2C+30+days+PTO%2C+health+insurance.%0AApply+at%3A+careers%40example.com' Limitations
Salary and seniority are inferred from wording
AI analysis of job posting text — salary estimates and seniority inference are based on language patterns, not verified data
What to do instead: Compare inferred salary ranges with current local compensation surveys.
Pages are limited to 16 MiB of HTML
Pages with more than 16 MiB of HTML are refused with a caller_input error naming the input field. The call is not charged, and the page is not retried through another fetch or rendering route.