{
  "openapi": "3.0.1",
  "info": {
    "title": "Review to Image Generator",
    "description": "Instantly transform customer reviews from Google, Facebook, Trustpilot, etc..  into stunning social media images. Boost social proof with this fully customizable Review to Image Generator featuring auto-fetch capabilities, custom branding, and multi-platform support",
    "version": "0.0",
    "x-build-id": "hfBRduxrumResvEhs"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/happitap~review-to-image-generator/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-happitap-review-to-image-generator",
        "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/happitap~review-to-image-generator/runs": {
      "post": {
        "operationId": "runs-sync-happitap-review-to-image-generator",
        "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/happitap~review-to-image-generator/run-sync": {
      "post": {
        "operationId": "run-sync-happitap-review-to-image-generator",
        "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": {
          "inputMode": {
            "title": "How do you want to provide reviews?",
            "enum": [
              "manual",
              "apify_scraper"
            ],
            "type": "string",
            "description": "<strong>Choose your input method:</strong><br/><br/>📝 <strong>Manual Input:</strong> Type or paste your reviews directly<br/>🤖 <strong>Auto-fetch:</strong> Connect to Apify review scrapers to automatically import reviews<br/><br/>💡 New users should start with Manual Input to see how it works",
            "default": "manual"
          },
          "reviews": {
            "title": "📝 Your Reviews",
            "type": "array",
            "description": "<strong>Add reviews to convert into images.</strong><br/><br/>Each review needs:<br/>• Author name<br/>• Review text<br/>• Rating (1-5 stars)<br/><br/>💡 <strong>Tip:</strong> Start with 1 review to test your design, then add more",
            "items": {
              "type": "object",
              "properties": {
                "authorName": {
                  "title": "Author Name",
                  "type": "string",
                  "description": "Name of the review author"
                },
                "authorTitle": {
                  "title": "Author Title",
                  "type": "string",
                  "description": "Title or role of the author (e.g., 'CEO at Company', 'Verified Buyer')"
                },
                "authorPhotoUrl": {
                  "title": "Author Photo URL",
                  "type": "string",
                  "description": "URL to author's profile photo"
                },
                "reviewText": {
                  "title": "Review Text",
                  "type": "string",
                  "description": "The review content/testimonial text"
                },
                "rating": {
                  "title": "Rating",
                  "type": "integer",
                  "description": "Star rating (1-5)"
                }
              }
            },
            "default": [
              {
                "authorName": "John Smith",
                "authorTitle": "Marketing Director",
                "authorPhotoUrl": "",
                "reviewText": "I couldn’t be happier with the service I received! From start to finish, everything was handled with care and professionalism. The team was always there to answer my questions and made sure I was completely satisfied. It’s rare to find such great customer service these days—highly recommend!",
                "rating": 5
              }
            ]
          },
          "scraperActorId": {
            "title": "🤖 Which scraper do you want to use?",
            "enum": [
              "compass/google-maps-reviews-scraper",
              "apify/facebook-reviews-scraper",
              "apify/trustpilot-scraper",
              "apify/yelp-scraper",
              "apify/tripadvisor-scraper",
              "custom"
            ],
            "type": "string",
            "description": "<strong>Select a review scraper:</strong><br/><br/>Choose from popular scrapers or enter your own custom actor ID. Each scraper fetches reviews from different platforms.<br/><br/>💡 <strong>Popular choices:</strong><br/>• Google Maps - for local business reviews<br/>• Trustpilot - for product/service reviews<br/>• Yelp - for restaurant/business reviews<br/><br/>💰 <strong>Note:</strong> Running the scraper will use credits from your Apify account.",
            "default": "compass/google-maps-reviews-scraper"
          },
          "customScraperActorId": {
            "title": "Custom Actor ID",
            "type": "string",
            "description": "Enter your Apify actor ID (e.g., <code>username/actor-name</code>)"
          },
          "scraperInput": {
            "title": "Scraper Configuration",
            "type": "object",
            "description": "<strong>Configure the scraper settings.</strong><br/><br/>This varies by scraper. Check the scraper's documentation for required fields.<br/><br/>Example for Google Maps:<br/><code>{\"startUrls\": [{\"url\": \"https://maps.google.com/...\"}]}</code>",
            "default": {}
          },
          "maxReviewsFromScraper": {
            "title": "How many reviews to fetch",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "<strong>Number of reviews to import from the scraper.</strong><br/><br/>💡 Start with 3-5 reviews for testing, then increase.<br/>💰 Remember: You'll be charged per image generated ($0.005 each)",
            "default": 5
          },
          "minRatingFilter": {
            "title": "Minimum star rating",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "<strong>Only fetch reviews with this rating or higher.</strong><br/><br/>Set to 4 or 5 to get only positive reviews for marketing.<br/>Set to 1 to include all reviews.",
            "default": 4
          },
          "source": {
            "title": "Platform Icon",
            "enum": [
              "shapo",
              "google",
              "facebook",
              "twitter",
              "etsy",
              "shopify",
              "linkedin",
              "apple_podcasts",
              "capterra",
              "trustpilot",
              "realtor",
              "zillow",
              "product_hunt",
              "reddit",
              "appstore",
              "playstore",
              "appsumo",
              "judge_me",
              "reviews_io",
              "stamped",
              "udemy",
              "feefo",
              "instagram",
              "yelp",
              "g2",
              "whatsapp",
              "tiktok",
              "youtube",
              "amazon",
              "fiverr",
              "airbnb",
              "tripadvisor"
            ],
            "type": "string",
            "description": "<strong>Which platform icon should appear on the image?</strong><br/><br/>This adds a small badge showing where the review came from (Google, Facebook, etc.)",
            "default": "google"
          },
          "showSourceIcon": {
            "title": "Show platform badge",
            "type": "boolean",
            "description": "Display the platform icon on the image",
            "default": true
          },
          "theme": {
            "title": "Light or Dark mode",
            "enum": [
              "light",
              "dark"
            ],
            "type": "string",
            "description": "<strong>Choose the overall color scheme.</strong><br/><br/>Light = dark text on light backgrounds<br/>Dark = light text on dark backgrounds",
            "default": "light"
          },
          "aspectRatio": {
            "title": "Image size & format",
            "enum": [
              "square",
              "stories",
              "landscape"
            ],
            "type": "string",
            "description": "<strong>Select the dimensions for your social media platform:</strong><br/><br/>📱 <strong>Square:</strong> Instagram posts, Facebook feed<br/>📲 <strong>Stories:</strong> Instagram/Facebook Stories, TikTok<br/>🖥️ <strong>Landscape:</strong> Twitter, LinkedIn, YouTube thumbnails",
            "default": "square"
          },
          "colorStyle": {
            "title": "Background style",
            "enum": [
              "gradient",
              "solid"
            ],
            "type": "string",
            "description": "Choose gradient for a modern look or solid for simplicity",
            "default": "gradient"
          },
          "primaryColor": {
            "title": "Primary color",
            "type": "string",
            "description": "Background color in hex format (e.g., <code>#667eea</code>). For gradients, this is the starting color.",
            "default": "#667eea"
          },
          "secondaryColor": {
            "title": "Secondary color",
            "type": "string",
            "description": "Gradient end color in hex format (e.g., <code>#764ba2</code>). Only used when background style is Gradient.",
            "default": "#764ba2"
          },
          "textColor": {
            "title": "Text color (optional)",
            "type": "string",
            "description": "Override text color in hex format. Leave empty to auto-select based on theme.",
            "default": ""
          },
          "starColor": {
            "title": "Star rating color",
            "type": "string",
            "description": "Color for star ratings in hex format",
            "default": "#FFD700"
          },
          "showRating": {
            "title": "Show star ratings",
            "type": "boolean",
            "description": "Display star rating on the image",
            "default": true
          },
          "showAuthorPhoto": {
            "title": "Show author photos",
            "type": "boolean",
            "description": "Display reviewer profile pictures (if available)",
            "default": true
          },
          "fontFamily": {
            "title": "Font style",
            "enum": [
              "modern",
              "classic",
              "elegant",
              "bold"
            ],
            "type": "string",
            "description": "Choose the font that matches your brand",
            "default": "modern"
          },
          "fontSize": {
            "title": "Font size",
            "enum": [
              "small",
              "medium",
              "large",
              "xlarge"
            ],
            "type": "string",
            "description": "Adjust the text size on your images. Auto adjusts based on text length.",
            "default": "medium"
          },
          "outputFormat": {
            "title": "⚙️ File format",
            "enum": [
              "png",
              "jpg",
              "webp"
            ],
            "type": "string",
            "description": "<strong>Choose the image file format:</strong><br/><br/>• <strong>PNG:</strong> Best quality, larger files<br/>• <strong>JPEG:</strong> Smaller files, good for web<br/>• <strong>WebP:</strong> Modern format, smallest files",
            "default": "png"
          },
          "imageQuality": {
            "title": "Image quality",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Quality setting from 1-100 (higher = better quality, larger files). Only applies to JPEG and WebP formats.",
            "default": 90
          },
          "uploadToKeyValueStore": {
            "title": "Save images to storage",
            "type": "boolean",
            "description": "Store images in Apify's Key-Value Store so you can download them later. <strong>Recommended: keep this enabled.</strong>",
            "default": true
          },
          "returnBase64": {
            "title": "Include Base64 data",
            "type": "boolean",
            "description": "Add base64-encoded image data to the results. Only enable if you need this for API integration. <strong>Warning:</strong> This increases output size significantly.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}