{
  "schemaVersion": "1.0",
  "item": {
    "slug": "pinata-api",
    "name": "Pinata API",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/iammatthias/pinata-api",
    "canonicalUrl": "https://clawhub.ai/iammatthias/pinata-api",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/pinata-api",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=pinata-api",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/pinata-api"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/pinata-api",
    "agentPageUrl": "https://openagent3.xyz/skills/pinata-api/agent",
    "manifestUrl": "https://openagent3.xyz/skills/pinata-api/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/pinata-api/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Pinata API",
        "body": "Access the Pinata IPFS storage API. Upload files, manage groups, create gateways, add signatures, set up x402 payments, and perform AI-powered vector search.\n\nRepo: https://github.com/PinataCloud/pinata-api-skill"
      },
      {
        "title": "Authentication",
        "body": "All requests require the header:\n\nAuthorization: Bearer $PINATA_JWT\n\nEnvironment Variables:\n\nPINATA_JWT (required) - Your Pinata API JWT token. Get one at app.pinata.cloud/developers/api-keys\nPINATA_GATEWAY_URL (required) - Your Pinata gateway domain (e.g., your-gateway.mypinata.cloud). Find yours at app.pinata.cloud/gateway\nPINATA_GATEWAY_KEY (optional) - Gateway key for accessing public IPFS content not tied to your Pinata account. See Gateway Access Controls"
      },
      {
        "title": "Test Authentication",
        "body": "GET https://api.pinata.cloud/data/testAuthentication"
      },
      {
        "title": "Base URLs",
        "body": "API: https://api.pinata.cloud\nUploads: https://uploads.pinata.cloud"
      },
      {
        "title": "Common Parameters",
        "body": "{network} - IPFS network: public (default) or private\nPagination uses limit and pageToken query parameters"
      },
      {
        "title": "Search Files",
        "body": "GET https://api.pinata.cloud/v3/files/{network}\n\nQuery parameters (all optional): name, cid, mimeType, limit, pageToken"
      },
      {
        "title": "Get File by ID",
        "body": "GET https://api.pinata.cloud/v3/files/{network}/{id}"
      },
      {
        "title": "Update File Metadata",
        "body": "PUT https://api.pinata.cloud/v3/files/{network}/{id}\nContent-Type: application/json\n\nBody:\n\n{\n  \"name\": \"new-name\",\n  \"keyvalues\": {\"key\": \"value\"}\n}\n\nBoth fields are optional."
      },
      {
        "title": "Delete File",
        "body": "DELETE https://api.pinata.cloud/v3/files/{network}/{id}"
      },
      {
        "title": "Upload File",
        "body": "POST https://uploads.pinata.cloud/v3/files\nContent-Type: multipart/form-data\n\nForm fields:\n\nfile (required) - The file to upload\nnetwork (optional) - public or private\ngroup_id (optional) - Group to add the file to\nkeyvalues (optional) - JSON string of key-value metadata"
      },
      {
        "title": "List Groups",
        "body": "GET https://api.pinata.cloud/v3/groups/{network}\n\nQuery parameters (all optional): name, limit, pageToken"
      },
      {
        "title": "Create Group",
        "body": "POST https://api.pinata.cloud/v3/groups/{network}\nContent-Type: application/json\n\nBody:\n\n{\n  \"name\": \"my-group\"\n}"
      },
      {
        "title": "Get Group",
        "body": "GET https://api.pinata.cloud/v3/groups/{network}/{id}"
      },
      {
        "title": "Update Group",
        "body": "PUT https://api.pinata.cloud/v3/groups/{network}/{id}\nContent-Type: application/json\n\nBody:\n\n{\n  \"name\": \"updated-name\"\n}"
      },
      {
        "title": "Delete Group",
        "body": "DELETE https://api.pinata.cloud/v3/groups/{network}/{id}"
      },
      {
        "title": "Add File to Group",
        "body": "PUT https://api.pinata.cloud/v3/groups/{network}/{groupId}/ids/{fileId}"
      },
      {
        "title": "Remove File from Group",
        "body": "DELETE https://api.pinata.cloud/v3/groups/{network}/{groupId}/ids/{fileId}"
      },
      {
        "title": "Create Private Download Link",
        "body": "POST https://api.pinata.cloud/v3/files/private/download_link\nContent-Type: application/json\n\nCreates a temporary signed URL for accessing private files.\n\nBody:\n\n{\n  \"url\": \"https://{PINATA_GATEWAY_URL}/files/{cid}\",\n  \"expires\": 600,\n  \"date\": 1700000000,\n  \"method\": \"GET\"\n}\n\nurl (required) - Full gateway URL using your PINATA_GATEWAY_URL and the file's CID\nexpires (optional) - Seconds until expiry (default: 600)\ndate (required) - Current Unix timestamp in seconds\nmethod (required) - HTTP method, typically GET"
      },
      {
        "title": "Create Signed Upload URL",
        "body": "POST https://uploads.pinata.cloud/v3/files/sign\nContent-Type: application/json\n\nCreates a pre-signed URL for client-side uploads (no JWT needed on the client).\n\nBody:\n\n{\n  \"date\": 1700000000,\n  \"expires\": 3600\n}\n\nOptional fields: max_file_size (bytes), allow_mime_types (array), group_id, filename, keyvalues"
      },
      {
        "title": "Signatures",
        "body": "EIP-712 signatures for verifying content authenticity."
      },
      {
        "title": "Add Signature",
        "body": "POST https://api.pinata.cloud/v3/files/{network}/signature/{cid}\nContent-Type: application/json\n\nBody:\n\n{\n  \"signature\": \"0x...\",\n  \"address\": \"0x...\"\n}"
      },
      {
        "title": "Get Signature",
        "body": "GET https://api.pinata.cloud/v3/files/{network}/signature/{cid}"
      },
      {
        "title": "Delete Signature",
        "body": "DELETE https://api.pinata.cloud/v3/files/{network}/signature/{cid}"
      },
      {
        "title": "Pin By CID",
        "body": "Pin existing IPFS content by its CID (public network only)."
      },
      {
        "title": "Pin a CID",
        "body": "POST https://api.pinata.cloud/v3/files/public/pin_by_cid\nContent-Type: application/json\n\nBody:\n\n{\n  \"cid\": \"bafybeig...\"\n}\n\nOptional fields: name, group_id, keyvalues, host_nodes (array of multiaddrs)"
      },
      {
        "title": "Query Pin Requests",
        "body": "GET https://api.pinata.cloud/v3/files/public/pin_by_cid\n\nQuery parameters (all optional): order (ASC/DESC), status, cid, limit, pageToken"
      },
      {
        "title": "Cancel Pin Request",
        "body": "DELETE https://api.pinata.cloud/v3/files/public/pin_by_cid/{id}"
      },
      {
        "title": "x402 Payment Instructions",
        "body": "Create payment instructions for monetizing IPFS content using the x402 protocol with USDC on Base.\n\nUSDC Contract Addresses:\n\nBase mainnet: 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\nBase Sepolia (testnet): 0x036CbD53842c5426634e7929541eC2318f3dCF7e\n\nImportant: The amount field uses the smallest USDC unit (6 decimals). For example, $1.50 = \"1500000\"."
      },
      {
        "title": "Create Payment Instruction",
        "body": "POST https://api.pinata.cloud/v3/x402/payment_instructions\nContent-Type: application/json\n\nBody:\n\n{\n  \"name\": \"My Payment\",\n  \"description\": \"Pay to access this content\",\n  \"payment_requirements\": [\n    {\n      \"asset\": \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n      \"pay_to\": \"0xWALLET_ADDRESS\",\n      \"network\": \"base\",\n      \"amount\": \"1500000\"\n    }\n  ]\n}\n\nname (required) - Display name\ndescription (optional) - Description\npayment_requirements (required) - Array with asset (USDC contract address), pay_to (wallet address), network (base or base-sepolia), amount (smallest unit as string)"
      },
      {
        "title": "List Payment Instructions",
        "body": "GET https://api.pinata.cloud/v3/x402/payment_instructions\n\nQuery parameters (all optional): limit, pageToken, cid, name, id"
      },
      {
        "title": "Get Payment Instruction",
        "body": "GET https://api.pinata.cloud/v3/x402/payment_instructions/{id}"
      },
      {
        "title": "Delete Payment Instruction",
        "body": "DELETE https://api.pinata.cloud/v3/x402/payment_instructions/{id}"
      },
      {
        "title": "Associate CID with Payment",
        "body": "PUT https://api.pinata.cloud/v3/x402/payment_instructions/{id}/cids/{cid}"
      },
      {
        "title": "Remove CID from Payment",
        "body": "DELETE https://api.pinata.cloud/v3/x402/payment_instructions/{id}/cids/{cid}"
      },
      {
        "title": "Vectorize (AI Search)",
        "body": "Generate vector embeddings for files and perform semantic search across groups."
      },
      {
        "title": "Vectorize a File",
        "body": "POST https://uploads.pinata.cloud/v3/vectorize/files/{file_id}"
      },
      {
        "title": "Delete File Vectors",
        "body": "DELETE https://uploads.pinata.cloud/v3/vectorize/files/{file_id}"
      },
      {
        "title": "Query Vectors (Semantic Search)",
        "body": "POST https://uploads.pinata.cloud/v3/vectorize/groups/{group_id}/query\nContent-Type: application/json\n\nBody:\n\n{\n  \"text\": \"search query here\"\n}"
      },
      {
        "title": "Notes",
        "body": "All JSON endpoints require Content-Type: application/json\nFile uploads use multipart/form-data — do not set Content-Type manually\nPagination: use pageToken from the previous response to get the next page\nNetwork defaults to public if not specified\nGateway URLs follow the pattern https://{PINATA_GATEWAY_URL}/files/{cid}"
      },
      {
        "title": "Resources",
        "body": "Pinata Documentation\nAPI Keys\nGateway Setup\nx402 Protocol\nSource (GitHub)"
      }
    ],
    "body": "Pinata API\n\nAccess the Pinata IPFS storage API. Upload files, manage groups, create gateways, add signatures, set up x402 payments, and perform AI-powered vector search.\n\nRepo: https://github.com/PinataCloud/pinata-api-skill\n\nAuthentication\n\nAll requests require the header:\n\nAuthorization: Bearer $PINATA_JWT\n\n\nEnvironment Variables:\n\nPINATA_JWT (required) - Your Pinata API JWT token. Get one at app.pinata.cloud/developers/api-keys\nPINATA_GATEWAY_URL (required) - Your Pinata gateway domain (e.g., your-gateway.mypinata.cloud). Find yours at app.pinata.cloud/gateway\nPINATA_GATEWAY_KEY (optional) - Gateway key for accessing public IPFS content not tied to your Pinata account. See Gateway Access Controls\nTest Authentication\nGET https://api.pinata.cloud/data/testAuthentication\n\nBase URLs\nAPI: https://api.pinata.cloud\nUploads: https://uploads.pinata.cloud\nCommon Parameters\n{network} - IPFS network: public (default) or private\nPagination uses limit and pageToken query parameters\nFiles\nSearch Files\nGET https://api.pinata.cloud/v3/files/{network}\n\n\nQuery parameters (all optional): name, cid, mimeType, limit, pageToken\n\nGet File by ID\nGET https://api.pinata.cloud/v3/files/{network}/{id}\n\nUpdate File Metadata\nPUT https://api.pinata.cloud/v3/files/{network}/{id}\nContent-Type: application/json\n\n\nBody:\n\n{\n  \"name\": \"new-name\",\n  \"keyvalues\": {\"key\": \"value\"}\n}\n\n\nBoth fields are optional.\n\nDelete File\nDELETE https://api.pinata.cloud/v3/files/{network}/{id}\n\nUpload File\nPOST https://uploads.pinata.cloud/v3/files\nContent-Type: multipart/form-data\n\n\nForm fields:\n\nfile (required) - The file to upload\nnetwork (optional) - public or private\ngroup_id (optional) - Group to add the file to\nkeyvalues (optional) - JSON string of key-value metadata\nGroups\nList Groups\nGET https://api.pinata.cloud/v3/groups/{network}\n\n\nQuery parameters (all optional): name, limit, pageToken\n\nCreate Group\nPOST https://api.pinata.cloud/v3/groups/{network}\nContent-Type: application/json\n\n\nBody:\n\n{\n  \"name\": \"my-group\"\n}\n\nGet Group\nGET https://api.pinata.cloud/v3/groups/{network}/{id}\n\nUpdate Group\nPUT https://api.pinata.cloud/v3/groups/{network}/{id}\nContent-Type: application/json\n\n\nBody:\n\n{\n  \"name\": \"updated-name\"\n}\n\nDelete Group\nDELETE https://api.pinata.cloud/v3/groups/{network}/{id}\n\nAdd File to Group\nPUT https://api.pinata.cloud/v3/groups/{network}/{groupId}/ids/{fileId}\n\nRemove File from Group\nDELETE https://api.pinata.cloud/v3/groups/{network}/{groupId}/ids/{fileId}\n\nGateway & Downloads\nCreate Private Download Link\nPOST https://api.pinata.cloud/v3/files/private/download_link\nContent-Type: application/json\n\n\nCreates a temporary signed URL for accessing private files.\n\nBody:\n\n{\n  \"url\": \"https://{PINATA_GATEWAY_URL}/files/{cid}\",\n  \"expires\": 600,\n  \"date\": 1700000000,\n  \"method\": \"GET\"\n}\n\nurl (required) - Full gateway URL using your PINATA_GATEWAY_URL and the file's CID\nexpires (optional) - Seconds until expiry (default: 600)\ndate (required) - Current Unix timestamp in seconds\nmethod (required) - HTTP method, typically GET\nCreate Signed Upload URL\nPOST https://uploads.pinata.cloud/v3/files/sign\nContent-Type: application/json\n\n\nCreates a pre-signed URL for client-side uploads (no JWT needed on the client).\n\nBody:\n\n{\n  \"date\": 1700000000,\n  \"expires\": 3600\n}\n\n\nOptional fields: max_file_size (bytes), allow_mime_types (array), group_id, filename, keyvalues\n\nSignatures\n\nEIP-712 signatures for verifying content authenticity.\n\nAdd Signature\nPOST https://api.pinata.cloud/v3/files/{network}/signature/{cid}\nContent-Type: application/json\n\n\nBody:\n\n{\n  \"signature\": \"0x...\",\n  \"address\": \"0x...\"\n}\n\nGet Signature\nGET https://api.pinata.cloud/v3/files/{network}/signature/{cid}\n\nDelete Signature\nDELETE https://api.pinata.cloud/v3/files/{network}/signature/{cid}\n\nPin By CID\n\nPin existing IPFS content by its CID (public network only).\n\nPin a CID\nPOST https://api.pinata.cloud/v3/files/public/pin_by_cid\nContent-Type: application/json\n\n\nBody:\n\n{\n  \"cid\": \"bafybeig...\"\n}\n\n\nOptional fields: name, group_id, keyvalues, host_nodes (array of multiaddrs)\n\nQuery Pin Requests\nGET https://api.pinata.cloud/v3/files/public/pin_by_cid\n\n\nQuery parameters (all optional): order (ASC/DESC), status, cid, limit, pageToken\n\nCancel Pin Request\nDELETE https://api.pinata.cloud/v3/files/public/pin_by_cid/{id}\n\nx402 Payment Instructions\n\nCreate payment instructions for monetizing IPFS content using the x402 protocol with USDC on Base.\n\nUSDC Contract Addresses:\n\nBase mainnet: 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\nBase Sepolia (testnet): 0x036CbD53842c5426634e7929541eC2318f3dCF7e\n\nImportant: The amount field uses the smallest USDC unit (6 decimals). For example, $1.50 = \"1500000\".\n\nCreate Payment Instruction\nPOST https://api.pinata.cloud/v3/x402/payment_instructions\nContent-Type: application/json\n\n\nBody:\n\n{\n  \"name\": \"My Payment\",\n  \"description\": \"Pay to access this content\",\n  \"payment_requirements\": [\n    {\n      \"asset\": \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n      \"pay_to\": \"0xWALLET_ADDRESS\",\n      \"network\": \"base\",\n      \"amount\": \"1500000\"\n    }\n  ]\n}\n\nname (required) - Display name\ndescription (optional) - Description\npayment_requirements (required) - Array with asset (USDC contract address), pay_to (wallet address), network (base or base-sepolia), amount (smallest unit as string)\nList Payment Instructions\nGET https://api.pinata.cloud/v3/x402/payment_instructions\n\n\nQuery parameters (all optional): limit, pageToken, cid, name, id\n\nGet Payment Instruction\nGET https://api.pinata.cloud/v3/x402/payment_instructions/{id}\n\nDelete Payment Instruction\nDELETE https://api.pinata.cloud/v3/x402/payment_instructions/{id}\n\nAssociate CID with Payment\nPUT https://api.pinata.cloud/v3/x402/payment_instructions/{id}/cids/{cid}\n\nRemove CID from Payment\nDELETE https://api.pinata.cloud/v3/x402/payment_instructions/{id}/cids/{cid}\n\nVectorize (AI Search)\n\nGenerate vector embeddings for files and perform semantic search across groups.\n\nVectorize a File\nPOST https://uploads.pinata.cloud/v3/vectorize/files/{file_id}\n\nDelete File Vectors\nDELETE https://uploads.pinata.cloud/v3/vectorize/files/{file_id}\n\nQuery Vectors (Semantic Search)\nPOST https://uploads.pinata.cloud/v3/vectorize/groups/{group_id}/query\nContent-Type: application/json\n\n\nBody:\n\n{\n  \"text\": \"search query here\"\n}\n\nNotes\nAll JSON endpoints require Content-Type: application/json\nFile uploads use multipart/form-data — do not set Content-Type manually\nPagination: use pageToken from the previous response to get the next page\nNetwork defaults to public if not specified\nGateway URLs follow the pattern https://{PINATA_GATEWAY_URL}/files/{cid}\nResources\nPinata Documentation\nAPI Keys\nGateway Setup\nx402 Protocol\nSource (GitHub)"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/iammatthias/pinata-api",
    "publisherUrl": "https://clawhub.ai/iammatthias/pinata-api",
    "owner": "iammatthias",
    "version": "1.0.9",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/pinata-api",
    "downloadUrl": "https://openagent3.xyz/downloads/pinata-api",
    "agentUrl": "https://openagent3.xyz/skills/pinata-api/agent",
    "manifestUrl": "https://openagent3.xyz/skills/pinata-api/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/pinata-api/agent.md"
  }
}