{
  "openapi": "3.0.1",
  "info": {
    "title": "ShopGoodwill Sold Prices & New Listing Alerts",
    "description": "ShopGoodwill sold prices: closed auctions with their final price, bids and end time for any search, plus an optional median / quartile comps summary and new-listing alerts to Discord, Slack or Telegram. No login. Searches that find nothing are free.",
    "version": "1.0",
    "x-build-id": "pOQRJYiVawIix30Af"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/accountable_eel~shopgoodwill-sold-lookup/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-accountable_eel-shopgoodwill-sold-lookup",
        "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/accountable_eel~shopgoodwill-sold-lookup/runs": {
      "post": {
        "operationId": "runs-sync-accountable_eel-shopgoodwill-sold-lookup",
        "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/accountable_eel~shopgoodwill-sold-lookup/run-sync": {
      "post": {
        "operationId": "run-sync-accountable_eel-shopgoodwill-sold-lookup",
        "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": [
          "searches"
        ],
        "properties": {
          "searches": {
            "title": "ShopGoodwill searches",
            "type": "array",
            "description": "One search per line, the words you would type into ShopGoodwill's search box, such as \"pyrex\" or \"vintage camera\". Each search reads up to the number of items set below, 40 per page. Accepted formats: pyrex, vintage camera, le creuset. You're only charged for the ones we actually find — a miss costs nothing.",
            "items": {
              "type": "string"
            }
          },
          "mode": {
            "title": "What do you need back?",
            "enum": [
              "sold",
              "live"
            ],
            "type": "string",
            "description": "Pick the option that matches what you need — you can leave this on the recommended setting.",
            "default": "sold"
          },
          "categoryId": {
            "title": "Category ID (optional)",
            "type": "integer",
            "description": "Only items in this ShopGoodwill category. Top-level IDs: 1 Antiques, 15 Art, 336 Bath & Body, 99 Books, 2208 Bulk, 170 Cameras & Camcorders, 10 Clothing, 4 Collectibles, 7 Computers & Electronics, 8 Crafts & Hobbies, 195 For The Home, 33 Gaming, 14 Glass, 6 Jewelry & Gemstones, 113 Miscellaneous, 2 Movies & Music, 13 Musical Instruments, 215 Office Supplies, 34 Pet Supplies, 115 Religious Items, 364 Science & Education, 18 Seasonal & Holiday, 12 Sports, 20 Tableware and Kitchenware, 114 Tools, 9 Toys/Dolls/Games, 23 Transportation, 427 Travel/Luggage, 468 Wedding. Sub-category IDs (the category_id column of a row you already have) work too."
          },
          "minPrice": {
            "title": "Lowest price (USD, optional)",
            "type": "integer",
            "description": "Skips items priced below this many dollars (the final price for sold items, the current bid for live ones)."
          },
          "maxPrice": {
            "title": "Highest price (USD, optional)",
            "type": "integer",
            "description": "Skips items priced above this many dollars. Use it with new-listing alerts to watch only the cheap ones."
          },
          "endedAfter": {
            "title": "Sold since (optional, YYYY-MM-DD)",
            "type": "string",
            "description": "Sold mode only. Keeps auctions that ended on or after this date (ShopGoodwill's own clock, no time zone), and searches back exactly that far. Empty searches the last 30 days; the furthest back is 365 days.",
            "default": ""
          },
          "maxItems": {
            "title": "Max items per search",
            "type": "integer",
            "description": "Up to 400 (ShopGoodwill returns 40 per page, so 10 pages). You are billed per item row returned.",
            "default": 40
          },
          "includeCompsSummary": {
            "title": "Add a comps summary row per search",
            "type": "boolean",
            "description": "One extra row per search with the item count, median, 25th / 75th percentile, low, high and median bids of the items read. In sold mode the prices use only auctions that had a bid. Billed as one summary event.",
            "default": false
          },
          "includeUnsold": {
            "title": "Include auctions that ended with no bids",
            "type": "boolean",
            "description": "Sold mode only. Auctions with no bids are not sales (their price is just the starting bid), so they are left out unless you tick this. They still count in the summary's item count.",
            "default": false
          },
          "deltaMode": {
            "title": "Monitor over time (remember what I have seen)",
            "type": "boolean",
            "description": "Each run compares every item with the items this search returned on earlier runs and fills in 'Since last run', the earlier price and the alert reason. Schedule it daily, then combine with 'Only return alerts' and 'Send alerts to'.",
            "default": false
          },
          "deltaName": {
            "title": "Watchlist name (optional)",
            "type": "string",
            "description": "Leave empty and one is derived from the mode, category and price limits. Type your own name to keep one memory across changes, or to run several independent watchlists.",
            "default": ""
          },
          "alertOn": {
            "title": "Alert on",
            "enum": [
              "new-listing",
              "price-below"
            ],
            "type": "string",
            "description": "New listing: every item this search has not returned before. Price at or below: an item whose price is at or below the line below, when it is new or was above the line last time.",
            "default": "new-listing"
          },
          "alertBelowUsd": {
            "title": "Alert price line (USD)",
            "type": "integer",
            "description": "Used when 'Alert on' is 'Price at or below my line'. Whole dollars."
          },
          "alertOnChangeOnly": {
            "title": "Only return alerts",
            "type": "boolean",
            "description": "With monitoring on, items that are not an alert are not returned and not billed, and a run with nothing to alert on bills nothing (the summary row is skipped too).",
            "default": false
          },
          "skipFirstRun": {
            "title": "Seed silently (no rows on the first run of a search)",
            "type": "boolean",
            "description": "The first run of a search has nothing to compare with, so every item would be new. Turn this on to remember them without returning or billing them, so alerts start from the second run.",
            "default": false
          },
          "notifyUrl": {
            "title": "Send alerts to (Discord or Slack webhook, Telegram bot link, or any URL)",
            "type": "string",
            "description": "Optional, needs monitoring on. After an alert row is billed it is posted here as one message with the title, price, bids, end time and item link. Discord or Slack: paste the channel's webhook URL. Telegram: https://api.telegram.org/bot<token>/sendMessage?chat_id=<chat id>. Any other URL receives JSON. Messages are free, and a failed message never fails the run (the row's notifyErrors says why). Stored encrypted, never logged or written to the results."
          },
          "notifyFormat": {
            "title": "Message format",
            "enum": [
              "auto",
              "discord",
              "slack",
              "telegram",
              "json"
            ],
            "type": "string",
            "description": "Leave on 'Detect from the link': discord.com links get Discord messages, hooks.slack.com Slack, api.telegram.org Telegram, anything else JSON. Pick one only to override that.",
            "default": "auto"
          },
          "maxNotificationsPerRun": {
            "title": "Most alert messages per run",
            "type": "integer",
            "description": "Up to 100. After this, one 'more alerts' message says the rest are in the run's dataset. 0 sends only that one message.",
            "default": 20
          },
          "testRun": {
            "title": "Try it first — only process the first 5",
            "type": "boolean",
            "description": "Turn this on to test your input on a small sample before running the full list. Turn it off to process everything.",
            "default": false
          },
          "onlyFound": {
            "title": "Hide rows with no result",
            "type": "boolean",
            "description": "Only keep rows where something was actually found. Misses are always free, whether or not you show them here.",
            "default": false
          },
          "includeKeywords": {
            "title": "Only keep items whose title contains",
            "type": "array",
            "description": "Optional. Keeps an item only if its title contains at least one of these words. Keep the 'Which of your title keywords matched' column selected when you use it.",
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Skip items whose title contains",
            "type": "array",
            "description": "Optional. Drops any item whose title contains one of these words, such as \"lot\" or \"parts\".",
            "items": {
              "type": "string"
            }
          },
          "maxResults": {
            "title": "Stop after this many results",
            "minimum": 1,
            "type": "integer",
            "description": "Optional. Stop the run once this many results have been found — useful for a quick, cheap sample. Leave blank for no limit."
          },
          "columns": {
            "title": "Which columns do you want?",
            "type": "array",
            "description": "Choose which pieces of information to include in each result row. All are included by default.",
            "items": {
              "type": "string",
              "enum": [
                "rowType",
                "searchMode",
                "itemId",
                "url",
                "title",
                "category",
                "categoryId",
                "priceUsd",
                "bids",
                "saleStatus",
                "endTime",
                "startTime",
                "sellerId",
                "shippingUsd",
                "totalMatching",
                "keywordMatch",
                "changeType",
                "alertReason",
                "previousPriceUsd",
                "priceChangePct",
                "checkedAt",
                "count",
                "soldWithBidsCount",
                "medianUsd",
                "p25Usd",
                "p75Usd",
                "lowUsd",
                "highUsd",
                "medianBids",
                "newestEndTime",
                "windowDays"
              ],
              "enumTitles": [
                "Row type: item or comps-summary",
                "Searched: sold (closed auctions) or live",
                "ShopGoodwill item ID",
                "Item link",
                "Title",
                "Category path",
                "Category ID",
                "Final price (sold) or current bid (live), USD",
                "Number of bids",
                "sold, no-bids or live",
                "Auction end time (ShopGoodwill site time)",
                "Auction start time (ShopGoodwill site time)",
                "Seller (Goodwill store) ID",
                "Shipping price shown in the listing, USD",
                "Total items ShopGoodwill matched for this search",
                "Which of your title keywords matched",
                "Since last run: new or seen (monitoring only)",
                "Alert reason: new-listing or price-below (monitoring only)",
                "Price the last run saw, USD (monitoring only)",
                "Price change since the last run, % (monitoring only)",
                "Checked at (ISO time)",
                "Summary: items read",
                "Summary: items with at least one bid",
                "Summary: median price, USD",
                "Summary: 25th percentile price, USD",
                "Summary: 75th percentile price, USD",
                "Summary: lowest price, USD",
                "Summary: highest price, USD",
                "Summary: median number of bids",
                "Summary: newest end time read",
                "Summary: days of closed auctions searched"
              ]
            },
            "default": [
              "rowType",
              "searchMode",
              "itemId",
              "url",
              "title",
              "category",
              "categoryId",
              "priceUsd",
              "bids",
              "saleStatus",
              "endTime",
              "startTime",
              "sellerId",
              "shippingUsd",
              "totalMatching",
              "keywordMatch",
              "changeType",
              "alertReason",
              "previousPriceUsd",
              "priceChangePct",
              "checkedAt",
              "count",
              "soldWithBidsCount",
              "medianUsd",
              "p25Usd",
              "p75Usd",
              "lowUsd",
              "highUsd",
              "medianBids",
              "newestEndTime",
              "windowDays"
            ]
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 1,
            "type": "integer",
            "description": "Parallel requests. Keep conservative — this target has no browser fallback, so getting blocked costs more than slow-and-steady.",
            "default": 1
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify Proxy config. Residential recommended for anti-bot-sensitive targets.",
            "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}