{
  "openapi": "3.0.1",
  "info": {
    "title": "Pinterest Search Scraper — Pins by Keyword + Creator Leads",
    "description": "Search Pinterest by keyword and get pins as clean rows: title, description, image URL, outbound link and domain, reactions, created date, pinner username, followers and verified-merchant flag, board. Optional creator enrichment adds the pinner's website, billed only when found. No login.",
    "version": "0.1",
    "x-build-id": "gM6j9vCM59l0K0oTH"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapersdelight~pinterest-search-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapersdelight-pinterest-search-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/scrapersdelight~pinterest-search-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapersdelight-pinterest-search-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/scrapersdelight~pinterest-search-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapersdelight-pinterest-search-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "queries": {
            "title": "Search keywords",
            "type": "array",
            "description": "Pinterest search terms, one per line — exactly what you would type into the Pinterest search box (\"boho bedroom\", \"vegan meal prep\", \"logo design inspiration\"). Each keyword is walked page by page (about 25 pins per page) until \"Max pins per search\" is reached or Pinterest runs out of results. Pins that rank for more than one keyword are returned once and billed once.",
            "default": [
              "home office ideas"
            ],
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Pinterest search URLs (optional)",
            "type": "array",
            "description": "Paste Pinterest search pages directly instead of, or alongside, keywords — e.g. https://www.pinterest.com/search/pins/?q=modern%20kitchen or https://www.pinterest.com/search/videos/?q=desk%20setup. The keyword and scope (pins / videos) are read from the URL.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "scope": {
            "title": "Result type",
            "enum": [
              "pins",
              "videos"
            ],
            "type": "string",
            "description": "PINS = Pinterest's normal pin results for the keyword (images, idea pins and the occasional video — 1% of rows were videos on a 390-pin sample). VIDEOS = only video pins; every row then carries videoUrl, videoDurationSec and videoThumbnailUrl. Both produce the identical row shape.",
            "default": "pins"
          },
          "enrichCreators": {
            "title": "Enrich creators (website, contact email / phone, Instagram, monthly views)",
            "type": "boolean",
            "description": "ON (default): one extra request per unique pinner adds creatorWebsite, creatorDomain + creatorDomainVerified, creatorContactEmail and creatorContactPhone (published by business accounts), creatorInstagram, creatorAbout, creatorLocation, creatorIsBusiness, creatorMonthlyViews and pin / board / following counts. Billed as a separate 'creator-contact-found' event ONLY when a website, email, phone or Instagram handle is actually found (measured 2026-08-22: 27.5% of 40 creators had a website, 52.5% were business accounts). A profile with no contact is fetched but never charged. OFF: the creator* columns stay present and null.",
            "default": true
          },
          "onlyWithCreatorContact": {
            "title": "Only pins whose creator has a contact",
            "type": "boolean",
            "description": "Keep only pins whose creator profile carried a website, contact email, contact phone or Instagram handle — a pure lead list. Turns creator enrichment on. Pins removed by this filter are never billed, but note the Actor still has to fetch the search pages and profiles to find out, so a run returns fewer rows per page than the limits suggest.",
            "default": false
          },
          "includeSaveCounts": {
            "title": "Include save / repin / comment / share counts (one extra request per pin)",
            "type": "boolean",
            "description": "Pinterest's search results do NOT carry save counts — only reactions. Switching this on opens each pin's detail resource once and fills saveCount, repinCount, commentCount and shareCount. Same price per pin; it costs time (about 0.5-1 s per pin at the default concurrency), not money.",
            "default": false
          },
          "onlyWithLink": {
            "title": "Only pins with an outbound link",
            "type": "boolean",
            "description": "Drop pins that were uploaded directly with no destination URL. 59.5% of pins carried a link on a 390-pin sample, so this removes roughly 4 in 10. Applied from the search row BEFORE any enrichment fetch — filtered-out pins cost nothing and are never billed.",
            "default": false
          },
          "maxItems": {
            "title": "Max pins (total)",
            "minimum": 1,
            "type": "integer",
            "description": "Stop after this many unique pins across all searches. Your hard cost ceiling for the pin event: 50 = $0.15, 500 = $1.50, 1,000 = $3.00. Duplicates are dropped before billing and never count against it.",
            "default": 50
          },
          "maxPinsPerQuery": {
            "title": "Max pins per search",
            "minimum": 1,
            "type": "integer",
            "description": "How deep to walk each keyword. Pinterest serves about 25 pins per page and keeps paginating for popular terms well past 1,000, so this is what bounds a broad keyword. Measured 2026-08-22: 18 of 18 pages returned 18-25 pins with 0 overlap between consecutive pages.",
            "default": 50
          },
          "maxConcurrency": {
            "title": "Concurrent enrichment requests",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "Parallel creator-profile / pin-detail fetches. Search pages are always walked one at a time (each page needs the previous page's bookmark). Measured 40/40 profiles at concurrency 4 through the Apify datacenter proxy. Values above 8 are rejected by the schema.",
            "default": 4
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Measured 2026-08-22 against Pinterest's search resource: direct 3/3, Apify datacenter 18/18 search pages + 40/40 creator profiles, Apify RESIDENTIAL 3/3 — so the default is the CHEAP datacenter rung rather than billing you for residential IPs you do not need. If the datacenter pool is ever rate-limited (HTTP 403/429), the Actor automatically retries those requests through RESIDENTIAL with a pinned session, capped at 20% of the run. Pick RESIDENTIAL here only if you see repeated failures in the log.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}