{
  "openapi": "3.0.1",
  "info": {
    "title": "Indotrading.com B2B Supplier & Product Scraper",
    "description": "Scrape products, suppliers and contacts from Indotrading.com, Indonesia's largest B2B marketplace. Seven modes: category listings, product search, product detail, supplier profiles, supplier directories, company search and the full category tree. Optional supplier WhatsApp number. No login needed.",
    "version": "0.0",
    "x-build-id": "cOzxKCtneivBwBSZT"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/fanndev~indotrading-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-fanndev-indotrading-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/fanndev~indotrading-scraper/runs": {
      "post": {
        "operationId": "runs-sync-fanndev-indotrading-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/fanndev~indotrading-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-fanndev-indotrading-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "categoryProducts",
              "searchProducts",
              "productDetail",
              "supplierProfile",
              "supplierDirectory",
              "searchSuppliers",
              "categoryTree"
            ],
            "type": "string",
            "description": "Which surface to scrape. Each mode reads one input list: categoryProducts and supplierDirectory read 'categories', searchProducts and searchSuppliers read 'searchTerms', productDetail reads 'productUrls', supplierProfile reads 'suppliers', and categoryTree needs no input at all.",
            "default": "categoryProducts"
          },
          "categories": {
            "title": "Categories",
            "type": "array",
            "description": "Category slugs or URLs, used by categoryProducts and supplierDirectory. All four shapes work: 'jual-pressure-washer', '/jual-pressure-washer', 'pressure-washer', or the full https://www.indotrading.com/jual-pressure-washer URL. Run the categoryTree mode first to get the full list of valid slugs.",
            "items": {
              "type": "string"
            }
          },
          "searchTerms": {
            "title": "Search terms",
            "type": "array",
            "description": "Keywords, used by searchProducts and searchSuppliers. A term that matches a category name is redirected to that whole category; a term that does not stays on the search results page with a narrower set.",
            "items": {
              "type": "string"
            }
          },
          "productUrls": {
            "title": "Product URLs",
            "type": "array",
            "description": "Full product page URLs for productDetail mode, e.g. https://www.indotrading.com/solusijaya10/high-pressure-cleaner-w250-18dpt-with-engine-yanmar-p1146289.aspx. The productUrl field of any listing record can be fed straight back in here.",
            "items": {
              "type": "string"
            }
          },
          "suppliers": {
            "title": "Supplier slugs or URLs",
            "type": "array",
            "description": "Supplier profile slugs or URLs for supplierProfile mode, e.g. 'lavorpro' or https://www.indotrading.com/lavorpro. The companyUrl field of any listing record works here.",
            "items": {
              "type": "string"
            }
          },
          "maxPages": {
            "title": "Max pages per target",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "How many listing pages to walk per category, search term or supplier. Product listings return 40 items per page, supplier directories about 5. Paging always stops early on the first empty page - indotrading's own 'Halaman 1 dari N' counter overstates how far a category can actually be paged, so it is recorded as metadata but never trusted as a stop condition.",
            "default": 5
          },
          "maxItemsPerTarget": {
            "title": "Max items per target",
            "minimum": 0,
            "type": "integer",
            "description": "Hard cap on records emitted per category or search term. Leave at 0 for no cap beyond maxPages.",
            "default": 0
          },
          "includeContact": {
            "title": "Include supplier WhatsApp number",
            "type": "boolean",
            "description": "Look up each product's supplier WhatsApp number. This costs one extra request per product, roughly doubling the run, so it is off by default. About two thirds of sellers have a number on file; the rest come back with whatsappNumber null and _warning 'no_whatsapp_number_on_file', which is a real absence rather than a failed lookup.",
            "default": false
          },
          "includeLastLogin": {
            "title": "Include supplier last-login activity",
            "type": "boolean",
            "description": "Add lastLoginMinutesAgo, how many minutes ago the supplier last signed in - the freshness signal indotrading renders as 'Online 2 Hari Lalu'. Batched into one request per page, so it is close to free.",
            "default": false
          },
          "includeSupplierProducts": {
            "title": "Include supplier catalogue",
            "type": "boolean",
            "description": "In supplierProfile mode, also emit every product on the supplier's own pages (20 per page, up to maxPages). Off by default so a profile run stays one record per supplier.",
            "default": false
          },
          "concurrency": {
            "title": "Concurrency",
            "minimum": 1,
            "maximum": 16,
            "type": "integer",
            "description": "Parallel requests for per-item fetches (product details and contact lookups). Listing pages are always walked in order because each page's referer is the previous page.",
            "default": 4
          },
          "maxRetries": {
            "title": "Max retries",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Attempts per request before giving up. Each retry backs off exponentially with jitter and rotates to the next TLS impersonation profile.",
            "default": 4
          },
          "requestTimeoutSecs": {
            "title": "Request timeout",
            "minimum": 10,
            "maximum": 300,
            "type": "integer",
            "description": "Per-request timeout in seconds. Category pages are large (500 KB and up), so do not set this too low.",
            "default": 45
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Optional. Indotrading has no IP-based gate - 25 sequential requests from a single datacenter address all returned full payloads during recon, and the only Cloudflare rule in play keys on the TLS fingerprint, which this actor already handles. So proxying is off by default; turn on residential if you want an Indonesian exit address or are running at high volume.",
            "default": {
              "useApifyProxy": false
            }
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}