{
  "openapi": "3.0.1",
  "info": {
    "title": "AI Holiday Planner: Every Stay Compared, Your Days Planned",
    "description": "Enter where, when, who is going, your budget and your kind of trip (family, relaxing, adrenaline, nightlife...). It compares every stay on Google Hotels and Airbnb, reads their reviews, checks opening hours and drive times, and returns a trip page, PDF and calendar. Pay only for a plan that passes.",
    "version": "0.1",
    "x-build-id": "argbeHIV2SWOnvdbH"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/zaiq~holiday-planner/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-zaiq-holiday-planner",
        "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/zaiq~holiday-planner/runs": {
      "post": {
        "operationId": "runs-sync-zaiq-holiday-planner",
        "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/zaiq~holiday-planner/run-sync": {
      "post": {
        "operationId": "run-sync-zaiq-holiday-planner",
        "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": [
          "destination"
        ],
        "properties": {
          "destination": {
            "title": "Where are you going?",
            "type": "string",
            "description": "City or region with its country, for example Cape Town, South Africa."
          },
          "checkIn": {
            "title": "Arrive",
            "type": "string",
            "description": "First night of the stay. Leave empty for 30 days from today."
          },
          "checkOut": {
            "title": "Leave",
            "type": "string",
            "description": "Day you check out (1 to 14 nights). Leave empty for five nights."
          },
          "planLevel": {
            "title": "Plan",
            "enum": [
              "full",
              "express"
            ],
            "type": "string",
            "description": "Full: every source, the deepest review reading, an editor's check. Express: a faster plan from fewer stays.",
            "default": "full"
          },
          "adults": {
            "title": "Adults",
            "minimum": 1,
            "maximum": 12,
            "type": "integer",
            "description": "Everyone 18 or older.",
            "default": 2
          },
          "childrenAges": {
            "title": "Children's ages",
            "type": "array",
            "description": "One age per child, for example [7, 10]. Prices and stays are checked for the whole party.",
            "items": {
              "type": "integer"
            },
            "default": []
          },
          "budget": {
            "title": "Total budget",
            "minimum": 1,
            "type": "number",
            "description": "For the whole party: stay, food, activities and local transport (flights are shown separately).",
            "default": 40000
          },
          "currency": {
            "title": "Currency",
            "type": "string",
            "description": "Three-letter code, for example ZAR, EUR, USD or GBP.",
            "default": "ZAR"
          },
          "stayBudget": {
            "title": "Most to spend on the stay",
            "minimum": 1,
            "type": "number",
            "description": "Optional. Otherwise 55% of the total budget is set aside for the stay."
          },
          "tripStyles": {
            "title": "Trip style",
            "type": "array",
            "description": "The kind of holiday: it changes what is searched, how each day runs and which stays are favoured. Nightlife (a jol) adds bars and clubs after dinner; adrenaline adds an adventure activity on calm days.",
            "items": {
              "type": "string",
              "enum": [
                "family",
                "relaxing",
                "adrenaline",
                "nightlife",
                "romantic",
                "culture",
                "food-and-wine",
                "nature",
                "beach",
                "luxury",
                "budget"
              ],
              "enumTitles": [
                "Family",
                "Relaxing",
                "Adrenaline",
                "Nightlife (a jol)",
                "Romantic",
                "Culture",
                "Food and wine",
                "Nature",
                "Beach",
                "Luxury",
                "Budget"
              ]
            }
          },
          "interests": {
            "title": "What you enjoy",
            "type": "array",
            "description": "For example beaches, food, nature, family fun, culture, nightlife.",
            "items": {
              "type": "string"
            },
            "default": [
              "food",
              "nature"
            ]
          },
          "pace": {
            "title": "Pace",
            "enum": [
              "relaxed",
              "balanced",
              "busy"
            ],
            "type": "string",
            "description": "Relaxed leaves time to rest; busy fits more in.",
            "default": "relaxed"
          },
          "mustSees": {
            "title": "Must-sees",
            "type": "array",
            "description": "Places that must be in the plan, for example Table Mountain.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "avoid": {
            "title": "Avoid",
            "type": "array",
            "description": "Anything to keep out, for example long hikes or nightclubs.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "brief": {
            "title": "Anything else",
            "type": "string",
            "description": "Optional, in your own words: 'we love seafood, the kids get car sick, no early starts'. The fields above win if they disagree."
          },
          "mustHaves": {
            "title": "The stay must have",
            "type": "array",
            "description": "For example pool, parking, kitchen, backup power. Only stays that list it qualify.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "dietary": {
            "title": "Food needs",
            "type": "array",
            "description": "Every meal stop must suit these.",
            "items": {
              "type": "string",
              "enum": [
                "vegetarian",
                "vegan",
                "halal",
                "kosher",
                "gluten-free"
              ],
              "enumTitles": [
                "Vegetarian",
                "Vegan",
                "Halal",
                "Kosher",
                "Gluten-free"
              ]
            }
          },
          "wheelchair": {
            "title": "Wheelchair friendly",
            "type": "boolean",
            "description": "Step-free stays and stops only, no hikes.",
            "default": false
          },
          "pets": {
            "title": "Bringing a pet",
            "type": "boolean",
            "description": "Only stays that allow pets.",
            "default": false
          },
          "minBedrooms": {
            "title": "Bedrooms at least",
            "minimum": 0,
            "maximum": 12,
            "type": "integer",
            "description": "Leave 0 for no minimum.",
            "default": 0
          },
          "minBeds": {
            "title": "Beds at least",
            "minimum": 0,
            "maximum": 12,
            "type": "integer",
            "description": "Leave 0 for no minimum.",
            "default": 0
          },
          "rooms": {
            "title": "Hotel rooms",
            "minimum": 0,
            "maximum": 12,
            "type": "integer",
            "description": "Rooms to price at hotels.",
            "default": 1
          },
          "origin": {
            "title": "Flying from",
            "type": "string",
            "description": "City or airport, for flight prices."
          },
          "includeFlights": {
            "title": "Add flights",
            "type": "boolean",
            "description": "Compare flight prices from your city for these dates and nearby dates.",
            "default": false
          },
          "transport": {
            "title": "Getting around",
            "enum": [
              "car",
              "taxi",
              "walk"
            ],
            "type": "string",
            "description": "Car or taxi use driving times; walking uses walking estimates.",
            "default": "car"
          },
          "pickUpPlace": {
            "title": "Car pick-up",
            "type": "string",
            "description": "airport (the main airport), city, or an airport code such as CPT.",
            "default": "airport"
          },
          "driverAge": {
            "title": "Driver's age",
            "minimum": 18,
            "maximum": 99,
            "type": "integer",
            "description": "Car hire prices and rules depend on it.",
            "default": 30
          },
          "luggage": {
            "title": "Bags",
            "minimum": 0,
            "maximum": 30,
            "type": "integer",
            "description": "Suitcases to fit in the hire car; leave empty if unsure."
          },
          "arrivalTime": {
            "title": "Free from (arrival day)",
            "type": "string",
            "description": "Local time you can start on the first day, HH:MM.",
            "default": "14:00"
          },
          "departureTime": {
            "title": "Done by (last day)",
            "type": "string",
            "description": "Local time the last day must end, HH:MM.",
            "default": "12:00"
          },
          "maxDriveMinutes": {
            "title": "Longest drive between stops (minutes)",
            "minimum": 5,
            "maximum": 240,
            "type": "integer",
            "description": "Optional. Default 60 relaxed, 100 otherwise."
          },
          "brandName": {
            "title": "Your agency name",
            "type": "string",
            "description": "Optional: shown at the top of the trip page and PDF."
          },
          "brandLogoUrl": {
            "title": "Logo URL",
            "type": "string",
            "description": "Optional public https link to your logo."
          },
          "brandContact": {
            "title": "Contact line",
            "type": "string",
            "description": "Optional: shown on the trip page."
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Language of the written reasons and notes.",
            "default": "English"
          },
          "carPerDay": {
            "title": "Car hire per day (your estimate)",
            "minimum": 0,
            "type": "number",
            "description": "Optional, added to the budget as an estimate."
          },
          "foodPerPersonPerMeal": {
            "title": "Food per person per meal (your estimate)",
            "minimum": 0,
            "type": "number",
            "description": "Optional fallback where a restaurant shows no price."
          },
          "interestWeights": {
            "title": "Interest weights",
            "type": "object",
            "description": "Optional, for example {\"beaches\": 2, \"food\": 1}."
          },
          "aiModel": {
            "title": "AI model",
            "type": "string",
            "description": "Optional OpenRouter model ID to use for every AI step instead of the defaults."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}