{
  "openapi": "3.0.1",
  "info": {
    "title": "Restaurant DNA Agent",
    "description": "Point it at a city or a list of places and get Restaurant DNA: scored, explainable traits (family-friendly, romantic, quiet, value, hidden-gem…) with confidence and cited evidence. The agent finds factual gaps, browses each venue's site to fill them, and returns provenance-tagged POI intelligence.",
    "version": "0.2",
    "x-build-id": "z1B6Zj5kQxISQS8hU"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/jinq~restaurant-dna-agent/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-jinq-restaurant-dna-agent",
        "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/jinq~restaurant-dna-agent/runs": {
      "post": {
        "operationId": "runs-sync-jinq-restaurant-dna-agent",
        "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/jinq~restaurant-dna-agent/run-sync": {
      "post": {
        "operationId": "run-sync-jinq-restaurant-dna-agent",
        "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": {
          "searchQuery": {
            "title": "City / search query",
            "type": "string",
            "description": "What POIs to discover, e.g. \"restaurants in District 1, Ho Chi Minh City\" or \"vegetarian food Hanoi\". Leave blank if you provide an explicit list below, or leave everything blank to get a bundled demo."
          },
          "locationQuery": {
            "title": "Location (optional, recommended)",
            "type": "string",
            "description": "A clean \"City, Country\" location to anchor the search area, e.g. \"District 1, Ho Chi Minh City, Vietnam\". Makes discovery faster and more consistent. Must be a location only — not the keyword query. Leave blank to search by the query text alone."
          },
          "placeNames": {
            "title": "Explicit place list (optional)",
            "type": "array",
            "description": "Enrich these specific places instead of (or in addition to) a query. One per line.",
            "items": {
              "type": "string"
            }
          },
          "maxPlaces": {
            "title": "Max places",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "How many POIs to discover and enrich.",
            "default": 5
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Google Places + summary language (ISO code). 'vi' for Vietnamese.",
            "default": "vi"
          },
          "includeDna": {
            "title": "Infer Restaurant DNA",
            "type": "boolean",
            "description": "Produce scored, explainable traits per place (family-friendly, romantic, quiet, digital-nomad, value, veg-friendly, hidden-gem, accessibility, authenticity) with confidence + cited evidence. Pulls reviews as evidence. This is the headline output.",
            "default": true
          },
          "dnaUseLlm": {
            "title": "Use LLM to deepen DNA",
            "type": "boolean",
            "description": "Mine review text with your LLM to lift the review-driven traits (quiet, romantic, authenticity) on top of the structured-attribute traits. On by default; costs a little more per place. Turn off for attribute-only DNA at lower cost.",
            "default": true
          },
          "llmProvider": {
            "title": "LLM provider",
            "enum": [
              "openai",
              "bedrock-openai",
              "anthropic"
            ],
            "type": "string",
            "description": "Which LLM the agent reasons with. 'openai' = any OpenAI-compatible endpoint. 'bedrock-openai' = Amazon Bedrock's OpenAI-compatible gateway (open models). 'anthropic' = Claude.",
            "default": "openai"
          },
          "llmApiKey": {
            "title": "LLM API key",
            "type": "string",
            "description": "Your own key for the chosen provider (OpenAI key, Bedrock bearer token, or Anthropic key). Never stored; used only for this run."
          },
          "llmModel": {
            "title": "LLM model id (optional)",
            "type": "string",
            "description": "Override the default model. Blank = provider default (gpt-4o-mini / qwen3-235b / claude)."
          },
          "llmBaseUrl": {
            "title": "LLM base URL (optional)",
            "type": "string",
            "description": "Override the OpenAI-compatible base URL (e.g. OpenRouter, Together, a Bedrock region endpoint)."
          },
          "useTinyFish": {
            "title": "Use TinyFish web agent for gap-filling",
            "type": "boolean",
            "description": "Browse each restaurant's own website with TinyFish (handles JS menus / 'see full menu' flows a plain fetch can't). Falls back to plain HTTP if off or no key.",
            "default": false
          },
          "tinyFishApiKey": {
            "title": "TinyFish API key (optional)",
            "type": "string",
            "description": "Required only if 'Use TinyFish' is on. 500 free steps at tinyfish.ai — no card needed."
          },
          "demo": {
            "title": "Demo mode (no keys needed)",
            "type": "boolean",
            "description": "Return a bundled, pre-enriched Vietnamese example so you can see the output shape instantly without any API keys.",
            "default": 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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}