diff --git a/services/tokei/tokei.service.js b/services/tokei/tokei.service.js
index e714c611e4b210c841e0830c54f32185af9eb3ba..cff5049b9b052da57d8c3817b9dc6ae43044b09d 100644
--- a/services/tokei/tokei.service.js
+++ b/services/tokei/tokei.service.js
@@ -1,84 +1,11 @@
-import Joi from 'joi'
-import { metric } from '../text-formatters.js'
-import { nonNegativeInteger } from '../validators.js'
-import { BaseJsonService, pathParams } from '../index.js'
-
-const schema = Joi.object({
-  lines: nonNegativeInteger,
-}).required()
-
-const description = `
-The \`provider\` is the domain name of git host.
-If no TLD is provided, \`.com\` will be added.
-For example, setting \`gitlab\` or \`bitbucket.org\` as the
-provider also works.
-
-Tokei will automatically count all files with a recognized extension. It will
-automatically ignore files and folders in \`.ignore\` files. If you
-want to ignore files or folders specifically for tokei, add them to the
-\`.tokeignore\` in the root of your repository. See
-[https://github.com/XAMPPRocky/tokei#excluding-folders](https://github.com/XAMPPRocky/tokei#excluding-folders)
-for more info.
-`
-
-export default class Tokei extends BaseJsonService {
-  static category = 'size'
-
-  static route = { base: 'tokei/lines', pattern: ':provider/:user/:repo' }
-
-  static openApi = {
-    '/tokei/lines/{provider}/{user}/{repo}': {
-      get: {
-        summary: 'Lines of code',
-        description,
-        parameters: pathParams(
-          {
-            name: 'provider',
-            example: 'github',
-          },
-          {
-            name: 'user',
-            example: 'badges',
-          },
-          {
-            name: 'repo',
-            example: 'shields',
-          },
-        ),
-      },
-    },
-  }
-
-  static defaultBadgeData = {
-    label: 'total lines',
-    color: 'blue',
-  }
-
-  static render({ lines }) {
-    return { message: metric(lines) }
-  }
-
-  async fetch({ provider, user, repo }) {
-    // This request uses the tokei-rs (https://github.com/XAMPPRocky/tokei_rs) API.
-    //
-    // By default, the API returns an svg, but when the Accept HTTP header is set to
-    // `application/json`, it sends json data. The `_requestJson` method
-    // automatically sets the Accept Header to what we need, so we don't need to
-    // specify it here.
-    //
-    // This behaviour of the API is "documented" here:
-    // https://github.com/XAMPPRocky/tokei_rs/issues/8#issuecomment-475071147
-    return this._requestJson({
-      schema,
-      url: `https://tokei.rs/b1/${provider}/${user}/${repo}`,
-      httpErrors: {
-        400: 'repo not found',
-      },
-    })
-  }
-
-  async handle({ provider, user, repo }) {
-    const { lines } = await this.fetch({ provider, user, repo })
-    return this.constructor.render({ lines })
-  }
-}
+import { deprecatedService } from '../index.js'
+
+export const Tokei = deprecatedService({
+  category: 'size',
+  route: {
+    base: 'tokei/lines',
+    pattern: ':various*',
+  },
+  label: 'tokei',
+  dateAdded: new Date('2023-09-17'),
+})
diff --git a/services/tokei/tokei.tester.js b/services/tokei/tokei.tester.js
index 5c4bb6adbf64f84e9dd81767c212f1f7d2a8c15a..faf157b0a5cbbddb8473fcae4dc0fc751bade3c3 100644
--- a/services/tokei/tokei.tester.js
+++ b/services/tokei/tokei.tester.js
@@ -1,30 +1,11 @@
 import { ServiceTester } from '../tester.js'
-import { isMetric } from '../test-validators.js'
 
 export const t = new ServiceTester({ id: 'tokei', title: 'Tokei LOC Tests' })
 
 t.create('GitHub LOC')
   .get('/lines/github/badges/shields.json')
-  .expectBadge({ label: 'total lines', message: isMetric })
-
-t.create('GitLab LOC')
-  .get('/lines/gitlab/shields-ops-group/tag-test.json')
-  .timeout(15000)
-  .expectBadge({ label: 'total lines', message: isMetric })
-
-t.create('GitHub LOC (with .com)')
-  .get('/lines/github.com/badges/shields.json')
-  .expectBadge({ label: 'total lines', message: isMetric })
-
-t.create('GitLab LOC (with .com)')
-  .get('/lines/gitlab.com/shields-ops-group/tag-test.json')
-  .timeout(15000)
-  .expectBadge({ label: 'total lines', message: isMetric })
+  .expectBadge({ label: 'tokei', message: 'no longer available' })
 
 t.create('BitBucket LOC')
   .get('/lines/bitbucket.org/MonliH/tokei-shields-test.json')
-  .expectBadge({ label: 'total lines', message: isMetric })
-
-t.create('Invalid Provider')
-  .get('/lines/example/tezos/tezos.json')
-  .expectBadge({ label: 'total lines', message: 'repo not found' })
+  .expectBadge({ label: 'tokei', message: 'no longer available' })