Generate Pinterest-ready pins programmatically. Plug PinImage into Make.com, Zapier, n8n, or any HTTP client to automate your visual content workflow.
All requests require a Bearer token in the Authorization header. Generate a key from the API Keys page — keys start with pk_live_ and are shown only once.
Authorization: Bearer pk_live_xxxxxxxxxxxxPOST https://pinimagestudio.com/api/public/v1/pins| Field | Type | Description |
|---|---|---|
| template | string | One of: classic, bold-quote, magazine, minimal, banner, framed, polaroid, ticket, sidebar, duotone, sticker, grid, cover, ribbon, circle |
| title | string | The pin headline (max 200 characters). |
| image_url | string | Direct URL to a JPEG or PNG image file. Must link to the image itself, not a webpage. CDN and redirect URLs are supported. |
| brand_color | string | Hex color, e.g. #7C3AED. Defaults to brand purple. |
{
"id": "8f3d...",
"url": "https://.../pin.png",
"usage": { "used": 12, "limit": 500 }
}Paste a key, tweak the body, and send a real request. The key never leaves your browser.
curl -X POST https://pinimagestudio.com/api/public/v1/pins \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"template": "classic",
"title": "10 Cozy Fall Recipes",
"image_url": "https://images.pexels.com/photos/1793035/pexels-photo-1793035.jpeg?auto=compress&cs=tinysrgb&w=1200",
"brand_color": "#7C3AED"
}'const res = await fetch("https://pinimagestudio.com/api/public/v1/pins", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
template: "classic",
title: "10 Cozy Fall Recipes",
image_url: "https://example.com/photo.jpg",
brand_color: "#7C3AED",
}),
});
const { url } = await res.json();
console.log("Pin URL:", url);import requests
resp = requests.post(
"https://pinimagestudio.com/api/public/v1/pins",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"template": "classic",
"title": "10 Cozy Fall Recipes",
"image_url": "https://example.com/photo.jpg",
"brand_color": "#7C3AED",
},
)
print(resp.json()["url"])https://pinimagestudio.com/api/public/v1/pinsJSONAuthorization and value Bearer YOUR_API_KEY. Add another row Content-Type = application/json.template, title, image_url, brand_color — map values from your trigger step.url in the next step (Pinterest, Buffer, Sheets…).Note: image_url must be a direct image file URL (e.g. your WordPress featured image URL), not a link to a webpage.
https://pinimagestudio.com/api/public/v1/pinsPOSTAuthorization: Bearer YOUR_API_KEY and Content-Type: application/json.Raw, Content type JSON (application/json).{
"template": "classic",
"title": "{{1.title}}",
"image_url": "{{1.image_url}}",
"brand_color": "#7C3AED"
}url downstream.Note: image_url must be a direct image file URL (e.g. your WordPress featured image URL), not a link to a webpage.
| Status | Meaning | |
|---|---|---|
| 400 | Bad Request | Invalid or missing fields in the body. |
| 401 | Unauthorized | Missing or invalid API key. |
| 402 | Plan required | API access requires a Pro or Agency plan (free plan users get this error). |
| 429 | Rate limited / quota exceeded | Two cases — check the "error" field: "rate_limited" (over 60 requests/min, slow down and retry) or "quota_exceeded" (monthly limit reached — response includes used, limit, reset_at). |
| 500 | Server error | Something went wrong on our side. Retry with exponential backoff. |
Need a higher limit? See pricing.