Install
openclaw skills install pinata-apiPinata IPFS API for file storage, groups, gateways, signatures, x402 payments, and file vectorization.
openclaw skills install pinata-apiAccess the Pinata IPFS storage API. Upload files, manage groups, create gateways, add signatures, set up x402 payments, and perform AI-powered vector search.
Repo: https://github.com/PinataCloud/pinata-api-skill
All requests require the header:
Authorization: Bearer $PINATA_JWT
Environment Variables:
PINATA_JWT (required) - Your Pinata API JWT token. Get one at app.pinata.cloud/developers/api-keysPINATA_GATEWAY_URL (required) - Your Pinata gateway domain (e.g., your-gateway.mypinata.cloud). Find yours at app.pinata.cloud/gatewayPINATA_GATEWAY_KEY (optional) - Gateway key for accessing public IPFS content not tied to your Pinata account. See Gateway Access ControlsGET https://api.pinata.cloud/data/testAuthentication
https://api.pinata.cloudhttps://uploads.pinata.cloud{network} - IPFS network: public (default) or privatelimit and pageToken query parametersGET https://api.pinata.cloud/v3/files/{network}
Query parameters (all optional): name, cid, mimeType, limit, pageToken
GET https://api.pinata.cloud/v3/files/{network}/{id}
PUT https://api.pinata.cloud/v3/files/{network}/{id}
Content-Type: application/json
Body:
{
"name": "new-name",
"keyvalues": {"key": "value"}
}
Both fields are optional.
DELETE https://api.pinata.cloud/v3/files/{network}/{id}
POST https://uploads.pinata.cloud/v3/files
Content-Type: multipart/form-data
Form fields:
file (required) - The file to uploadnetwork (optional) - public or privategroup_id (optional) - Group to add the file tokeyvalues (optional) - JSON string of key-value metadataGET https://api.pinata.cloud/v3/groups/{network}
Query parameters (all optional): name, limit, pageToken
POST https://api.pinata.cloud/v3/groups/{network}
Content-Type: application/json
Body:
{
"name": "my-group"
}
GET https://api.pinata.cloud/v3/groups/{network}/{id}
PUT https://api.pinata.cloud/v3/groups/{network}/{id}
Content-Type: application/json
Body:
{
"name": "updated-name"
}
DELETE https://api.pinata.cloud/v3/groups/{network}/{id}
PUT https://api.pinata.cloud/v3/groups/{network}/{groupId}/ids/{fileId}
DELETE https://api.pinata.cloud/v3/groups/{network}/{groupId}/ids/{fileId}
POST https://api.pinata.cloud/v3/files/private/download_link
Content-Type: application/json
Creates a temporary signed URL for accessing private files.
Body:
{
"url": "https://{PINATA_GATEWAY_URL}/files/{cid}",
"expires": 600,
"date": 1700000000,
"method": "GET"
}
url (required) - Full gateway URL using your PINATA_GATEWAY_URL and the file's CIDexpires (optional) - Seconds until expiry (default: 600)date (required) - Current Unix timestamp in secondsmethod (required) - HTTP method, typically GETPOST https://uploads.pinata.cloud/v3/files/sign
Content-Type: application/json
Creates a pre-signed URL for client-side uploads (no JWT needed on the client).
Body:
{
"date": 1700000000,
"expires": 3600
}
Optional fields: max_file_size (bytes), allow_mime_types (array), group_id, filename, keyvalues
EIP-712 signatures for verifying content authenticity.
POST https://api.pinata.cloud/v3/files/{network}/signature/{cid}
Content-Type: application/json
Body:
{
"signature": "0x...",
"address": "0x..."
}
GET https://api.pinata.cloud/v3/files/{network}/signature/{cid}
DELETE https://api.pinata.cloud/v3/files/{network}/signature/{cid}
Pin existing IPFS content by its CID (public network only).
POST https://api.pinata.cloud/v3/files/public/pin_by_cid
Content-Type: application/json
Body:
{
"cid": "bafybeig..."
}
Optional fields: name, group_id, keyvalues, host_nodes (array of multiaddrs)
GET https://api.pinata.cloud/v3/files/public/pin_by_cid
Query parameters (all optional): order (ASC/DESC), status, cid, limit, pageToken
DELETE https://api.pinata.cloud/v3/files/public/pin_by_cid/{id}
Create payment instructions for monetizing IPFS content using the x402 protocol with USDC on Base.
USDC Contract Addresses:
0x833589fCD6eDb6E08f4c7C32D4f71b54bdA029130x036CbD53842c5426634e7929541eC2318f3dCF7eImportant: The amount field uses the smallest USDC unit (6 decimals). For example, $1.50 = "1500000".
POST https://api.pinata.cloud/v3/x402/payment_instructions
Content-Type: application/json
Body:
{
"name": "My Payment",
"description": "Pay to access this content",
"payment_requirements": [
{
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"pay_to": "0xWALLET_ADDRESS",
"network": "base",
"amount": "1500000"
}
]
}
name (required) - Display namedescription (optional) - Descriptionpayment_requirements (required) - Array with asset (USDC contract address), pay_to (wallet address), network (base or base-sepolia), amount (smallest unit as string)GET https://api.pinata.cloud/v3/x402/payment_instructions
Query parameters (all optional): limit, pageToken, cid, name, id
GET https://api.pinata.cloud/v3/x402/payment_instructions/{id}
DELETE https://api.pinata.cloud/v3/x402/payment_instructions/{id}
PUT https://api.pinata.cloud/v3/x402/payment_instructions/{id}/cids/{cid}
DELETE https://api.pinata.cloud/v3/x402/payment_instructions/{id}/cids/{cid}
Generate vector embeddings for files and perform semantic search across groups.
POST https://uploads.pinata.cloud/v3/vectorize/files/{file_id}
DELETE https://uploads.pinata.cloud/v3/vectorize/files/{file_id}
POST https://uploads.pinata.cloud/v3/vectorize/groups/{group_id}/query
Content-Type: application/json
Body:
{
"text": "search query here"
}
Content-Type: application/jsonmultipart/form-data — do not set Content-Type manuallypageToken from the previous response to get the next pagepublic if not specifiedhttps://{PINATA_GATEWAY_URL}/files/{cid}