WeFitter website screenshot

WeFitter

WeFitter is a health and fitness data platform ("one API to access wearable data, gamification and AI") operated by Thunderbyte.AI in Groningen, Netherlands. Its REST API aggregates health and activity data from 300+ wearables and fitness apps — Fitbit, Garmin, Google Fit, Apple Health, Withings, Polar, Oura, Whoop, Samsung Health, Huawei and more — into a single unified, deduplicated data model, and layers gamification (challenges, leaderboards, teams, points) and AI insights (biological age, recommendations) on top. Organizations use it to build corporate wellbeing, digital fitness, e-health and insurance solutions. WeFitter also ships mobile SDK bridges for Apple Health, Samsung Health and Android Health Connect.

WeFitter publishes 9 APIs on the APIs.io network, including app API, challenge API, connection API, and 6 more. Tagged areas include Company, Health, Fitness, Wearables, and Health Data.

The WeFitter catalog on APIs.io includes 1 event-driven AsyncAPI specification.

WeFitter’s developer surface includes documentation, getting-started guide, API reference, support, engineering blog, changelog, signup flow, and 24 more developer resources.

47.4/100 developing ▬ flat Agent 25/100 agent aware saas Full breakdown ↓
scored 2026-09-08 · rubric v0.20.0
1 APIs
CompanyHealthFitnessWearablesHealth DataWellbeingGamificationDigital HealthInsuranceActivity Tracking

Kin Score

Kin Score Kin Score How this is scored →
scored 2026-09-08 · rubric v0.20.0
Regulatory Posture applies to this provider. Its tags matched the Health regime, so Regulatory Posture carries 15 points of the composite. If this regime is wrong for your business, say so on your provider repo — the applicability map is public and we will correct it.
Create-or-Update Ergonomics applies to this provider. This API accepts writes, so it carries 10 points of the composite. It is scored from the published contracts themselves: whether a caller can create-or-update in one call, whether the write accepts a key the caller already holds, and whether the response says which branch ran. Without that, every write needs a search-and-branch in front of it, and the first time that check is skipped a duplicate record is created. Scored against the observed mean rather than raw — a provider at the catalog average is unchanged by this facet, not penalised by it.
The six quality facets above are damped to 75 points between them, because the conditional facet above carries the other 25. That is why each facet's contribution is shown against a damped maximum: raising a quality facet moves the composite by 75% of its nominal weight, not 100%. The full arithmetic is at apis.io/rating/.
Improve this rating by publishing the missing artifacts — every area above can be raised, and the full rubric is at apis.io/rating/. Every facet and dimension name above is a link: it opens that measurement's own page — what it means, the exact checks that feed it, how the whole catalog distributes on it, and the providers at the top of it. This rating is computed from github.com/api-evangelist/wefitter: open an issue to ask a question, or submit a pull request to add artifacts. Submit an artifact on GitHub — free → Manage your own listing — the Influence plan, $499/mo →

APIs 9

Individual APIs this provider publishes, each with its own machine-readable definition.

WeFitter app API

The app API from WeFitter — 1 operation(s) for app.

WeFitter challenge API

WeFitter API’s challenge engine will bring endless engagement to your platform. For more information about the possibilities in challenges please go to https://www.wefitter.com/...

WeFitter connection API

Connections are the links between profiles and their wearables.

WeFitter insights API

The insights API from WeFitter — 1 operation(s) for insights.

WeFitter loyalty API

The loyalty API from WeFitter — 2 operation(s) for loyalty.

WeFitter notification API

Send a notification to all devices for the specified profiles The data will be sent to the client in the following format: ``` { "app": , "title": , "body"...</p> </div> <div class="item-card"> <h4><a href="https://apis.io/apis/wefitter/wefitter-profile-api/">WeFitter profile API</a></h4><p>Profiles are containers for wearables data. The profiles can be seen as an extension of users in a different system. Profiles are anonymous objects which can participate in team...</p> </div> <div class="item-card"> <h4><a href="https://apis.io/apis/wefitter/wefitter-team-api/">WeFitter team API</a></h4><p>The team API from WeFitter — 5 operation(s) for team.</p> </div> <div class="item-card"> <h4><a href="https://apis.io/apis/wefitter/wefitter-token-api/">WeFitter token API</a></h4><p><p> Before any calls can be made to wefitter, BasicAuth is needed to verify the identity of the requesting party. This call will result into a Bearer token which has administrat...</p> </div> </div><p class="scroll-hint">Scroll for all 9</p> <!-- Postman Collections --> <!-- Open Collections (open + Bruno formats) --> <h2 class="section-anchor" id="open-collections"><a href="#open-collections">Open Collections</a> <span class="section-count">10</span></h2><p class="section-blurb">Open, tool-agnostic API collections (OpenAPI-derived and Bruno).</p> <div class="card-grid scroll-pane"> <div class="item-card" style="border-left: 3px solid #ea580c;"> <h4><a href="https://apis.io/collections/wefitter/open-.refine-report/">API Collection</a></h4><span class="card-badge" style="background: #ea580c;">OPEN COLLECTION</span> </div> <div class="item-card" style="border-left: 3px solid #ea580c;"> <h4><a href="https://apis.io/collections/wefitter/open-wefitter-app-api/">WeFitter app API</a></h4><span class="card-badge" style="background: #ea580c;">OPEN COLLECTION</span> </div> <div class="item-card" style="border-left: 3px solid #ea580c;"> <h4><a href="https://apis.io/collections/wefitter/open-wefitter-challenge-api/">WeFitter app challenge API</a></h4><span class="card-badge" style="background: #ea580c;">OPEN COLLECTION</span> </div> <div class="item-card" style="border-left: 3px solid #ea580c;"> <h4><a href="https://apis.io/collections/wefitter/open-wefitter-connection-api/">WeFitter app connection API</a></h4><span class="card-badge" style="background: #ea580c;">OPEN COLLECTION</span> </div> <div class="item-card" style="border-left: 3px solid #ea580c;"> <h4><a href="https://apis.io/collections/wefitter/open-wefitter-insights-api/">WeFitter app insights API</a></h4><span class="card-badge" style="background: #ea580c;">OPEN COLLECTION</span> </div> <div class="item-card" style="border-left: 3px solid #ea580c;"> <h4><a href="https://apis.io/collections/wefitter/open-wefitter-loyalty-api/">WeFitter app loyalty API</a></h4><span class="card-badge" style="background: #ea580c;">OPEN COLLECTION</span> </div> <div class="item-card" style="border-left: 3px solid #ea580c;"> <h4><a href="https://apis.io/collections/wefitter/open-wefitter-notification-api/">WeFitter app notification API</a></h4><span class="card-badge" style="background: #ea580c;">OPEN COLLECTION</span> </div> <div class="item-card" style="border-left: 3px solid #ea580c;"> <h4><a href="https://apis.io/collections/wefitter/open-wefitter-profile-api/">WeFitter app profile API</a></h4><span class="card-badge" style="background: #ea580c;">OPEN COLLECTION</span> </div> <div class="item-card" style="border-left: 3px solid #ea580c;"> <h4><a href="https://apis.io/collections/wefitter/open-wefitter-team-api/">WeFitter app team API</a></h4><span class="card-badge" style="background: #ea580c;">OPEN COLLECTION</span> </div> <div class="item-card" style="border-left: 3px solid #ea580c;"> <h4><a href="https://apis.io/collections/wefitter/open-wefitter-token-api/">WeFitter app token API</a></h4><span class="card-badge" style="background: #ea580c;">OPEN COLLECTION</span> </div> </div><p class="scroll-hint">Scroll for all 10</p> <!-- Arazzo Workflows --> <!-- MCP Servers --> <!-- Agent Skills --> <!-- GraphQL --> <!-- Pricing Plans --> <!-- Rate Limits --> <!-- FinOps --> <!-- Features --> <!-- Event Specifications (AsyncAPI) --> <h2 class="section-anchor" id="asyncapis"><a href="#asyncapis">Event Specifications</a> <span class="section-count">1</span></h2><p class="section-blurb">AsyncAPI definitions for this provider's event-driven and streaming APIs.</p> <div class="card-grid scroll-pane"> <div class="item-card" style="border-left: 3px solid #1e40af;"> <h4><a href="https://apis.io/asyncapis/wefitter/wefitter-webhooks/">Wefitter Webhooks</a></h4><p></p><span class="card-badge" style="background: #1e40af;">ASYNCAPI</span> </div> </div> <!-- Semantic Vocabularies (JSON-LD) --> <!-- Spectral Rules — bespoke card (severity breakdown) --> <!-- JSON Schema --> <!-- JSON Structure --> <!-- Examples --> <!-- Security Posture --> <h2 class="section-anchor" id="security"><a href="#security">Security Posture</a> <span class="section-count">2</span></h2><p class="section-blurb">Authentication, domain security, vulnerability disclosure, and trust-center signals.</p> <div class="card-grid scroll-pane"> <div class="item-card" style="border-left: 3px solid #b91c1c;"> <h4><a href="https://apis.io/security/wefitter/wefitter-authentication/">Wefitter Authentication</a></h4><p>apiKey/http · 2 schemes</p><span class="card-badge" style="background: #b91c1c;">SECURITY</span> </div> <div class="item-card" style="border-left: 3px solid #b91c1c;"> <h4><a href="https://apis.io/security/wefitter/wefitter-domain-security/">Wefitter Domain Security</a></h4><p>TLSv1.3 · HSTS · DNSSEC · DMARC</p><span class="card-badge" style="background: #b91c1c;">SECURITY</span> </div> </div> <!-- Scopes --> <!-- Agentic Access --> <h2 class="section-anchor" id="agentic-access"><a href="#agentic-access">Agentic Access</a> <span class="section-count">1</span></h2><p class="section-blurb">Recommended x-agentic-access execution contracts for AI agents.</p> <div class="card-grid scroll-pane"> <div class="item-card" style="border-left: 3px solid #6d28d9;"> <h4><a href="https://apis.io/agentic-access/wefitter/wefitter-agentic-access/">Wefitter Agentic Access</a></h4><p>77 operations · 34 acting</p><p class="card-meta">77 operations · 34 acting</p><span class="card-badge" style="background: #6d28d9;">AGENTIC</span> </div> </div> <!-- Use Cases --> <!-- Integrations --> <!-- Solutions --> <!-- Kubernetes CRDs — bespoke card (external links) --> <!-- Press — bespoke card (external links) --> <!-- Resources Section — grouped by the JOB the resource does, mirroring the way the rating panel groups its checks into facets. A provider can declare 50+ properties; ungrouped they were an undifferentiated wall of cards where a status page sat next to a privacy policy. The groups follow the integrator's arc: start it, read it, build it, secure it, learn it, run it, then the commercial and corporate surface. Each property's `group` is assigned in build.py (resource_group()), so this template only has to filter — Liquid has no array-append, which makes the equivalent in-template grouping quadratic and fragile. --> <h2 class="section-anchor" id="resources"><a href="#resources">Resources</a></h2> <div class="res-group"> <div class="res-group-head"> <h3 id="resources-start">Get Started <span class="res-count">3</span></h3> <p>Portal, sign-up, and the first successful call</p> </div> <div class="card-grid"> <a href="https://www.wefitter.com/en-us/developers/" target="_blank" rel="noopener" class="item-card res-card res-start"> <strong>DeveloperPortal</strong> <div class="res-type">DeveloperPortal</div> </a> <a href="https://www.wefitter.com/en-us/developers/getting-started/" target="_blank" rel="noopener" class="item-card res-card res-start"> <strong>GettingStarted</strong> <div class="res-type">GettingStarted</div> </a> <a href="https://api.wefitter.com/dashboard" target="_blank" rel="noopener" class="item-card res-card res-start"> <strong>SignUp</strong> <div class="res-type">SignUp</div> </a> </div> </div> <div class="res-group"> <div class="res-group-head"> <h3 id="resources-docs">Documentation <span class="res-count">4</span></h3> <p>Reference material describing how the API behaves</p> </div> <div class="card-grid"> <a href="https://www.wefitter.com/en-us/developers/documentation/" target="_blank" rel="noopener" class="item-card res-card res-docs"> <strong>Documentation</strong> <div class="res-type">Documentation</div> </a> <a href="https://api.wefitter.com/api/v1.3/redoc/" target="_blank" rel="noopener" class="item-card res-card res-docs"> <strong>APIReference</strong> <div class="res-type">APIReference</div> </a> <a href="https://www.wefitter.com/en-us/developers/guides/" target="_blank" rel="noopener" class="item-card res-card res-docs"> <strong>Guides</strong> <div class="res-type">Guides</div> </a> <a href="openapi/_original/wefitter-openapi-original.json" target="_blank" rel="noopener" class="item-card res-card res-docs"> <strong>OpenAPI</strong> <div class="res-type">OpenAPI</div> </a> </div> </div> <div class="res-group"> <div class="res-group-head"> <h3 id="resources-agent">Agent Surfaces <span class="res-count">4</span></h3> <p>MCP servers, agent skills, and machine-readable catalogs</p> </div> <div class="card-grid"> <a href="mcp/wefitter-mcp.yml" target="_blank" rel="noopener" class="item-card res-card res-agent"> <strong>X-MCPServerCandidate</strong> <div class="res-type">X-MCPServerCandidate</div> </a> <a href="llms/wefitter-llms.txt" target="_blank" rel="noopener" class="item-card res-card res-agent"> <strong>LLMsTxt</strong> <div class="res-type">LLMsTxt</div> </a> <a href="skills/_index.yml" target="_blank" rel="noopener" class="item-card res-card res-agent"> <strong>AgentSkill</strong> <div class="res-type">AgentSkill</div> </a> <a href="agentic-access/wefitter-agentic-access.yml" target="_blank" rel="noopener" class="item-card res-card res-agent"> <strong>AgenticAccess</strong> <div class="res-type">AgenticAccess</div> </a> </div> </div> <div class="res-group"> <div class="res-group-head"> <h3 id="resources-design">Design & Contract <span class="res-count">7</span></h3> <p>Pagination, idempotency, versioning, errors, and events</p> </div> <div class="card-grid scroll-pane"> <a href="conformance/wefitter-conformance.yml" target="_blank" rel="noopener" class="item-card res-card res-design"> <strong>Conformance</strong> <div class="res-type">Conformance</div> </a> <a href="errors/wefitter-problem-types.yml" target="_blank" rel="noopener" class="item-card res-card res-design"> <strong>ErrorCatalog</strong> <div class="res-type">ErrorCatalog</div> </a> <a href="lifecycle/wefitter-lifecycle.yml" target="_blank" rel="noopener" class="item-card res-card res-design"> <strong>Lifecycle</strong> <div class="res-type">Lifecycle</div> </a> <a href="conventions/wefitter-conventions.yml" target="_blank" rel="noopener" class="item-card res-card res-design"> <strong>Conventions</strong> <div class="res-type">Conventions</div> </a> <a href="data-model/wefitter-data-model.yml" target="_blank" rel="noopener" class="item-card res-card res-design"> <strong>DataModel</strong> <div class="res-type">DataModel</div> </a> <a href="asyncapi/wefitter-webhooks.yml" target="_blank" rel="noopener" class="item-card res-card res-design"> <strong>Webhooks</strong> <div class="res-type">Webhooks</div> </a> <a href="components/wefitter-components.yml" target="_blank" rel="noopener" class="item-card res-card res-design"> <strong>Components</strong> <div class="res-type">Components</div> </a> </div> <p class="scroll-hint">Scroll for all 7</p> </div> <div class="res-group"> <div class="res-group-head"> <h3 id="resources-build">Build <span class="res-count">3</span></h3> <p>SDKs, sample code, and the tooling you integrate with</p> </div> <div class="card-grid"> <a href="https://github.com/wefitter" target="_blank" rel="noopener" class="item-card res-card res-build"> <strong>GitHubOrganization</strong> <div class="res-type">GitHubOrganization</div> </a> <a href="packages/wefitter-packages.yml" target="_blank" rel="noopener" class="item-card res-card res-build"> <strong>Packages</strong> <div class="res-type">Packages</div> </a> <a href="packages/wefitter-packages.yml" target="_blank" rel="noopener" class="item-card res-card res-build"> <strong>SDKs</strong> <div class="res-type">SDKs</div> </a> </div> </div> <div class="res-group"> <div class="res-group-head"> <h3 id="resources-auth">Access & Security <span class="res-count">2</span></h3> <p>Authentication, authorization, and security posture</p> </div> <div class="card-grid"> <a href="security/wefitter-domain-security.yml" target="_blank" rel="noopener" class="item-card res-card res-auth"> <strong>DomainSecurity</strong> <div class="res-type">DomainSecurity</div> </a> <a href="authentication/wefitter-authentication.yml" target="_blank" rel="noopener" class="item-card res-card res-auth"> <strong>Authentication</strong> <div class="res-type">Authentication</div> </a> </div> </div> <div class="res-group"> <div class="res-group-head"> <h3 id="resources-operate">Operate <span class="res-count">3</span></h3> <p>Status, limits, changes, and where to get help</p> </div> <div class="card-grid"> <a href="https://developers.wefitter.com/support" target="_blank" rel="noopener" class="item-card res-card res-operate"> <strong>Support</strong> <div class="res-type">Support</div> </a> <a href="https://www.wefitter.com/en-us/developers/changelog/" target="_blank" rel="noopener" class="item-card res-card res-operate"> <strong>ChangeLog</strong> <div class="res-type">ChangeLog</div> </a> <a href="changelog/wefitter-changelog.yml" target="_blank" rel="noopener" class="item-card res-card res-operate"> <strong>ChangeLog</strong> <div class="res-type">ChangeLog</div> </a> </div> </div> <div class="res-group"> <div class="res-group-head"> <h3 id="resources-commercial">Commercial <span class="res-count">2</span></h3> <p>Pricing, plans, and the legal terms of use</p> </div> <div class="card-grid"> <a href="https://www.wefitter.com/en-us/terms-and-conditions/" target="_blank" rel="noopener" class="item-card res-card res-commercial"> <strong>TermsOfService</strong> <div class="res-type">TermsOfService</div> </a> <a href="https://www.wefitter.com/en-us/privacy-policy/" target="_blank" rel="noopener" class="item-card res-card res-commercial"> <strong>PrivacyPolicy</strong> <div class="res-type">PrivacyPolicy</div> </a> </div> </div> <div class="res-group"> <div class="res-group-head"> <h3 id="resources-company">Company <span class="res-count">2</span></h3> <p>The organization behind the API</p> </div> <div class="card-grid"> <a href="https://www.wefitter.com/en-us/resources/blog/" target="_blank" rel="noopener" class="item-card res-card res-company"> <strong>Blog</strong> <div class="res-type">Blog</div> </a> <a href="https://wefitter.com" target="_blank" rel="noopener" class="item-card res-card res-company"> <strong>Website</strong> <div class="res-type">Website</div> </a> </div> </div> <div class="res-group"> <div class="res-group-head"> <h3 id="resources-other">Other <span class="res-count">1</span></h3> <p>Properties that don't map to a standard resource type</p> </div> <div class="card-grid"> <a href="overlays/wefitter-openapi-overlay.yaml" target="_blank" rel="noopener" class="item-card res-card res-other"> <strong>Overlay</strong> <div class="res-type">Overlay</div> </a> </div> </div> <!-- Source (apis.yml) — always rendered last, at the bottom of the page. The include renders its own heading with id="source" (the #source anchor target). specs='none' keeps this to apis.yml alone: a provider page describes the company, and its individual specs belong on the API pages they document. --> <link rel="stylesheet" href="/assets/prism/prism-coy.min.css"> <link rel="stylesheet" href="/assets/prism/prism-line-numbers.min.css"> <style> .src-widget { background: #fdfdfd; border: 1px solid #e3e7ee; border-radius: 10px; overflow: hidden; margin-top: 0.75rem; } .src-widget-head { display: flex; align-items: center; gap: 0.5rem; padding: 0.55rem 0.85rem; background: #f8fafc; border-bottom: 1px solid #e3e7ee; flex-wrap: wrap; } .src-label { color: #475569; font-weight: 600; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 0.8rem; flex: 0 0 auto; } .src-picker { flex: 0 0 auto; max-width: 360px; padding: 0.3em 0.55em; border: 1px solid #cbd5e1; border-radius: 4px; background: #fff; font-size: 0.78rem; color: #1a1a2e; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; cursor: pointer; } .src-picker:focus { outline: none; border-color: #1e40af; box-shadow: 0 0 0 2px rgba(30, 64, 175, 0.15); } .src-loading { color: #94a3b8; font-style: italic; padding: 1rem; } .src-search { flex: 1 1 200px; min-width: 140px; } .src-search input { width: 100%; padding: 0.3em 0.6em; border: 1px solid #cbd5e1; border-radius: 4px; font-size: 0.8rem; background: #fff; color: #1a1a2e; } .src-search input:focus { outline: none; border-color: #1e40af; box-shadow: 0 0 0 2px rgba(30, 64, 175, 0.15); } .src-actions { display: flex; gap: 0.25rem; flex: 0 0 auto; } .src-actions a, .src-actions button { background: none; border: 1px solid transparent; padding: 0.25em 0.6em; color: #1e40af; font-size: 0.78rem; font-weight: 500; cursor: pointer; text-decoration: none; border-radius: 4px; line-height: 1.4; } .src-actions a:hover, .src-actions button:hover { background: #eef2f7; } .src-actions button.active { background: #dbeafe; border-color: #93c5fd; } .src-actions button:disabled { color: #94a3b8; cursor: not-allowed; } .src-actions button:disabled:hover { background: none; } .src-widget pre[class*="language-"] { margin: 0; padding: 1rem 0; background: #fdfdfd; box-shadow: none; border: none; max-height: 540px; overflow: auto; font-size: 0.82rem; line-height: 1.5; } .src-widget pre[class*="language-"] > code { font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; padding-right: 1rem; } .src-widget pre[class*="language-"]::before, .src-widget pre[class*="language-"]::after { display: none; } .src-widget pre.line-numbers { padding-left: 3.5em; counter-reset: linenumber; position: relative; } .src-widget pre.line-numbers > code { position: relative; white-space: inherit; } .src-widget pre.line-numbers .line-numbers-rows { position: absolute; pointer-events: none; top: 1rem; font-size: 100%; left: -3em; width: 2.7em; letter-spacing: -1px; border-right: 1px solid #e3e7ee; user-select: none; } .src-widget pre.line-numbers .line-numbers-rows > span { display: block; counter-increment: linenumber; } .src-widget pre.line-numbers .line-numbers-rows > span:before { content: counter(linenumber); color: #cbd5e1; display: block; padding-right: 0.7em; text-align: right; font-size: 0.78rem; } .src-widget .token.key, .src-widget .token.property, .src-widget .token.atrule { color: #1e40af; font-weight: 600; } .src-widget .token.string { color: #047857; } .src-widget .token.number, .src-widget .token.boolean, .src-widget .token.null { color: #b45309; } .src-widget .token.comment { color: #94a3b8; font-style: italic; } .src-widget .token.punctuation, .src-widget .token.operator { color: #64748b; } .src-widget .token.tag { color: #7c3aed; } .src-widget .token.anchor, .src-widget .token.alias { color: #be185d; } .src-widget mark.src-hit { background: #fef08a; color: inherit; padding: 0; border-radius: 2px; } .src-widget mark.src-hit-active { background: #fb923c; color: #fff; } .src-copied { color: #047857 !important; } .src-empty { padding: 2rem 1rem; text-align: center; color: #94a3b8; font-size: 0.85rem; } </style> <h3 class="section-title" id="source">Source (apis.yml)</h3> <div class="src-widget" data-src-widget data-original-lang="yaml" data-current-lang="yaml" data-original-filename="apis.yml"> <div class="src-widget-head"> <span class="src-label" data-src-filename>apis.yml</span> <span class="src-search"> <input type="search" data-src-search placeholder="Search in source… (n / N to navigate)" aria-label="Search source"> </span> <span class="src-actions"> <button type="button" data-src-toggle data-target="yaml" aria-label="View as YAML">YAML</button> <button type="button" data-src-toggle data-target="json" aria-label="View as JSON">JSON</button> <button type="button" data-src-download aria-label="Download source">Download</button> <a data-src-raw href="https://raw.githubusercontent.com/api-evangelist/wefitter/refs/heads/main/apis.yml" target="_blank" rel="noopener">Raw ↑</a> <button type="button" data-src-copy>Copy</button> </span> </div> <pre class="line-numbers language-yaml"><code class="language-yaml" data-src-code>x-enrichment: date: '2026-07-21' status: enriched artifacts_added: 16 pass: local-v1 aid: wefitter name: WeFitter description: WeFitter is a health and fitness data platform ("one API to access wearable data, gamification and AI") operated by Thunderbyte.AI in Groningen, Netherlands. Its REST API aggregates health and activity data from 300+ wearables and fitness apps — Fitbit, Garmin, Google Fit, Apple Health, Withings, Polar, Oura, Whoop, Samsung Health, Huawei and more — into a single unified, deduplicated data model, and layers gamification (challenges, leaderboards, teams, points) and AI insights (biological age, recommendations) on top. Organizations use it to build corporate wellbeing, digital fitness, e-health and insurance solutions. WeFitter also ships mobile SDK bridges for Apple Health, Samsung Health and Android Health Connect. deliveryModel: model: saas open_source: false commercial: true callable_host: true label: Hosted service · you call their endpoint confidence: high source: - openapi - pricing generated: '2026-08-28' method: derived accessModel: pricing: unknown onboarding: unknown trial: false try_now: false public: false label: Unknown confidence: low source: - authentication - security generated: '2026-09-03' method: derived image: https://www.wefitter.com/static/frontend/img/website/wefitter.png url: https://raw.githubusercontent.com/api-evangelist/wefitter/refs/heads/main/apis.yml x-type: company x-source: vc-portfolio x-backed-by: - 500-global x-operator: Thunderbyte.AI specificationVersion: '0.23' created: '2026-07-17' modified: '2026-07-21' tags: - Company - Health - Fitness - Wearables - Health Data - Wellbeing - Gamification - Digital Health - Insurance - Activity Tracking apis: - aid: wefitter:wefitter-app-api name: WeFitter app API description: The app API from WeFitter — 1 operation(s) for app. humanURL: https://www.wefitter.com/en-us/developers/ baseURL: https://api.wefitter.com/api/v1.3 tags: - App tags_raw: - app properties: - type: OpenAPI url: openapi/wefitter-app-api-openapi.yml - type: Swagger url: https://api.wefitter.com/api/v1.3/redoc/?format=openapi - type: APIReference url: https://api.wefitter.com/api/v1.3/redoc/ - aid: wefitter:wefitter-challenge-api name: WeFitter challenge API description: "WeFitter API’s challenge engine will bring endless engagement to your platform.\nFor more information about\ \ the possibilities in challenges please go to https://www.wefitter.com/en-us/features/gamification/\n\nChallenges have\ \ multilanguage support on the fields: `Title`, `Slogan`, and `Description`.\nBy default, challenges get the default-language\ \ that is configured in the app. Whenever a challenge is requested through the API this challenge will be presented in\ \ the default language.\nIf another language is preferred, this can be requested by adding the header parameter `Accept-Language`\ \ stating the language short code (ex. `en` for english). If this language short code is not present in the title of the\ \ challenge, the default language will be returned.\n\nThese translation fields contain JSON strings, for example:\n```{\"\ en\":\"this is the English title\",\"nl\":\"this is the Dutch title\"}```\nSo to create a multilanguage challenge, please\ \ provide the title, slogan, and description field as json strings, be aware that because of serialization this should\ \ be formed with backward slashes:\n\n\n<table><tbody>\n <tr><td>\n{\n\n\"title\": \"{\\\"en\\\":\\\"this is the English\ \ title\\\", \\\"nl\\\":\\\"this is the dutch title\\\"}\",\n\n\"slogan\": \"{\\\"en\\\":\\\"this is the English title\\\ \", \\\"nl\\\":\\\"this is the dutch slogan\\\"}\",\n\n\"description\": \"{\\\"en\\\":\\\"this is the English title\\\"\ , \\\"nl\\\":\\\"this is the dutch description\\\"}\",\n\n}\n</td></tr>\n</tbody></table>" humanURL: https://www.wefitter.com/en-us/developers/ baseURL: https://api.wefitter.com/api/v1.3 tags: - Challenge tags_raw: - challenge properties: - type: OpenAPI url: openapi/wefitter-challenge-api-openapi.yml - type: Swagger url: https://api.wefitter.com/api/v1.3/redoc/?format=openapi - type: APIReference url: https://api.wefitter.com/api/v1.3/redoc/ - aid: wefitter:wefitter-connection-api name: WeFitter connection API description: Connections are the links between profiles and their wearables. humanURL: https://www.wefitter.com/en-us/developers/ baseURL: https://api.wefitter.com/api/v1.3 tags: - Connection tags_raw: - connection properties: - type: OpenAPI url: openapi/wefitter-connection-api-openapi.yml - type: Swagger url: https://api.wefitter.com/api/v1.3/redoc/?format=openapi - type: APIReference url: https://api.wefitter.com/api/v1.3/redoc/ - aid: wefitter:wefitter-insights-api name: WeFitter insights API description: The insights API from WeFitter — 1 operation(s) for insights. humanURL: https://www.wefitter.com/en-us/developers/ baseURL: https://api.wefitter.com/api/v1.3 tags: - Insights tags_raw: - insights properties: - type: OpenAPI url: openapi/wefitter-insights-api-openapi.yml - type: Swagger url: https://api.wefitter.com/api/v1.3/redoc/?format=openapi - type: APIReference url: https://api.wefitter.com/api/v1.3/redoc/ - aid: wefitter:wefitter-loyalty-api name: WeFitter loyalty API description: The loyalty API from WeFitter — 2 operation(s) for loyalty. humanURL: https://www.wefitter.com/en-us/developers/ baseURL: https://api.wefitter.com/api/v1.3 tags: - Loyalty tags_raw: - loyalty properties: - type: OpenAPI url: openapi/wefitter-loyalty-api-openapi.yml - type: Swagger url: https://api.wefitter.com/api/v1.3/redoc/?format=openapi - type: APIReference url: https://api.wefitter.com/api/v1.3/redoc/ - aid: wefitter:wefitter-notification-api name: WeFitter notification API description: "Send a notification to all devices for the specified profiles\nThe data will be sent to the client in the\ \ following format:\n```\n{\n \"app\": <app public id>,\n \"title\": <title>,\n \"body\": <body>,\n\ \ \"link\": <optional link>\n}\n```" humanURL: https://www.wefitter.com/en-us/developers/ baseURL: https://api.wefitter.com/api/v1.3 tags: - Notification tags_raw: - notification properties: - type: OpenAPI url: openapi/wefitter-notification-api-openapi.yml - type: Swagger url: https://api.wefitter.com/api/v1.3/redoc/?format=openapi - type: APIReference url: https://api.wefitter.com/api/v1.3/redoc/ - aid: wefitter:wefitter-profile-api name: WeFitter profile API description: 'Profiles are containers for wearables data. The profiles can be seen as an extension of users in a different system. Profiles are anonymous objects which can participate in teams and challenges. Keep in mind, listing profiles and creating profiles need an administrative bearer token, all profile specific actions need a seperate bearer token that is returned after creating a profile. This bearer token is used in place of the administrative bearer token. (see profile create action for more information)' humanURL: https://www.wefitter.com/en-us/developers/ baseURL: https://api.wefitter.com/api/v1.3 tags: - Profile tags_raw: - profile properties: - type: OpenAPI url: openapi/wefitter-profile-api-openapi.yml - type: Swagger url: https://api.wefitter.com/api/v1.3/redoc/?format=openapi - type: APIReference url: https://api.wefitter.com/api/v1.3/redoc/ - aid: wefitter:wefitter-team-api name: WeFitter team API description: The team API from WeFitter — 5 operation(s) for team. humanURL: https://www.wefitter.com/en-us/developers/ baseURL: https://api.wefitter.com/api/v1.3 tags: - Team tags_raw: - team properties: - type: OpenAPI url: openapi/wefitter-team-api-openapi.yml - type: Swagger url: https://api.wefitter.com/api/v1.3/redoc/?format=openapi - type: APIReference url: https://api.wefitter.com/api/v1.3/redoc/ - aid: wefitter:wefitter-token-api name: WeFitter token API description: '<p> Before any calls can be made to wefitter, BasicAuth is needed to verify the identity of the requesting party. This call will result into a Bearer token which has administrator privileges and is valid for 1 day. This token can be used to create profiles, challenges, etc. </p> <p> The returned bearer is a JWT (<a href="https://en.wikipedia.org/wiki/JSON_Web_Token">JSON Web Token</a>). </p>' humanURL: https://www.wefitter.com/en-us/developers/ baseURL: https://api.wefitter.com/api/v1.3 tags: - Token tags_raw: - token properties: - type: OpenAPI url: openapi/wefitter-token-api-openapi.yml - type: Swagger url: https://api.wefitter.com/api/v1.3/redoc/?format=openapi - type: APIReference url: https://api.wefitter.com/api/v1.3/redoc/ maintainers: - FN: Kin Lane email: kin@apievangelist.com - FN: APIs.json email: info@apis.io common: - type: DeveloperPortal url: https://www.wefitter.com/en-us/developers/ - type: Documentation url: https://www.wefitter.com/en-us/developers/documentation/ - type: GettingStarted url: https://www.wefitter.com/en-us/developers/getting-started/ - type: APIReference url: https://api.wefitter.com/api/v1.3/redoc/ - type: Guides url: https://www.wefitter.com/en-us/developers/guides/ - type: Support url: https://developers.wefitter.com/support - type: Blog url: https://www.wefitter.com/en-us/resources/blog/ - type: ChangeLog url: https://www.wefitter.com/en-us/developers/changelog/ - type: GitHubOrganization url: https://github.com/wefitter - type: SignUp url: https://api.wefitter.com/dashboard - type: TermsOfService url: https://www.wefitter.com/en-us/terms-and-conditions/ - type: PrivacyPolicy url: https://www.wefitter.com/en-us/privacy-policy/ - type: OpenAPI url: openapi/_original/wefitter-openapi-original.json - type: Overlay url: overlays/wefitter-openapi-overlay.yaml - type: Packages url: packages/wefitter-packages.yml - type: SDKs url: packages/wefitter-packages.yml - type: X-MCPServerCandidate url: mcp/wefitter-mcp.yml note: 'Renamed from MCPServer 2026-09-03 (roadmap#247): the manifest self-describes as status: candidate — a tool list derived from the published API contracts, not an existing server. The scorer already read the manifest and reported mcp_server correctly; the MCPServer type was crediting the artifact-type surfaces with a server that does not exist.' - type: LLMsTxt url: llms/wefitter-llms.txt - type: Conformance url: conformance/wefitter-conformance.yml - type: ErrorCatalog url: errors/wefitter-problem-types.yml - type: Lifecycle url: lifecycle/wefitter-lifecycle.yml - type: ChangeLog url: changelog/wefitter-changelog.yml - type: Conventions url: conventions/wefitter-conventions.yml - type: DataModel url: data-model/wefitter-data-model.yml - type: Webhooks url: asyncapi/wefitter-webhooks.yml - type: Components url: components/wefitter-components.yml - type: AgentSkill url: skills/_index.yml - type: DomainSecurity url: security/wefitter-domain-security.yml - type: AgenticAccess url: agentic-access/wefitter-agentic-access.yml - type: Authentication url: authentication/wefitter-authentication.yml - type: Website url: https://wefitter.com </code></pre> </div> <script src="/assets/prism/prism-core.min.js" defer></script> <script src="/assets/prism/prism-yaml.min.js" defer></script> <script src="/assets/prism/prism-json.min.js" defer></script> <script src="/assets/prism/prism-line-numbers.min.js" defer></script> <script src="/assets/prism/js-yaml.min.js" defer></script> <script> (function () { if (window.__srcWidgetInit) return; window.__srcWidgetInit = true; function initWidget(widget) { var codeEl = widget.querySelector('[data-src-code]'); var preEl = widget.querySelector('pre'); var search = widget.querySelector('[data-src-search]'); var toggles = widget.querySelectorAll('[data-src-toggle]'); var downloadBtn = widget.querySelector('[data-src-download]'); var copyBtn = widget.querySelector('[data-src-copy]'); var fileLabel = widget.querySelector('[data-src-filename]'); var picker = widget.querySelector('[data-src-picker]'); var rawLink = widget.querySelector('[data-src-raw]'); var headingEl = widget.previousElementSibling && widget.previousElementSibling.tagName === 'H3' ? widget.previousElementSibling : null; var fetchedCache = {}; // Original raw text — we always re-render from this so toggles + searches don't compound. var originalLang = widget.dataset.originalLang; var originalText = codeEl.textContent; var originalFilename = widget.dataset.originalFilename; var currentLang = originalLang; var currentText = originalText; var searchHits = []; var activeHit = -1; function highlight() { if (window.Prism) window.Prism.highlightElement(codeEl); } function setActiveToggle() { toggles.forEach(function (b) { if (b.dataset.target === currentLang) b.classList.add('active'); else b.classList.remove('active'); }); } function updateFilenameForLang() { if (!fileLabel) return; var base = (currentSourceFilename || originalFilename).replace(/\.(ya?ml|json)$/i, ''); fileLabel.textContent = base + '.' + currentLang; } var currentSourceFilename = originalFilename; var currentSourceUrl = null; if (rawLink) currentSourceUrl = rawLink.getAttribute('href'); function setLangContent(lang, text) { currentLang = lang; currentText = text; codeEl.textContent = text; codeEl.className = 'language-' + lang; preEl.className = 'line-numbers language-' + lang; highlight(); setActiveToggle(); updateFilenameForLang(); runSearch(); } function tryConvert(targetLang) { if (targetLang === currentLang) return; if (!window.jsyaml) return; try { var parsed; if (currentLang === 'yaml') parsed = window.jsyaml.load(currentText); else parsed = JSON.parse(currentText); var out; if (targetLang === 'yaml') { out = window.jsyaml.dump(parsed, { indent: 2, lineWidth: 100, noRefs: true }); } else { out = JSON.stringify(parsed, null, 2); } setLangContent(targetLang, out); } catch (err) { alert('Cannot convert: source is not valid ' + currentLang.toUpperCase() + '.\n' + err.message); } } // ---- Search highlighting (DOM walker over text nodes inside <code>) ---- function clearSearch() { widget.querySelectorAll('mark.src-hit').forEach(function (m) { var parent = m.parentNode; while (m.firstChild) parent.insertBefore(m.firstChild, m); parent.removeChild(m); parent.normalize(); }); searchHits = []; activeHit = -1; } function runSearch() { clearSearch(); var q = (search.value || '').trim(); if (q.length < 2) return; var qLower = q.toLowerCase(); var walker = document.createTreeWalker(codeEl, NodeFilter.SHOW_TEXT, null); var nodes = []; var n; while ((n = walker.nextNode())) nodes.push(n); nodes.forEach(function (node) { var text = node.nodeValue; var lower = text.toLowerCase(); var idx = lower.indexOf(qLower); if (idx === -1) return; var frag = document.createDocumentFragment(); var cursor = 0; while (idx !== -1) { if (idx > cursor) frag.appendChild(document.createTextNode(text.slice(cursor, idx))); var mark = document.createElement('mark'); mark.className = 'src-hit'; mark.textContent = text.slice(idx, idx + q.length); frag.appendChild(mark); searchHits.push(mark); cursor = idx + q.length; idx = lower.indexOf(qLower, cursor); } if (cursor < text.length) frag.appendChild(document.createTextNode(text.slice(cursor))); node.parentNode.replaceChild(frag, node); }); if (searchHits.length) jumpToHit(0); } function jumpToHit(i) { if (!searchHits.length) return; if (activeHit >= 0 && searchHits[activeHit]) searchHits[activeHit].classList.remove('src-hit-active'); activeHit = ((i % searchHits.length) + searchHits.length) % searchHits.length; var el = searchHits[activeHit]; el.classList.add('src-hit-active'); el.scrollIntoView({ block: 'center', behavior: 'smooth' }); } // ---- Wire up ---- var debounce; search.addEventListener('input', function () { clearTimeout(debounce); debounce = setTimeout(runSearch, 100); }); search.addEventListener('keydown', function (ev) { if (ev.key === 'Enter' || ev.key === 'n') { ev.preventDefault(); jumpToHit(activeHit + 1); } else if (ev.key === 'N' || (ev.key === 'p')) { ev.preventDefault(); jumpToHit(activeHit - 1); } else if (ev.key === 'Escape') { search.value = ''; runSearch(); } }); toggles.forEach(function (b) { b.addEventListener('click', function () { tryConvert(b.dataset.target); }); }); downloadBtn.addEventListener('click', function () { var blob = new Blob([codeEl.textContent], { type: currentLang === 'json' ? 'application/json' : 'application/yaml' }); var url = URL.createObjectURL(blob); var a = document.createElement('a'); a.href = url; a.download = fileLabel.textContent; document.body.appendChild(a); a.click(); document.body.removeChild(a); setTimeout(function () { URL.revokeObjectURL(url); }, 0); }); copyBtn.addEventListener('click', function () { navigator.clipboard.writeText(codeEl.textContent).then(function () { var orig = copyBtn.textContent; copyBtn.textContent = 'Copied'; copyBtn.classList.add('src-copied'); setTimeout(function () { copyBtn.textContent = orig; copyBtn.classList.remove('src-copied'); }, 1500); }); }); // ---- Picker (provider pages with multiple specs) ---- function applySource(text, lang, filename, url, heading) { currentSourceFilename = filename || originalFilename; currentSourceUrl = url || null; if (rawLink) { if (url) { rawLink.setAttribute('href', url); rawLink.style.display = ''; } else { rawLink.style.display = 'none'; } } if (headingEl && heading) headingEl.textContent = heading; setLangContent(lang, text); } if (picker) { picker.addEventListener('change', function () { var opt = picker.options[picker.selectedIndex]; var url = opt.dataset.url; var fmt = opt.dataset.format || 'yaml'; var fname = opt.dataset.filename || ''; var heading = opt.dataset.heading || ''; if (!url) { // Original embedded source applySource(originalText, originalLang, originalFilename, picker.options[0].dataset.url || null, picker.options[0].dataset.heading || ''); return; } if (fetchedCache[url]) { applySource(fetchedCache[url], fmt, fname, url, heading); return; } codeEl.textContent = 'Loading ' + fname + '…'; codeEl.className = ''; preEl.className = ''; fetch(url).then(function (r) { if (!r.ok) throw new Error('HTTP ' + r.status); return r.text(); }).then(function (text) { fetchedCache[url] = text; applySource(text, fmt, fname, url, heading); }).catch(function (err) { codeEl.textContent = 'Could not load: ' + err.message; }); }); // Stash the default option's url so we can restore "Raw" link when reset. if (rawLink && picker.options[0]) { picker.options[0].dataset.url = rawLink.getAttribute('href') || ''; picker.options[0].dataset.heading = (headingEl ? headingEl.textContent : '') || ''; } } // Auto-fetch when initial source is empty but a remote URL is available. // This happens when the build found an external OpenAPI URL but didn't // inline the content — the widget fetches it on page load instead. if (!originalText.trim() && currentSourceUrl) { var remoteUrl = currentSourceUrl; codeEl.textContent = 'Loading…'; codeEl.className = ''; preEl.className = 'line-numbers language-' + originalLang; fetch(remoteUrl) .then(function (r) { if (!r.ok) throw new Error('HTTP ' + r.status); return r.text(); }) .then(function (text) { var ext = remoteUrl.replace(/\?.*/, '').split('.').pop().toLowerCase(); var fmt = ext === 'json' ? 'json' : 'yaml'; originalText = text; originalLang = fmt; currentLang = fmt; widget.dataset.originalLang = fmt; applySource(text, fmt, originalFilename, remoteUrl, headingEl ? headingEl.textContent : ''); }) .catch(function (err) { codeEl.textContent = 'Could not load spec: ' + err.message; }); } // Initial state setActiveToggle(); // Wait for Prism to load before highlighting / line-numbers wiring. var tries = 0; var waitPrism = setInterval(function () { if (window.Prism && window.Prism.plugins) { clearInterval(waitPrism); highlight(); } else if (++tries > 80) { clearInterval(waitPrism); } }, 50); } function initAll() { document.querySelectorAll('[data-src-widget]').forEach(initWidget); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initAll); } else { initAll(); } })(); </script> <style> /* One row of options, not four stacked blocks. align-items:start so opening a <details> grows only its own card instead of stretching every sibling. */ .apimcp-bar { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 0.75rem; margin: 1rem 0 0; } /* flex over a fixed 4-column grid: two of the four cards are conditional, and a grid would leave a hole in the row on the sections that render three or two. */ .apimcp-card { flex: 1 1 220px; min-width: 0; background: #fff; border: 1px solid #e3e7ee; border-left: 3px solid var(--apimcp-accent, #6c757d); border-radius: 10px; padding: 0.9rem 1rem; } .apimcp-card h4 { font-size: 0.9rem; font-weight: 700; color: #1a1a2e; margin: 0 0 0.35rem; } .apimcp-card p { font-size: 0.78rem; line-height: 1.4; color: #6c757d; margin: 0; } .apimcp-card p + p, .apimcp-card > * + p { margin-top: 0.5rem; } .apimcp-card code { font-size: 0.72rem; word-break: break-all; } .apimcp-card summary { font-size: 0.78rem; color: #0d6efd; font-weight: 600; cursor: pointer; } .apimcp-card summary:hover { text-decoration: underline; } .apimcp-card details { margin-top: 0.15rem; } .apimcp-card ul { list-style: none; padding: 0; margin: 0.5rem 0 0; font-size: 0.78rem; } .apimcp-card ul li { margin-bottom: 0.5rem; } .apimcp-card ul li span { display: block; color: #6c757d; } .apimcp-card pre { background: #f6f8fa; border: 1px solid #e3e7ee; border-radius: 6px; padding: 0.5rem; margin: 0; white-space: pre-wrap; word-break: break-all; } .apimcp-curl { margin-top: 0.6rem; } .apimcp-curl .apimcp-label { display: block; font-size: 0.72rem; color: #6c757d; margin-bottom: 0.25rem; } .apimcp-link { display: inline-block; margin-top: 0.55rem; font-size: 0.78rem; font-weight: 600; color: #0d6efd; text-decoration: none; } .apimcp-link:hover { text-decoration: underline; } /* Three auth providers side by side keeps this card the same height as the others; stacked buttons were what made the row ragged. */ .apimcp-auth { display: flex; gap: 0.4rem; margin-top: 0.15rem; } .apimcp-auth a { flex: 1 1 0; min-width: 0; display: inline-flex; align-items: center; justify-content: center; gap: 0.3rem; padding: 0.35rem 0.4rem; border: 1px solid #d7dce5; border-radius: 6px; background: #fff; color: #4a5568; font-size: 0.72rem; font-weight: 600; text-decoration: none; } .apimcp-auth a:hover { border-color: #0d6efd; color: #0d6efd; } .apimcp-auth svg { flex: none; } @media (max-width: 575.98px) { .apimcp-card { flex-basis: 100%; } } </style> <h2 class="section-anchor" id="api-mcp"><a href="#api-mcp">Work with this as data</a></h2> <p class="section-blurb"> Every provider here is available over the APIs.io API and to AI agents over MCP.</p> <div class="apimcp-bar"> <div class="apimcp-card" style="--apimcp-accent: #3098d8;"> <h4>MCP server</h4> <p>One button, every client — Claude, Cursor, VS Code and the rest.</p> <script src="https://install.apicommons.org/button.js" async></script> <mcp-install-button server="https://apis.io/server.json" label="Install the MCP server" color="#3098d8"></mcp-install-button> <p><code>https://apis.io/mcp</code></p> </div> <div class="apimcp-card" style="--apimcp-accent: #6d28d9;"> <h4>Tools for providers</h4> <details> <summary>9 MCP tools reach this</summary> <ul> <li><code>find_providers</code><span>Browse and filter every provider in the catalog.</span></li> <li><code>get_provider_artifacts</code><span>Every artifact this provider publishes, grouped by type.</span></li> <li><code>get_provider_operations</code><span>Every operation across all of their OpenAPIs — one call instead of parsing every spec.</span></li> <li><code>get_provider_tools</code><span>Every MCP tool they ship, with the operation each wraps.</span></li> <li><code>get_provider_evidence</code><span>How each part of their score was established. Free — the basis for a claim should not sit behind it.</span></li> <li><code>get_provider_rating</code><span>PRO — composite, band, trend and facet scores.</span></li> <li><code>apis_io_search</code><span>START HERE — APIs, providers and tags for one query, each with its total.</span></li> <li><code>resolve</code><span>Turn a domain, URL or GitHub org into the provider it belongs to.</span></li> <li><code>find_cohorts</code><span>Every scored population of providers in the catalog.</span></li> </ul> </details> <a href="https://apis.io/developer/mcp-server/" class="apimcp-link">All 92 tools →</a> </div> <div class="apimcp-card" style="--apimcp-accent: #198754;"> <h4>Call it yourself</h4> <details> <summary>curl for this page</summary> <div class="apimcp-curl"> <span class="apimcp-label">This provider</span> <pre><code>curl "https://apis.io/api/v1/providers/wefitter"</code></pre> </div> <div class="apimcp-curl"> <span class="apimcp-label">All providers</span> <pre><code>curl "https://apis.io/api/v1/providers?limit=25"</code></pre> </div> <div class="apimcp-curl"> <span class="apimcp-label">Every operation they expose</span> <pre><code>curl "https://apis.io/api/v1/providers/wefitter/operations?limit=25"</code></pre> </div> <div class="apimcp-curl"> <span class="apimcp-label">How their score was established</span> <pre><code>curl "https://apis.io/api/v1/providers/wefitter/evidence"</code></pre> </div> </details> <p>Discovery needs no key. Ratings and market analysis are Pro.</p> </div><div class="apimcp-card" style="--apimcp-accent: #6c757d;"> <h4>Get an API key</h4> <!-- roadmap#272 — this said "no email required". The intent was "no form to fill in"; what it told a data subject AT THE MOMENT OF COLLECTION was that no email is collected. The callback stores one on every account it creates (auth/index.mjs) and indexes it in the EmailIndex GSI, and a verified email is what joins a second provider to an existing account. The copy has to say what the code does. --> <p>Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our <a href="/privacy/">Privacy Policy</a> and <a href="/terms/">Terms</a>.</p> <div class="apimcp-auth"> <a href="https://apis.io/api/v1/auth/login?provider=github"> <svg viewBox="0 0 16 16" width="14" height="14" fill="currentColor" aria-hidden="true"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8Z"/></svg> <span>GitHub</span> </a> <a href="https://apis.io/api/v1/auth/login?provider=google"> <svg viewBox="0 0 18 18" width="14" height="14" aria-hidden="true"><path fill="#4285F4" d="M17.64 9.2c0-.64-.06-1.25-.16-1.84H9v3.48h4.84a4.14 4.14 0 0 1-1.8 2.72v2.26h2.92c1.7-1.57 2.68-3.88 2.68-6.62Z"/><path fill="#34A853" d="M9 18c2.43 0 4.47-.8 5.96-2.18l-2.92-2.26c-.81.54-1.84.86-3.04.86-2.34 0-4.32-1.58-5.03-3.7H.96v2.33A9 9 0 0 0 9 18Z"/><path fill="#FBBC05" d="M3.97 10.72a5.41 5.41 0 0 1 0-3.44V4.95H.96a9 9 0 0 0 0 8.1l3.01-2.33Z"/><path fill="#EA4335" d="M9 3.58c1.32 0 2.5.45 3.44 1.35l2.58-2.58C13.46.89 11.43 0 9 0A9 9 0 0 0 .96 4.95l3.01 2.33C4.68 5.16 6.66 3.58 9 3.58Z"/></svg> <span>Google</span> </a> <a href="https://apis.io/api/v1/auth/login?provider=linkedin"> <svg viewBox="0 0 24 24" width="14" height="14" fill="#0A66C2" aria-hidden="true"><path d="M20.45 20.45h-3.56v-5.57c0-1.33-.03-3.04-1.85-3.04-1.85 0-2.14 1.45-2.14 2.94v5.67H9.35V9h3.41v1.56h.05c.48-.9 1.63-1.85 3.36-1.85 3.6 0 4.27 2.37 4.27 5.45v6.29ZM5.34 7.43a2.06 2.06 0 1 1 0-4.13 2.06 2.06 0 0 1 0 4.13ZM7.12 20.45H3.55V9h3.57v11.45ZM22.22 0H1.77C.79 0 0 .77 0 1.72v20.56C0 23.23.79 24 1.77 24h20.45c.98 0 1.78-.77 1.78-1.72V1.72C24 .77 23.2 0 22.22 0Z"/></svg> <span>LinkedIn</span> </a> </div> <p>A second provider on the same verified email joins the account you already have.</p> </div> </div> <script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Organization", "name": "WeFitter", "description": "WeFitter is a health and fitness data platform (\"one API to access wearable data, gamification and AI\") operated by Thunderbyte.AI in Groningen, Netherlands. Its REST API aggregates health and activity data from 300+ wearables and fitness apps — Fitbit, Garmin, Google Fit, Apple Health, Withings, Polar, Oura, Whoop, Samsung Health, Huawei and more — into a single unified, deduplicated data model, and layers gamification (challenges, leaderboards, teams, points) and AI insights (biological age, recommendations) on top. Organizations use it to build corporate wellbeing, digital fitness, e-health and insurance solutions. WeFitter also ships mobile SDK bridges for Apple Health, Samsung Health and Android Health Connect.", "logo": "https://www.wefitter.com/static/frontend/img/website/wefitter.png", "keywords": "Company, Health, Fitness, Wearables, Health Data, Wellbeing, Gamification, Digital Health, Insurance, Activity Tracking" } </script> <script type="application/ld+json"> { "@context": "https://schema.org", "@type": "BreadcrumbList", "itemListElement": [ { "@type": "ListItem", "position": 1, "name": "Home", "item": "https://apis.io/" }, { "@type": "ListItem", "position": 2, "name": "Providers", "item": "https://apis.io/providers/" }, { "@type": "ListItem", "position": 3, "name": "WeFitter" } ] } </script> </main> <footer class="footer"> <div class="container"><div class="footer-grid"><div class="footer-col"> <h6 class="footer-col-title">Catalog</h6> <ul class="footer-col-list"><li><a href="https://apis.io/providers/">Providers</a></li><li><a href="https://apis.io/apis/">APIs</a></li><li><a href="https://apis.io/tags/">Tags</a></li><li><a href="https://apis.io/industries/">Industries</a></li><li><a href="https://apis.io/areas/">Areas</a></li><li><a href="https://apis.io/regions/">Regions</a></li><li><a href="https://apis.io/countries/">Countries</a></li><li><a href="https://apis.io/vcs/">Venture Capital</a></li><li><a href="https://apis.io/secondary-market/">Secondary Market</a></li><li><a href="https://apis.io/estates/">API Estates</a></li><li><a href="https://apis.io/capabilities/">Business Capabilities</a></li></ul> </div><div class="footer-col"> <h6 class="footer-col-title">Artifacts</h6> <ul class="footer-col-list"><li><a href="https://apis.io/capabilities/">Business Capabilities</a></li><li><a href="https://apis.io/extensions/">OpenAPI Extensions</a></li><li><a href="https://apis.io/headers/">HTTP Headers</a></li><li><a href="https://apis.io/schemas/">Schemas</a></li><li><a href="https://apis.io/examples/">Examples</a></li><li><a href="https://apis.io/json-structure/">JSON Structure</a></li><li><a href="https://apis.io/collections/">Collections</a></li><li><a href="https://apis.io/arazzos/">Arazzo Workflows</a></li><li><a href="https://apis.io/servers/">MCP Servers</a></li><li><a href="https://apis.io/a2a/">A2A Agent Cards</a></li><li><a href="https://apis.io/ard/">Agent Discovery</a></li><li><a href="https://apis.io/agent-skills/">Agent Skills</a></li></ul> </div><div class="footer-col"> <h6 class="footer-col-title">Signals</h6> <ul class="footer-col-list"><li><a href="https://apis.io/rating/">Kin Score</a></li><li><a href="https://apis.io/security/">Security Posture</a></li><li><a href="https://apis.io/scopes/">OAuth Scopes</a></li><li><a href="https://apis.io/agentic-access/">Agentic Access</a></li><li><a href="https://apis.io/plans/">Plans</a></li><li><a href="https://apis.io/rate-limits/">Rate Limits</a></li><li><a href="https://apis.io/finops/">FinOps</a></li></ul> </div><div class="footer-col"> <h6 class="footer-col-title">Platform</h6> <ul class="footer-col-list"><li><a href="https://apis.io/developer/">Developer Docs</a></li><li><a href="https://apis.io/onboarding/">Onboarding</a></li><li><a href="https://apis.io/unlock/">Data Access</a></li><li><a href="https://apis.io/analytics/">Analytics</a></li><li><a href="https://apis.io/search-terms/">Search Terms</a></li><li><a href="https://apis.io/model-visibility/">Model Visibility</a></li><li><a href="https://apis.io/changelog/">Changelog</a></li></ul> </div><div class="footer-col"> <h6 class="footer-col-title">APIs.io</h6> <ul class="footer-col-list"><li><a href="https://apis.io/about/">About</a></li><li><a href="https://apis.io/blog/">Blog</a></li><li><a href="https://usecommune.com/n/apisio">Newsletter</a></li><li><a href="https://apis.io/add/">Add Your API</a></li><li><a href="https://apis.io/support/">Support</a></li><li><a href="https://github.com/api-search">GitHub</a></li></ul> </div></div><div class="footer-bar"> <span class="footer-copy">© APIs.io</span> <div class="footer-legal"><a href="http://apisjson.org">APIs.json</a><a href="http://apicommons.org">API Commons</a><a href="https://apievangelist.com">API Evangelist</a><a href="https://apis.io/terms/">Terms</a><a href="https://apis.io/privacy/">Privacy</a></div> </div> </div> </footer> <script src="/assets/js/kin-glyph.js"></script> </body> </html>