# PasteApply for agents

Product: https://pasteapply.com

[![Listed on mcpservers.org](https://mcpservers.org/badge.svg)](https://mcpservers.org/servers/pasteapply-com-agents-md)

## 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** · $3/mo try-unlock · $10 Pro). Honesty / fact-lock: https://pasteapply.com/honesty

## HTTP API (v0)
Base: https://pasteapply.com — no API key for status/generate/checkout.

- `GET /.well-known/mcp.json` → directory listing (`name`, `mcp`, `docs`, `honesty`)
- `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** when `paid:false`. Full bodies only after unlock. Optional `proPasses` for Pro.
- `POST /api/checkout` `{ "price": "monthly"|"export"|"pro", "generationId"?: "..." }` → `{ "url" }` — hand to HUMAN only
- `POST /api/confirm` `{ "sessionId": "cs_..." }` → unlock state after Checkout
- `GET /api/generation/:id` → generation object including `paid` / `unlocked` (or 404 expired)

Never invent employers/dates/skills. Never scrape card UI. Public guarantee: https://pasteapply.com/honesty

## Bot loop
1. generate with real job + resume
2. show the human the teaser (coverage, proof, what-changed, redacted sample) — never treat it as the file
3. if the full artifact is needed → unlock_link / checkout URL (default `price: "export"` = $5) → human pays
4. confirm_payment with session id (or poll GET /api/generation/:id until `paid:true`) then read the full cover + resume

## curl
```bash
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`:

```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.

**Paying referrer → matching-tier month for the friend:** if the code owner has a live Stripe subscription (`active` / `trialing`), Checkout for that same tier applies a **30-day trial** (`subscription_data.trial_period_days: 30`) on the matching Price. After the trial, Stripe bills the regular monthly price. They can cancel. Self-referrals and free/teaser-only accounts do not grant a trial.

The referred person's **first** successful payment also banks the referrer a matching month: $3 → a month of the $3 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` (`$3/month`, `$5/month export`, `$10/month Pro`). No secrets. CORS `*` (no credentials).

### POST /api/generate
`Content-Type: application/json`

```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`):

```json
{
  "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": "Salesforce admin", "status": "implied", "note": "Salesforce is on the resume; the exact admin title is not." },
    { "skill": "Kubernetes", "status": "missing", "note": "Kubernetes is not on the resume. Lead with SQL — do not invent Kubernetes." }
  ]
}
```

`coverage[].status` is `present` | `implied` | `missing`. **Present** = named on the source resume. **Implied** = a related tool or title is on the resume, not the exact word. **Missing** = not on the resume — we show the gap and do not invent it. If `inventedClaims` would be >0, generate fails (HTTP 422) instead of returning fiction. Guarantee: https://pasteapply.com/honesty

### POST /api/checkout
```json
{ "price": "export", "generationId": "<uuid>" }
```
`price`: `monthly` | `export` | `pro`. Default ask is `$5 Export` (`price: "export"`, or omit). `$3/mo` try-unlock 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 $3/month unlock, $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
```json
{ "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 / $3-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:

```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 (unless `useSample`)
- `422` — honesty lock: invented claims. Fix the source resume; do not retry the same invention.
- `429` — free generate daily cap. Wait for `retryAfter` / `Retry-After`.
- `402` — download routes before unlock
- `404` — generation expired (24h) or unknown id
- Standard generate aborts at ~20s; Pro rewrite ~28s. `estimate` is `~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`, default `export` = $5). Stripe Checkout URL for a **human**.
- `confirm_payment` — `sessionId` (`cs_...`). After success, payload is the full artifact.
- `get_generation` — `id`. Poll `paid` / `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: paying referrers gift a matching-tier **30-day Stripe trial**; starter unlock is **$3/month** (`price: "monthly"`); default human unlock remains **$5 Export**; 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` (present / implied / missing); 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
