{
  "openapi": "3.0.1",
  "info": {
    "title": "Pinterest Boards Scraper With Product Prices & Stores",
    "description": "Automate Pinterest board data collection at scale. Pinterest Boards Scraper pulls board metadata, pins, media URLs, and performance metrics. Perfect for SEO research, trend tracking, brand monitoring, and analytics workflows.",
    "version": "0.1",
    "x-build-id": "xTqZNKL48aWNOue83"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapier~pinterest-boards-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapier-pinterest-boards-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/scrapier~pinterest-boards-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapier-pinterest-boards-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/scrapier~pinterest-boards-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapier-pinterest-boards-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",
        "required": [
          "urls"
        ],
        "properties": {
          "urls": {
            "title": "🔗 Boards, profiles or pins to shop",
            "type": "array",
            "description": "Board URLs (https://www.pinterest.com/<user>/<board>/), profile URLs or bare usernames, and pin URLs or bare pin IDs. One per line — bulk runs are supported. Merchant catalog boards carry the most product data (measured: /etsy/artwork-for-your-home/ 25.3% of pins priced, /HGTV/hgtv-dream-home/ 0%).",
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "📊 Max KEPT pins per URL",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Maximum pins returned per target (1–5000), counted AFTER the store/price screens below — so a tight filter keeps scrolling instead of returning three rows. Product rows are extra and are capped separately.",
            "default": 10
          },
          "includeProductDetails": {
            "title": "🏷️ Include merchant & product details",
            "type": "boolean",
            "description": "Read the merchant/store record and every product item Pinterest publishes on the pin, and fill `store`, `merchantName`, `products`, `productCount`, `productPriceMin` / `productPriceMax`. Zero extra requests — this data is already in the board feed payload. Turn it off to get the plain base row.",
            "default": true
          },
          "includeProductRows": {
            "title": "🧾 Emit one row per product",
            "type": "boolean",
            "description": "Also push a separate `type: \"product\"` row for each item on a Shop-the-look pin, carrying price, list price, discount %, in-stock, merchant and purchase URL. Each product row is billed like a pin row. Turn it off to keep the products only as the nested `products` array on the pin row.",
            "default": true
          },
          "maxProductsPerPin": {
            "title": "🔢 Max products per pin",
            "minimum": 0,
            "maximum": 200,
            "type": "integer",
            "description": "Ceiling on the product items kept per pin (also caps the nested `products` array). Measured: a Shop-the-look pin publishes 1–8 items. 0 = no ceiling.",
            "default": 20
          },
          "productPinsOnly": {
            "title": "🛍️ Only pins that carry a product record",
            "type": "boolean",
            "description": "Keep only pins that actually publish a product (a Shop-the-look / collection pin). MEASURED SELECTIVITY: 6.1% of pins across 886 board rows publish a price, 12% carry a product record at all — on an inspiration board it is 0%, so this is off by default. It is NOT a filter for 'has an outbound link' (that is 99% of pins and would filter nothing).",
            "default": false
          },
          "linkDomains": {
            "title": "🌐 Only these store domains",
            "type": "array",
            "description": "Keep only pins whose destination lands on one of these hosts — e.g. etsy.com, amazon.com, a competitor's own domain. Subdomains included, matched case-insensitively against the pin's domain, its tracked/UTM link, the store's site and canonical host, and every product item's link. Empty keeps every domain. Caveat: for affiliate and shortener links the host Pinterest published is the redirector, not the shop behind it — the raw `link` ships unchanged so you can check.",
            "items": {
              "type": "string"
            }
          },
          "minPrice": {
            "title": "💵 Minimum price",
            "minimum": 0,
            "maximum": 1000000,
            "type": "integer",
            "description": "Keep only pins publishing at least one product at or above this price, in the currency the pin reports (currencies are NOT converted; one board can mix $, € and £). 0 = no floor. Setting any price band drops every pin with no published price — the log reports how many.",
            "default": 0
          },
          "maxPrice": {
            "title": "💰 Maximum price",
            "minimum": 0,
            "maximum": 1000000,
            "type": "integer",
            "description": "Keep only pins publishing at least one product at or below this price. 0 = no ceiling. Set both ends to get the slice of the category you actually trade in.",
            "default": 0
          },
          "fetchStoreDetails": {
            "title": "🏪 Open the pin to enrich the store (1 extra request per pin)",
            "type": "boolean",
            "description": "Open each pin's closeup to add `store.pageTitle`, `store.pageDescription`, `store.locale` and `store.linkStatus` — the destination page as Pinterest indexed it. Measured on a West Elm board: those four go from 0/40 to 37/40. Without it, `store.merchantName` and `store.siteUrl` still come free from the board feed. Pinterest's `canonical_url` is deliberately NOT offered: it is null on 100/100 pins from every Apify exit tested, so it would be an always-empty column.",
            "default": false
          },
          "maxStoreLookups": {
            "title": "🔢 Max store lookups per run",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "Ceiling on the closeup requests above, across the whole run. Pins past the ceiling are still returned with the five closeup-only store fields null. 0 = no ceiling.",
            "default": 100
          },
          "fetchPinDetails": {
            "title": "🕒 Fetch pin engagement details (1 extra request per pin)",
            "type": "boolean",
            "description": "Base option, unchanged. Fills `date` (ISO 8601 creation time), `commentCount`, `shareCount` and the pinner's follower count. These are null without it — the board grid carries no creation date. Shares the same closeup request as the store lookup above, so enabling both costs one request per pin, not two.",
            "default": false
          },
          "maxPinDetailFetches": {
            "title": "🔢 Max pin detail requests per run",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "Base option, unchanged. Ceiling on the engagement closeups above. Pins past the ceiling are still returned with those fields null. 0 = no ceiling.",
            "default": 50
          },
          "fetchLinkDetails": {
            "title": "↗️ Include the outbound link & domain",
            "type": "boolean",
            "description": "Base option, unchanged. Fills `link` / `externalLink` / `domain` with the destination each pin points at. Turn it off to return those three as null — the store and product records are unaffected, and the `linkDomains` screen still works.",
            "default": true
          },
          "includeBoardSections": {
            "title": "📁 Attribute pins to board sections",
            "type": "boolean",
            "description": "Base option, unchanged. Walks the board's sections and stamps `sectionId` / `sectionTitle` / `sectionSlug` onto each pin. Costs roughly one request per 50 section pins. Pins outside every section keep a null section.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "🛡️ Proxy configuration",
            "type": "object",
            "description": "Your own proxy selection is honored exactly as configured — groups, country and custom proxy URLs all reach the fetch layer.",
            "default": {
              "useApifyProxy": false
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}