{
  "openapi": "3.0.1",
  "info": {
    "title": "Customer Review Analyzer — Podium Alternative",
    "description": "Analyze Google Maps reviews or review records you supply. Return one action plan per review with priority, issue themes, response status, source details, and an editable reply draft for human approval.",
    "version": "0.1",
    "x-build-id": "bThfhA05gmQMstIUI"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/khadinakbar~podium-alternative/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-khadinakbar-podium-alternative",
        "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/khadinakbar~podium-alternative/runs": {
      "post": {
        "operationId": "runs-sync-khadinakbar-podium-alternative",
        "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/khadinakbar~podium-alternative/run-sync": {
      "post": {
        "operationId": "run-sync-khadinakbar-podium-alternative",
        "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": [
          "businessName"
        ],
        "properties": {
          "sourceMode": {
            "title": "Review source",
            "enum": [
              "googleMaps",
              "providedReviews"
            ],
            "type": "string",
            "description": "Choose where the review records come from. Use googleMaps to collect current public Google Maps reviews for one named place, or providedReviews to analyze your own review objects without an external fetch. Defaults to googleMaps. This is not a connector to a Podium, CRM, payment, or messaging account.",
            "default": "googleMaps"
          },
          "businessName": {
            "title": "Business name",
            "type": "string",
            "description": "Name of the business whose public feedback should be reviewed, for example Eiffel Tower. It is used with location to resolve one Google Maps place and is carried into every action-plan record. Defaults to Eiffel Tower for the quality-test path. This is not a broad category search or a customer-contact list.",
            "default": "Eiffel Tower"
          },
          "location": {
            "title": "Business location",
            "type": "string",
            "description": "City, region, or country used to disambiguate businessName, for example Paris, France. It is sent only to the public-review source when sourceMode is googleMaps. Defaults to Paris, France. This is not a customer address or a proxy configuration.",
            "default": "Paris, France"
          },
          "maxReviews": {
            "title": "Maximum reviews to analyze",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Hard cap on review records requested or processed in this run. Accepts 1 to 50 and defaults to 10, so the event-charge ceiling is $0.02 per persisted action-plan row plus platform usage. Use a small number for a first run. This is not a count of messages to send because the Actor has no sending capability.",
            "default": 10
          },
          "analysisScope": {
            "title": "Reviews to keep in the queue",
            "enum": [
              "all",
              "needsReply",
              "negativeOnly"
            ],
            "type": "string",
            "description": "Controls which valid review records become action-plan rows. Use all for every review, needsReply for reviews without an owner response, or negativeOnly for ratings of one or two. Defaults to all. This filter does not alter a source review or publish a response.",
            "default": "all"
          },
          "responseTone": {
            "title": "Draft response tone",
            "enum": [
              "warmProfessional",
              "concise",
              "apologetic"
            ],
            "type": "string",
            "description": "Sets the voice of the deterministic, editable response draft. Choose warmProfessional, concise, or apologetic; every draft still requires a human review before any use. Defaults to warmProfessional. This setting does not activate generative AI or send a message.",
            "default": "warmProfessional"
          },
          "countryCode": {
            "title": "Google Maps country hint",
            "pattern": "^[A-Z]{2}$",
            "type": "string",
            "description": "Two-letter market hint used when resolving a public Google Maps place, for example FR, US, or GB. Defaults to FR for the Eiffel Tower prefill and accepts two uppercase letters. It affects public-place resolution only. This is not an address, customer country field, or guaranteed proxy location.",
            "default": "FR"
          },
          "providedReviews": {
            "title": "Caller-provided review records",
            "maxItems": 50,
            "type": "array",
            "description": "Review records to analyze when sourceMode is providedReviews. Each object needs a stable reviewId, rating, sourceUrl, and optional text, ownerResponse, and publishedAt; no reviewer profile fields are accepted. Defaults to an empty list. This is not a way to supply credentials, cookies, or private CRM exports without your own authority.",
            "items": {
              "type": "object",
              "properties": {
                "reviewId": {
                  "title": "Review ID",
                  "type": "string",
                  "description": "Stable caller-defined review identifier, for example review-001."
                },
                "rating": {
                  "title": "Rating",
                  "type": "integer",
                  "description": "Integer rating from 1 through 5, for example 2."
                },
                "text": {
                  "title": "Review text",
                  "type": "string",
                  "description": "Optional public or caller-authorized review text used only for a simple issue-theme hint."
                },
                "ownerResponse": {
                  "title": "Existing owner response",
                  "type": "string",
                  "description": "Optional existing response; when supplied the actor marks the item already responded."
                },
                "publishedAt": {
                  "title": "Published at",
                  "type": "string",
                  "description": "Optional ISO-8601 review timestamp, for example 2026-09-07T00:00:00.000Z."
                },
                "sourceUrl": {
                  "title": "Source URL",
                  "type": "string",
                  "description": "Canonical URL where the caller is authorized to view the review, for example https://example.com/reviews/001."
                }
              },
              "required": [
                "reviewId",
                "rating",
                "sourceUrl"
              ]
            },
            "default": []
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}