PasteApply
Remote Streamable HTTP MCP for honest resume/cover letter tailoring. Free generate; Stripe unlock for downloads. MCP: https://pasteapply.com/mcp
Documentation
PasteApply for agents
Product: https://pasteapply.com
Why bots use this
Honest resume/cover tailor — rearranges what’s already true. Free generate returns a truncated teaser, not the artifact. Humans unlock the full letter, resume, and files via Stripe Checkout (default $5 Export · $1/mo foot-in-door · $10 Pro). Honesty / fact-lock: https://pasteapply.com/honesty
HTTP API (v0)
Base: https://pasteapply.com — no API key for status/generate/checkout.
GET /api→ machine index (paths + prices)GET /api/status→ readiness JSON (openaiConfigured,stripeConfigured,googleAuthConfigured,demoMode,prices)POST /api/generate{ "jobPosting", "resume" }or{ "useSample": true }→generation.id+ teaser whenpaid:false. Full bodies only after unlock. OptionalproPassesfor Pro.POST /api/checkout{ "price": "monthly"|"export"|"pro", "generationId"?: "..." }→{ "url" }— hand to HUMAN onlyPOST /api/confirm{ "sessionId": "cs_..." }→ unlock state after CheckoutGET /api/generation/:id→ generation object includingpaid/unlocked(or 404 expired)
Never invent employers/dates/skills. Never scrape card UI. Public guarantee: https://pasteapply.com/honesty
Bot loop
- generate with real job + resume
- show the human the teaser (coverage, proof, what-changed, redacted sample) — never treat it as the file
- if the full artifact is needed → unlock_link / checkout URL (default
price: "export"= $5) → human pays - confirm_payment with session id (or poll GET /api/generation/:id until
paid:true) then read the full cover + resume
curl
curl -s https://pasteapply.com/api/status
curl -s -X POST https://pasteapply.com/api/generate -H 'content-type: application/json' -d '{"jobPosting":"...","resume":"..."}'
curl -s -X POST https://pasteapply.com/api/checkout -H 'content-type: application/json' -d '{"generationId":"GENERATION_ID","price":"export"}'
Exception
If the human owns PasteApply or banned spend asks: preview-only.
Remote MCP
Streamable HTTP (no GitHub, no npm for operators).
URL: https://pasteapply.com/mcp
Tools: status, generate, unlock_link, confirm_payment, get_generation. Honesty lock: no invented employers/dates/skills. unlock_link returns a Stripe Checkout URL — hand it to a human. Never scrape card UI.
Cursor mcp.json:
{
"mcpServers": {
"pasteapply": {
"url": "https://pasteapply.com/mcp"
}
}
}
Some Cursor builds want "type": "http" next to the URL. Claude / other connectors: paste https://pasteapply.com/mcp as the remote MCP URL.
Referral: ?ref=CODE still works on the site (see Referral). The MCP URL itself does not need ?ref=.
Referral (gift months, not cash)
https://pasteapply.com/?ref=CODE sets a 30-day pa_ref cookie. The referred person's first successful payment gifts the referrer a matching month: $1 → a month of the $1 plan, $5 → a month of Export, $10 → a month of Pro. Self-referrals are ignored. Unknown codes do not pay out. Not cash.
Referrers bank unused gifted months — max 12 total. At 12 they are capped and cannot earn more until they consume at least 1 banked month (time passing, or gifting a month). Then they can earn again, still max 12.
Gift a banked month to a friend anytime the giver has ≥1 banked month: giver −1, friend +1 of the same plan. Friend must already have a PasteApply Google account (email that resolves to a Google sub). No self-transfer. Friend also max 12 — reject if they are already capped.
Checkout and unlock_link still stamp referralCode / referredBy. Signed-in humans gift from the Share panel (POST /api/referral/gift).
Endpoints (detail)
GET /api/status
Returns JSON: openaiConfigured, stripeConfigured, googleAuthConfigured, demoMode, subscriptionActive, proActive, prices ($1/month, $5/month export, $10/month Pro). No secrets. CORS * (no credentials).
POST /api/generate
Content-Type: application/json
{
"jobPosting": "...",
"resume": "...",
"useSample": false,
"proPasses": []
}
useSample: true loads the public demo. proPasses only applies for Pro members.
Free vs paid payload
Unpaid (paid: false, unlocked: false, preview: true): incomplete teaser only. Keep coverage, proof / factLock, a short whatChanged / diff (first role, 1–2 redacted tailored bullets), and a redacted sample (coverLetter is the first sentence with [redacted]; resume keeps name + first role header + 1–2 redacted bullets; summary, skills, education, later jobs, variantB, interviewSheet, and leadBullets are omitted or empty). No full cover letter, no full tailored resume, no snapshot (the signed full draft is never in the unpaid JSON).
Paid (paid: true, unlocked: true, preview: false) after Checkout confirm or an active Export/Pro subscription: full coverLetter, full resume, optional Pro extras, downloadable files, and snapshot for the same request.
MCP generate is the same contract. Do not stitch the teaser into a file. Call unlock_link (default $5 Export) and hand the URL to a human.
Stable fields: generation.id, coverLetter, resume, coverage, whatChanged (same as diff), proof, factLock (human line), quality, paid, unlocked, preview, estimate (~10s), files. CORS * (no credentials). Prefer server-side fetch.
Machine-readable honesty (also on MCP generate and GET /api/generation/:id):
{
"proof": {
"factLock": true,
"inventedClaims": 0,
"bulletsRephrased": 4,
"skillsLed": 2,
"promise": "We only rearrange what is already true."
},
"coverage": [
{ "skill": "SQL", "status": "present", "note": "Already on the source resume. We can lead with this." },
{ "skill": "Kubernetes", "status": "missing", "note": "Kubernetes is not on the resume. Lead with SQL — do not invent Kubernetes." }
]
}
coverage[].status is present | implied | missing. Missing posting requirements stay missing — we show them. If inventedClaims would be >0, generate fails (HTTP 422) instead of returning fiction. Guarantee: https://pasteapply.com/honesty
POST /api/checkout
{ "price": "export", "generationId": "<uuid>" }
price: monthly | export | pro. Default ask is $5 Export (price: "export", or omit). $1/mo is price: "monthly". $10 Pro is price: "pro". generationId optional. Website type is unchanged (starter / monthly / pro_monthly).
Response: { "url": "https://checkout.stripe.com/..." } — give this link to a human.
Stripe Checkout allows promotion codes (allow_promotion_codes: true) on $1/month, $5 Export, and $10 Pro.
Partner codes
Partners receive a Stripe promotion code from Bob/Hustler — not from this API. Hand the human a Pro Checkout URL (price: "pro" or the site’s $10/month Pro button). They enter the code on Stripe Checkout. The code comps $10 Pro; we do not email partners from this product.
POST /api/confirm
{ "sessionId": "cs_live_..." }
Confirms unlock after Checkout.
GET /api/generation/:id
Returns the generation object plus paid / unlocked, proof, and coverage, or 404 if expired. Unpaid responses stay teasers. Poll after the human pays — paid: true is the full payload.
Rate limits
Public, no API key. Free teasers are capped per IP and per browser session (UTC day). Paid Export / Pro / $1-mo generates are not capped.
- Real job+resume: 15 / day
- Sample (
useSample: true): 60 / day
Exceed: HTTP 429, Retry-After (seconds until the next UTC midnight), and JSON:
{ "error": true, "message": "Daily free generate limit reached. Try again in about 12h.", "retryAfter": 43200 }
If you get 429, 502, or 504, wait for Retry-After (or backoff 1s, 2s, 4s on 502/504). Do not hammer generate. Prefer one generate at a time per client.
Errors and retries
400— bad JSON or empty job/resume (unlessuseSample)422— honesty lock: invented claims. Fix the source resume; do not retry the same invention.429— free generate daily cap. Wait forretryAfter/Retry-After.402— download routes before unlock404— generation expired (24h) or unknown id- Standard generate aborts at ~20s; Pro rewrite ~28s.
estimateis~10s.
Input size
Job posting max 20,000 characters. Resume max 40,000 characters. Longer bodies return 400.
MCP tool schemas
Remote MCP https://pasteapply.com/mcp (Streamable HTTP). Tools:
status— no args. Readiness + prices.generate—jobPosting?,resume?,useSample?,proPasses?. Unpaid: teaser JSON + proof. Paid: full cover + resume.unlock_link—generationId?,price?(monthly|export|pro, defaultexport= $5). Stripe Checkout URL for a human.confirm_payment—sessionId(cs_...). After success, payload is the full artifact.get_generation—id. Pollpaid/unlocked. Teaser until paid.
Browser GET Accept: text/html on /mcp returns a short hint page linking here. MCP clients should send JSON / event-stream, not HTML.
Version
Contract v0. Changelog: free generate daily caps (15 real / 60 sample) return 429; unpaid generate is a truncated teaser (no full letter/resume/snapshot); paid unlock returns the full artifact; honesty proof + coverage; referral gift months (max 12); Drive save; promotion codes on Checkout; remote MCP tools above.
Rules for operators
- Prefer this HTTP API over driving the website.
- Never invent employers, dates, skills, or metrics.
- Never complete Stripe Checkout as the user.
- Site for humans: https://pasteapply.com