{"openapi":"3.1.0","info":{"title":"Shortlist API","version":"0.1.0","description":"A fully local resume/job-application toolkit: ATS keyword matching, resume readability analysis, action-verb suggestions, a bullet-point improver, cover-letter opener templates, an interview question bank, the STAR method guide, resume section checklists, common resume mistakes, and salary-negotiation scripts.\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://shortlist.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"hr@unifydynamics.com","url":"https://connectorbay.com/shortlist/docs"},"termsOfService":"https://connectorbay.com/shortlist/terms"},"servers":[{"url":"https://shortlist.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/shortlist/docs"},"security":[{},{"bearer":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/ats_keyword_match":{"post":{"operationId":"ats_keyword_match","summary":"Extracts meaningful keywords/skills from a job description (tokenization, stopword removal, and a","description":"Extracts meaningful keywords/skills from a job description (tokenization, stopword removal, and a\n    multi-word noun-phrase heuristic — not a fixed lookup table) and checks which appear in the resume text.\n    Returns a match percentage, the matched keywords, and the missing keywords worth considering. Use for\n    \"does my resume match this job posting\", \"what keywords am I missing for this job\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"resume_text":{"description":"The candidate's resume text (plain text).","minLength":1,"title":"Resume Text","type":"string"},"job_description_text":{"description":"The job posting/description text to match against.","minLength":1,"title":"Job Description Text","type":"string"}},"required":["resume_text","job_description_text"],"title":"ats_keyword_matchArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/resume_readability":{"post":{"operationId":"resume_readability","summary":"Analyzes a resume's bullet points: average bullet length, strong action-verb openers vs weak openers","description":"Analyzes a resume's bullet points: average bullet length, strong action-verb openers vs weak openers\n    (\"responsible for\", \"worked on\", ...), a passive-voice heuristic, and the percentage of bullets that\n    contain a number or metric. Use for \"is my resume well written\", \"check my resume bullets\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"resume_text":{"description":"Resume text, one bullet point per line.","minLength":1,"title":"Resume Text","type":"string"}},"required":["resume_text"],"title":"resume_readabilityArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/action_verb_suggestions":{"post":{"operationId":"action_verb_suggestions","summary":"Suggests strong action verbs from a hand-curated, categorized library of 150+ verbs, given either a","description":"Suggests strong action verbs from a hand-curated, categorized library of 150+ verbs, given either a\n    weak phrase to replace (e.g. \"responsible for\", \"helped with\") or a category name directly. Use for\n    \"give me stronger verbs than 'responsible for'\", \"leadership action verbs for a resume\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"weak_phrase_or_category":{"description":"A weak phrase like 'responsible for', or a category: leadership, achievement, communication, technical, analytical, creative, organizational, collaboration, improvement.","minLength":1,"title":"Weak Phrase Or Category","type":"string"}},"required":["weak_phrase_or_category"],"title":"action_verb_suggestionsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/bullet_point_improver":{"post":{"operationId":"bullet_point_improver","summary":"Heuristic suggestions for improving a single resume bullet: flags a missing metric, a weak opener, and","description":"Heuristic suggestions for improving a single resume bullet: flags a missing metric, a weak opener, and\n    possible passive voice, and shows the STAR/XYZ template (\"Accomplished X as measured by Y by doing Z\")\n    with a worked example. Use for \"how can I improve this bullet point\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"bullet_text":{"description":"One resume bullet point to analyze.","minLength":1,"title":"Bullet Text","type":"string"}},"required":["bullet_text"],"title":"bullet_point_improverArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/cover_letter_opener":{"post":{"operationId":"cover_letter_opener","summary":"Fill-in-the-blank cover-letter opening-paragraph templates — achievement-focused, connection/referral-","description":"Fill-in-the-blank cover-letter opening-paragraph templates — achievement-focused, connection/referral-\n    focused, mission-alignment-focused, or problem-solver-focused. A structural template to adapt with your\n    own true details, not a finished, AI-written letter. Use for \"give me a cover letter opener for X at Y\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"role":{"description":"The job title/role being applied for.","minLength":1,"title":"Role","type":"string"},"company":{"description":"The company name.","minLength":1,"title":"Company","type":"string"},"hook_type":{"default":"achievement","description":"achievement | connection | mission | problem-solver","title":"Hook Type","type":"string"}},"required":["role","company"],"title":"cover_letter_openerArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/interview_questions":{"post":{"operationId":"interview_questions","summary":"A hand-curated bank of common interview questions by role category and question type (90 questions","description":"A hand-curated bank of common interview questions by role category and question type (90 questions\n    total across 6 role categories x 3 types). Use for \"give me behavioral interview questions for a sales\n    role\", \"situational questions for a management interview\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"role_category":{"description":"software-engineering | sales | marketing | management | customer-service | general","title":"Role Category","type":"string"},"question_type":{"default":"behavioral","description":"behavioral | technical-general | situational | all","title":"Question Type","type":"string"}},"required":["role_category"],"title":"interview_questionsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/star_method_guide":{"post":{"operationId":"star_method_guide","summary":"Explains the STAR (Situation, Task, Action, Result) interview-answer framework with a full worked","description":"Explains the STAR (Situation, Task, Action, Result) interview-answer framework with a full worked\n    example and tips for prepping stories in advance. Use for \"what's the STAR method\", \"how do I structure\n    a behavioral interview answer\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"star_method_guideArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/resume_section_checklist":{"post":{"operationId":"resume_section_checklist","summary":"The expected sections and order for a chronological, functional, or combination resume, with what","description":"The expected sections and order for a chronological, functional, or combination resume, with what\n    each section should contain and who each format best suits. Use for \"what sections should my resume\n    have\", \"how do I structure a functional resume\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"resume_type":{"default":"chronological","description":"chronological | functional | combination","title":"Resume Type","type":"string"}},"title":"resume_section_checklistArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/common_resume_mistakes":{"post":{"operationId":"common_resume_mistakes","summary":"A hand-curated list of common resume mistakes with fixes, by category (formatting, content, ATS-","description":"A hand-curated list of common resume mistakes with fixes, by category (formatting, content, ATS-\n    compatibility, tone), or every category if none is given. Use for \"what are common resume mistakes\",\n    \"resume formatting mistakes to avoid\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"category":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"formatting | content | ats-compatibility | tone; omit for all categories.","title":"Category"}},"title":"common_resume_mistakesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/salary_negotiation_scripts":{"post":{"operationId":"salary_negotiation_scripts","summary":"Example scripts and phrasing for common salary-negotiation scenarios — starting-point templates to","description":"Example scripts and phrasing for common salary-negotiation scenarios — starting-point templates to\n    adapt with your own numbers and voice, not guaranteed outcomes. Use for \"how do I negotiate a job offer\",\n    \"what do I say to counter a low offer\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"scenario":{"description":"initial-offer-response | counter-offer | competing-offer-leverage | benefits-instead-of-salary","title":"Scenario","type":"string"}},"required":["scenario"],"title":"salary_negotiation_scriptsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}