{
  "openapi": "3.0.1",
  "info": {
    "title": "AI Sales Personalizer - Cold Email + Opener Generator",
    "description": "AI cold email opener generator for B2B sales. Drop a company URL, get a personalized opener with evidence quotes, fit score (0-100), pain points, and recommended channel. Self-critique pass. Bring your own LLM key (Gemini/Groq/Anthropic). $0.10 to $0.20 per lead.",
    "version": "0.2",
    "x-build-id": "YBua0g3TDLi7lMYla"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/fetchcraft~ai-sales-personalizer/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-fetchcraft-ai-sales-personalizer",
        "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/fetchcraft~ai-sales-personalizer/runs": {
      "post": {
        "operationId": "runs-sync-fetchcraft-ai-sales-personalizer",
        "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/fetchcraft~ai-sales-personalizer/run-sync": {
      "post": {
        "operationId": "run-sync-fetchcraft-ai-sales-personalizer",
        "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": [
          "urls",
          "your_product_pitch"
        ],
        "properties": {
          "urls": {
            "title": "Company URLs",
            "type": "array",
            "description": "List of company homepage URLs. One personalized result per URL. You can also pass objects of the form {\"url\": \"https://...\", \"contact_role\": \"VP Sales\"} to override per-URL role.",
            "items": {
              "type": "string"
            }
          },
          "your_product_pitch": {
            "title": "Your product pitch (one paragraph)",
            "minLength": 20,
            "maxLength": 2000,
            "type": "string",
            "description": "Briefly describe what you sell. Concrete beats vague. \"We cut SaaS spend 30 to 45 percent on usage-aware FinOps\" works. \"We help with optimization\" does not. The AI uses this to calculate fit score and tailor every opener."
          },
          "tone": {
            "title": "Tone of opener",
            "enum": [
              "consultative",
              "direct",
              "warm",
              "curious",
              "witty"
            ],
            "type": "string",
            "description": "How the opener should read.",
            "default": "consultative"
          },
          "mode": {
            "title": "Mode",
            "enum": [
              "preview",
              "standard",
              "premium"
            ],
            "type": "string",
            "description": "Preview = first URL only, not charged (try the actor risk-free). Standard = Claude Sonnet 4.6, self-critique pass, $0.15 per result. Premium = Claude Opus 4.7, deeper critique, $0.25 per result (for high-value enterprise lists).",
            "default": "standard"
          },
          "contact_role": {
            "title": "Decision-maker role (optional)",
            "minLength": 0,
            "maxLength": 100,
            "type": "string",
            "description": "Default role for all URLs (e.g. \"VP Sales\", \"Head of RevOps\", \"Founder\"). The AI tailors language and priorities to how this role typically speaks. Leave blank for generic opener. Override per-URL by passing objects in the urls field.",
            "default": ""
          },
          "use_cache": {
            "title": "Use 30-day cache",
            "type": "boolean",
            "description": "If you re-run the same URL with the same pitch and tone within 30 days, return the cached result and do not charge again. Recommended ON.",
            "default": true
          },
          "max_concurrency": {
            "title": "Max parallel requests",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many URLs to process in parallel. Higher = faster but more Claude API load.",
            "default": 5
          },
          "llm_provider": {
            "title": "LLM provider (bring your own key)",
            "enum": [
              "",
              "gemini",
              "groq",
              "cerebras",
              "openrouter",
              "huggingface",
              "anthropic"
            ],
            "type": "string",
            "description": "Pick which LLM you want to use, then paste the matching key below. Gemini is recommended: 1500 free requests/day at https://aistudio.google.com/apikey. Groq is also good (14400 free/day at https://console.groq.com/keys). Leave blank to use the actor owner's configured key (if any).",
            "default": ""
          },
          "llm_api_key": {
            "title": "Your LLM API key (paired with llm_provider above)",
            "type": "string",
            "description": "Paste the API key for the provider you selected above. Never leaves the Apify run, never logged. Free tier providers (Gemini, Groq) give you thousands of free results per day."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}