{"openapi":"3.1.0","info":{"title":"SkillPlug Agent API","version":"1.0.0","description":"Lets a SkillPlug customer's AI agent read the skill packs they own and sync study progress. Every request is authenticated with the customer's own SkillPlug key (Authorization: Bearer sp_live_...), the same key that syncs their private progress dashboards. Create and revoke keys at https://skillplug.io/account/agent. A remote MCP server exposing the same tools is available at https://skillplug.io/api/agent/mcp. SkillPlug is operated by VerityAI, LLC; support@skillplug.io."},"servers":[{"url":"https://skillplug.io/api/agent/v1"}],"security":[{"agentKey":[]}],"paths":{"/me":{"get":{"operationId":"SKILLPLUG_GET_ACCOUNT","summary":"Get account","description":"Get the SkillPlug account that owns the connected SkillPlug key. Returns the account id, display name, email, plan, and created time. Use this to confirm the connection works and to see whose library you are reading.","x-composio-tool-slug":"SKILLPLUG_GET_ACCOUNT","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Account"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid SkillPlug key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/packs":{"get":{"operationId":"SKILLPLUG_LIST_PACKS","summary":"List owned packs","description":"List the skill packs the connected SkillPlug account owns. Each item has the pack slug, name, current version, and the time that version was released. Use the slug with the other SkillPlug tools.","x-composio-tool-slug":"SKILLPLUG_LIST_PACKS","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackList"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid SkillPlug key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/packs/{slug}":{"get":{"operationId":"SKILLPLUG_GET_PACK","summary":"Get pack details and file manifest","description":"Get details for one owned skill pack by slug, including its description, current version, and the manifest of downloadable files in the pack with their paths, sizes, and SHA-256 checksums. Returns 404 for a pack the account does not own.","x-composio-tool-slug":"SKILLPLUG_GET_PACK","parameters":[{"name":"slug","in":"path","required":true,"description":"Skill pack slug, as returned by SKILLPLUG_LIST_PACKS.","schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackDetail"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid SkillPlug key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/packs/{slug}/download":{"get":{"operationId":"SKILLPLUG_DOWNLOAD_PACK","summary":"Get signed download URL for latest zip","description":"Get a short-lived signed URL for the latest zip of an owned skill pack. Download the zip from the returned URL before it expires (5 minutes); the URL itself needs no SkillPlug key. Returns 404 for a pack the account does not own.","x-composio-tool-slug":"SKILLPLUG_DOWNLOAD_PACK","parameters":[{"name":"slug","in":"path","required":true,"description":"Skill pack slug, as returned by SKILLPLUG_LIST_PACKS.","schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Download"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid SkillPlug key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/download":{"get":{"operationId":"SKILLPLUG_DOWNLOAD_FILE","summary":"Download a pack zip with a signed token","description":"Streams a pack zip. Authorized by the short-lived signed token from SKILLPLUG_DOWNLOAD_PACK, not by a SkillPlug key. Not a Composio tool; it is the target of the signed URL.","security":[{}],"parameters":[{"name":"t","in":"query","required":true,"description":"Signed download token from the download endpoint.","schema":{"type":"string"}}],"responses":{"200":{"description":"The pack zip","content":{"application/zip":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"Missing, invalid, or expired token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Pack file not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/progress":{"get":{"operationId":"SKILLPLUG_GET_PROGRESS","summary":"Get study progress for a pack","description":"Get the saved study progress for one owned skill pack: completed items, percent complete, last activity time, and any pack-specific data. Returns an empty record if nothing has been saved yet. Returns 404 for a pack the account does not own.","x-composio-tool-slug":"SKILLPLUG_GET_PROGRESS","parameters":[{"name":"pack","in":"query","required":true,"description":"Skill pack slug.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Progress"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid SkillPlug key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"SKILLPLUG_SYNC_PROGRESS","summary":"Upsert study progress for a pack","description":"Save study progress for one owned skill pack. Creates the record if it does not exist and updates it if it does. Send the pack slug plus the fields that changed; provided fields replace the stored ones (last write wins) and completed_items replaces the stored list. The server sets updated_at. The saved record is returned.","x-composio-tool-slug":"SKILLPLUG_SYNC_PROGRESS","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProgressInput"}}}},"responses":{"200":{"description":"Saved progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Progress"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid SkillPlug key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/openapi.json":{"get":{"operationId":"SKILLPLUG_GET_OPENAPI","summary":"This OpenAPI document","description":"Returns this OpenAPI 3.1 document. No authentication required.","security":[{}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}}}}},"components":{"securitySchemes":{"agentKey":{"type":"http","scheme":"bearer","description":"The customer's SkillPlug key, sent as Authorization: Bearer sp_live_<...>."}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable code, e.g. unauthorized, not_found, rate_limited."},"message":{"type":"string"}}}}},"Account":{"type":"object","required":["id","email","name"],"properties":{"id":{"type":"string","description":"Stable, non-PII account id."},"email":{"type":"string","description":"Sign-in identifier: an email address, or a phone number in E.164 format for phone sign-ins."},"name":{"type":["string","null"],"description":"Display name derived from the sign-in email, or null when there is none (for example a phone sign-in)."},"plan":{"type":"string","enum":["lifetime","none"],"description":"\"lifetime\" when the account owns at least one pack (packs are one-time purchases), otherwise \"none\"."},"created_at":{"type":["string","null"],"format":"date-time","description":"Time of the account's earliest order, else when its first SkillPlug key was created, or null."}}},"PackSummary":{"type":"object","required":["slug","name","version","updated_at"],"properties":{"slug":{"type":"string"},"name":{"type":"string"},"version":{"type":"string"},"updated_at":{"type":"string","format":"date-time","description":"When the current version was released."}}},"PackList":{"type":"object","required":["packs"],"properties":{"packs":{"type":"array","items":{"$ref":"#/components/schemas/PackSummary"}}}},"ManifestFile":{"type":"object","required":["path","content_type"],"properties":{"path":{"type":"string","description":"The downloadable file name (a zip artifact of the pack)."},"size_bytes":{"type":["integer","null"]},"sha256":{"type":["string","null"]},"content_type":{"type":"string"}}},"PackDetail":{"allOf":[{"$ref":"#/components/schemas/PackSummary"},{"type":"object","required":["description","files"],"properties":{"description":{"type":"string"},"files":{"type":"array","items":{"$ref":"#/components/schemas/ManifestFile"},"description":"Downloadable zip artifacts included with the pack."}}}]},"Download":{"type":"object","required":["slug","version","url","expires_at"],"properties":{"slug":{"type":"string"},"version":{"type":"string"},"url":{"type":"string","format":"uri","description":"Short-lived signed URL for the latest zip; needs no SkillPlug key."},"expires_at":{"type":"string","format":"date-time"},"size_bytes":{"type":["integer","null"]},"sha256":{"type":["string","null"]}}},"ProgressInput":{"type":"object","required":["pack"],"additionalProperties":false,"properties":{"pack":{"type":"string","description":"Slug of the skill pack this progress belongs to."},"pack_version":{"type":["string","null"],"description":"Pack version the progress was recorded against. Send null to clear it; omit to leave it unchanged."},"completed_items":{"type":"array","items":{"type":"string"},"description":"Ids or file paths of finished items. Replaces the stored list. Max 2000 items."},"percent_complete":{"type":["number","null"],"minimum":0,"maximum":100,"description":"Overall completion from 0 to 100. Send null to clear it; omit to leave it unchanged."},"last_activity_at":{"type":"string","format":"date-time","description":"When the customer last studied this pack. Defaults to the server time on every sync."},"data":{"type":["object","null"],"additionalProperties":true,"description":"Optional pack-specific state. Max 32 KB serialized. Replaces the stored object. Send null to clear it; omit to leave it unchanged."}}},"Progress":{"type":"object","required":["pack","completed_items","updated_at"],"properties":{"pack":{"type":"string"},"pack_version":{"type":["string","null"]},"completed_items":{"type":"array","items":{"type":"string"}},"percent_complete":{"type":["number","null"],"minimum":0,"maximum":100},"last_activity_at":{"type":["string","null"],"format":"date-time"},"data":{"type":["object","null"],"additionalProperties":true},"updated_at":{"type":"string","format":"date-time"}}}}}}