{"id":21171517,"url":"https://github.com/vaaski/openmagicline","last_synced_at":"2026-04-10T14:04:05.961Z","repository":{"id":42630825,"uuid":"374074895","full_name":"vaaski/openmagicline","owner":"vaaski","description":"The Magicline API for everybody.","archived":false,"fork":false,"pushed_at":"2025-04-13T12:42:22.000Z","size":681,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"v2","last_synced_at":"2025-04-13T13:29:54.273Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vaaski.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"license.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-06-05T09:37:17.000Z","updated_at":"2025-04-13T12:42:26.000Z","dependencies_parsed_at":"2024-10-26T18:46:24.213Z","dependency_job_id":"53ba26ee-3077-4003-9e54-7828c893500b","html_url":"https://github.com/vaaski/openmagicline","commit_stats":null,"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vaaski%2Fopenmagicline","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vaaski%2Fopenmagicline/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vaaski%2Fopenmagicline/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vaaski%2Fopenmagicline/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vaaski","download_url":"https://codeload.github.com/vaaski/openmagicline/tar.gz/refs/heads/v2","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248722170,"owners_count":21151211,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-20T16:06:50.947Z","updated_at":"2026-04-10T14:04:00.921Z","avatar_url":"https://github.com/vaaski.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1\u003e\u003cp align=\"center\"\u003eOpenmagicline\u003c/p\u003e\u003c/h1\u003e\n\u003cp align=\"center\"\u003eThe Magicline API for everybody.\u003c/p\u003e\n\n## Synopsis\n\nI work at a gym that has been using [magicline](https://magicline.com) for\nwell over a decade now.\n\nWhen they switched to a completely new cloud-based web-interface in about 2016,\nusing magicline got a lot slower. The new interface not only took a\nsignificant time to get used to, it also runs considerably slower than\nthe previous (native) one. This sucks for an environment where the\ncustomer expects fast and reliable service.\n\nI build custom software to speed up the workflow, and Openmagicline is the\nadapter that powers it.\n\nOpenmagicline is a **reverse-engineered**, **strongly-typed** version of\nmagicline's internal API.\n\n## Usage\n\nThis is far from feature-complete as I only implement the parts I need.\nFeel free to use it, but expect a lot of functionality to be missing.\n\nI am, however, very open to [contributions](#roadmap) and this project should be a\nsolid starting point for anyone who wants to implement missing functionality.\n\n```ts\nconst magicline = new Openmagicline({\n  gym: \"gym\", // example for https://gym.web.magicline.com\n  username: \"your username\",\n  password: \"your password\",\n})\n\nawait magicline.login()\nawait magicline.customer.search(\"John Doe\")\n```\n\n## Features\n\n- **Strongly-typed** - All API calls and responses are typed\n- **Authentication** - Automatically re-authenticates on session expiry\n- **Covered** - Probably close to 100% test coverage\n\n## Roadmap\n\n- Detect magicline version and warn if openmagicline is outdated\n- Improve tests and verify API responses with something like zod\n\n## New in v2\n\n- Added setting `organizationUnitId` per instance to avoid re-checking it.\n  - This is optional, it'll get the default unitID if not provided.\n- Added checkoutByCustomerID to Checkin class which utilizes a cached map of\n  customerID -\u003e checkinID to avoid having to re-list checkins.\n- Switched to [Bun](https://bun.sh) for package management and testing.\n- Switched to [ofetch](https://npmr.vaa.ski/ofetch) for HTTP requests.\n- Switched to [Biome](https://biomejs.dev) for linting and formatting.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvaaski%2Fopenmagicline","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvaaski%2Fopenmagicline","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvaaski%2Fopenmagicline/lists"}