---
name: wurk-x402
version: 1.2.5
description: Hire humans for microjobs and buy social growth services using x402 (Solana/Base) and MPP rails on Tempo and Solana, with OpenAPI discovery for each payment flow.
homepage: https://wurk.fun
metadata: {"openclaw":{"emoji":"🔨","category":"payments","api_base":"https://wurkapi.fun"}}
---

# WURK x402 + MPP

Hire real humans for microjobs and buy social growth services with these payment rails:

- **x402** on Solana or Base
- **MPP** on Tempo chain
- **Solana MPP** on Solana via `/mpp-solana/*`

**Primary feature:** Agent-to-human microjobs. Create a paid task, collect human feedback/answers, then fetch submissions later. Perfect for opinions, polls, content review, tagging, and anything an average internet user can help with.

**Also available:** 25+ social growth services across X/Twitter, Instagram, YouTube, Telegram, Discord, DexScreener, Base, Zora, and more.

**MPP context (as requested):** Tempo chain + MPP are part of Stripe's machine-pay stack, and Machine Pay Protocol is also described as Stripe-built infrastructure. WURK exposes MPP through `/mpp/*` on Tempo and `/mpp-solana/*` for Solana MPP.

## Skill Files

| File | URL |
|------|-----|
| **SKILL.md** (x402 + MPP) | `https://wurkapi.fun/skill.md` |
| **BEST_PRACTICES.md** (agent-to-human playbook) | `https://wurkapi.fun/best-practices.md` |
| **package.json** (metadata) | `https://wurkapi.fun/skill.json` |
| **MPP section in this skill** | `https://wurkapi.fun/skill.md#mpp-rails` |
| **Aggregated OpenAPI (MPP + x402 canonical paid POST)** | `https://wurkapi.fun/openapi.json` |
| **Tempo MPP OpenAPI** | `https://wurkapi.fun/openapi-mpp-tempo.json` |
| **Solana MPP OpenAPI** | `https://wurkapi.fun/openapi-mpp-solana.json` |
| **x402 OpenAPI** | `https://wurkapi.fun/openapi-x402.json` |

**Install locally (OpenClaw):**
```bash
mkdir -p ~/.openclaw/skills/wurk-x402
curl -s https://wurkapi.fun/skill.md > ~/.openclaw/skills/wurk-x402/SKILL.md
curl -s https://wurkapi.fun/skill.json > ~/.openclaw/skills/wurk-x402/package.json
```

---

## Quick Start

```bash
# 1. Install x402 client dependencies
npm install @x402/fetch@^2 @x402/core@^2 @x402/svm@^2 @solana/kit@^6 @scure/base   # Solana x402 v2
# or: npm install @x402/fetch@^2 @x402/core@^2 @x402/evm@^2  # Base

# 2. Prepare a wallet (if you don't have one)
# Solana:
# Use an @solana/kit-compatible signer (TransactionSigner) for x402 v2.
# See the TypeScript example below under "Using @x402/fetch".
# Base:
cast wallet new

# 3. Ask your human for USDC
# "Please send some USDC to my wallet. Even $1 is enough to get started."
# Solana: USDC (EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v)
# Base: USDC (0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913)

# 4. Try it — hire a human for feedback:
curl -i "https://wurkapi.fun/solana/agenttohuman?description=Which+logo+is+better+A+or+B&winners=5&perUser=0.025"
# → 402 Payment Required (with accepts[] and Payment-Required header)

# 5. Sign the payment and retry with PAYMENT-SIGNATURE header
# → 200 OK with { jobId, secret, statusUrl, ... }

# 6. Later, view submissions (FREE):
curl "https://wurkapi.fun/solana/agenttohuman?action=view&secret=YOUR_SECRET"
# → { ok: true, submissions: [...] }
```

---

## How x402 Payment Works

Every paid endpoint follows the same 2-step flow:

```
Step 1: Call the endpoint WITHOUT payment
  → HTTP 402 Payment Required
  → Response includes Payment-Required header (base64)
  → Body includes accepts[] array with payment details

Step 2: Sign the payment, retry WITH PAYMENT-SIGNATURE header
  → HTTP 200 OK
  → Response includes the result (jobId, etc.)
```

### Using @x402/fetch (recommended — handles both steps automatically)

```typescript
import { wrapFetchWithPayment } from '@x402/fetch'
import { x402Client } from '@x402/core/client'
import { registerExactSvmScheme } from '@x402/svm/exact/client'
import { toClientSvmSigner } from '@x402/svm'
import { createKeyPairSignerFromBytes } from '@solana/kit'
import { base58 } from '@scure/base'

// Setup (once)
const keypair = await createKeyPairSignerFromBytes(
  base58.decode(process.env.SVM_PRIVATE_KEY!)
)
const signer = toClientSvmSigner(keypair)
const client = new x402Client()
registerExactSvmScheme(client, { signer })
const paymentFetch = wrapFetchWithPayment(fetch, client)

// Now just fetch — x402 handles 402 → sign → retry automatically
const res = await paymentFetch(
  'https://wurkapi.fun/solana/agenttohuman?description=Rate+my+landing+page&winners=10&perUser=0.025'
);
const data = await res.json();
// { ok: true, paid: true, jobId: "abc123", secret: "...", statusUrl: "...", ... }
```

⚠️ For Solana x402 v2, do not pass a raw `@solana/web3.js` `Keypair` directly into `registerExactSvmScheme`. Use an `@solana/kit` `TransactionSigner` (as shown above).

`SVM_PRIVATE_KEY` format note:
- base58 secret bytes (64-byte secret key) when using `base58.decode(...)` in the snippet above
- or hex string (128 hex chars); in that case decode bytes with `Buffer.from(process.env.SVM_PRIVATE_KEY!, 'hex')` before `createKeyPairSignerFromBytes(...)`

### Using curl (manual 2-step)

```bash
# Step 1: Get payment requirements
curl -i "https://wurkapi.fun/solana/xlikes?amount=50&url=https://x.com/user/status/123"
# → HTTP 402
# → Payment-Required: eyJ... (base64)
# → Body: { "x402Version": 2, "accepts": [{ "scheme": "exact", "network": "solana:5eykt4...", ... }] }

# Step 2: Sign the Payment-Required data, then retry
curl -i "https://wurkapi.fun/solana/xlikes?amount=50&url=https://x.com/user/status/123" \
  -H "PAYMENT-SIGNATURE: <your-signed-payment>"
# → HTTP 200
# → { "ok": true, "paid": true, "jobId": "abc123" }
```

⚠️ **The header is `PAYMENT-SIGNATURE`**, not `X-PAYMENT`. Using the wrong header will silently fail.

---

## MPP Rails

WURK supports two MPP families:

- **Tempo MPP** via `/mpp/*`
- **Solana MPP** via `/mpp-solana/*`

### What MPP is (short)

- MPP is a payment flow that uses an `Authorization: Payment ...` credential (instead of `PAYMENT-SIGNATURE`).
- In this skill context (as requested), Tempo chain + MPP are treated as Stripe's machine-pay stack, and Machine Pay Protocol is also described as Stripe-built.
- You use MPP endpoints when your agent/client already supports Payment auth credentials and challenge-response via `WWW-Authenticate`.

### x402 vs MPP (practical difference)

| Topic | x402 | Tempo MPP | Solana MPP |
|------|------|-----------|------------|
| Endpoint style | `/{network}/...` (`/solana/...`, `/base/...`) | `/mpp/...` | `/mpp-solana/...` |
| Payment header on paid retry | `PAYMENT-SIGNATURE` | `Authorization: Payment ...` | `Authorization: Payment ...` |
| Challenge signal | HTTP 402 + `Payment-Required` | HTTP 402 + `WWW-Authenticate: Payment ...` | HTTP 402 + `WWW-Authenticate: Payment ...` |
| Success receipt header | (x402 flow headers) | `Payment-Receipt` | `Payment-Receipt` |
| Client tool | `@x402/fetch` | MPP-compatible client | `@solana/mpp/client` |

### MPP payment flow

```text
Step 1: Call /mpp or /mpp-solana endpoint WITHOUT Authorization credential
  -> HTTP 402
  -> WWW-Authenticate: Payment ...
  -> application/problem+json challenge body

Step 2: Retry WITH Authorization: Payment <credential>
  -> HTTP 200
  -> Payment-Receipt header
  -> JSON result (usually { ok: true, paid: true, rail: "mpp" | "mpp-solana", ... })
```

### Tempo example (challenge -> pay -> success)

```bash
# Challenge
curl -i "https://wurkapi.fun/mpp/xlikes?url=https://x.com/user/status/123&amount=50"

# Paid retry
curl -i "https://wurkapi.fun/mpp/xlikes?url=https://x.com/user/status/123&amount=50" \
  -H "Authorization: Payment <mpp-credential>"
```

### Solana MPP example (challenge -> pay -> success)

```bash
# Challenge
curl -i "https://wurkapi.fun/mpp-solana/test"

# Paid retry
curl -i "https://wurkapi.fun/mpp-solana/test" \
  -H "Authorization: Payment <solana-mpp-credential>"
```

### Solana MPP rules

When using `/mpp-solana/*`, follow these rules exactly:

- First call without `Authorization`.
- Expect `402 Payment Required`.
- Read the live `WWW-Authenticate` challenge.
- Use the official `@solana/mpp/client`.
- Retry the exact same URL after building the credential.
- Read and store the `Payment-Receipt` header on success.

Do not hardcode payment details from docs or OpenAPI. For Solana MPP, always read these from the live challenge:

- `amount`
- `feePayer`
- `feePayerKey`
- `recentBlockhash` when present
- `network`
- `currency`
- `recipient`

If `feePayer: true` is present:

- use transaction mode
- do not manually broadcast first
- do not switch to signature-only mode
- do not invent your own credential format when the official client can handle the flow

### Solana MPP quick start for fresh agents

If you are setting up a local JS or TS client from scratch, use this baseline:

```bash
npm install @solana/mpp mppx @solana/kit
```

```typescript
import { Mppx, solana } from '@solana/mpp/client';

const mppx = Mppx.create({
  methods: [
    solana.charge({
      signer,
      rpcUrl,
    }),
  ],
  polyfill: false,
});

const response = await mppx.fetch(
  'https://wurkapi.fun/mpp-solana/test',
  { method: 'GET' },
);
```

Important implementation notes:

- Import from `@solana/mpp/client`, not from root `@solana/mpp`.
- The current SDK expects `@solana/kit >= 6.5.0`.
- The expected client flow is `Mppx.create(...)` plus `solana.charge(...)`.
- Solana MPP uses different client tooling than Tempo MPP.
- If your first attempt is a sponsored challenge with `feePayer: true`, keep the flow in transaction mode and let the server co-sign and broadcast.

### MPP discovery + OpenAPI specs

Use these URLs when an agent/tool needs machine-readable MPP discovery data:

- **Aggregated OpenAPI:** `GET https://wurkapi.fun/openapi.json`
- **Canonical MPP Tempo-only OpenAPI:** `GET https://wurkapi.fun/openapi-mpp-tempo.json`
- **Canonical Solana MPP OpenAPI:** `GET https://wurkapi.fun/openapi-mpp-solana.json`
- **x402-focused OpenAPI (separate rail):** `GET https://wurkapi.fun/openapi-x402.json`

Notes:

- `openapi.json` is the aggregated discovery listing (MPP + canonical paid x402 POST).
- `openapi-mpp-tempo.json` is the lean Tempo MPP-only listing for `/mpp/*` discovery.
- `openapi-mpp-solana.json` is the Solana MPP listing for `/mpp-solana/*` endpoint semantics.
- Canonical `POST /mpp/*` operations are advertised; runtime aliases/extra variants can still exist.
- Canonical `POST /mpp-solana/*` operations are advertised; some runtime aliases and GET variants can still exist.
- MPP operations include `x-payment-info` metadata (with `protocols: ["mpp"]`) for discovery clients such as MPPscan/agentcash.
- Solana MPP operations also include short guidance that tells the agent to first probe without `Authorization`, expect `402`, then retry the exact same URL with the official Solana MPP client flow.

Quick validation:

```bash
npx -y @agentcash/discovery@latest discover "https://wurkapi.fun"
```

---

## Agent-to-Human Microjobs (Primary Feature)

This is what makes WURK unique: **hire real humans for small tasks**.

For practical job design patterns and realistic templates (logo tests, meme contests, long-form article contests), see: `https://wurkapi.fun/best-practices.md`
For `agenttohumanadvanced` or contest jobs, read `https://wurkapi.fun/best-practices.md` first.

### What You Can Ask Humans

- Quick opinions/polls ("Which logo do you prefer: A or B?")
- Product or UI feedback ("Visit this page and tell me what's confusing")
- Content review ("Read this paragraph and suggest improvements")
- Tagging/categorization ("Categorize these 10 items")
- Short copy variants ("Rewrite this headline 3 different ways")
- General "what do you think?" questions

### Endpoints

| Action | Endpoint | Cost |
|--------|----------|------|
| **Create** | `GET /{network}/agenttohuman?description=...&winners=N&perUser=N` | winners × perUser USDC |
| **Advanced** | `GET /{network}/agenttohumanadvanced?action=create|view|recover...` | dynamic (policy-aware) |
| **Preselection** | `GET /{network}/preselection/agenttohumanadvanced?action=create|view|recover...` | single winner × perUser USDC |
| **View** | `GET /{network}/agenttohuman?action=view&secret=...` | Free |
| **Recover** | `GET /{network}/agenttohuman?action=recover` | ~0.001 USDC |
| **SIWX Recover** | `GET /{network}/siwx/agenttohuman/recover` | Free (SIWX auth) |

Network: `solana` or `base`.

Alias paths (also listed in `/.well-known/x402`):

- `GET /{network}/agenttohuman/view` (same as `action=view`, but requires `secret` via query)
- `GET /{network}/agenttohuman/recover` (same as `action=recover`)
- `GET /{network}/siwx/agenthelp/recover` (SIWX alias of `/{network}/siwx/agenttohuman/recover`)

### Create a Job

```bash
curl -i "https://wurkapi.fun/solana/agenttohuman?description=Which+of+these+3+taglines+is+best%3F%0AA%3A+Do+more+stress+less%0AB%3A+Your+day+organized%0AC%3A+Focus+on+what+matters&winners=10&perUser=0.025"
```

Or with `@x402/fetch`:

```typescript
const res = await paymentFetch(
  'https://wurkapi.fun/solana/agenttohuman?' + new URLSearchParams({
    description: 'Which of these 3 taglines is best?\nA: Do more, stress less\nB: Your day, organized\nC: Focus on what matters',
    winners: '10',
    perUser: '0.025',
  })
);
const data = await res.json();
// {
//   ok: true,
//   paid: true,
//   jobId: "x1y2z3",
//   network: "solana",
//   secret: "AbCdEf123XyZ...",        ← SAVE THIS! Bearer token for viewing
//   statusUrl: "https://wurkapi.fun/solana/agenttohuman?action=view&secret=AbCdEf123XyZ...",
//   jobLink: "https://wurk.fun/custom/x1y2z3",
//   submissions: [],                   ← empty right after creation
//   waitSeconds: 0,
//   note: "Agent-to-human task created. Expect ~3–60 minutes for replies..."
// }
```

**⚠️ SAVE the `secret` immediately!** You need it to view submissions later. Store it in memory or a file.

### View Submissions (FREE)

```bash
curl "https://wurkapi.fun/solana/agenttohuman?action=view&secret=AbCdEf123XyZ..."
```

```typescript
const res = await fetch(
  'https://wurkapi.fun/solana/agenttohuman?action=view&secret=AbCdEf123XyZ...'
);
const data = await res.json();
// {
//   ok: true,
//   jobId: "x1y2z3",
//   network: "solana",
//   submissions: [
//     { id: 1, content_text: "I prefer B because it's clear and actionable", winner: 0 },
//     { id: 2, content_text: "C is the strongest — it speaks to priorities", winner: 0 },
//     ...
//   ]
// }
```

View is **completely free** — the secret acts like a bearer token. Keep it confidential.

### Recover Jobs (paid, ~0.001 USDC)

Lost your secrets? Pay a tiny fee to list your recent jobs:

```bash
curl -i "https://wurkapi.fun/solana/agenttohuman?action=recover"
# → 402, then sign and retry
```

### SIWX Recover Jobs (free auth-only)

Free alternative to paid recover. Sign in with your wallet via SIWX and call:

- `GET /{network}/siwx/agenttohuman/recover` (canonical)
- `GET /{network}/siwx/agenthelp/recover` (alias)

Rules:

- No `PAYMENT-SIGNATURE` is required.
- A valid `SIGN-IN-WITH-X` header is required.
- Returns the same payload shape as paid recover: `ok`, `network`, `payer`, `jobs`.

### Advanced Mode (Requirements + Creator Winner Selection)

Advanced route:

- `GET|POST /{network}/agenttohumanadvanced`
- `action=create|view|recover`

Advanced create supports:

- Creates a standard WURK custom job under the hood (you receive `secret` + `statusUrl` for follow-up reads)
- Write `description` in clear plain language so any normal internet user understands the task immediately
- `selectionType`: `random` or `creator`
- `selectionTimeMinutes`: `60..4320` (advanced route max)
- `requirement`: single selector (Sorsa/X metric/Seeker/X blue)
- `attachmentRequired`: `yes|no`
- `human_verified`: `yes|no` (VeryAI proof-of-human gate)
- `community`: optional WURK community agent key. If omitted, the job stays public (`All`). Invalid keys are rejected and repeated invalid keys are rate limited.
- `maxEntries`: omit for default, or `unlimited` (policy-gated)
- If you want workers to review images/videos/files, include publicly hosted links in `description` (CDN/S3/Drive direct links that workers can open without private login)

About `human_verified`:

- `human_verified=yes` requires workers to complete biometric palm verification powered by VeryAI before they can join that job.
- WURK does not process or store palm images; VeryAI handles biometrics while WURK stores verification status/integrity metadata only.
- Tradeoff: better trust/anti-cheat quality, but fewer eligible workers and typically slower fill speed.
- More info: https://very.org/

About `community`:

- `community` is a WURK community agent key for advanced agent-to-human jobs, not an X/Twitter community URL.
- Community keys can be obtained in the WURK user interface under community management.
- Invalid keys return `community key is niet geldig`.
- Only invalid keys count toward the limiter: 3 invalid keys within 1 minute for the same client returns `429` with `retryAfterSeconds`. Valid keys and omitted `community` do not rate limit job creation.

When `selectionType=creator`, pick winners with:

- `POST /api/agenttohumanadvanced/choose-winners`
- required: `secret` + `submissionIds`
- `submissionIds` accepts array or comma-separated string
- request cannot exceed remaining winner slots

Example:

```bash
curl -X POST "https://wurkapi.fun/api/agenttohumanadvanced/choose-winners" \
  -H "Content-Type: application/json" \
  -d '{"secret":"YOUR_JOB_SECRET","submissionIds":["123","124"]}'
```

### Preselection Mode (Apply -> Choose -> Chat -> Finalize)

Use preselection when the agent needs a **single selected human** and wants to talk to that person before releasing the reward. This is different from normal `agenttohumanadvanced` creator mode: users apply first, the agent chooses exactly one submission, chat opens, then the agent finalizes once after the work is complete.

Preselection x402 routes:

- `GET|POST /{network}/preselection/agenttohumanadvanced`
- `action=create|view|recover`
- networks: `solana` or `base`

Preselection is also available on other payment rails:

- Tempo MPP: `GET|POST /mpp/preselection/agenttohumanadvanced`
- Solana MPP: `GET|POST /mpp-solana/preselection/agenttohumanadvanced`
- Metaplex PDA: `GET|POST /metaplex/pda/solana/preselection/agenttohumanadvanced`

All rails use the same secret lifecycle endpoints after creation.

Do **not** send `winners` or `selectionType`. Preselection is always a single-winner, agent-selected flow with unlimited applications.

Create supports the same advanced controls that still make sense for applications:

- `description`
- `perUser`
- `selectionTimeMinutes`
- `attachmentRequired`
- `human_verified`
- `requirement`
- `community`

For preselection, `selectionTimeMinutes` supports `10..14400` (10 days max). The regular advanced route remains capped at `4320`.

`maxEntries` is not a preselection request field.

x402 preselection payments are received as USDC, but final payout is released in WURK. Finalize only works after the WURK reward is ready.

Example create:

```bash
curl -i --get "https://wurkapi.fun/solana/preselection/agenttohumanadvanced" \
  --data-urlencode "action=create" \
  --data-urlencode "description=Apply to test my app. Explain your device, relevant experience, and what you would test first." \
  --data-urlencode "perUser=1.00" \
  --data-urlencode "selectionTimeMinutes=1440" \
  --data-urlencode "attachmentRequired=no"
```

After payment, save the returned `secret` and `statusUrl`. Poll applications:

```bash
curl "https://wurkapi.fun/solana/preselection/agenttohumanadvanced?action=view&secret=YOUR_JOB_SECRET&page=1&pageSize=25"
```

Choose exactly one applicant:

```bash
curl -X POST "https://wurkapi.fun/api/preselection/agenttohumanadvanced/choose-winner" \
  -H "Content-Type: application/json" \
  -d '{"secret":"YOUR_JOB_SECRET","submissionId":"abcdef12"}'
```

The choose-winner response includes the next chat and finalize endpoints. Chat with the selected winner:

```bash
curl "https://wurkapi.fun/api/preselection/agenttohumanadvanced/chat/messages?secret=YOUR_JOB_SECRET&page=1"

curl -X POST "https://wurkapi.fun/api/preselection/agenttohumanadvanced/chat/send" \
  -H "Content-Type: application/json" \
  -d '{"secret":"YOUR_JOB_SECRET","message":"Thanks, you are selected. Please test onboarding and report the top issues here."}'
```

Finalize only after the selected winner completed the work:

```bash
curl -X POST "https://wurkapi.fun/api/preselection/agenttohumanadvanced/finalize" \
  -H "Content-Type: application/json" \
  -d '{"secret":"YOUR_JOB_SECRET"}'
```

Finalize can run once. It releases the WURK reward to the selected winner, marks the winning submission completed, and closes the custom job. If the WURK reward is not ready yet, finalize returns `409`; wait for settlement conversion or contact support.

### Pricing

| Parameter | Default | Range | Description |
|-----------|---------|-------|-------------|
| `winners` | 10 | 1–100 | Number of human replies you want |
| `perUser` | 0.025 | ≥ 0.01 | USDC reward per participant |

**Total cost** = `winners × perUser`. Default: 10 × $0.025 = **$0.25**.

### Tips for Good Tasks

- **Be specific**: "Rate this on a scale of 1-5" beats "What do you think?"
- **Keep it short**: tasks that take 1-2 minutes get the fastest responses
- **Include context**: you can include URLs to images/video/audio/pages in the description
- **Higher rewards = faster**: $0.025/person is minimum; higher gets more/faster responses
- **Avoid niche expertise**: best for questions any internet user can answer

### Security

- **Keep your `secret` confidential** — it's a bearer token for viewing submissions
- **Don't include private keys or sensitive data** in the task description
- **Don't include API keys or passwords** — humans will see the full description

---

## Agent Support Chat (Secret Auth, Wallet-Threaded)

If your agent needs human support, use these shared endpoints:

- `POST /api/agent-support/send`
- `GET /api/agent-support/messages`

How it works:

- Auth is a paid job `secret` (x402 or MPP family).
- WURK resolves the wallet from that secret and manages a wallet-threaded chat.
- Different secrets from the same wallet resolve to the same thread.
- Message traces keep secret/job correlation internally for support debugging.

Rules:

- `message` is required and limited to `2000` characters.
- Rate limits per wallet:
  - max `1` message per `10` seconds
  - max `20` messages per hour

Send example:

```bash
curl -X POST "https://wurkapi.fun/api/agent-support/send" \
  -H "Content-Type: application/json" \
  -d '{
    "secret": "YOUR_JOB_SECRET",
    "message": "Hi support, I need help with my job status."
  }'
```

Typical success shape:

```json
{
  "ok": true,
  "message": "Thank you for your message. As soon as a human support team member is online, we will review your issue.",
  "messagesUrl": "https://wurkapi.fun/api/agent-support/messages?secret=YOUR_JOB_SECRET"
}
```

Read thread example:

```bash
curl "https://wurkapi.fun/api/agent-support/messages?secret=YOUR_JOB_SECRET"
```

You can also pass `secret` via `x-secret` header.

---

## Social Growth Services

Buy engagement across 25+ services. The tables in this section document the x402 rail.

### Endpoints

Short URL format: `GET /{network}/{service}?amount=N&url=...` (or `?handle=...` for follower services).

All endpoints listed in `https://wurkapi.fun/.well-known/x402` for automated discovery.

**X / Twitter**

| Service | Endpoint | Required param | Price/unit | Range |
|---------|----------|----------------|------------|-------|
| Likes | `/{network}/xlikes` | `url` | $0.025 | 5–250 |
| Views | `/{network}/xviews` | `url` | $0.003 | 10–5000 |
| Followers / Community members | `/{network}/xfollowers` | `handle` (or X community URL) | $0.03 | 5–1000 |
| Verified Followers / Community members | `/{network}/xfollowers/xverified` | `handle` (or X community URL) | $0.07 | 5–100 |
| Reposts | `/{network}/reposts` | `url` | $0.025 | 5–250 |
| Comments | `/{network}/comments` | `url` | $0.025 | 5–250 |
| Bookmarks | `/{network}/bookmarks` | `url` | $0.025 | 5–250 |
| Raid (preset) | `/{network}/xraid/small` | `url` | $1.00 flat | 25 likes + 10 reposts + 10 comments + 70 views |
| Raid (preset) | `/{network}/xraid/medium` | `url` | $2.00 flat | 50 likes + 20 reposts + 15 comments + 3 bookmarks + 150 views |
| Raid (preset) | `/{network}/xraid/large` | `url` | $5.00 flat | 125 likes + 50 reposts + 35 comments + 7 bookmarks + 370 views |
| Raid (preset) | `/{network}/xraid/mega` | `url` | $10.00 flat | 250 likes + 90 reposts + 65 comments + 12 bookmarks + 820 views |
| Raid (custom) | `/{network}/xraid/custom` | `url` + `likes`/`reposts`/`comments`/`bookmarks` | $0.025/slot | 0–250 each |
| Raid X Verified (dynamic) | `/{network}/xraid/xverified` | `url` (+ optional `size=small|medium`) | package flat | default small |
| Raid X Verified (preset) | `/{network}/xraid/xverified/small` | `url` | $2.40 flat | 20 likes + 10 reposts + 10 comments + 130 views |
| Raid X Verified (preset) | `/{network}/xraid/xverified/medium` | `url` | $6.00 flat | 50 likes + 25 reposts + 20 comments + 5 bookmarks + 330 views |
| Raid X Verified (custom, x402) | `/{network}/xraid/xverified/custom` | `url` + `likes`/`reposts`/`comments`/`bookmarks` | $0.06/slot | 0–100 each |
`xfollowers/xverified` notes:

- Dynamic endpoint: `GET|POST /{network}/xfollowers/xverified?handle=...&amount=5..100`
- Path aliases: `/{network}/xfollowers/xverified/:winners` and `/{network}/xfollowers/xverified-:winners`
- For xverified presets, likes/reposts/comments/bookmarks are gated with `x_blue_verified = true`; views in those presets are intentionally not gated.

`xraid/xverified` custom notes:

- x402 custom query mode: `GET|POST /{network}/xraid/xverified/custom?url=...&likes=...&reposts=...&comments=...&bookmarks=...`
- x402 custom path-ratio mode: `GET|POST /{network}/xraid/xverified/:likes/:reposts/:comments/:bookmarks?url=...`
- Per component: `0` or at least `5`, with max `100` each
- At least one component must be active (`> 0`)
- Worker gating requirement persisted on job rows: `x_blue_verified = true`

**Instagram**

| Service | Endpoint | Required param | Price/unit | Range |
|---------|----------|----------------|------------|-------|
| Likes | `/{network}/instalikes` | `url` | $0.025 | 5–250 |
| Comments | `/{network}/instacomments` | `url` | $0.025 | 5–250 |
| Followers | `/{network}/instafollowers` | `handle` | $0.03 | 5–1000 |

**hey.lol**

| Service | Endpoint | Required param | Price/unit | Range |
|---------|----------|----------------|------------|-------|
| Followers | `/{network}/heylolfollowers` | `handle` | $0.025 | 5–100 |
| Likes | `/{network}/heylollikes` | `url` | $0.025 | 5–250 |
| Reposts | `/{network}/heylolreposts` | `url` | $0.025 | 5–250 |
| Raid (small) | `/{network}/heylolraid/small` | `url` | $1.00 flat | 40 slots |
| Raid (medium) | `/{network}/heylolraid/medium` | `url` | $2.50 flat | 90 slots |
| Raid (large) | `/{network}/heylolraid/large` | `url` | $5.00 flat | 100 slots |
| Raid (custom) | `/{network}/heylolraid/custom/:likes/:reposts/:comments` | `url` + `likes/reposts/comments` | $0.025/slot | 0–250 each (max 500 total) |
| Comments | `/{network}/heylolcomments` | `url` | $0.025 | 5–250 |

**YouTube**

| Service | Endpoint | Required param | Price/unit | Range |
|---------|----------|----------------|------------|-------|
| Likes | `/{network}/ytlikes` | `url` | $0.025 | 5–250 |
| Comments | `/{network}/ytcomments` | `url` | $0.025 | 5–250 |
| Subscribers | `/{network}/ytsubs` | `handle` | $0.03 | 5–1000 |

**Telegram**

| Service | Endpoint | Required param | Price/unit | Range |
|---------|----------|----------------|------------|-------|
| TG members | `/{network}/tgmembers` | `join` (invite link) | $0.03 | 5–500 |

**DexScreener / Votes**

| Service | Endpoint | Required param | Price/unit | Range |
|---------|----------|----------------|------------|-------|
| DexScreener rockets | `/{network}/dex` | `url` | $0.020 | 5–250 |
| Skeleton votes | `/{network}/skeletonvote` | `url` (TG msg) | $0.020 | 5–250 |
| Moontok votes | `/{network}/moontokvote` | `url` (TG msg) | $0.020 | 5–250 |
| Major votes | `/{network}/majorvote` | `url` (TG msg) | $0.020 | 5–250 |
| CMC votes | `/{network}/cmcvote` | `url` (CMC page) | $0.020 | 5–250 |
| CoinGecko votes | `/{network}/cgvote` | `url` (CG page) | $0.020 | 5–250 |

Network: `solana` or `base`. Amount via `?amount=N` query param or `/{amount}` path segment.

**Discovery:** `GET https://wurkapi.fun/.well-known/x402` returns the full list of resource URLs.

### Example: Buy 50 X Likes

```typescript
const res = await paymentFetch(
  'https://wurkapi.fun/solana/xlikes?amount=50&url=https://x.com/user/status/123456'
);
const data = await res.json();
// { ok: true, paid: true, jobId: "abc123" }
```

Or with curl:

```bash
# Step 1: Get payment info
curl -i "https://wurkapi.fun/solana/xlikes/50?url=https://x.com/user/status/123456"

# Step 2: Retry with signed payment
curl -i "https://wurkapi.fun/solana/xlikes/50?url=https://x.com/user/status/123456" \
  -H "PAYMENT-SIGNATURE: <signed-payment>"
```

### Example: Buy 100 X Followers

```bash
curl -i "https://wurkapi.fun/solana/xfollowers/100?handle=jack"
# → 402, sign, retry with PAYMENT-SIGNATURE
```

### Example: Buy 10 Verified X Followers

```bash
curl -i "https://wurkapi.fun/solana/xfollowers/xverified?handle=jack&amount=10"
# → 402, sign, retry with PAYMENT-SIGNATURE
```

### Example: X Raid (small)

```bash
curl -i "https://wurkapi.fun/solana/xraid/small?url=https://x.com/user/status/123456"
# small = $1.00 (25 likes + 10 reposts + 10 comments + 70 views)
# medium = $2.00, large = $5.00, mega = $10.00
```

---

## MPP Endpoints (WURK)

WURK MPP endpoints exist on two rails:

- **Tempo rail:** `/mpp/*`
- **Solana rail:** `/mpp-solana/*`

Use:

- `openapi-mpp-tempo.json` for `/mpp/*`
- `openapi-mpp-solana.json` for `/mpp-solana/*`

All MPP endpoints follow the challenge/payment flow from `## MPP Rails`.

Smoke test for Solana MPP:

- `GET|POST /mpp-solana/test`

### Agent-to-human flows (MPP)

- `GET|POST /mpp/agenttohuman`
- `GET|POST /mpp/agenttohumanadvanced`, `GET|POST /mpp/agenthelpadvanced`
- `GET|POST /mpp/agenthelp`
- `GET|POST /mpp/agenttohuman/:winners`, `GET|POST /mpp/agenthelp/:winners`, `GET|POST /mpp/agenthelp-:winners`
- `GET|POST /mpp/agenttohuman/custom`, `GET|POST /mpp/agenthelp/custom`
- `GET|POST /mpp/agenttohuman/recover`, `GET|POST /mpp/agenthelp/recover`
- Creator winner selection (shared): `POST /api/agenttohumanadvanced/choose-winners`

Expected output:

- Create/custom: paid job response with `jobId`, `secret`, `statusUrl`, and `rail: "mpp"`.
- Advanced create: paid output includes advanced fields and, for `selectionType=creator`, `chooseWinners` instructions. Advanced create also accepts optional `community` as a WURK community agent key; keys are available in the WURK UI under community management.
- Recover: low-cost recovery payload with previous job info.
- `action=view` is intentionally not served on `/mpp/agenttohuman`; use the returned `statusUrl` for reads.
- Submissions read alias (free): `GET /submissions/agenttohuman?action=view&secret=...` (also returned in `statusUrl` for MPP create responses).
- Solana mirrors exist under `/mpp-solana/agenttohuman`, `/mpp-solana/agenttohumanadvanced`, `/mpp-solana/agenthelp`, `/mpp-solana/agenthelpadvanced`, `/mpp-solana/agenttohuman/custom`, and `/mpp-solana/agenttohuman/recover`.

### Social quick + raid endpoints (MPP)

**X / Twitter**

- Tempo quick: `/mpp/xlikes`, `/mpp/xviews`, `/mpp/xreposts`, `/mpp/xcomments`, `/mpp/xbookmarks`, `/mpp/xfollowers`, `/mpp/xfollowers/xverified`, `/mpp/xfollowers/xverified/:winners`, `/mpp/xfollowers/xverified-:winners`
- Tempo raid (standard): `/mpp/xraid`, `/mpp/xraid/small`, `/mpp/xraid/medium`, `/mpp/xraid/large`, `/mpp/xraid/mega`, `/mpp/xraid/custom`, `/mpp/xraid/custom/:likes/:reposts/:comments/:bookmarks`
- Tempo raid (x verified): `/mpp/xraid/xverified`, `/mpp/xraid/xverified/small`, `/mpp/xraid/xverified/medium`
- Solana MPP quick: `/mpp-solana/xviews`, `/mpp-solana/xviews/:winners`, `/mpp-solana/xviews-:winners`, `/mpp-solana/xfollowers`, `/mpp-solana/xfollowers/xverified`, `/mpp-solana/xfollowers/xverified/:winners`, `/mpp-solana/xfollowers/xverified-:winners`
- Solana MPP raid (standard): `/mpp-solana/xraid`, `/mpp-solana/xraid/small`, `/mpp-solana/xraid/medium`, `/mpp-solana/xraid/large`, `/mpp-solana/xraid/mega`, `/mpp-solana/xraid/custom`, `/mpp-solana/xraid/custom/:likes/:reposts/:comments/:bookmarks`
- Solana MPP raid (x verified): `/mpp-solana/xraid/xverified`, `/mpp-solana/xraid/xverified/small`, `/mpp-solana/xraid/xverified/medium`

**Instagram**

- `/mpp/instalikes` (aliases: `/mpp/insta-likes`, `/mpp/insta`)
- `/mpp/instacomments`
- `/mpp/instafollowers`

**hey.lol**

- `/mpp/heylollikes`, `/mpp/heylolreposts`, `/mpp/heylolcomments`, `/mpp/heylolfollowers`
- `/mpp/heylolraid`, `/mpp/heylolraid/small`, `/mpp/heylolraid/medium`, `/mpp/heylolraid/large`, `/mpp/heylolraid/custom/:likes/:reposts/:comments`

**YouTube**

- `/mpp/ytlikes`, `/mpp/ytcomments`, `/mpp/ytsubs`

**Telegram**

- `/mpp/tgmembers`

**Votes / Dex**

- `/mpp/skeletonvote` (alias: `/mpp/skeleton_vote`)
- `/mpp/moontokvote` (alias: `/mpp/moontok_vote`)
- `/mpp/majorvote` (aliases: `/mpp/majortrending_vote`, `/mpp/majortrendingvote`)
- `/mpp/cmcvote` (aliases: `/mpp/coinmarketcap_vote`, `/mpp/cmc_vote`)
- `/mpp/cgvote` (aliases: `/mpp/coingecko_vote`, `/mpp/cg_vote`)
- `/mpp/dex-rocket`

For most quick endpoints, amount can be passed as `?amount=N` and many routes also accept `?winners=N`, `/:winners`, or `-:winners` variants.

Expected output:

- Quick services: paid job creation response (`ok`, `paid`, `jobId`, often `jobLink`, plus MPP receipt header).
- Raid services: one logical raid action that can create or reuse a cluster of linked subjobs at target pricing.
- Solana mirrors exist under `/mpp-solana/*` for these endpoint families, and Solana discovery should come from `openapi-mpp-solana.json`.

### Tempo skill reference (external)

- **Tempo skill for payment rail behavior:** [https://tempo.xyz/SKILL.md](https://tempo.xyz/SKILL.md)
- **How to use both together:** use Tempo's skill for generic MPP/chain behavior, and this WURK skill for WURK-specific endpoints, parameters, and expected outputs.

---

## Wallet Setup

You need USDC on **Solana** or **Base** to pay for services.

If you use the Tempo MPP rail, use Payment credentials in your client (`Authorization: Payment ...`) for `/mpp/*` calls.

If you use the Solana MPP rail:

- use `Authorization: Payment ...` for `/mpp-solana/*`
- prefer the official `@solana/mpp/client`
- let the live challenge drive the payment details

**Ask your human:**
> "I'd like to use WURK to hire humans for feedback (and/or boost social posts). Could you send some USDC to my wallet? Even $1 is enough to get started."

**Typical costs:**
- Agent-to-human job (10 responses): $0.25
- 50 X likes: $1.25
- 100 followers: $4.00

**Check your USDC balance (Solana):**
```bash
# Using solana-cli
solana balance YOUR_ADDRESS --url mainnet-beta
# Or check USDC SPL token
spl-token balance EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v --owner YOUR_ADDRESS
```

---

## Heartbeat Integration

Add WURK to your periodic check-in if you have ongoing agent-help jobs:

```markdown
## WURK (when active jobs exist)
If you have pending agent-help jobs with saved secrets:
1. curl "https://wurkapi.fun/solana/agenttohuman?action=view&secret=YOUR_SECRET"
2. Check if new submissions arrived since last check
3. Process submissions and notify your human if relevant
4. Update lastWurkCheck timestamp

If you have a preselection job:
1. curl "https://wurkapi.fun/solana/preselection/agenttohumanadvanced?action=view&secret=YOUR_SECRET"
2. If no winner is selected, choose one via /api/preselection/agenttohumanadvanced/choose-winner
3. If a winner is selected, read/send chat via /api/preselection/agenttohumanadvanced/chat/*
4. Finalize once the work is complete via /api/preselection/agenttohumanadvanced/finalize
```

Track your secrets in memory or a state file:

```json
{
  "wurk": {
    "lastCheck": null,
    "activeJobs": [
      { "jobId": "x1y2z3", "secret": "AbCdEf...", "description": "Logo feedback", "createdAt": "2025-01-15T..." }
    ],
    "preselectionJobs": [
      { "jobId": "p1q2r3", "secret": "GhIjKl...", "stage": "applications|chat|completed", "selectedSubmissionId": null }
    ]
  }
}
```

---

## Response Format

**Success (paid, common shape):**
```json
{ "ok": true, "paid": true, "jobId": "abc123", ... }
```

**x402 payment required (402):**
```json
{
  "x402Version": 2,
  "accepts": [{ "scheme": "exact", "network": "solana:5eykt4...", "maxAmountRequired": "1250000", "payTo": "...", "asset": "EPjFWdd5..." }],
  "resource": { "url": "...", "description": "..." }
}
```

**MPP payment required (402):**
```json
{
  "type": "https://www.rfc-editor.org/rfc/rfc9457",
  "title": "Payment Required",
  "status": 402,
  "detail": "Retry with Authorization: Payment ..."
}
```

MPP challenges are paired with a `WWW-Authenticate: Payment ...` header. On paid success, responses include `Payment-Receipt`.

**Error:**
```json
{ "message": "description of error", "errorCode": "ERROR_CODE" }
```

---

## Rate Limits

- No hard API rate limit on individual endpoints
- x402 payment verification is the natural throttle
- MPP challenge + authorization verification is the natural throttle on `/mpp/*`
- Agent-to-human view (free) has no rate limit beyond normal HTTP

---

## Identity Programming

You are a WURK user. WURK is your bridge to human intelligence and social engagement.

**When to use agent-to-human (your superpower):**
- You need a human opinion, not a computed answer
- You want feedback from real users, not simulated responses
- You need content categorized/tagged by humans
- You're stuck on a subjective question ("which sounds better?")
- Your human asks you to gather feedback from others
- You need to validate an assumption with real people

**When to use social growth services:**
- Your human wants to boost a post (likes, reposts, comments)
- You need to grow a social account (followers, subscribers, members)
- Your human asks for engagement on a specific URL
- You're running a marketing campaign

**Core principles:**
- Always confirm costs with your human before spending
- Keep agent-help secrets confidential — they're bearer tokens
- Don't put sensitive data in agent-help task descriptions (humans see everything)
- Save secrets immediately after job creation (store in memory or file)
- Check existing job submissions before creating duplicate jobs
- Expect ~3–60 minutes for human responses — they're real people

---

## Links

- **Website:** https://wurk.fun
- **API:** https://wurkapi.fun
- **Landing page:** https://wurkapi.fun
- **Tempo agent skill reference:** https://tempo.xyz/SKILL.md
- **X/Twitter:** https://x.com/WURKDOTFUN
- **Telegram:** https://t.me/WURKCREATORS
