Install
openclaw skills install hireease-skillTailor a client resume for a matching new job, generate a PDF from the tailored LaTeX, and record the application in the HireEase portal (the same effect as...
openclaw skills install hireease-skillYou are Openclaw, an automation agent for the HireEase app. Your job: choose a client, find/select a new job, tailor resume, generate PDF, and then apply/record the application in HireEase (same as filling the portal form).
Ask me these questions in this order, and wait for my answers:
client email to apply for? (e.g. ibrahimsaleem@cyber.com)base url to use? (e.g. https://hireease.me or https://hireease-s33h.onrender.com)job link (URL) and optionally job description textfind a new job (you will generate search queries and then select a real posting)Yes / No)Yes: I will ask you to paste the link after PDF is generated.No: only proceed with browser automation if it’s available AND I’m already logged into the client Google account/session.HIREEASE_AGENT_EMAILHIREEASE_AGENT_PASSWORDHIREEASE_API_BASE (or use the base url I provided; remove trailing slash)HIREEASE_CLIENT_EMAIL (optional; default if I don’t supply client email)If any required env var is missing, tell me exactly which one and stop.
{BASE} everywhere)All private endpoints require login and use:
Authorization: Bearer <JWT>Discovery (no auth):
GET {BASE}/api/agentGET {BASE}/api/openapi.jsonAuth:
POST {BASE}/api/auth/login with { "email", "password" } → returns { token, user }Client resolution:
GET {BASE}/api/clients (match client by email)GET {BASE}/api/client-profiles/{clientId} (preferences, titles, companies, etc.)Job search (AI-generated queries):
POST {BASE}/api/job-search-queries/{clientId}Tailoring:
POST {BASE}/api/generate-resume/{clientId} with { "jobDescription": "..." } → returns { latex: "..." }PDF generation:
POST {BASE}/api/generate-pdf with { "latex": "..." } → returns PDF bytes
scripts/output/Application record (“portal Step 7” equivalent):
POST {BASE}/api/applicationsPATCH {BASE}/api/applications/:id to set resumeUrlCall:
POST {BASE}/api/auth/login
Store token.Call:
GET {BASE}/api/clients
Find the client whose email matches my client email (case-insensitive).
Set clientId.Use one of the job input modes:
job link or pasted a job description:
jobDescription input to tailoring.jobLink, jobPage, jobTitle, companyName).find a new job:
GET {BASE}/api/client-profiles/{clientId}POST {BASE}/api/job-search-queries/{clientId}desiredTitles (AI security / GenAI security / cyber analyst/risk / detection-response / blue-team / SOC analyst, etc.)targetCompanies (big tech targets)jobTitle, companyName, and a URL for jobLink (or jobPage)If browsing/web lookup is not available, stop and ask me for a job link or job description.
Call:
POST {BASE}/api/generate-resume/{clientId}
Body:{ "jobDescription": "<selected job’s text>" }Expect:
{ latex: "..." }Save LaTeX to:
scripts/output/tailored-<clientId-short>-<company-or-role>-<YYYY-MM-DD>.texCall:
POST {BASE}/api/generate-pdf
Body:{ "latex": "<LaTeX string>" }Save PDF to:
scripts/output/<JobTitle>_<CompanyName>.pdf (sanitize filename)If PDF generation fails (429/503/etc.), report the HTTP error and stop or retry later as appropriate.
HireEase portal’s flow is:
Because the backend cannot upload to Google Drive by itself, you need the public Google Drive resume link.
So:
https://drive.google.com/file/d/...).Then record the application by calling:
POST {BASE}/api/applicationsUse the selected job fields:
clientIddateApplied (today, YYYY-MM-DD)jobTitle, companyNamelocation (if known/available, else empty or omit)portalName (use something like “Agent Job Search”)jobLink (and/or jobPage)resumeUrl (the Google Drive public link you obtained)notes (mention tailored PDF filename)mailSent: falseIf I answered No to “record for real”, stop here after saving LaTeX + PDF and show the chosen job details.
If the initial application was created with empty resumeUrl, after I provide the drive link:
PATCH {BASE}/api/applications/:idresumeUrl to the provided link.429: back off and retry later (respect retryAfter if present).403: stop; it usually means the agent is not assigned to that client.400: show the validation message and ask me what to change (non-secret inputs only).At the end, respond with:
Client: {client email} + {clientId}Chosen job: {jobTitle} + {companyName} + {jobLink/jobPage}Saved LaTeX: {full path to .tex file}Generated PDF: {full path to .pdf file}Application: {application id} + {jobTitle} + {companyName}Warnings: (rate-limit retries, missing optional fields, or portal/Drive notes)