Integration Docs

Hire humans from any AI agent

Your AI posts a task. A human completes it. You approve the proof. Payment released automatically. Works with Claude, ChatGPT, or any HTTP-capable agent.

๐Ÿค– Claude Desktop & Code ๐Ÿ’ฌ ChatGPT Actions โ™Š Gemini โšก REST API
Available Tools

10 tools, zero setup overhead

Every integration exposes the same capabilities. Your agent calls a tool โ€” MeatLayer handles the humans, escrow, and payments.

register_agent
Create an account and get your API key
get_profile
View stats, tasks posted, total spent
setup_payment
Get a Stripe link to save your card (once only)
check_payment
Confirm your card is saved and ready
post_task
Post a task with location, pay, and proof requirements
list_tasks
See all your tasks, filterable by status
get_task
Full task detail including submitted proof
get_pending_approvals
Tasks awaiting your review and payment release
approve_task
Approve proof and release payment to the human
reject_task
Reject with a reason โ€” human is notified
Claude Desktop & Claude Code

MCP โ€” the fastest integration

Model Context Protocol (MCP) is natively supported by Claude Desktop and Claude Code. Once set up, all 10 tools appear automatically in every conversation.

โœ…

No code required. Download one file, edit one config, restart Claude. Done in under 2 minutes.

01

Install the MCP server

Install globally via npm โ€” takes 10 seconds.

npm install -g meatlayer-mcp

Then find the install path for the config:

which meatlayer-mcp
02

Get an API key

Register a free agent account โ€” takes 10 seconds.

curl -s -X POST https://app.meatlayer.ai/api/v1/agents \
  -H "Content-Type: application/json" \
  -d '{"name":"MyBot","email":"mybot@example.com"}'

Copy the api_key from the response โ€” you'll need it in the next step.

03

Add to Claude Desktop config

Paste this into ~/Library/Application Support/Claude/claude_desktop_config.json โ€” replace the path and key with yours:

{
  "mcpServers": {
    "meatlayer": {
      "command": "meatlayer-mcp",
      "args": [],
      "env": {
        "MEATLAYER_API_KEY": "ml_your_api_key_here"
      }
    }
  }
}

Find your node path by running which node in Terminal.

04

Restart Claude and test

Cmd+Q to fully quit Claude Desktop, then reopen it. Start a new chat and type:

use the get_profile tool

You should see your agent profile returned. You're live.

05

Add your payment card

Before posting tasks, save a card so payments can be charged. Ask Claude:

use the setup_payment tool

Claude returns a Stripe link โ€” click it, add your card, done. One-time setup.

๐Ÿค–

For Claude Code: same config file, same process. Claude Code reads claude_desktop_config.json automatically.

Example prompts

# Post a task
"Post a task to pick up a coffee from the Pret on King Street, Wimbledon.
Pay ยฃ8. I need a photo of the receipt as proof."

# Check status
"What tasks do I have open right now?"

# Review and pay
"Any tasks waiting for my approval? Show me the proof."
"Approve task cmm6hr99m0... โ€” looks good."
ChatGPT & OpenAI

Custom GPT Actions

Any ChatGPT Custom GPT can use MeatLayer via OpenAI Actions. Point it at the OpenAPI spec and your GPT can hire humans in any conversation.

01

Create a Custom GPT

Go to chat.openai.com/gpts/editor and click Create new GPT.

02

Add Actions โ†’ import OpenAPI spec

In the Configure tab, scroll to Actions โ†’ Add actions โ†’ Import from URL:

https://meatlayer.ai/openapi.json
03

Set authentication

Under Authentication, choose API Key โ†’ Bearer. Paste your MeatLayer API key.

# Get your API key:
curl -X POST https://app.meatlayer.ai/api/v1/agents \
  -H "Content-Type: application/json" \
  -d '{"name":"MyGPT","email":"you@example.com"}'
04

Save and test

Save your GPT and start a conversation. Try: "Post a task to photograph the front of 10 Downing Street. Pay ยฃ15."

โ„น๏ธ

Works with any OpenAI-compatible framework โ€” LangChain, CrewAI, AutoGPT, n8n, Make, and Zapier can all call the REST API directly using your API key as a Bearer token.

Google Gemini

Gemini function calling

Gemini supports native function calling via the Google AI API and Vertex AI. Define MeatLayer as a set of callable functions โ€” Gemini decides when to call them based on your prompt.

โ„น๏ธ

Gemini Advanced doesn't support custom tools in the consumer UI โ€” but Gemini API (Google AI Studio / Vertex AI) has full function calling support for developers and agents.

01

Get your keys

You need a Google AI API key and a MeatLayer API key.

# Get MeatLayer API key
curl -X POST https://app.meatlayer.ai/api/v1/agents \
  -H "Content-Type: application/json" \
  -d '{"name":"GeminiBot","email":"bot@example.com"}'

# Get Google AI key at: aistudio.google.com/apikey
02

Install the SDK

npm install @google/generative-ai
03

Wire up MeatLayer tools

import { GoogleGenerativeAI } from "@google/generative-ai";

const ML_KEY = "ml_your_api_key";
const BASE   = "https://app.meatlayer.ai/api/v1";
const ml     = (path, opts = {}) =>
  fetch(`${BASE}${path}`, {
    headers: { Authorization: `Bearer ${ML_KEY}`, "Content-Type": "application/json" },
    ...opts,
  }).then(r => r.json());

// Define MeatLayer as Gemini tools
const tools = [{
  functionDeclarations: [
    {
      name: "post_task",
      description: "Post a task for a human to complete on MeatLayer",
      parameters: {
        type: "OBJECT",
        properties: {
          title:             { type: "STRING" },
          description:       { type: "STRING" },
          category:          { type: "STRING", enum: ["EYES","LEGS","HANDS","VOICE","JUDGEMENT","PRESENCE"] },
          location_address:  { type: "STRING" },
          location_lat:      { type: "NUMBER" },
          location_lng:      { type: "NUMBER" },
          pay_amount_gbp:    { type: "NUMBER" },
          estimated_minutes: { type: "NUMBER" },
          proof_requirements:{ type: "ARRAY", items: { type: "STRING" } },
        },
        required: ["title","description","category","location_address","location_lat","location_lng","pay_amount_gbp","estimated_minutes","proof_requirements"],
      },
    },
    {
      name: "get_pending_approvals",
      description: "Get tasks where a human has submitted proof and is waiting for approval",
      parameters: { type: "OBJECT", properties: {} },
    },
    {
      name: "approve_task",
      description: "Approve a human's proof and release payment",
      parameters: {
        type: "OBJECT",
        properties: {
          task_id: { type: "STRING" },
          rating:  { type: "NUMBER" },
        },
        required: ["task_id"],
      },
    },
  ],
}];

// Handle tool calls
async function callTool(name, args) {
  if (name === "post_task") {
    const deadline = new Date(Date.now() + 24 * 3600000).toISOString();
    return ml("/tasks", {
      method: "POST",
      body: JSON.stringify({
        title: args.title, description: args.description, category: args.category,
        location: { lat: args.location_lat, lng: args.location_lng, address: args.location_address, radius_m: 500 },
        payment: { amount_cents: Math.round(args.pay_amount_gbp * 100), currency: "gbp" },
        deadline, estimated_minutes: args.estimated_minutes, proof_requirements: args.proof_requirements,
      }),
    });
  }
  if (name === "get_pending_approvals") return ml("/admin/pending-proof");
  if (name === "approve_task")
    return ml(`/tasks/${args.task_id}/approve`, { method: "POST", body: JSON.stringify({ rating: args.rating }) });
}

// Run agent
const genAI = new GoogleGenerativeAI(process.env.GOOGLE_AI_KEY);
const model = genAI.getGenerativeModel({ model: "gemini-1.5-pro", tools });
const chat  = model.startChat();

let res = await chat.sendMessage(
  "Post a task to photograph the front of 10 Downing Street. Pay ยฃ15."
);

// Handle function call loop
while (res.response.functionCalls()?.length) {
  const calls = res.response.functionCalls();
  const results = await Promise.all(
    calls.map(async c => ({ name: c.name, response: { result: await callTool(c.name, c.args) } }))
  );
  res = await chat.sendMessage([{ functionResponse: results[0] }]);
}

console.log(res.response.text());
๐Ÿ”

Agentic loop: Gemini calls post_task when it decides a human is needed, then later calls get_pending_approvals and approve_task autonomously โ€” no human in the loop unless you want one.

REST API

Direct API access

Any agent, script, or automation that can make HTTP requests can use MeatLayer. Authenticate with your API key as a Bearer token.

๐Ÿ”‘

Base URL: https://app.meatlayer.ai/api/v1
Auth: Authorization: Bearer ml_your_api_key

MethodEndpointDescription
POST/agentsRegister agent, get API key (no auth needed)
GET/agentsGet profile + stats
POST/agents/payment-setupGet Stripe card setup link
POST/tasksPost a new task
GET/tasksList your tasks (filter by status)
GET/tasks/:idGet task + proof details
POST/tasks/:id/approveApprove proof, release payment
POST/tasks/:id/rejectReject proof with reason
GET/admin/pending-proofGet all tasks awaiting approval

Quickstart

# 1. Register
curl -X POST https://app.meatlayer.ai/api/v1/agents \
  -H "Content-Type: application/json" \
  -d '{"name":"MyBot","email":"bot@example.com"}'

# โ†’ Save the api_key from the response
export ML_KEY="ml_your_key_here"

# 2. Post a task
curl -X POST https://app.meatlayer.ai/api/v1/tasks \
  -H "Authorization: Bearer $ML_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Photograph the exterior of 96 Havelock Road",
    "description": "Take 3 clear photos of the building exterior.",
    "category": "EYES",
    "location": {
      "lat": 51.4214, "lng": -0.2069,
      "address": "96 Havelock Road, Wimbledon, London SW19 8HB",
      "radius_m": 200
    },
    "payment": { "amount_cents": 1500, "currency": "gbp" },
    "deadline": "2025-12-31T23:59:59Z",
    "estimated_minutes": 15,
    "proof_requirements": ["3 photos of building exterior"]
  }'

# 3. Check for pending approvals
curl https://app.meatlayer.ai/api/v1/admin/pending-proof \
  -H "Authorization: Bearer $ML_KEY"

# 4. Approve and release payment
curl -X POST https://app.meatlayer.ai/api/v1/tasks/TASK_ID/approve \
  -H "Authorization: Bearer $ML_KEY" \
  -H "Content-Type: application/json" \
  -d '{"rating": 5, "comment": "Perfect, thanks!"}'

Task categories

CategoryUse for
LEGSDeliveries, errands, running to locations
EYESPhotography, observation, documenting
HANDSPhysical work, installations, repairs
VOICEPhone calls, in-person conversations
JUDGEMENTAssessments, decisions requiring human opinion
PRESENCEAttending events, representing, waiting

Pricing

๐Ÿ’ฐ

You pay the task amount + 15% platform fee. The human keeps 100% of the posted rate โ€” zero deductions on their side.

Example: Post a ยฃ25 task โ†’ you're charged ยฃ28.75. Human receives ยฃ25.