{"meta":{"api_name":"Resume Scanner Pro API","version":"1.0.1","description":"Dual-engine ATS Scanner using TF-IDF (Strict Mode) and SBERT (Flexible AI Mode).","status":"Online","maintained_by":"Silvio Christian, Joe","base_url":"https://silvio0-resume-scanner.hf.space","documentation_url":"https://silvio0-resume-scanner.hf.space/docs"},"endpoints":{"/extract":{"method":"POST","full_url":"https://silvio0-resume-scanner.hf.space/extract","summary":"PDF Text Extraction","description":"Upload a PDF resume to extract raw text. Checks for page count warnings.","content_type":"multipart/form-data","usage_example":"curl -X POST 'https://silvio0-resume-scanner.hf.space/extract' -F 'cv_file=@/path/to/resume.pdf'","request_body":{"cv_file":{"type":"File (Binary)","required":true,"format":".pdf","description":"The resume file to be processed. Must be a valid PDF document."}},"response_structure":{"total_pages":"Integer - Total number of pages (Page Count) detected in the PDF.","Info":"String - Feedback advice based on the total page count (e.g., 'Optimal' if 1 page, 'Warning' if multiple pages).","cv_text":"String - The full raw text extracted from all pages, joined by newlines."},"error_responses":{"400 - Encrypted PDF":"Returns '🔒 Encrypted PDF Detected' if the file is password protected.","400 - Invalid File":"Returns '❌ Invalid or Corrupt File' if the upload is not a valid PDF or header is broken.","400 - Empty File":"Returns '⚠️ Empty File' if the uploaded file contains no data (0 bytes).","400 - Processing Error":"Returns '⚠️ Processing Error' for unexpected parsing issues (e.g., PyPDF2 failure)."}},"/analyze":{"method":"POST","full_url":"https://silvio0-resume-scanner.hf.space/analyze","summary":"Resume vs Job Description Analysis","description":"Calculates match score, identifies keywords, and validates critical skills.","content_type":"application/x-www-form-urlencoded","usage_example":"curl -X POST 'https://silvio0-resume-scanner.hf.space/analyze' -d 'cv_text=raw_text_here' -d 'jd_text=job_desc_here' -d 'mode=strict'","request_body":{"cv_text":{"type":"String","required":true,"description":"Raw text of the CV (Result from /extract endpoint). System will auto-clean newlines."},"jd_text":{"type":"String","required":true,"description":"Raw text of the Job Description. System will auto-clean newlines."},"mode":{"type":"String (Enum)","options":["strict","flexible"],"default":"strict","description":"strict = Exact Keyword Match (TF-IDF). flexible = Contextual Match (AI/SBERT)."},"manual_keywords":{"type":"List[String]","required":false,"description":"Optional list of MUST-HAVE skills. Accepts comma-separated values (e.g. 'Python, SQL'). If empty, defaults to Top 5 JD words."}},"response_structure":{"score":"Float (0.00 - 100.00) - Final Match Percentage.","mode":"String - The analysis mode used.","missing_keywords":"List[String] - General keywords found in Job Description but missing in CV.","available_keywords":"List[String] - All keywords extracted from the Job Description (Sorted by importance).","default_critical_keywords":"List[String] - The Top 5 most frequent words in the Job Description (used as fallback).","critical_check":{"description":"Validation result of the 'Must-Have' skills (Target vs Reality).","fields":{"keywords_checked":"List[String] - The TARGET list of skills the system was searching for (either User Input or Top 5 Default).","missing_critical":"List[String] - The CRITICAL GAP. Skills from the 'keywords_checked' list that were NOT found in the CV.","status":"String - 'SAFE' (User has all critical skills) or 'RISK' (User is missing one or more critical skills)."}}},"error_responses":{"400 - Missing Input":"Returns 'Invalid Input: Both Resume text and Job Description are required' if fields are missing.","400 - Empty Job Description":"Returns 'Invalid Input: Job Description cannot be empty' if JD contains only whitespace.","500 - Server Error":"Returns 'Server Error: AI Model failed to load' if the SBERT model is not ready.","500 - TF-IDF Empty Vocab":"Returns 'Insufficient Content' if JD is too short or contains only stop words (e.g. 'the', 'and').","500 - TF-IDF Data Error":"Returns 'Data Processing Error' if there is a structure mismatch during vectorization.","500 - Strict Calc Error":"Returns 'Strict Mode Error' if mathematical cosine similarity calculation fails.","500 - AI Memory Error":"Returns 'System Limit Reached' if the server runs out of memory (RAM) during flexible analysis.","500 - AI Data Error":"Returns 'Data Mismatch' or 'Flexible Mode Error' if embeddings cannot be compared."}}}}