{"openapi":"3.1.0","info":{"title":"Teachable (BYOK) API","version":"0.1.0","description":"Teachable (BYOK) lets an AI assistant read your own Teachable data through the Teachable API with a key you supply (Teachable API key (Growth plan or higher)). Read-only: 8 tools (list_courses, get_course, list_course_enrollments, get_course_progress, list_users, get_user, list_pricing_plans, list_transactions). The BYOK key travels with each request, is used for that one call only and is never...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-teachable.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-teachable/docs"},"termsOfService":"https://connectorbay.com/byok-teachable/terms"},"servers":[{"url":"https://byok-teachable.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-teachable/docs"},"security":[{"upstreamKey":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."},"upstreamKey":{"type":"apiKey","in":"header","name":"X-Upstream-Key","description":"Your own key for the service this connector wraps (bring your own key). Used for that one call only; never stored, logged or cached."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/list_courses":{"post":{"operationId":"list_courses","summary":"List the school's courses with name, subtitle, published flag and image, optionally filtered by name or published state.","description":"List the school's courses with name, subtitle, published flag and image, optionally filtered by name or published state. Use for \"Which courses are published in my Teachable school\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"name":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only courses with this name.","title":"Name"},"is_published":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"True for published courses only, false for unpublished only.","title":"Is Published"},"per":{"anyOf":[{"maximum":20,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many courses per page (default and usual maximum 20).","title":"Per"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"}},"title":"list_coursesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_course":{"post":{"operationId":"get_course","summary":"Get one course with author bio and its curriculum: sections with name, position and lecture ids. Use for \"What sections ","description":"Get one course with author bio and its curriculum: sections with name, position and lecture ids. Use for \"What sections does Teachable course 1234 contain\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"course_id":{"description":"Teachable course id, from list_courses.","minimum":1,"title":"Course Id","type":"integer"}},"required":["course_id"],"title":"get_courseArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_course_enrollments":{"post":{"operationId":"list_course_enrollments","summary":"List the students enrolled in one course with enrollment date, expiry, completion date and percent complete. Use for \"Wh","description":"List the students enrolled in one course with enrollment date, expiry, completion date and percent complete. Use for \"Who is enrolled in Teachable course 1234 and how far along are they\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"course_id":{"description":"Teachable course id, from list_courses.","minimum":1,"title":"Course Id","type":"integer"},"enrolled_in_after":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Only enrollments after this ISO 8601 time.","title":"Enrolled In After"},"enrolled_in_before":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Only enrollments before this ISO 8601 time.","title":"Enrolled In Before"},"sort_direction":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"default":null,"description":"Order by enrollment date: asc or desc.","title":"Sort Direction"}},"required":["course_id"],"title":"list_course_enrollmentsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_course_progress":{"post":{"operationId":"get_course_progress","summary":"Show one student's progress in a course: percent complete, completion date, certificate and each lecture's completed fla","description":"Show one student's progress in a course: percent complete, completion date, certificate and each lecture's completed flag. Use for \"How far has user 777 got in Teachable course 1234\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"course_id":{"description":"Teachable course id, from list_courses.","minimum":1,"title":"Course Id","type":"integer"},"user_id":{"description":"Teachable user id of the student, from list_users.","minimum":1,"title":"User Id","type":"integer"}},"required":["course_id","user_id"],"title":"get_course_progressArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_users":{"post":{"operationId":"list_users","summary":"List the school's users (students and admins) with id, name and email, optionally looking up one email. Contains persona","description":"List the school's users (students and admins) with id, name and email, optionally looking up one email. Contains personal data. Use for \"Which Teachable user has the email ana@example.com\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"email":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only the user with this email address.","title":"Email"},"per":{"anyOf":[{"maximum":20,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many users per page (default and usual maximum 20).","title":"Per"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"}},"title":"list_usersArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_user":{"post":{"operationId":"get_user","summary":"Get one user with role, last sign-in IP, enrolled courses with progress and tags. Contains personal data. Use for \"Which","description":"Get one user with role, last sign-in IP, enrolled courses with progress and tags. Contains personal data. Use for \"Which courses is Teachable user 777 enrolled in\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"user_id":{"description":"Teachable user id, from list_users.","minimum":1,"title":"User Id","type":"integer"}},"required":["user_id"],"title":"get_userArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_pricing_plans":{"post":{"operationId":"list_pricing_plans","summary":"List pricing plans with name, price in the smallest currency unit, currency and the course each belongs to. Use for \"Wha","description":"List pricing plans with name, price in the smallest currency unit, currency and the course each belongs to. Use for \"What pricing plans does my Teachable school offer\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"per":{"anyOf":[{"maximum":5,"minimum":1,"type":"integer"},{"type":"null"}],"default":5,"description":"How many plans per page (default and usual maximum 5).","title":"Per"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"}},"title":"list_pricing_plansArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_transactions":{"post":{"operationId":"list_transactions","summary":"List sales transactions with charge, price, currency, tax, revenue, status, chargeback and refund details, filterable by","description":"List sales transactions with charge, price, currency, tax, revenue, status, chargeback and refund details, filterable by user, course, plan and date. Use for \"What Teachable sales happened this month\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"user_id":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only transactions of this user id.","title":"User Id"},"course_id":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only transactions for this course id.","title":"Course Id"},"pricing_plan_id":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only transactions for this pricing plan id.","title":"Pricing Plan Id"},"is_fully_refunded":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"True for fully refunded transactions only.","title":"Is Fully Refunded"},"is_chargeback":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"True for chargebacks only.","title":"Is Chargeback"},"start":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Only transactions after this ISO 8601 time (exclusive).","title":"Start"},"end":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Only transactions up to this ISO 8601 time (inclusive).","title":"End"},"per":{"anyOf":[{"maximum":20,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many transactions per page (default and usual maximum 20).","title":"Per"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"}},"title":"list_transactionsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}