{
  "createdAt": "2026-06-23T10:55:32.469Z",
  "requestedPrimaryProvider": "openai_responses_web_search",
  "openaiKeyConfigured": true,
  "openaiModel": "gpt-5.5",
  "openaiApiBase": "https://openai.dyhdcfsawig.com",
  "openaiProxyTokenConfigured": true,
  "fallbackProvider": "manual_chatgpt_pro_prompt",
  "fallbackModel": "ChatGPT Pro manual live-search prompt",
  "keywordResearch": {
    "createdAt": "2026-06-23T10:55:36.835Z",
    "provider": "openai_responses_web_search",
    "model": "gpt-5.5",
    "sourceRule": "OpenAI Responses web_search was required for Takealot traffic keywords.",
    "status": "openai_live_search_failed_manual_gpt_pro_required",
    "queries": [
      "dreadlock wig",
      "lace front wig",
      "24 Inch wig",
      "Source Photo Colour Mix wig",
      "wig",
      "women's wig",
      "curly wig",
      "synthetic wig"
    ],
    "attempts": [],
    "liveKeywords": [],
    "finalKeywords": [],
    "note": "OpenAI live search failed or is not configured. No substitute keyword list was used; use the ChatGPT Pro manual live-search prompt on the job page."
  },
  "selectedProvider": "manual_chatgpt_pro_required_after_openai_failure",
  "selectedModel": "ChatGPT Pro manual live-search prompt",
  "finalTitle": "",
  "modelTitle": "",
  "titleSource": "",
  "titleGuardrailIssues": [],
  "manualRequired": true,
  "note": "Automatic listing copy must be generated from OpenAI Responses web_search public evidence. If OpenAI live search fails, the workbench must show the ChatGPT Pro manual live-search prompt instead of pretending generic substitute terms are hot keywords.",
  "openaiError": "OpenAI Takealot keyword web_search failed after 2 attempts: OpenAI Takealot keyword web_search returned retryable status 429"
}