{
  "openapi": "3.0.1",
  "info": {
    "title": "Bokadirekt Scraper",
    "description": "Scrape 17,000+ beauty and wellness businesses from Bokadirekt, Sweden's biggest booking marketplace: phone, email, website, Instagram, org numbers, opening hours, full price list, and ratings. Filter by service, city, free slots, payment options, rating, and missing website.",
    "version": "1.0",
    "x-build-id": "UcyIx9XxlQAVLIm03"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/normdata~bokadirekt-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-normdata-bokadirekt-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/normdata~bokadirekt-scraper/runs": {
      "post": {
        "operationId": "runs-sync-normdata-bokadirekt-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/normdata~bokadirekt-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-normdata-bokadirekt-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "maxItems": {
            "title": "Maximum results",
            "minimum": 1,
            "type": "integer",
            "description": "Caps how many businesses this run writes. Leave empty to collect every match."
          },
          "mode": {
            "title": "What to do",
            "enum": [
              "search",
              "lookup"
            ],
            "type": "string",
            "description": "Search builds a list of businesses. Look up resolves specific known profiles directly.",
            "default": "search"
          },
          "categories": {
            "title": "Services",
            "type": "array",
            "description": "One or more service categories. Leave empty, with no keywords, to search every business.",
            "items": {
              "type": "string",
              "enum": [
                "Frisör",
                "Barberare",
                "Massage",
                "Naglar",
                "Fransar",
                "Bryn",
                "Hudvård",
                "Skönhet",
                "Spa",
                "Vaxning",
                "Makeup",
                "Laser",
                "Injektionsbehandlingar",
                "Tatuering",
                "Piercing",
                "Fotvård",
                "Tandvård",
                "Tandblekning",
                "Träning",
                "Yoga",
                "Naprapat",
                "Kiropraktor",
                "Fysioterapi",
                "Akupunktur",
                "Psykolog",
                "Hälsa",
                "Hundtrim"
              ],
              "enumTitles": [
                "Hairdresser (Frisör)",
                "Barber (Barberare)",
                "Massage (Massage)",
                "Nails (Naglar)",
                "Lashes (Fransar)",
                "Brows (Bryn)",
                "Skin care (Hudvård)",
                "Beauty (all) (Skönhet)",
                "Spa (Spa)",
                "Waxing (Vaxning)",
                "Makeup (Makeup)",
                "Laser treatments (Laser)",
                "Injectables and fillers (Injektionsbehandlingar)",
                "Tattoo (Tatuering)",
                "Piercing (Piercing)",
                "Foot care (Fotvård)",
                "Dental care (Tandvård)",
                "Teeth whitening (Tandblekning)",
                "Training (Träning)",
                "Yoga (Yoga)",
                "Naprapathy (Naprapat)",
                "Chiropractor (Kiropraktor)",
                "Physiotherapy (Fysioterapi)",
                "Acupuncture (Akupunktur)",
                "Psychologist (Psykolog)",
                "Health (general) (Hälsa)",
                "Dog grooming (Hundtrim)"
              ]
            }
          },
          "keywords": {
            "title": "Other services or keywords",
            "type": "array",
            "description": "Any other service in Swedish, e.g. \"Balayage\", \"Lash lift\", \"Microneedling\". Each keyword is searched on its own and the results are merged.",
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "Swedish cities, municipalities, or districts, e.g. \"Göteborg\", \"Södermalm\", \"Uppsala\". Leave empty for all of Sweden. An unknown name stops the run with suggestions instead of silently searching the whole country.",
            "items": {
              "type": "string"
            }
          },
          "nearPoint": {
            "title": "Near a point",
            "type": "string",
            "description": "Search around a map point instead of a named location. Paste the coordinates exactly as Google Maps copies them, e.g. 59.3293, 18.0686 (right-click a spot in Google Maps and click the numbers)."
          },
          "availableFrom": {
            "title": "Available from",
            "type": "string",
            "description": "Only businesses with a free booking slot from this date."
          },
          "availableTo": {
            "title": "Available to",
            "type": "string",
            "description": "Only businesses with a free booking slot up to this date. Defaults to the same day as Available from."
          },
          "timeOfDay": {
            "title": "Time of day",
            "enum": [
              "any",
              "morning",
              "afternoon",
              "evening"
            ],
            "type": "string",
            "description": "Only businesses with a free slot at this time of day.",
            "default": "any"
          },
          "lastMinuteOnly": {
            "title": "Last-minute deals only",
            "type": "boolean",
            "description": "Only businesses currently offering discounted last-minute slots.",
            "default": false
          },
          "hasCampaigns": {
            "title": "Running a campaign",
            "type": "boolean",
            "description": "Only businesses with an active discount campaign.",
            "default": false
          },
          "hasBundles": {
            "title": "Sells multi-visit bundles",
            "type": "boolean",
            "description": "Only businesses selling punch cards or multi-visit bundles.",
            "default": false
          },
          "payLater": {
            "title": "Pay later (Klarna or Qliro)",
            "type": "boolean",
            "description": "Only businesses that accept pay later.",
            "default": false
          },
          "acceptsGiftCard": {
            "title": "Accepts gift cards",
            "type": "boolean",
            "description": "Only businesses that accept gift cards.",
            "default": false
          },
          "acceptsWellnessCard": {
            "title": "Accepts wellness allowance",
            "type": "boolean",
            "description": "Only businesses that accept payment with the Swedish employer wellness allowance (friskvårdsbidrag).",
            "default": false
          },
          "tradeAssociationOnly": {
            "title": "Trade association member",
            "type": "boolean",
            "description": "Only businesses that belong to a professional trade association, such as Frisörföretagarna or the Swedish skin therapists' association.",
            "default": false
          },
          "minRating": {
            "title": "Minimum rating",
            "enum": [
              "any",
              "4.0",
              "4.5",
              "4.7",
              "4.8",
              "4.9"
            ],
            "type": "string",
            "description": "Only businesses rated at least this. Most businesses on Bokadirekt score above 4.5, so the useful cut-offs are high.",
            "default": "any"
          },
          "minReviews": {
            "title": "Minimum number of reviews",
            "enum": [
              "any",
              "10",
              "25",
              "50",
              "100",
              "250",
              "500"
            ],
            "type": "string",
            "description": "Only businesses with at least this many reviews, a good sign of an established business.",
            "default": "any"
          },
          "requireEmail": {
            "title": "Has an email address",
            "type": "boolean",
            "description": "Only businesses that publish an email address.",
            "default": false
          },
          "website": {
            "title": "Website",
            "enum": [
              "any",
              "has",
              "none"
            ],
            "type": "string",
            "description": "Filter on whether the business has its own website. Businesses without one are often the best leads for web and marketing agencies.",
            "default": "any"
          },
          "requireInstagram": {
            "title": "Has Instagram",
            "type": "boolean",
            "description": "Only businesses that publish an Instagram account.",
            "default": false
          },
          "sort": {
            "title": "Sort by",
            "enum": [
              "popular",
              "reviews_score",
              "closest",
              "availability",
              "highest_discount",
              "smt_discount"
            ],
            "type": "string",
            "description": "Order of results. \"Closest\" needs a point in Near a point."
          },
          "placeUrls": {
            "title": "Business profiles (for Look up)",
            "type": "array",
            "description": "Profile URLs like https://www.bokadirekt.se/places/some-salon-136216, or just the number at the end.",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}