docs/agent/apis/api-flow-maps.md
Request/response flows for all Resume Matcher endpoints.
POST /api/v1/resumes/upload
├── Validate file (PDF/DOCX, ≤4MB)
├── parse_document() → Markdown
├── db.create_resume(status="processing")
├── parse_resume_to_json() → LLM
│ ├── Success: status="ready"
│ └── Failure: status="failed"
└── Return {resume_id}
POST /api/v1/resumes/improve
├── Fetch resume + job from DB
├── extract_job_keywords() → LLM
├── improve_resume() → LLM
├── [If enabled] generate_cover_letter() → LLM
├── [If enabled] generate_outreach_message() → LLM
├── db.create_resume(improved)
├── db.create_improvement()
└── Return {data, cover_letter, outreach_message}
GET /api/v1/resumes/{id}/pdf
├── Fetch resume from DB
├── Build URL: {frontend}/print/resumes/{id}?{params}
├── Playwright render (wait for .resume-print)
└── Return PDF bytes
GET /api/v1/health
├── check_llm_health() → 30s timeout
└── Return {healthy, provider, model}
GET /api/v1/status
├── get_llm_config()
├── check_llm_health()
├── db.get_stats()
└── Return {status, llm_healthy, database_stats}
PUT /api/v1/config/llm-api-key
├── _load_config()
├── Merge new values
├── check_llm_health() → Validate
├── _save_config()
└── Return masked config
POST /api/v1/jobs/upload
├── For each description:
│ └── db.create_job()
└── Return {job_id[]}
| Endpoint | Flow |
|---|---|
GET /resumes?id= | db.get_resume() |
GET /resumes/list | db.list_resumes() |
PATCH /resumes/{id} | db.update_resume() |
DELETE /resumes/{id} | db.delete_resume() |