{
  "openapi": "3.0.1",
  "info": {
    "title": "Online Course Finder & Comparator",
    "description": "Find and compare online courses for a learner goal using public Coursera search pages and Skillshare class sitemap discovery. Produces ranked shortlist rows with buyingDecision, goalFitScore, valueForMoneyScore, confidenceTier, missingData and redFlags.",
    "version": "0.1",
    "x-build-id": "ZTEdtaUYalL1OhZ7O"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/trovevault~online-course-finder-comparator/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-trovevault-online-course-finder-comparator",
        "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/trovevault~online-course-finder-comparator/runs": {
      "post": {
        "operationId": "runs-sync-trovevault-online-course-finder-comparator",
        "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/trovevault~online-course-finder-comparator/run-sync": {
      "post": {
        "operationId": "run-sync-trovevault-online-course-finder-comparator",
        "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": [
          "topic",
          "learnerGoal",
          "platforms"
        ],
        "properties": {
          "topic": {
            "title": "What do you want to learn?",
            "type": "string",
            "description": "Skill, subject, or course topic to search for. Example: AI agents, Python automation, Excel for finance, UX research. Use a specific phrase for cleaner course discovery.",
            "default": "AI agents"
          },
          "learnerGoal": {
            "title": "Learning goal",
            "type": "string",
            "description": "Outcome the learner or team wants after the course. Example: Build practical AI agent workflows for business automation in 4 weeks. This is used to rank fit and explain each recommendation."
          },
          "decisionContext": {
            "title": "Decision context",
            "enum": [
              "individual purchase",
              "career switch",
              "certification prep",
              "team training",
              "procurement shortlist"
            ],
            "type": "string",
            "description": "Why you are choosing a course. The actor adapts recommendation language for an individual learner, career switcher, certification buyer, team training, or procurement shortlist.",
            "default": "individual purchase"
          },
          "experienceLevel": {
            "title": "Experience level",
            "enum": [
              "any",
              "beginner",
              "intermediate",
              "advanced"
            ],
            "type": "string",
            "description": "Current learner level. Choose beginner for first exposure, intermediate for practical builders, advanced for experienced practitioners, or any when level does not matter.",
            "default": "intermediate"
          },
          "mustHaveCriteria": {
            "title": "Must-have criteria",
            "type": "array",
            "description": "Selection requirements that matter most. The actor flags courses that appear to match or miss these criteria and explains missing evidence when public pages do not expose enough data.",
            "items": {
              "type": "string",
              "enum": [
                "certificate",
                "hands-on projects",
                "beginner-friendly",
                "advanced depth",
                "under 10 hours",
                "free or audit option",
                "recognized provider",
                "team suitable"
              ],
              "enumTitles": [
                "Certificate",
                "Hands-on projects",
                "Beginner-friendly",
                "Advanced depth",
                "Under 10 hours",
                "Free or audit option",
                "Recognized provider",
                "Team suitable"
              ]
            },
            "default": [
              "hands-on projects"
            ]
          },
          "budgetPreference": {
            "title": "Budget preference",
            "enum": [
              "best-value",
              "lowest-price",
              "premium-ok",
              "free-first"
            ],
            "type": "string",
            "description": "How price should affect ranking. Best overall value balances price and quality, cheapest first favors low cost, quality over price rewards proof signals, and free options first favors free or audit-friendly courses.",
            "default": "best-value"
          },
          "platforms": {
            "title": "Platforms to search",
            "minItems": 1,
            "type": "array",
            "description": "Course platforms to prospect. Coursera uses public search pages. Skillshare uses its public class sitemap because the search page blocks HTTP requests.",
            "items": {
              "type": "string",
              "enum": [
                "coursera",
                "skillshare"
              ],
              "enumTitles": [
                "Coursera",
                "Skillshare"
              ]
            },
            "default": [
              "coursera",
              "skillshare"
            ]
          },
          "maxCoursesPerPlatform": {
            "title": "Max courses per platform",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Maximum number of course candidates to keep from each platform. Use 3 to 10 for quick recommendations or 20 to 50 for broader L&D research.",
            "default": 5
          },
          "datasetId": {
            "title": "Dataset ID",
            "type": "string",
            "description": "Optional existing Apify dataset ID to append the same recommendation rows to, in addition to the default run dataset."
          },
          "runId": {
            "title": "Run ID",
            "type": "string",
            "description": "Optional identifier copied to output rows for downstream tracing in larger workflows."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}