{
  "data": {
    "id": "IoZm2zy6Tmh6v30xi",
    "actId": "IKA39DgUebK9DKMHR",
    "userId": "zq8lKbpLzTjGDayPC",
    "startedAt": "2026-11-11T20:56:43.617Z",
    "finishedAt": "2026-11-11T20:57:19.628Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CI"
    },
    "stats": {
      "durationMillis": 35944,
      "runTimeSecs": 35.944,
      "computeUnits": 0.03993777777777778,
      "imageSizeBytes": 3193392128
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "GK9YjZRyQZVzOdoH5",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Pinterest Data Extractor Input\",\n  \"description\": \"Collect public Pinterest Pins, profiles, boards, board Pins, search results, and comments with optional detail enrichment. All fields are source-backed and optional.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"What to collect\",\n      \"type\": \"string\",\n      \"description\": \"Choose a collection type. Auto-detect accepts mixed public Pinterest links.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"auto\",\n        \"pinDetail\",\n        \"comments\",\n        \"searchPins\",\n        \"searchVideos\",\n        \"searchUsers\",\n        \"searchBoards\",\n        \"userProfile\",\n        \"userPins\",\n        \"userBoards\",\n        \"boardDetail\",\n        \"boardPins\",\n        \"ideas\",\n        \"search\"\n      ],\n      \"enumTitles\": [\n        \"Auto-detect links\",\n        \"Pin details\",\n        \"Comments for Pins\",\n        \"Search Pins\",\n        \"Search video Pins\",\n        \"Search people\",\n        \"Search boards\",\n        \"Profile details\",\n        \"Pins created by a person\",\n        \"Boards owned by a person\",\n        \"Board details\",\n        \"Pins inside a board\",\n        \"Ideas feed (list only)\",\n        \"Search Pins (legacy)\"\n      ],\n      \"default\": \"auto\",\n      \"prefill\": \"auto\"\n    },\n    \"keywords\": {\n      \"title\": \"Search words\",\n      \"type\": \"array\",\n      \"description\": \"One or more words or phrases for search modes.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"pinUrls\": {\n      \"title\": \"Pin URLs or IDs\",\n      \"type\": \"array\",\n      \"description\": \"Public Pin links or numeric Pin IDs.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"usernames\": {\n      \"title\": \"Pinterest usernames\",\n      \"type\": \"array\",\n      \"description\": \"Usernames, @usernames, or public profile links.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"boardUrls\": {\n      \"title\": \"Board URLs\",\n      \"type\": \"array\",\n      \"description\": \"Public board links or username/board-name paths.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"search\": {\n      \"title\": \"Search Query\",\n      \"type\": \"string\",\n      \"description\": \"Keyword to search on Pinterest. Results will be pins matching this query.\",\n      \"editor\": \"textfield\",\n      \"prefill\": \"cats\"\n    },\n    \"startUrls\": {\n      \"title\": \"Pinterest URLs\",\n      \"type\": \"array\",\n      \"description\": \"List of Pinterest URLs to scrape. Supports pin URLs, user profile URLs, board URLs, and search URLs.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"prefill\": []\n    },\n    \"maxItems\": {\n      \"title\": \"Max Items\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum number of Pins/source records to collect. Comment rows are additional and are capped per Pin by maxComments. Set to 0 for unlimited.\",\n      \"default\": 50,\n      \"minimum\": 0,\n      \"maximum\": 20000\n    },\n    \"maxPages\": {\n      \"title\": \"Max pages\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum pagination pages per search, profile, or board. 0 means continue until Pinterest has no next page.\",\n      \"default\": 0,\n      \"prefill\": 0,\n      \"minimum\": 0,\n      \"maximum\": 2000\n    },\n    \"minSaves\": {\n      \"title\": \"Minimum saves\",\n      \"type\": \"integer\",\n      \"description\": \"Keep Pins only when Pinterest supplies at least this many saves.\",\n      \"minimum\": 0,\n      \"maximum\": 10000000\n    },\n    \"minCreatorFollowers\": {\n      \"title\": \"Minimum creator followers\",\n      \"type\": \"integer\",\n      \"description\": \"Keep Pins only when Pinterest supplies a creator follower count at or above this value.\",\n      \"minimum\": 0,\n      \"maximum\": 1000000000\n    },\n    \"verifiedOnly\": {\n      \"title\": \"Verified accounts only\",\n      \"type\": \"boolean\",\n      \"description\": \"Keep only rows explicitly marked verified by Pinterest.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"requireOutboundLink\": {\n      \"title\": \"Require destination link\",\n      \"type\": \"boolean\",\n      \"description\": \"Keep only Pins with a public destination link supplied by Pinterest.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"imageOnly\": {\n      \"title\": \"Images only\",\n      \"type\": \"boolean\",\n      \"description\": \"Exclude Pins that Pinterest identifies as video.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"excludeAds\": {\n      \"title\": \"Exclude promoted Pins\",\n      \"type\": \"boolean\",\n      \"description\": \"Exclude Pins Pinterest marks as promoted or sponsored.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"commerceOnly\": {\n      \"title\": \"Shoppable Pins only\",\n      \"type\": \"boolean\",\n      \"description\": \"Keep only Pins with source-backed product or shopping metadata.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"includeComments\": {\n      \"title\": \"Include Pin comments\",\n      \"type\": \"boolean\",\n      \"description\": \"When enabled, add one real comment/activity row for each collected Pin. Pinterest's public cookieless comment path is used automatically.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"maxComments\": {\n      \"title\": \"Maximum comments per Pin\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum public comment/activity rows to add per Pin when comments are enabled.\",\n      \"minimum\": 1,\n      \"maximum\": 20000,\n      \"default\": 10,\n      \"prefill\": 10\n    },\n    \"includeCommentReplies\": {\n      \"title\": \"Include comment replies\",\n      \"type\": \"boolean\",\n      \"description\": \"When comments are collected, also fetch depth-one replies for comments that report replies. Adds one request per parent comment.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"maxCommentReplies\": {\n      \"title\": \"Max replies per comment\",\n      \"type\": \"integer\",\n      \"description\": \"Upper bound on replies fetched for each top-level comment.\",\n      \"default\": 10,\n      \"prefill\": 10,\n      \"minimum\": 1,\n      \"maximum\": 200,\n      \"editor\": \"number\"\n    },\n    \"enrichDetails\": {\n      \"title\": \"Enrich Details\",\n      \"type\": \"boolean\",\n      \"description\": \"When enabled, each pin from search/profile/board results will be enriched with accurate stats (reaction count, follower count, etc.) by fetching its detail page. Slower but more complete data.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"resolveNumericIds\": {\n      \"title\": \"Resolve numeric Pin IDs from creator RSS\",\n      \"type\": \"boolean\",\n      \"description\": \"Creator feeds sometimes return encrypted Pin IDs that Pinterest will not open. When enabled, the actor follows the creator's public RSS feed (or the numeric user-pins feed) to recover openable numeric Pin IDs. Disable it to keep only the IDs the feed itself returns.\",\n      \"default\": true,\n      \"prefill\": true\n    }\n  },\n  \"required\": []\n}",
    "readme": "# Pinterest Rich Pin, Board & Creator Field Scraper\n\nPinterest's own pages carry far more structured data than a basic Pin scrape surfaces — media variants, full creator and board objects, product and SEO metadata, Story Pin pages, and reaction breakdowns. This actor pulls that deeper field set for Pins, profiles, boards, search results, and public comments, without requiring login cookies; anything Pinterest doesn't publish for a given record is simply left out of the newer camelCase fields.\n\n## What this actor does\n\n- **Ten collection modes plus auto-detect:** Pin detail, Pin comments, Pin search, video search, profile detail, a creator's Pins, a creator's boards, board detail, and board Pins, plus `auto` for pasted links.\n- **Rich Pin context:** media variants, creator and original-creator objects, board objects, destination links, product and SEO metadata, Story Pin pages and reaction counts when Pinterest supplies them.\n- **Pin filters:** saves, creator followers, verified creator, destination link, image-only, promoted Pins and shoppable Pins. They apply to Pin rows only, never to profile, board or comment rows.\n- **Cursor paging:** follows Pinterest's own next-page cursors for searches, creator feeds and boards, and skips Pins already returned earlier in the run.\n- **Encrypted feed IDs:** search and board feeds can return an opaque `e1_...` Pin ID instead of a numeric one. Those rows are kept as list records with `idIsEncrypted: true`, `detailAvailable: false` and no Pin URL, so a run is never silently empty.\n- **Numeric-ID recovery:** for a creator feed that returns encrypted IDs, the actor reads the creator's public RSS feed (or the numeric user-pins feed) and emits openable numeric Pin rows when `resolveNumericIds` is on.\n- **Run provenance:** every row carries `sourceType`, `sourceValue`, `position`, `seed`, and `query` on search rows, plus `numericIdSource` when a numeric ID was recovered.\n- **Run summary:** the default key-value store gets a `RUN_SUMMARY` with raw rows, accepted rows, rejected rows and the reason a run returned nothing.\n- **Omitted fields:** the camelCase fields are dropped when Pinterest doesn't supply them. A few older snake_case fields fall back to `0`, `false` or `\"public\"` instead (see the note under the output section).\n\n## Output per record\n\nEvery row includes `record_type`/`recordType` (`pin`, `profile`, `board` or `comment`), `source_url` (the search, profile, board or Pin page it came from), `scraped_at`, `sourceType`, `sourceValue` and `position`. Search rows also carry `query`; every row carries `seed`. Rows produced from a recovered numeric ID carry `numericIdSource` (`userPins` or `profileRss`).\n\n### Pin fields\n\nMany Pin values appear twice: once under an older snake_case name and once under a newer camelCase name. Any field below may be absent when Pinterest doesn't expose it for that Pin.\n\n- **Identity & text:** `id`/`pinId`, `idIsEncrypted`, `detailAvailable`, `commentsAvailable`, `url`/`pinUrl` (numeric Pins only), `title`, `description`, `altText`, `created_at`/`createdAt`, `dominant_color`, `link`/`linkUrl`, `linkDomain`, `domain`, `contentCategory`, `canonicalUrl`, `canonicalPinId`, `canonicalPinUrl`\n- **Media:** `images` (size → URL map), `imageUrl`, `imageVariants`, `videoVariants`, `video_url`/`videoUrl`, `is_video`/`isVideo`, `mediaType` (`image`, `animatedImage` or `video`), `pinFormat` (`story` for Story Pins), `mediaMethod`, `storyPinId`, `storyPages`\n- **SEO & link tracking:** `seoTitle`, `seoDescription`, `seoUrl`, `mobileLinkUrl`, `trackedLinkUrl`, `utmLinkUrl`\n- **Creator:** `creator`, `creatorId`, `creatorUsername`, `creatorName`, `creatorFollowerCount`, `originalCreator` (only when it differs from `creator`), `pinner_id`, `pinner_username`, `pinner_name`, `pinner_followers`\n- **Board:** `board`, `boardId`/`board_id`, `boardName`/`board_name`, `boardDescription`, `boardUrl`/`board_url`, `boardCoverImageUrl`, `boardPinCount`, `boardFollowerCount`, `boardSectionCount`, `boardCollaboratorCount`, `boardPrivacy`, `boardCreatedAt`, `boardIsCollaborative`, `boardFollowedByMe`\n- **Engagement:** `saves`/`save_count`, `commentCount`/`comment_count`, `repinCount`, `shareCount`, `likeCount`/`like_count`, `reactionCount`/`reaction_count`, `reactionCounts`/`reaction_counts`\n- **Status flags:** `isPromoted`, `commentsDisabled`, `commentsEligible`, `isEligibleForImageDownload`, `isEligibleForProduct`, `isOutOfStock`, `isStaleProduct`, `isUnsafeForComments`, `isDownstreamPromotion`, `shouldMute`\n- **Shopping:** `product`, `productPrice`, `productCurrency`, `productMerchant`, `productAvailability`, `isShoppable`, `shoppingFlags`, `richMetadata`\n\n`creator` and `originalCreator` can carry `id`, `username`, `fullName`, `firstName`, `followerCount`, `avatarSmallUrl`, `avatarMediumUrl`, `avatarLargeUrl`, `isVerified`, `isAdsOnly`, `isPrivate` and `followedByMe`. Each `imageVariants`/`videoVariants` entry is keyed by Pinterest's own size name and can carry `url`, `width`, `height`, `duration` and `thumbnailUrl`. Story Pin pages can carry `pageId`, `layout` and a block list with `type`, `text`, `images` and `videos`.\n\n### Profile fields\n\n- **Identity:** `type` (always `user`), `id`/`profileId`, `username`, `full_name`/`fullName`, `bio`, `location`, `createdAt`\n- **Counts:** `follower_count`/`followerCount`, `following_count`/`followingCount`, `pin_count`/`pinCount`, `board_count`/`boardCount`, `monthlyViews`\n- **Media & links:** `avatarUrls`, `avatarUrl`, `image_url`, `website_url`/`websiteUrl`, `domainUrl`, `profile_url`/`profileUrl`\n- **Account flags:** `is_verified`, `isVerified`, `isPrivate`, `isPartner`, `isVerifiedMerchant`, `isDomainVerified`, `isTastemaker`\n\n### Board fields\n\n- **Identity:** `type` and `recordType` (both `board`), `id`/`boardId`, `name`, `description`, `url`, `owner_username`/`ownerUsername`, `owner_name`, `createdAt`\n- **Counts:** `pin_count`/`pinCount`, `follower_count`/`followerCount`, `sectionCount`, `collaboratorCount`\n- **Media & flags:** `coverImageUrl`, `privacy`, `isCollaborative`, `followedByMe`\n\n### Comment fields\n\n- **Content & identity:** `id`, `text`, `created_at`, `type`, `node_id`, `tags`, `tagged_users`, `media`, `pin_id`, `pin_url`\n- **Author:** `author_name`, `author_username`, `author_id`, `author_first_name`, `author_image`, `author_image_medium`, `author_node_id`, `author_is_private_profile`\n- **Engagement & state:** `like_count`, `reaction_counts`, `reaction_by_me`, `helpful_count`, `marked_helpful_by_me`, `reply_count`, `is_edited`, `is_highlighted_by_pin_owner`, `is_translatable`\n\n**Note on absent values:** every field is written only when Pinterest supplied it for that record. An explicit `0` or `false` from Pinterest is kept; an unknown engagement count, follower count or video flag is omitted instead of being replaced with a made-up zero. `idIsEncrypted`, `detailAvailable` and `commentsAvailable` are always present because the actor can determine them from the ID shape.\n\n### Encrypted Pin IDs\n\nPinterest increasingly returns an opaque ID such as `e1_AfqPShx7dj...` from search and board feeds. That ID is real, but `pinterest.com/pin/<id>/`, the Pin detail endpoint and oEmbed do not open it. The actor keeps the row:\n\n- `id` and `pinId` contain the opaque ID exactly as Pinterest returned it.\n- `idIsEncrypted` is `true` and `detailAvailable` is `false`.\n- `aggregatePinId` is emitted when Pinterest supplies the aggregate comments ID. In that case `commentsAvailable` is `true` and `includeComments` can fetch the public comment thread without a Pin URL.\n- `url` and `pinUrl` are omitted because no public Pin page exists.\n- All list fields Pinterest did return remain: title, description, images, creator, board, reaction counts, saves (when the feed carries them), `created_at`, `domain`, `link`, video/story data and so on.\n\nThe actor never invents detail-only fields for these rows. If the same Pin is later found through a creator feed with a numeric ID, that row is openable and can be enriched.\n\n### Numeric-ID recovery\n\n`UserPinsResource` normally returns numeric IDs. When it returns only opaque IDs or no rows, `resolveNumericIds` (default on) makes the actor read the creator's public `/<username>/feed.rss`. RSS items carry a numeric Pin link, title, description, image and publication date; they are emitted with `sourceType: \"profileRss\"` and `numericIdSource: \"profileRss\"`. RSS contains only the creator's most recent Pins (about 21-25). The user-pins cursor is always preferred when it returns numeric rows.\n\n### Commerce fields\n\nWhen Pinterest supplies a real product payload (`product_pin_data`, `product_metadata` or `rich_summary.products[].offers`), the actor normalizes:\n\n- `productPrice` in major currency units (Pinterest's `price_value` is in cents: `1364` -> `13.64`).\n- `productCurrency` (upper-case ISO code), `productMerchant`, `productAvailability` (`in_stock`, `out_of_stock`, `preorder`, `backorder` or `stale`).\n- `isShoppable` only when Pinterest published real product/shopping evidence. A `{type, id}` metadata stub alone is not treated as shoppable.\n\nThe original `product` object is kept for traceability.\n\n### Run summary and zero-row behavior\n\nEvery run writes `RUN_SUMMARY` to the default key-value store:\n\n```json\n{\n  \"rawRows\": 20,\n  \"accepted\": 5,\n  \"rejected\": 0,\n  \"recordsByType\": { \"pin\": 5 },\n  \"sources\": [\n    { \"sourceType\": \"search\", \"sourceValue\": \"cats\", \"rawRows\": 20, \"accepted\": 5, \"rejected\": 0, \"rejectReasons\": {} }\n  ]\n}\n```\n\nWhen a valid source returns rows but none can be emitted, the run fails with a reason such as `opaque_id_not_openable` or `source_returned_no_rows`. When filters deliberately remove every row, the run warns with `all_rows_filtered_out`. The status message always shows raw / accepted / rejected / reason, so a zero-row run is never reported as a plain success.\n\n## Input\n\nAt least one source is required: `keywords`, `startUrls`, `pinUrls`, `usernames`, `boardUrls`, or an explicit mode with its matching source. The auto prefill is `search=cats`; Apify's validator cannot express \"one of\", so the actor documents the fallback.\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `auto` | `auto`, `pinDetail`, `comments`, `searchPins`, `searchVideos`, `searchUsers`, `searchBoards`, `userProfile`, `userPins`, `userBoards`, `boardDetail`, `boardPins`, `ideas`, or `search` (same as `searchPins`). |\n| `keywords` | array | `[]` | Search phrases. Used by the search modes and by `auto`; merged together with `search`. Legacy `searchTerms` is mapped in code. |\n| `search` | string | – | One extra search phrase, added to `keywords`. |\n| `pinUrls` | array | `[]` | Pin URLs or numeric Pin IDs for `pinDetail` and `comments`. Legacy `pinterestUrls` is mapped in code. |\n| `usernames` | array | `[]` | Usernames, `@usernames` or profile URLs for `userProfile`, `userPins` and `userBoards`. Legacy `profiles` is mapped in code. |\n| `boardUrls` | array | `[]` | Board URLs or `username/board-name` paths for `boardDetail` and `boardPins`. Legacy `boards` is mapped in code. |\n| `startUrls` | array | – | Mixed Pin, profile, board and search URLs for `auto` mode. A profile URL returns the profile row plus that person's Pins. |\n| `maxItems` | integer | `50` | Maximum records for the run (`0` = no limit, up to 20,000). Counts Pin rows in Pin-producing modes, and profile or board rows in `userProfile`, `userBoards` and `boardDetail`. Comment rows and the profile row added by profile URLs are not counted. |\n| `maxPages` | integer | `0` | Pages per search, creator feed or board. `0` follows Pinterest's cursor until it ends. Legacy `endPage` is mapped in code. |\n| `minSaves` | integer | – | Keep Pins with at least this many saves. Pins without a save count are dropped. |\n| `minCreatorFollowers` | integer | – | Keep Pins whose creator has at least this many followers. |\n| `verifiedOnly` | boolean | `false` | Keep only Pins whose creator object is marked verified. Profiles and boards are not filtered. |\n| `requireOutboundLink` | boolean | `false` | Keep only Pins with a destination link. |\n| `imageOnly` | boolean | `false` | Drop Pins Pinterest marks as video. |\n| `excludeAds` | boolean | `false` | Drop Pins marked as promoted. |\n| `commerceOnly` | boolean | `false` | Keep only Pins with product or shopping data. |\n| `includeComments` | boolean | `false` | Add comment rows after each collected Pin. |\n| `maxComments` | integer | `10` | Maximum comment rows per Pin (1-20,000). |\n| `includeCommentReplies` | boolean | `false` | Fetch depth-one replies for comments that report replies. |\n| `maxCommentReplies` | integer | `10` | Maximum replies fetched per top-level comment (1-200). |\n| `enrichDetails` | boolean | `false` | Re-open each feed Pin (search, creator, board) to refresh its comment, reaction and save counts, creator name/username/followers and video fields. |\n| `resolveNumericIds` | boolean | `true` | When a creator feed returns only encrypted Pin IDs, read the creator's public RSS feed (or numeric user-pins feed) to emit openable numeric Pin rows. Turn off to keep only the IDs the creator feed itself returns. |\n\n### Example: detailed Pin\n\n```json\n{\n  \"mode\": \"pinDetail\",\n  \"pinUrls\": [\"https://www.pinterest.com/pin/142567144448888376/\"]\n}\n```\n\n### Example: creator feed with refreshed counts\n\n```json\n{\n  \"mode\": \"userPins\",\n  \"usernames\": [\"crazylaurablog\"],\n  \"maxItems\": 2000,\n  \"endPage\": 0,\n  \"enrichDetails\": true\n}\n```\n\n### Example: board Pins with comments\n\n```json\n{\n  \"mode\": \"boardPins\",\n  \"boardUrls\": [\"https://www.pinterest.com/nasa/hubble-images/\"],\n  \"maxItems\": 500,\n  \"includeComments\": true,\n  \"maxComments\": 20\n}\n```\n\n### Example: filtered video search\n\n```json\n{\n  \"mode\": \"searchVideos\",\n  \"keywords\": [\"easy dinner\", \"travel guide\"],\n  \"excludeAds\": true,\n  \"maxItems\": 500\n}\n```\n\n## Use cases\n\n- Audit the destination links, SEO titles and alt text on a brand's Pins.\n- Compare creators by follower counts, monthly views and verification flags.\n- Inventory a board's Pins together with their section and collaborator counts.\n- Collect Story Pins and video Pins with every published media size for a creative library.\n- Read the comment threads under high-save Pins in a niche.\n- Track which Pins in a search are shoppable, out of stock or promoted.\n\n## FAQ\n\n### Do I need to log in?\n\nNo. Every mode works signed-out. The cookie inputs are optional and no mode depends on them.\n\n### What happens if I run it with no input?\n\nWhen no search phrase, URL, username or board is given, the actor collects the single example Pin from the input form so the run still produces a record.\n\n### Why were my usernames or boards ignored?\n\nIn `auto` mode the actor only reads `keywords`/`search`, `startUrls` and (when `startUrls` is empty) `pinUrls`. Pick `userProfile`, `userPins`, `userBoards`, `boardDetail` or `boardPins` to use `usernames` or `boardUrls`, or paste the profile and board links into `startUrls`.\n\n### What is the difference between `searchPins` and `searchVideos`?\n\nBoth run the same Pinterest Pin search. `searchVideos` then keeps only the results Pinterest marks as video, so it can page through more results to fill `maxItems`. `search` is an older name for `searchPins`.\n\n### Can a run return more than 10,000 rows?\n\nYes. `maxItems` goes up to 20,000 (or `0` for no limit), and the actor keeps following Pinterest's cursor as long as Pinterest returns more Pins.\n\n### Why can a feed contain fewer rows than the account's visible Pin count?\n\nSigned-out feeds, cursor limits, privacy settings, duplicate Pins and your filters all shrink the result. For boards, the actor loads up to `maxItems` Pins first and then applies the filters, so a filtered board run can return fewer rows than `maxItems`.\n\n### Why do some rows have no `url` or detail counts?\n\nSearch and board feeds can return an encrypted `e1_...` Pin ID. Pinterest does not open that ID as a Pin page and does not return its detail. Those rows are still real list records: `idIsEncrypted` is `true`, `detailAvailable` is `false`, and `url`/`pinUrl` are left out. The list fields Pinterest did publish remain. When Pinterest supplies an aggregate comments ID (`aggregatePinId`), the actor can still fetch the public top-level comments for that row. Set `includeCommentReplies` to fetch depth-one replies for comments that report replies; each reply carries `parentCommentId` and `depth: 1`. Deeper nesting is not exposed by the public resource.\n\n### What does `resolveNumericIds` do?\n\nFor a creator feed, it enables the numeric-ID recovery path. If the creator's Pin list is empty or contains only encrypted IDs, the actor reads the creator's public RSS feed and emits numeric Pin rows there. RSS is recent-only; set the option to `false` if you want only the IDs the creator feed itself returns.\n\n### Why is a run marked failed with zero rows?\n\nThe actor now treats a zero-row run as a bug when the source returned rows it could not emit. The status message and `RUN_SUMMARY` show `rawRows`, `accepted`, `rejected` and a reason such as `opaque_id_not_openable` or `source_returned_no_rows`. A run that is empty because your filters removed every row warns with `all_rows_filtered_out` instead of failing.\n\n### Why is `productPrice` missing on most Pins?\n\nPinterest publishes product payloads only for a small subset of Pins. The actor fills `productPrice`, `productCurrency`, `productMerchant`, `productAvailability` and `isShoppable` only when Pinterest supplies real product data or shopping flags. A metadata stub with just a type and ID is not treated as a product.\n\n### What does `enrichDetails` change?\n\nFor Pins found through search, creator or board feeds, it opens each Pin's own page and overwrites the comment, reaction and save counts, the creator id, name, username and follower count, and the video flag and URL with the Pin page's values. It does not add new media, product or SEO fields, and it slows the run down. `pinDetail`, `comments` and Pin URLs in `auto` already read the Pin's own page.\n\n`maxItems` counts Pins/source records. Comment rows, including opt-in replies, are additional and are capped by `maxComments` and `maxCommentReplies`; a comments run can therefore produce more dataset rows than `maxItems`.\n\n### Are filters based on guessed engagement?\n\nNo. `minSaves`, `verifiedOnly`, `commerceOnly` and the other filters only pass a Pin when Pinterest supplied the value they test. A Pin with no published save count is dropped by `minSaves`.\n\n### Which Pinterest links are recognised?\n\nPin, profile, board, board-section, Ideas, `/search/pins/?q=`, `/search/users/?q=` and `/search/boards/?q=` links on pinterest.com and its regional domains (such as pinterest.co.uk, .de, .fr, .ca, .com.au and .jp). Short `pin.it` links are not recognised.\n\n### What do the newer modes return?\n\n- `searchUsers` and `searchBoards` return public people/board search results with cursor pagination.\n- `ideas` returns the Pins in an Ideas feed (list-only; the public feed has no detail/comments).\n- A three-segment board-section URL reads `BoardSectionsResource` + `BoardSectionPinsResource`, which is the best cookieless source of numeric Pin IDs.\n- Profile tabs are routed honestly: `pins`/`_created` read created Pins, `boards` reads the person's boards, and unsupported tabs (`_saved`, followers, following, likes, activity) warn instead of returning unrelated Pins.\n- Related-Pins mode is not exposed because the public resource worked locally but returned no rows from the cloud exit. The `e1_...` to numeric mapping remains a hard limit; use board sections, user Pins and creator RSS for numeric recovery.\n\n### Why do some outbound `linkUrl` values return 403?\n\nThe outbound link is exactly what Pinterest supplied. Etsy short links (`etsy.me`) can reject clean non-browser clients with 403; the destination is still valid in a browser. Pin media, profile and board URLs were verified HTTP 200.\n\n### Is this affiliated with Pinterest?\n\nNo. It's an independent tool that reads publicly visible Pinterest data.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "pinterest-rich-pin-board-and-creator-field-scraper",
      "title": "Pinterest Rich Pin, Board & Creator Field Scraper",
      "description": "Collect Pinterest Pins, profiles, boards and comments with media variants, creator and board detail, product and SEO fields, filtered by saves, followers, verification and more.",
      "version": "1.1",
      "readme": "# Pinterest Rich Pin, Board & Creator Field Scraper\n\nPinterest's own pages carry far more structured data than a basic Pin scrape surfaces — media variants, full creator and board objects, product and SEO metadata, Story Pin pages, and reaction breakdowns. This actor pulls that deeper field set for Pins, profiles, boards, search results, and public comments, without requiring login cookies; anything Pinterest doesn't publish for a given record is simply left out of the newer camelCase fields.\n\n## What this actor does\n\n- **Ten collection modes plus auto-detect:** Pin detail, Pin comments, Pin search, video search, profile detail, a creator's Pins, a creator's boards, board detail, and board Pins, plus `auto` for pasted links.\n- **Rich Pin context:** media variants, creator and original-creator objects, board objects, destination links, product and SEO metadata, Story Pin pages and reaction counts when Pinterest supplies them.\n- **Pin filters:** saves, creator followers, verified creator, destination link, image-only, promoted Pins and shoppable Pins. They apply to Pin rows only, never to profile, board or comment rows.\n- **Cursor paging:** follows Pinterest's own next-page cursors for searches, creator feeds and boards, and skips Pins already returned earlier in the run.\n- **Encrypted feed IDs:** search and board feeds can return an opaque `e1_...` Pin ID instead of a numeric one. Those rows are kept as list records with `idIsEncrypted: true`, `detailAvailable: false` and no Pin URL, so a run is never silently empty.\n- **Numeric-ID recovery:** for a creator feed that returns encrypted IDs, the actor reads the creator's public RSS feed (or the numeric user-pins feed) and emits openable numeric Pin rows when `resolveNumericIds` is on.\n- **Run provenance:** every row carries `sourceType`, `sourceValue`, `position`, `seed`, and `query` on search rows, plus `numericIdSource` when a numeric ID was recovered.\n- **Run summary:** the default key-value store gets a `RUN_SUMMARY` with raw rows, accepted rows, rejected rows and the reason a run returned nothing.\n- **Omitted fields:** the camelCase fields are dropped when Pinterest doesn't supply them. A few older snake_case fields fall back to `0`, `false` or `\"public\"` instead (see the note under the output section).\n\n## Output per record\n\nEvery row includes `record_type`/`recordType` (`pin`, `profile`, `board` or `comment`), `source_url` (the search, profile, board or Pin page it came from), `scraped_at`, `sourceType`, `sourceValue` and `position`. Search rows also carry `query`; every row carries `seed`. Rows produced from a recovered numeric ID carry `numericIdSource` (`userPins` or `profileRss`).\n\n### Pin fields\n\nMany Pin values appear twice: once under an older snake_case name and once under a newer camelCase name. Any field below may be absent when Pinterest doesn't expose it for that Pin.\n\n- **Identity & text:** `id`/`pinId`, `idIsEncrypted`, `detailAvailable`, `commentsAvailable`, `url`/`pinUrl` (numeric Pins only), `title`, `description`, `altText`, `created_at`/`createdAt`, `dominant_color`, `link`/`linkUrl`, `linkDomain`, `domain`, `contentCategory`, `canonicalUrl`, `canonicalPinId`, `canonicalPinUrl`\n- **Media:** `images` (size → URL map), `imageUrl`, `imageVariants`, `videoVariants`, `video_url`/`videoUrl`, `is_video`/`isVideo`, `mediaType` (`image`, `animatedImage` or `video`), `pinFormat` (`story` for Story Pins), `mediaMethod`, `storyPinId`, `storyPages`\n- **SEO & link tracking:** `seoTitle`, `seoDescription`, `seoUrl`, `mobileLinkUrl`, `trackedLinkUrl`, `utmLinkUrl`\n- **Creator:** `creator`, `creatorId`, `creatorUsername`, `creatorName`, `creatorFollowerCount`, `originalCreator` (only when it differs from `creator`), `pinner_id`, `pinner_username`, `pinner_name`, `pinner_followers`\n- **Board:** `board`, `boardId`/`board_id`, `boardName`/`board_name`, `boardDescription`, `boardUrl`/`board_url`, `boardCoverImageUrl`, `boardPinCount`, `boardFollowerCount`, `boardSectionCount`, `boardCollaboratorCount`, `boardPrivacy`, `boardCreatedAt`, `boardIsCollaborative`, `boardFollowedByMe`\n- **Engagement:** `saves`/`save_count`, `commentCount`/`comment_count`, `repinCount`, `shareCount`, `likeCount`/`like_count`, `reactionCount`/`reaction_count`, `reactionCounts`/`reaction_counts`\n- **Status flags:** `isPromoted`, `commentsDisabled`, `commentsEligible`, `isEligibleForImageDownload`, `isEligibleForProduct`, `isOutOfStock`, `isStaleProduct`, `isUnsafeForComments`, `isDownstreamPromotion`, `shouldMute`\n- **Shopping:** `product`, `productPrice`, `productCurrency`, `productMerchant`, `productAvailability`, `isShoppable`, `shoppingFlags`, `richMetadata`\n\n`creator` and `originalCreator` can carry `id`, `username`, `fullName`, `firstName`, `followerCount`, `avatarSmallUrl`, `avatarMediumUrl`, `avatarLargeUrl`, `isVerified`, `isAdsOnly`, `isPrivate` and `followedByMe`. Each `imageVariants`/`videoVariants` entry is keyed by Pinterest's own size name and can carry `url`, `width`, `height`, `duration` and `thumbnailUrl`. Story Pin pages can carry `pageId`, `layout` and a block list with `type`, `text`, `images` and `videos`.\n\n### Profile fields\n\n- **Identity:** `type` (always `user`), `id`/`profileId`, `username`, `full_name`/`fullName`, `bio`, `location`, `createdAt`\n- **Counts:** `follower_count`/`followerCount`, `following_count`/`followingCount`, `pin_count`/`pinCount`, `board_count`/`boardCount`, `monthlyViews`\n- **Media & links:** `avatarUrls`, `avatarUrl`, `image_url`, `website_url`/`websiteUrl`, `domainUrl`, `profile_url`/`profileUrl`\n- **Account flags:** `is_verified`, `isVerified`, `isPrivate`, `isPartner`, `isVerifiedMerchant`, `isDomainVerified`, `isTastemaker`\n\n### Board fields\n\n- **Identity:** `type` and `recordType` (both `board`), `id`/`boardId`, `name`, `description`, `url`, `owner_username`/`ownerUsername`, `owner_name`, `createdAt`\n- **Counts:** `pin_count`/`pinCount`, `follower_count`/`followerCount`, `sectionCount`, `collaboratorCount`\n- **Media & flags:** `coverImageUrl`, `privacy`, `isCollaborative`, `followedByMe`\n\n### Comment fields\n\n- **Content & identity:** `id`, `text`, `created_at`, `type`, `node_id`, `tags`, `tagged_users`, `media`, `pin_id`, `pin_url`\n- **Author:** `author_name`, `author_username`, `author_id`, `author_first_name`, `author_image`, `author_image_medium`, `author_node_id`, `author_is_private_profile`\n- **Engagement & state:** `like_count`, `reaction_counts`, `reaction_by_me`, `helpful_count`, `marked_helpful_by_me`, `reply_count`, `is_edited`, `is_highlighted_by_pin_owner`, `is_translatable`\n\n**Note on absent values:** every field is written only when Pinterest supplied it for that record. An explicit `0` or `false` from Pinterest is kept; an unknown engagement count, follower count or video flag is omitted instead of being replaced with a made-up zero. `idIsEncrypted`, `detailAvailable` and `commentsAvailable` are always present because the actor can determine them from the ID shape.\n\n### Encrypted Pin IDs\n\nPinterest increasingly returns an opaque ID such as `e1_AfqPShx7dj...` from search and board feeds. That ID is real, but `pinterest.com/pin/<id>/`, the Pin detail endpoint and oEmbed do not open it. The actor keeps the row:\n\n- `id` and `pinId` contain the opaque ID exactly as Pinterest returned it.\n- `idIsEncrypted` is `true` and `detailAvailable` is `false`.\n- `aggregatePinId` is emitted when Pinterest supplies the aggregate comments ID. In that case `commentsAvailable` is `true` and `includeComments` can fetch the public comment thread without a Pin URL.\n- `url` and `pinUrl` are omitted because no public Pin page exists.\n- All list fields Pinterest did return remain: title, description, images, creator, board, reaction counts, saves (when the feed carries them), `created_at`, `domain`, `link`, video/story data and so on.\n\nThe actor never invents detail-only fields for these rows. If the same Pin is later found through a creator feed with a numeric ID, that row is openable and can be enriched.\n\n### Numeric-ID recovery\n\n`UserPinsResource` normally returns numeric IDs. When it returns only opaque IDs or no rows, `resolveNumericIds` (default on) makes the actor read the creator's public `/<username>/feed.rss`. RSS items carry a numeric Pin link, title, description, image and publication date; they are emitted with `sourceType: \"profileRss\"` and `numericIdSource: \"profileRss\"`. RSS contains only the creator's most recent Pins (about 21-25). The user-pins cursor is always preferred when it returns numeric rows.\n\n### Commerce fields\n\nWhen Pinterest supplies a real product payload (`product_pin_data`, `product_metadata` or `rich_summary.products[].offers`), the actor normalizes:\n\n- `productPrice` in major currency units (Pinterest's `price_value` is in cents: `1364` -> `13.64`).\n- `productCurrency` (upper-case ISO code), `productMerchant`, `productAvailability` (`in_stock`, `out_of_stock`, `preorder`, `backorder` or `stale`).\n- `isShoppable` only when Pinterest published real product/shopping evidence. A `{type, id}` metadata stub alone is not treated as shoppable.\n\nThe original `product` object is kept for traceability.\n\n### Run summary and zero-row behavior\n\nEvery run writes `RUN_SUMMARY` to the default key-value store:\n\n```json\n{\n  \"rawRows\": 20,\n  \"accepted\": 5,\n  \"rejected\": 0,\n  \"recordsByType\": { \"pin\": 5 },\n  \"sources\": [\n    { \"sourceType\": \"search\", \"sourceValue\": \"cats\", \"rawRows\": 20, \"accepted\": 5, \"rejected\": 0, \"rejectReasons\": {} }\n  ]\n}\n```\n\nWhen a valid source returns rows but none can be emitted, the run fails with a reason such as `opaque_id_not_openable` or `source_returned_no_rows`. When filters deliberately remove every row, the run warns with `all_rows_filtered_out`. The status message always shows raw / accepted / rejected / reason, so a zero-row run is never reported as a plain success.\n\n## Input\n\nAt least one source is required: `keywords`, `startUrls`, `pinUrls`, `usernames`, `boardUrls`, or an explicit mode with its matching source. The auto prefill is `search=cats`; Apify's validator cannot express \"one of\", so the actor documents the fallback.\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `auto` | `auto`, `pinDetail`, `comments`, `searchPins`, `searchVideos`, `searchUsers`, `searchBoards`, `userProfile`, `userPins`, `userBoards`, `boardDetail`, `boardPins`, `ideas`, or `search` (same as `searchPins`). |\n| `keywords` | array | `[]` | Search phrases. Used by the search modes and by `auto`; merged together with `search`. Legacy `searchTerms` is mapped in code. |\n| `search` | string | – | One extra search phrase, added to `keywords`. |\n| `pinUrls` | array | `[]` | Pin URLs or numeric Pin IDs for `pinDetail` and `comments`. Legacy `pinterestUrls` is mapped in code. |\n| `usernames` | array | `[]` | Usernames, `@usernames` or profile URLs for `userProfile`, `userPins` and `userBoards`. Legacy `profiles` is mapped in code. |\n| `boardUrls` | array | `[]` | Board URLs or `username/board-name` paths for `boardDetail` and `boardPins`. Legacy `boards` is mapped in code. |\n| `startUrls` | array | – | Mixed Pin, profile, board and search URLs for `auto` mode. A profile URL returns the profile row plus that person's Pins. |\n| `maxItems` | integer | `50` | Maximum records for the run (`0` = no limit, up to 20,000). Counts Pin rows in Pin-producing modes, and profile or board rows in `userProfile`, `userBoards` and `boardDetail`. Comment rows and the profile row added by profile URLs are not counted. |\n| `maxPages` | integer | `0` | Pages per search, creator feed or board. `0` follows Pinterest's cursor until it ends. Legacy `endPage` is mapped in code. |\n| `minSaves` | integer | – | Keep Pins with at least this many saves. Pins without a save count are dropped. |\n| `minCreatorFollowers` | integer | – | Keep Pins whose creator has at least this many followers. |\n| `verifiedOnly` | boolean | `false` | Keep only Pins whose creator object is marked verified. Profiles and boards are not filtered. |\n| `requireOutboundLink` | boolean | `false` | Keep only Pins with a destination link. |\n| `imageOnly` | boolean | `false` | Drop Pins Pinterest marks as video. |\n| `excludeAds` | boolean | `false` | Drop Pins marked as promoted. |\n| `commerceOnly` | boolean | `false` | Keep only Pins with product or shopping data. |\n| `includeComments` | boolean | `false` | Add comment rows after each collected Pin. |\n| `maxComments` | integer | `10` | Maximum comment rows per Pin (1-20,000). |\n| `includeCommentReplies` | boolean | `false` | Fetch depth-one replies for comments that report replies. |\n| `maxCommentReplies` | integer | `10` | Maximum replies fetched per top-level comment (1-200). |\n| `enrichDetails` | boolean | `false` | Re-open each feed Pin (search, creator, board) to refresh its comment, reaction and save counts, creator name/username/followers and video fields. |\n| `resolveNumericIds` | boolean | `true` | When a creator feed returns only encrypted Pin IDs, read the creator's public RSS feed (or numeric user-pins feed) to emit openable numeric Pin rows. Turn off to keep only the IDs the creator feed itself returns. |\n\n### Example: detailed Pin\n\n```json\n{\n  \"mode\": \"pinDetail\",\n  \"pinUrls\": [\"https://www.pinterest.com/pin/142567144448888376/\"]\n}\n```\n\n### Example: creator feed with refreshed counts\n\n```json\n{\n  \"mode\": \"userPins\",\n  \"usernames\": [\"crazylaurablog\"],\n  \"maxItems\": 2000,\n  \"endPage\": 0,\n  \"enrichDetails\": true\n}\n```\n\n### Example: board Pins with comments\n\n```json\n{\n  \"mode\": \"boardPins\",\n  \"boardUrls\": [\"https://www.pinterest.com/nasa/hubble-images/\"],\n  \"maxItems\": 500,\n  \"includeComments\": true,\n  \"maxComments\": 20\n}\n```\n\n### Example: filtered video search\n\n```json\n{\n  \"mode\": \"searchVideos\",\n  \"keywords\": [\"easy dinner\", \"travel guide\"],\n  \"excludeAds\": true,\n  \"maxItems\": 500\n}\n```\n\n## Use cases\n\n- Audit the destination links, SEO titles and alt text on a brand's Pins.\n- Compare creators by follower counts, monthly views and verification flags.\n- Inventory a board's Pins together with their section and collaborator counts.\n- Collect Story Pins and video Pins with every published media size for a creative library.\n- Read the comment threads under high-save Pins in a niche.\n- Track which Pins in a search are shoppable, out of stock or promoted.\n\n## FAQ\n\n### Do I need to log in?\n\nNo. Every mode works signed-out. The cookie inputs are optional and no mode depends on them.\n\n### What happens if I run it with no input?\n\nWhen no search phrase, URL, username or board is given, the actor collects the single example Pin from the input form so the run still produces a record.\n\n### Why were my usernames or boards ignored?\n\nIn `auto` mode the actor only reads `keywords`/`search`, `startUrls` and (when `startUrls` is empty) `pinUrls`. Pick `userProfile`, `userPins`, `userBoards`, `boardDetail` or `boardPins` to use `usernames` or `boardUrls`, or paste the profile and board links into `startUrls`.\n\n### What is the difference between `searchPins` and `searchVideos`?\n\nBoth run the same Pinterest Pin search. `searchVideos` then keeps only the results Pinterest marks as video, so it can page through more results to fill `maxItems`. `search` is an older name for `searchPins`.\n\n### Can a run return more than 10,000 rows?\n\nYes. `maxItems` goes up to 20,000 (or `0` for no limit), and the actor keeps following Pinterest's cursor as long as Pinterest returns more Pins.\n\n### Why can a feed contain fewer rows than the account's visible Pin count?\n\nSigned-out feeds, cursor limits, privacy settings, duplicate Pins and your filters all shrink the result. For boards, the actor loads up to `maxItems` Pins first and then applies the filters, so a filtered board run can return fewer rows than `maxItems`.\n\n### Why do some rows have no `url` or detail counts?\n\nSearch and board feeds can return an encrypted `e1_...` Pin ID. Pinterest does not open that ID as a Pin page and does not return its detail. Those rows are still real list records: `idIsEncrypted` is `true`, `detailAvailable` is `false`, and `url`/`pinUrl` are left out. The list fields Pinterest did publish remain. When Pinterest supplies an aggregate comments ID (`aggregatePinId`), the actor can still fetch the public top-level comments for that row. Set `includeCommentReplies` to fetch depth-one replies for comments that report replies; each reply carries `parentCommentId` and `depth: 1`. Deeper nesting is not exposed by the public resource.\n\n### What does `resolveNumericIds` do?\n\nFor a creator feed, it enables the numeric-ID recovery path. If the creator's Pin list is empty or contains only encrypted IDs, the actor reads the creator's public RSS feed and emits numeric Pin rows there. RSS is recent-only; set the option to `false` if you want only the IDs the creator feed itself returns.\n\n### Why is a run marked failed with zero rows?\n\nThe actor now treats a zero-row run as a bug when the source returned rows it could not emit. The status message and `RUN_SUMMARY` show `rawRows`, `accepted`, `rejected` and a reason such as `opaque_id_not_openable` or `source_returned_no_rows`. A run that is empty because your filters removed every row warns with `all_rows_filtered_out` instead of failing.\n\n### Why is `productPrice` missing on most Pins?\n\nPinterest publishes product payloads only for a small subset of Pins. The actor fills `productPrice`, `productCurrency`, `productMerchant`, `productAvailability` and `isShoppable` only when Pinterest supplies real product data or shopping flags. A metadata stub with just a type and ID is not treated as a product.\n\n### What does `enrichDetails` change?\n\nFor Pins found through search, creator or board feeds, it opens each Pin's own page and overwrites the comment, reaction and save counts, the creator id, name, username and follower count, and the video flag and URL with the Pin page's values. It does not add new media, product or SEO fields, and it slows the run down. `pinDetail`, `comments` and Pin URLs in `auto` already read the Pin's own page.\n\n`maxItems` counts Pins/source records. Comment rows, including opt-in replies, are additional and are capped by `maxComments` and `maxCommentReplies`; a comments run can therefore produce more dataset rows than `maxItems`.\n\n### Are filters based on guessed engagement?\n\nNo. `minSaves`, `verifiedOnly`, `commerceOnly` and the other filters only pass a Pin when Pinterest supplied the value they test. A Pin with no published save count is dropped by `minSaves`.\n\n### Which Pinterest links are recognised?\n\nPin, profile, board, board-section, Ideas, `/search/pins/?q=`, `/search/users/?q=` and `/search/boards/?q=` links on pinterest.com and its regional domains (such as pinterest.co.uk, .de, .fr, .ca, .com.au and .jp). Short `pin.it` links are not recognised.\n\n### What do the newer modes return?\n\n- `searchUsers` and `searchBoards` return public people/board search results with cursor pagination.\n- `ideas` returns the Pins in an Ideas feed (list-only; the public feed has no detail/comments).\n- A three-segment board-section URL reads `BoardSectionsResource` + `BoardSectionPinsResource`, which is the best cookieless source of numeric Pin IDs.\n- Profile tabs are routed honestly: `pins`/`_created` read created Pins, `boards` reads the person's boards, and unsupported tabs (`_saved`, followers, following, likes, activity) warn instead of returning unrelated Pins.\n- Related-Pins mode is not exposed because the public resource worked locally but returned no rows from the cloud exit. The `e1_...` to numeric mapping remains a hard limit; use board sections, user Pins and creator RSS for numeric recovery.\n\n### Why do some outbound `linkUrl` values return 403?\n\nThe outbound link is exactly what Pinterest supplied. Etsy short links (`etsy.me`) can reject clean non-browser clients with 403; the destination is still valid in a browser. Pin media, profile and board URLs were verified HTTP 200.\n\n### Is this affiliated with Pinterest?\n\nNo. It's an independent tool that reads publicly visible Pinterest data.\n",
      "dockerfile": "../Dockerfile",
      "input": {
        "title": "Pinterest Data Extractor Input",
        "description": "Collect public Pinterest Pins, profiles, boards, board Pins, search results, and comments with optional detail enrichment. All fields are source-backed and optional.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "What to collect",
            "type": "string",
            "description": "Choose a collection type. Auto-detect accepts mixed public Pinterest links.",
            "editor": "select",
            "enum": [
              "auto",
              "pinDetail",
              "comments",
              "searchPins",
              "searchVideos",
              "searchUsers",
              "searchBoards",
              "userProfile",
              "userPins",
              "userBoards",
              "boardDetail",
              "boardPins",
              "ideas",
              "search"
            ],
            "enumTitles": [
              "Auto-detect links",
              "Pin details",
              "Comments for Pins",
              "Search Pins",
              "Search video Pins",
              "Search people",
              "Search boards",
              "Profile details",
              "Pins created by a person",
              "Boards owned by a person",
              "Board details",
              "Pins inside a board",
              "Ideas feed (list only)",
              "Search Pins (legacy)"
            ],
            "default": "auto",
            "prefill": "auto"
          },
          "keywords": {
            "title": "Search words",
            "type": "array",
            "description": "One or more words or phrases for search modes.",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "default": [],
            "prefill": []
          },
          "pinUrls": {
            "title": "Pin URLs or IDs",
            "type": "array",
            "description": "Public Pin links or numeric Pin IDs.",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "default": [],
            "prefill": []
          },
          "usernames": {
            "title": "Pinterest usernames",
            "type": "array",
            "description": "Usernames, @usernames, or public profile links.",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "default": [],
            "prefill": []
          },
          "boardUrls": {
            "title": "Board URLs",
            "type": "array",
            "description": "Public board links or username/board-name paths.",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "default": [],
            "prefill": []
          },
          "search": {
            "title": "Search Query",
            "type": "string",
            "description": "Keyword to search on Pinterest. Results will be pins matching this query.",
            "editor": "textfield",
            "prefill": "cats"
          },
          "startUrls": {
            "title": "Pinterest URLs",
            "type": "array",
            "description": "List of Pinterest URLs to scrape. Supports pin URLs, user profile URLs, board URLs, and search URLs.",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "prefill": []
          },
          "maxItems": {
            "title": "Max Items",
            "type": "integer",
            "description": "Maximum number of Pins/source records to collect. Comment rows are additional and are capped per Pin by maxComments. Set to 0 for unlimited.",
            "default": 50,
            "minimum": 0,
            "maximum": 20000
          },
          "maxPages": {
            "title": "Max pages",
            "type": "integer",
            "description": "Maximum pagination pages per search, profile, or board. 0 means continue until Pinterest has no next page.",
            "default": 0,
            "prefill": 0,
            "minimum": 0,
            "maximum": 2000
          },
          "minSaves": {
            "title": "Minimum saves",
            "type": "integer",
            "description": "Keep Pins only when Pinterest supplies at least this many saves.",
            "minimum": 0,
            "maximum": 10000000
          },
          "minCreatorFollowers": {
            "title": "Minimum creator followers",
            "type": "integer",
            "description": "Keep Pins only when Pinterest supplies a creator follower count at or above this value.",
            "minimum": 0,
            "maximum": 1000000000
          },
          "verifiedOnly": {
            "title": "Verified accounts only",
            "type": "boolean",
            "description": "Keep only rows explicitly marked verified by Pinterest.",
            "default": false,
            "prefill": false
          },
          "requireOutboundLink": {
            "title": "Require destination link",
            "type": "boolean",
            "description": "Keep only Pins with a public destination link supplied by Pinterest.",
            "default": false,
            "prefill": false
          },
          "imageOnly": {
            "title": "Images only",
            "type": "boolean",
            "description": "Exclude Pins that Pinterest identifies as video.",
            "default": false,
            "prefill": false
          },
          "excludeAds": {
            "title": "Exclude promoted Pins",
            "type": "boolean",
            "description": "Exclude Pins Pinterest marks as promoted or sponsored.",
            "default": false,
            "prefill": false
          },
          "commerceOnly": {
            "title": "Shoppable Pins only",
            "type": "boolean",
            "description": "Keep only Pins with source-backed product or shopping metadata.",
            "default": false,
            "prefill": false
          },
          "includeComments": {
            "title": "Include Pin comments",
            "type": "boolean",
            "description": "When enabled, add one real comment/activity row for each collected Pin. Pinterest's public cookieless comment path is used automatically.",
            "default": false,
            "prefill": false
          },
          "maxComments": {
            "title": "Maximum comments per Pin",
            "type": "integer",
            "description": "Maximum public comment/activity rows to add per Pin when comments are enabled.",
            "minimum": 1,
            "maximum": 20000,
            "default": 10,
            "prefill": 10
          },
          "includeCommentReplies": {
            "title": "Include comment replies",
            "type": "boolean",
            "description": "When comments are collected, also fetch depth-one replies for comments that report replies. Adds one request per parent comment.",
            "default": false,
            "prefill": false
          },
          "maxCommentReplies": {
            "title": "Max replies per comment",
            "type": "integer",
            "description": "Upper bound on replies fetched for each top-level comment.",
            "default": 10,
            "prefill": 10,
            "minimum": 1,
            "maximum": 200,
            "editor": "number"
          },
          "enrichDetails": {
            "title": "Enrich Details",
            "type": "boolean",
            "description": "When enabled, each pin from search/profile/board results will be enriched with accurate stats (reaction count, follower count, etc.) by fetching its detail page. Slower but more complete data.",
            "default": false,
            "prefill": false
          },
          "resolveNumericIds": {
            "title": "Resolve numeric Pin IDs from creator RSS",
            "type": "boolean",
            "description": "Creator feeds sometimes return encrypted Pin IDs that Pinterest will not open. When enabled, the actor follows the creator's public RSS feed (or the numeric user-pins feed) to recover openable numeric Pin IDs. Disable it to keep only the IDs the feed itself returns.",
            "default": true,
            "prefill": true
          }
        },
        "required": []
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Pinterest Rich Pin, Board & Creator Field Scraper Output",
        "description": "One record per Pin, profile, board or comment with media variants, creator and board detail, and engagement counts.",
        "properties": {
          "results": {
            "type": "string",
            "description": "Dataset with scraped Pinterest data",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "views": {
            "overview": {
              "title": "Overview",
              "transformation": {
                "fields": [
                  "record_type",
                  "recordType",
                  "id",
                  "title",
                  "url",
                  "pinner_username",
                  "board_name",
                  "save_count",
                  "comment_count",
                  "like_count",
                  "reaction_count",
                  "pinId",
                  "pinUrl",
                  "idIsEncrypted",
                  "detailAvailable",
                  "commentsAvailable",
                  "imageUrl",
                  "creatorUsername",
                  "creatorFollowerCount",
                  "saves",
                  "commentCount",
                  "likeCount",
                  "reactionCount",
                  "mediaType",
                  "linkUrl",
                  "is_video",
                  "sourceType",
                  "sourceValue",
                  "position",
                  "query",
                  "seed",
                  "numericIdSource",
                  "productPrice",
                  "productCurrency",
                  "productMerchant",
                  "productAvailability",
                  "isShoppable",
                  "source_url",
                  "scraped_at"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "id": {
                    "label": "Pin ID",
                    "format": "text"
                  },
                  "title": {
                    "label": "Title",
                    "format": "text"
                  },
                  "url": {
                    "label": "URL",
                    "format": "link"
                  },
                  "pinner_username": {
                    "label": "Pinner",
                    "format": "text"
                  },
                  "board_name": {
                    "label": "Board",
                    "format": "text"
                  },
                  "save_count": {
                    "label": "Saves",
                    "format": "number"
                  },
                  "comment_count": {
                    "label": "Comments",
                    "format": "number"
                  },
                  "like_count": {
                    "label": "Likes",
                    "format": "number"
                  },
                  "reaction_count": {
                    "label": "Reactions",
                    "format": "number"
                  },
                  "is_video": {
                    "label": "Video",
                    "format": "boolean"
                  }
                }
              }
            },
            "detailed": {
              "title": "Detailed",
              "transformation": {
                "fields": [
                  "record_type",
                  "recordType",
                  "id",
                  "title",
                  "description",
                  "url",
                  "link",
                  "created_at",
                  "pinner_username",
                  "pinner_name",
                  "pinner_followers",
                  "board_name",
                  "board_url",
                  "save_count",
                  "comment_count",
                  "like_count",
                  "reaction_count",
                  "reaction_counts",
                  "pinId",
                  "pinUrl",
                  "idIsEncrypted",
                  "detailAvailable",
                  "commentsAvailable",
                  "repliesAvailable",
                  "imageVariants",
                  "videoVariants",
                  "creator",
                  "originalCreator",
                  "board",
                  "saves",
                  "commentCount",
                  "likeCount",
                  "reactionCount",
                  "linkUrl",
                  "richMetadata",
                  "productPrice",
                  "productCurrency",
                  "productMerchant",
                  "productAvailability",
                  "isShoppable",
                  "is_video",
                  "video_url",
                  "dominant_color",
                  "images",
                  "sourceType",
                  "sourceValue",
                  "position",
                  "query",
                  "seed",
                  "numericIdSource",
                  "source_url",
                  "scraped_at"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "id": {
                    "label": "Pin ID",
                    "format": "text"
                  },
                  "title": {
                    "label": "Title",
                    "format": "text"
                  },
                  "description": {
                    "label": "Description",
                    "format": "text"
                  },
                  "url": {
                    "label": "Pin URL",
                    "format": "link"
                  },
                  "link": {
                    "label": "Source Link",
                    "format": "link"
                  },
                  "created_at": {
                    "label": "Created",
                    "format": "text"
                  },
                  "pinner_username": {
                    "label": "Pinner",
                    "format": "text"
                  },
                  "pinner_name": {
                    "label": "Pinner Name",
                    "format": "text"
                  },
                  "pinner_followers": {
                    "label": "Pinner Followers",
                    "format": "number"
                  },
                  "board_name": {
                    "label": "Board",
                    "format": "text"
                  },
                  "board_url": {
                    "label": "Board URL",
                    "format": "link"
                  },
                  "save_count": {
                    "label": "Saves",
                    "format": "number"
                  },
                  "comment_count": {
                    "label": "Comments",
                    "format": "number"
                  },
                  "like_count": {
                    "label": "Likes",
                    "format": "number"
                  },
                  "reaction_count": {
                    "label": "Reactions",
                    "format": "number"
                  },
                  "reaction_counts": {
                    "label": "Reaction breakdown",
                    "format": "object"
                  },
                  "idIsEncrypted": {
                    "label": "Encrypted Pin ID",
                    "format": "boolean"
                  },
                  "detailAvailable": {
                    "label": "Detail available",
                    "format": "boolean"
                  },
                  "commentsAvailable": {
                    "label": "Comments available",
                    "format": "boolean"
                  },
                  "productPrice": {
                    "label": "Product price",
                    "format": "number"
                  },
                  "productCurrency": {
                    "label": "Currency",
                    "format": "text"
                  },
                  "productMerchant": {
                    "label": "Merchant",
                    "format": "text"
                  },
                  "productAvailability": {
                    "label": "Availability",
                    "format": "text"
                  },
                  "isShoppable": {
                    "label": "Shoppable",
                    "format": "boolean"
                  },
                  "is_video": {
                    "label": "Video",
                    "format": "boolean"
                  },
                  "video_url": {
                    "label": "Video URL",
                    "format": "link"
                  },
                  "dominant_color": {
                    "label": "Color",
                    "format": "text"
                  },
                  "images": {
                    "label": "Images",
                    "format": "text"
                  }
                }
              }
            }
          }
        }
      }
    },
    "buildNumber": "1.1.1",
    "imageDigest": "ce22bd8480904866bc742446baa005be9a83bd951a31a069056158d1a4940174",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.1"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.03993777777777778
    }
  }
}