Live

PeoplePerHour API and MCP server

peopleperhour.com

PeoplePerHour has no public API and no developer docs (checked 12 Oct 2026). Cotlet is a hosted MCP server and REST API for PeoplePerHour with 11 endpoints (6 read, 5 write): your AI agent signs in as you and does the work.

Endpoints
11 6 read, 5 write
Updated
How Cotlet connects your agent to PeoplePerHour
  1. Your agent

    Claude Code, Codex, Cursor or a script

  2. Cotlet

    MCP server and REST API · 11 endpoints

    cotlet.dev/mcp/v1

  3. PeoplePerHour

    Signed in as you on peopleperhour.com

You sign in once. We never store your password.

Official API

Does PeoplePerHour have an official API?

PeoplePerHour has no public API and no developer docs (checked 12 Oct 2026). Freelancers search projects, send proposals, answer buyers in WorkStreams and raise invoices in the website only; the one built-in alert is an email, instant or daily, from up to 10 saved searches.

What PeoplePerHour's own tools do compared with Cotlet
Task PeoplePerHour official Cotlet
Search new projects Partly Saved search email, instant or daily, nothing to call from code Yes
Send a proposal to a project No Yes
Cancel and re-send a proposal No Yes
List WorkStreams and read their messages No Yes
Reply to a buyer in a WorkStream No Yes
Create an Offer No Yes
Raise an invoice from a WorkStream No AutoPay bills a fixed weekly or monthly amount, set up by the buyer Yes

Sources: PeoplePerHour: How it works for freelancers · PeoplePerHour Help: Submitting Proposals · PeoplePerHour Help: Canceling a proposal · PeoplePerHour Help: Saved Searches · PeoplePerHour Help: Set up AutoPay · PeoplePerHour: Terms of website use

Common use cases

What can an AI agent do in PeoplePerHour?

Cotlet is best for PeoplePerHour freelancers who want an AI agent to find projects, draft proposals, answer buyers and raise invoices without running or fixing a server.

  • Find new projects that match my skills Runs: Daily

    Every morning, check PeoplePerHour for web design projects posted since yesterday, skip anything under £200 or with more than 15 proposals, read the briefs of the rest and give me a shortlist of five with one line on why each fits. Your agent calls search_projects and get_project.

  • Write and send proposals Runs: Daily

    Draft proposals for the two landing page projects you shortlisted today, using my Figma portfolio and a 50% deposit, and show me each one before it goes out. Your agent calls get_project, send_proposal, list_proposals and cancel_proposal.

  • Answer buyer messages in WorkStreams Runs: Twice daily

    Twice a day, find WorkStreams where the buyer wrote last, draft a reply to each from the thread history, and flag any that are close to a full working day without an answer. Your agent calls list_workstreams, get_workstream and send_message.

  • Raise invoices for finished work Runs: Weekly

    Every Friday, go through my active WorkStreams, find jobs the buyer has signed off but I have not invoiced, and draft each invoice for the agreed price. Your agent calls list_workstreams, get_workstream and create_invoice.

  • Re-send a proposal with a new price

    The buyer on the landing page project asked for a lower price. Cancel my proposal and send a new one at 400. Your agent calls list_proposals, cancel_proposal and send_proposal.

Endpoints

What is the PeoplePerHour API?

Cotlet's PeoplePerHour API exposes 11 endpoints for your own PeoplePerHour account: search projects, get project, list proposals, list WorkStreams, get WorkStream, list Offers, send proposal, cancel proposal, send message, create invoice and create Offer. The search_projects endpoint returns projects buyers posted, newest first, with title, budget, category and proposal count. Each endpoint takes simple JSON inputs like limit, cursor or workstream_id and works both as an MCP tool for agents and as a REST call for scripts.

All endpoints · 11 total

missing one? request an endpoint

  • POST

    search_projects

    read

    Returns projects from the same search as the website, newest first. Filter by keyword or by posting time to read only what came in since your last check. Each item has the budget the buyer set; get_project returns the full brief. Pass next_cursor back as cursor for the next page.

    POST /api/v1/peopleperhour/search_projects

    Input

    Input: search_projects
    Parameter Type Description
    query string Keywords to search for.
    since datetime Only projects posted after this time.
    limit integer 1 to 50. Default: 20.
    cursor string Next page cursor from the previous call.

    Example response

    {
      "projects": [
        {
          "project_id": "pj_48213",
          "title": "Landing page design for a SaaS launch",
          "budget": {
            "amount": 500,
            "currency": "GBP"
          },
          "category": "Design",
          "proposals": 4,
          "posted_at": "2026-10-10T08:12:00Z",
          "url": "https://www.peopleperhour.com/freelance-jobs/design/landing-page-design-for-a-saas-launch-48213"
        }
      ],
      "next_cursor": null
    }
  • POST

    get_project

    read

    Returns one project with the buyer's full brief, budget, required skills and how many proposals it has. Use it before send_proposal so your agent reads the brief instead of the title.

    POST /api/v1/peopleperhour/get_project

    Input

    Input: get_project
    Parameter Type Description
    project_id required string Project ID from search_projects.

    Example response

    {
      "project_id": "pj_48213",
      "title": "Landing page design for a SaaS launch",
      "brief": "We need a one-page design in Figma for our launch on 1 November. Copy is ready.",
      "budget": {
        "amount": 500,
        "currency": "GBP"
      },
      "skills": [
        "Web design",
        "Figma"
      ],
      "proposals": 4,
      "posted_at": "2026-10-10T08:12:00Z"
    }
  • POST

    list_proposals

    read

    Lists the proposals on your account, newest first, with the project, your price and whether the buyer has accepted it. Filter by status to find the ones still waiting. Pass proposal_id to cancel_proposal.

    POST /api/v1/peopleperhour/list_proposals

    Input

    Input: list_proposals
    Parameter Type Description
    status string Only proposals with this status, for example pending.
    limit integer 1 to 50. Default: 20.
    cursor string Next page cursor from the previous call.

    Example response

    {
      "proposals": [
        {
          "proposal_id": "pp_90412",
          "project_id": "pj_48213",
          "project_title": "Landing page design for a SaaS launch",
          "price": 450,
          "status": "pending",
          "sent_at": "2026-10-10T09:30:00Z"
        }
      ],
      "next_cursor": null
    }
  • POST

    list_workstreams

    read

    Lists your WorkStreams, most recent first, each with the buyer, the project and a preview of the last message. Set awaiting_reply to see only threads where the buyer wrote last. Use the workstream_id with get_workstream, send_message and create_invoice.

    POST /api/v1/peopleperhour/list_workstreams

    Input

    Input: list_workstreams
    Parameter Type Description
    awaiting_reply boolean Only threads where the buyer sent the last message.
    limit integer 1 to 50. Default: 20.
    cursor string Next page cursor from the previous call.

    Example response

    {
      "workstreams": [
        {
          "workstream_id": "ws_7731",
          "buyer": "Maria S.",
          "project_title": "Landing page design for a SaaS launch",
          "last_message": "Can you start on Monday?",
          "last_from": "buyer",
          "updated_at": "2026-10-11T07:40:00Z"
        }
      ],
      "next_cursor": null
    }
  • POST

    get_workstream

    read

    Returns one WorkStream in order, oldest first: messages, the proposals sent in it, invoices raised and file names shared. Read it before replying so your agent sees the whole history with this buyer.

    POST /api/v1/peopleperhour/get_workstream

    Input

    Input: get_workstream
    Parameter Type Description
    workstream_id required string WorkStream ID from list_workstreams.

    Example response

    {
      "workstream_id": "ws_7731",
      "buyer": "Maria S.",
      "items": [
        {
          "type": "proposal",
          "proposal_id": "pp_90412",
          "price": 450,
          "sent_at": "2026-10-10T09:30:00Z"
        },
        {
          "type": "message",
          "from": "buyer",
          "body": "Can you start on Monday?",
          "sent_at": "2026-10-11T07:40:00Z"
        }
      ]
    }
  • POST

    list_offers

    read

    Lists the fixed-price Offers on your profile, newest first, with title, price and whether each is live. Use it to check what you already sell before creating another.

    POST /api/v1/peopleperhour/list_offers

    Input

    No parameters.

    Example response

    {
      "offers": [
        {
          "offer_id": "of_2209",
          "title": "Landing page design in Figma",
          "price": 350,
          "status": "live"
        }
      ]
    }
  • POST

    send_proposal

    write

    Sends a proposal on one project under your name. It takes a brief of what you will deliver, a price, a delivery time and optionally a deposit to hold in Escrow. It counts against your free Proposals for the month; more are bought as Proposal credits. By default you confirm each call; you can switch that off for this tool.

    POST /api/v1/peopleperhour/send_proposal

    Input

    Input: send_proposal
    Parameter Type Description
    project_id required string Project ID from search_projects.
    brief required string What you will deliver and by when.
    price required number Your price in the project currency.
    delivery_days required integer Days to deliver.
    deposit_percent integer Share of the price to hold in Escrow up front. Default: none.

    Example response

    {
      "proposal_id": "pp_90412",
      "project_id": "pj_48213",
      "status": "pending",
      "price": 450,
      "delivery_days": 7,
      "deposit_percent": 20,
      "workstream_id": "ws_7731",
      "sent_at": "2026-10-10T09:30:00Z"
    }
  • POST

    cancel_proposal

    write

    Cancels one pending proposal. An accepted proposal cannot be cancelled and the call fails. The buyer sees the proposal withdrawn, so use it before sending a corrected one. By default you confirm each call; you can switch that off for this tool.

    POST /api/v1/peopleperhour/cancel_proposal

    Input

    Input: cancel_proposal
    Parameter Type Description
    proposal_id required string Proposal ID from list_proposals.

    Example response

    {
      "proposal_id": "pp_90412",
      "status": "cancelled"
    }
  • POST

    send_message

    write

    Posts a message in one WorkStream under your name. Each WorkStream is one buyer and one project, so a message never reaches other buyers. By default you confirm each call; you can switch that off for this tool.

    POST /api/v1/peopleperhour/send_message

    Input

    Input: send_message
    Parameter Type Description
    workstream_id required string WorkStream ID from list_workstreams.
    body required string Message text.

    Example response

    {
      "workstream_id": "ws_7731",
      "message_id": "msg_5120",
      "status": "sent",
      "sent_at": "2026-10-11T08:05:00Z"
    }
  • POST

    create_invoice

    write

    Raises an invoice in one WorkStream. The buyer is asked to pay it, so it reaches money and the other person. Amount and description are the ones you pass. By default you confirm each call; you can switch that off for this tool.

    POST /api/v1/peopleperhour/create_invoice

    Input

    Input: create_invoice
    Parameter Type Description
    workstream_id required string WorkStream ID from list_workstreams.
    amount required number Invoice amount in the project currency.
    description required string What the invoice is for.

    Example response

    {
      "invoice_id": "inv_3318",
      "workstream_id": "ws_7731",
      "amount": 300,
      "description": "Landing page design, week 2",
      "status": "sent",
      "raised_at": "2026-10-16T16:00:00Z"
    }
  • POST

    create_offer

    write

    Publishes an Offer on your profile with a title, description and price, visible to buyers. It reaches the public, so it asks first. By default you confirm each call; you can switch that off for this tool.

    POST /api/v1/peopleperhour/create_offer

    Input

    Input: create_offer
    Parameter Type Description
    title required string Offer title.
    description required string What the buyer gets.
    price required number Price in your account currency.

    Example response

    {
      "offer_id": "of_2210",
      "title": "Logo refresh in 3 days",
      "price": 120,
      "status": "live"
    }

Setup

How do I connect PeoplePerHour to Claude Code, Codex or Cursor?

Connecting PeoplePerHour takes three steps: request access, sign in to PeoplePerHour once, then add one MCP server or call the REST API with the same key.

Connect PeoplePerHour over MCP

  1. 1

    Create an account

    Sign up and add PeoplePerHour in the console. Your API key is there too.

  2. 2

    Sign in to PeoplePerHour once

    Open the connect page from the console and sign in to PeoplePerHour the way you always do. We keep the session, never your password, and you can revoke it anytime.

  3. 3

    Add Cotlet to your agent

    Claude Code
    claude mcp add --transport http cotlet \
      https://cotlet.dev/mcp/v1 \
      --header "Authorization: Bearer $COTLET_API_KEY"
    Cursor
    {
      "mcpServers": {
        "cotlet": {
          "url": "https://cotlet.dev/mcp/v1",
          "headers": {
            "Authorization": "Bearer ${COTLET_API_KEY}"
          }
        }
      }
    }
    Codex
    # ~/.codex/config.toml
    [mcp_servers.cotlet]
    url = "https://cotlet.dev/mcp/v1"
    bearer_token_env_var = "COTLET_API_KEY"

    Paste the snippet for your client. The same server and key serve every app you connect, so you do this once.

  4. 4

    Ask your agent

    Prompt

    Every morning, check PeoplePerHour for web design projects posted since yesterday, skip anything under £200 or with more than 15 proposals, read the briefs of the rest and give me a shortlist of five with one line on why each fits.

    Ask in plain words. Your agent finds the PeoplePerHour tools on the server and calls them for you; anything that reaches other people waits for your OK unless you switch that off for a tool.

Call PeoplePerHour over REST

  1. 1

    Export your API key

    Shell

    export COTLET_API_KEY="cotlet_..."

    Your scripts use the same API key as your agent. Keep it in an environment variable, never in your code.

  2. 2

    Call a tool

    curl

    curl https://cotlet.dev/api/v1/peopleperhour/send_proposal \
      -H "Authorization: Bearer $COTLET_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{"project_id":"pj_48213","brief":"I will design the landing page in Figma and hand over the files, with two rounds of changes.","price":450,"delivery_days":7,"deposit_percent":20}'

    Every tool is a POST endpoint at /api/v1/peopleperhour/{tool}. Send its parameters as JSON, exactly as listed in the endpoints above.

  3. 3

    Read the result

    Example response · send_proposal

    {
      "proposal_id": "pp_90412",
      "project_id": "pj_48213",
      "status": "pending",
      "price": 450,
      "delivery_days": 7,
      "deposit_percent": 20,
      "workstream_id": "ws_7731",
      "sent_at": "2026-10-10T09:30:00Z"
    }

    You get plain JSON back, ready for your script. A failed call costs nothing.

Why Cotlet

Why use Cotlet for PeoplePerHour? Hosted, safe and kept working.

  • Built for agents

    • One MCP server for every app you connect.
    • The same tools as a REST API for scripts and cron jobs.
    • Works with Claude Code, Codex and Cursor.
  • Your login stays yours

    • You sign in to PeoplePerHour yourself. We keep only the session, encrypted with AES-256.
    • The model never sees a login.
    • No stored passwords, no CAPTCHA solving, no MFA bypass.
  • You stay in control

    • Pick read only, or read and write.
    • Anything that reaches other people waits for your OK, unless you switch it off per tool.
    • Revoke access in one click.
  • Kept working for you

    • We test every integration daily.
    • When PeoplePerHour changes, the tool pauses until we fix it.
    • Failed calls cost nothing.

Alternatives

Is there a PeoplePerHour MCP server on GitHub?

Hosted scrapers exist for PeoplePerHour. They read public project and freelancer listings, you pay them per result, and they never see your WorkStreams or send anything as you. Cotlet signs in as you and works in your own account.

Cotlet compared with a Hosted scraper
Hosted scraper Cotlet
Setup Create an account with the scraper host, set search inputs, add its token to your client Request access, sign in to PeoplePerHour once in your browser, add one MCP server or API key
What it covers Public project and freelancer listings, read only Search plus your proposals, WorkStreams, messages, Offers and invoices
Your account Not connected, so it cannot send or reply as you Works as you: proposals, replies and invoices go out under your name
Your session None, no account is connected Encrypted in an EU vault, limited to the actions you allow, revoked in one click
When PeoplePerHour changes Maintained by the scraper author Our team tests it daily and fixes it for you; failed calls are free
Where it runs Hosted by the scraper provider Hosted: Claude Code, Codex, Cursor, n8n and scripts, also on a schedule
Price Per result Free 7-day trial with 5,000 credits, then credits per call

Which one fits you

Pick Cotlet if

  • you are not a developer, or you do not want to maintain a server
  • you need it to keep working when PeoplePerHour changes, without checking it yourself
  • your agent or a script should run it on a schedule, also while your computer is off

Pick an open-source server if

  • you are comfortable installing, updating and fixing it yourself
  • you want the session to stay on your own computer
  • you only need it now and then, from one MCP client

For AI agents

Cotlet for PeoplePerHour in plain text The facts on this page in one block: status, endpoints, access, pricing, contact.

Endpoint health

verified 2h ago

  • search_projects passing
  • get_project passing
  • list_proposals passing
  • list_workstreams passing
  • get_workstream passing

+ 6 more endpoints

11/11 passing latest check self-healing

peopleperhour.txt

PeoplePerHour has no public API and no developer docs (checked 12 Oct 2026). Freelancers search projects, send proposals, answer buyers in WorkStreams and raise invoices in the website only; the one built-in alert is an email, instant or daily, from up to 10 saved searches.
Cotlet provides a hosted MCP server and REST API for PeoplePerHour: 11 tools (6 read, 5 write).
Access       Request access at https://cotlet.dev/app/signup?app=peopleperhour; we email the API key.

MCP server   https://cotlet.dev/mcp/v1
REST base    https://cotlet.dev/api/v1/peopleperhour
Auth         Authorization: Bearer <COTLET_API_KEY>. Listing endpoints and schemas needs no key; calling an endpoint needs one.
Tools        search_projects, get_project, list_proposals, list_workstreams, get_workstream, list_offers, send_proposal, cancel_proposal, send_message, create_invoice, create_offer
Confirm      send_proposal, cancel_proposal, send_message, create_invoice, create_offer (by default the user approves each call; the user can switch this off per tool, e.g. for scheduled automations)
Markdown     https://cotlet.dev/integrations/peopleperhour-api-mcp-server.md

How access works:
1. The user requests access at https://cotlet.dev/app/signup?app=peopleperhour (PeoplePerHour is pre-selected). Each request is reviewed and the API key is sent by email.
2. The user signs in to PeoplePerHour once in a browser. An agent cannot do this step.
3. The API key goes into the MCP client or the REST call as a bearer token.

Fits: people who want a hosted PeoplePerHour server that someone else maintains, including non-developers.

Policy: Cotlet never stores passwords, never solves CAPTCHAs, never bypasses MFA.
Company: legal details in the Terms of service at https://cotlet.dev/terms. Contact contact@cotlet.dev.
Session: the user signs in to PeoplePerHour in a browser; Cotlet keeps only the session, AES-256 encrypted, revocable in the dashboard at any time.
Terms: the user stays responsible for following PeoplePerHour's terms; Cotlet is not affiliated with PeoplePerHour.
Full page as Markdown

Automations

Can PeoplePerHour automations run on a schedule in n8n, Make or Zapier?

Yes. Cotlet does not replace your automation platform: it gives it a PeoplePerHour connection it does not have, with the same API key as your agent. Write actions ask for your OK by default; switch that off in your dashboard for the tools you choose, for example to find new projects that match my skills, and the schedule runs on its own. Cotlet runs in the cloud, so it keeps going while your computer is off.

Where to run PeoplePerHour automations through Cotlet, and how to schedule them
Where How to connect How to schedule
Your AI agent Add https://cotlet.dev/mcp/v1 with your API key. A scheduled agent run, for example a Claude Code routine.
n8n MCP Client node with https://cotlet.dev/mcp/v1, or an HTTP Request node to https://cotlet.dev/api/v1/peopleperhour/{tool}. Schedule Trigger node.
Make HTTP module: POST https://cotlet.dev/api/v1/peopleperhour/{tool} with an Authorization: Bearer header and a JSON body. Scenario schedule.
Zapier Webhooks by Zapier: POST https://cotlet.dev/api/v1/peopleperhour/{tool} with the same header and body. Schedule by Zapier trigger.
Your own script POST https://cotlet.dev/api/v1/peopleperhour/{tool} with your API key. cron or GitHub Actions.

Pricing & limits

How much does the PeoplePerHour API cost?

Free 7-day trial with 5,000 credits, no card needed. After that, the PeoplePerHour API comes with the Cotlet plan, from $29 a month for 3,000 credits, with no limit on apps. Each month's credits stay valid for 3 months, so unused credits add up.

Cotlet plan sizes: price, monthly credits and price per credit
Size Price Credits / month Per credit
Solo $29/mo 3,000 about $0.0097
Pro $99/mo 12,000 about $0.0083
Agency $299/mo 40,000 $0.0075

Each successful call uses credits for the work it takes; failed calls and timeouts cost nothing. A hard spend cap is on by default. Authenticate with the Authorization: Bearer header.

About Cotlet

How Cotlet holds your access

Cotlet hosts MCP servers and REST APIs for apps with no usable API. Your agent works in your own PeoplePerHour account.

Company details
The legal name, address and registration numbers of the company behind Cotlet are in the Terms of service. Terms
Your session
You sign in to PeoplePerHour yourself, in your browser. We keep only the session, never your password: encrypted with AES-256 in an EU vault, isolated to your account and used only when your agent calls a PeoplePerHour tool you allowed. When it expires, your agent gives you a link to sign in again. Security
Revoking access
Disconnect PeoplePerHour in your dashboard: the session is deleted and access ends at once. Actions that reach other people wait for your OK unless you switch that off per tool.
What we never do
Store passwords, solve CAPTCHAs or bypass MFA.
PeoplePerHour's terms
You use your own PeoplePerHour account and stay responsible for following PeoplePerHour's terms. Cotlet is independent and not affiliated with PeoplePerHour. Terms
Contact
Questions about the company, security or an app: contact@cotlet.dev
About Cotlet

Frequently asked questions

How do I get access?

Request access and pick PeoplePerHour. Cotlet reviews each request and emails you your API key.

Do I need to be technical?

No. You sign in to PeoplePerHour once in your browser and paste one command into your agent, or one URL into n8n. Your agent can walk you through it. There is no server to install, update or fix.

Is a hosted server safe? My PeoplePerHour session would leave my computer.

Cotlet keeps your PeoplePerHour session encrypted with AES-256 in an EU vault, isolated to your account and used only for the tools you allow: read only, or read and write. The AI model never sees it, and you revoke it in one click. A local server keeps the same session in a file on your computer, readable by any program you run, and needs a fresh sign-in whenever it expires.

Do I need a paid PeoplePerHour plan?

No plan is needed for Cotlet; it works in your own freelancer account. PeoplePerHour gives each freelancer 15 Proposals a month for free and sells more as Proposal credits.

Can my agent post or send messages in PeoplePerHour without asking me?

No. Every call to send_proposal, cancel_proposal, send_message, create_invoice or create_offer waits for your OK by default. For scheduled automations you can switch confirmation off per tool in your dashboard, for example only for approvals.

Can I use the PeoplePerHour API in n8n?

Yes. Add https://cotlet.dev/mcp/v1 with your API key in n8n's MCP Client node, or call https://cotlet.dev/api/v1/peopleperhour/{tool} from the HTTP Request node.

Give your agent access to PeoplePerHour.

Request access and pick it. We review each request and email you your API key. Free 7-day trial with 5,000 credits, no card needed.