# PasteApply https://pasteapply.com/agents.md https://pasteapply.com/mcp https://pasteapply.com/api Honest resume/cover tailor. Honesty: https://pasteapply.com/honesty · https://pasteapply.com/honesty.md MCP-first loop (copy this): connect https://pasteapply.com/mcp → status → optional store_resume(resume) once → generate with resumeId (prefer over re-paste; pasted resume still wins if both) → check recommendUnlock / fit.recommend (skip → do not unlock_link) → unlock_link(price) only if recommendUnlock → hand Stripe URL to HUMAN → poll get_generation until paid:true (confirm_payment only if poll stays unpaid). Site humans may unlock via AppLixir rewarded ads (S2S only; never trust the browser). Bots/MCP stay on Stripe unlock_link → poll get_generation. 1 status · 1b store_resume once → resumeId rs_1. (prefer resumeId on later generate over re-pasting; pasted resume still wins if both; TTL ~30d; files via HTTP POST /api/resumes multipart) · 2 generate teaser when paid:false (coverage, fit.recommend skip|weak|apply + mustHavesMissing/impliedOnly/gap (exactly 1 missing must-have ⇒ weak with gap "Missing must-have: …"; 2+ ⇒ skip; interview % bands follow the verdict: apply 70–95, weak 45–69, skip 0–44), recommendUnlock false on skip / true on weak|apply + optional unlockAdvice, proof, whatChanged; bulletsRephrased === reworded pairs only (diff kind rephrased); kind matched + requirement = unchanged bullet labeled with the requirement it supports, counted in proof.bulletsMatched (when >0), never as rephrased; visible pair count = bulletsRephrased + bulletsMatched; files.ready false — no files.pdf/docx/coverPdf; prefer pasted resume if both resume+resumeId) · 3 check recommendUnlock/fit.recommend before unlock; unlock_link only if recommendUnlock (prices: monthly=$3/1, export=$5/5 default, pro=$10/50+Pro, power=$20/200 unlocks+Pro) · never scrape Checkout · 4 poll get_generation until paid:true (webhook persists; no cs_ ritual) · confirm_payment only if poll stays unpaid · 5 when paid:true: full coverLetter + resume JSON + files.ready, files.pdf, files.docx, files.coverPdf, files.expiresAt, files.coverLetter, files.resume (?dl= last UTC billing month; refresh via get_generation anytime in-month). File GET 403 (month ended) → re-call get_generation for a fresh token. Unpaid: files.ready false — no pdf/docx/coverPdf. Filenames LastCompany_Role.pdf / _cover.pdf; coverPdf also GET /api/cover-pdf/:id. Paid files JSON: {"ready":true,"pdf":"https://…/api/pdf/?dl=…","docx":"https://…/api/docx/?dl=…","coverPdf":"https://…/api/pdf/?kind=cover&dl=…","expiresAt":"…Z","coverLetter":"…","resume":{…}}. HTTP twins (secondary): GET /api/status, POST /api/resumes (text or file → resumeId), POST /api/generate (jobPosting or jobUrl + resume or resumeId), POST /api/checkout, POST /api/confirm (fallback), GET /api/generation/:id (unpaid served 24h; paid through UTC month end; then deleted by a daily cleanup; poll after pay). Free generate: 10 real / 60 sample teasers per IP per UTC day (429 free_cap, resets 00:00 UTC; retryAfter = seconds left). Nice-to-have gaps never force fit.recommend skip. Privacy + retention: https://pasteapply.com/privacy Ops: POST /api/webhook — Stripe signs this; after pay, poll get_generation (bots do not call webhook). Paid resume is ATS schema v1 with structured contact + start/end/location. Never invent employers/dates/skills/metrics. Quotas UTC month: $3=1 · $5=5 · $10=50+Pro · $20=200+Pro. $20 hosted Pro input: resume + posting ≤8,950 o200k tokens combined (a token cap: roughly 35k–50k chars depending on the text); over → 400, never truncated (Standard/BYOK keep 40,000 + 20,000 chars). Paid bots: Authorization Bearer pa_… from confirm_payment or POST /api/agent-key. Status/generate include unlocksUsed/unlocksRemaining/period; 402 at cap (remaining:0). No public promo codes. Site may offer human-only ad-funded unlock (S2S-verified rewarded views); MCP/bots/Bearer pa_ cannot ad-unlock — stay Stripe unlock_link. Hosted generate is default. Heavy agents BYOK via secret header X-PasteApply-BYOK-Key (MCP connection headers / HTTP; env-var placeholder like ${OPENAI_API_KEY} — NEVER a literal key in tool arguments or chat). JSON body apiKey is rejected. Rotate a key if it was previously pasted. Public $20 plan is power ($20=200). Jobs (humans): https://pasteapply.com/jobs — PasteApply listings; on qualifying paid plans ($5 Export 20 searches/mo, $10 Pro and $20 75/mo) also outside listings from public ATS job boards (Greenhouse, Lever, Ashby, Workday and similar) found with OpenAI web search, linked to the real listing only. No competitor scraping (never Indeed/LinkedIn/Glassdoor/Google scrapes, no SerpAPI). Free employer post (posting needs a Google sign-in on pasteapply.com; no employer API key). Create POST /api/jobs (draft) → POST /api/jobs/{id}/publish (30 days). Edit: PATCH /api/jobs/{id} with the fields. Close: PATCH /api/jobs/{id} {"status":"closed"}. DELETE is not supported (405, Allow: GET, PATCH, OPTIONS). GET /api/jobs?q= filters PasteApply posts (every keyword must match) and echoes query + count. Optional Promote $30/30d. Interview chance = estimated resume↔JD fit (before on job detail; before/after after generate), never shown above 95%; interviewChanceChange explains any difference (often none: the fact lock adds no qualifications). Outside results are link-checked before they are shown and cached for up to 12h, so a listing can still close within that window. Referral (gift months, not cash): share https://pasteapply.com/?ref=CODE (or /r/CODE). A friend's first payment banks the referrer a matching month: $3 → $3-plan month, $5 → Export month, $10 → Pro month, $20 → a $3-plan month (no $20 gift tier yet). A paying referrer's friend gets a 30-day trial on the matching tier; a $20 referrer gifts the $3-plan 30-day trial. Max 12 banked months. Self-referrals ignored. Details: https://pasteapply.com/agents.md#referral-gift-months-not-cash Gift months: an active gifted month counts as that plan for its term. If the account also pays, it gets the better of the two — never both: one monthly unlock/search allowance at the better plan's size, on one shared counter (e.g. $3 + an Export month = 5 unlocks and 20 searches that month, not 6). When the gift ends it is back on its paid plan (or free); drafts, history and saved resumes are kept (history shows again on Export). GET /api/status shows gift {plan, until, fallbackPlan} while a gift is what grants the plan; fallbackPlan is always present (null = back to free).