diff --git a/services/amo/amo-base.js b/services/amo/amo-base.js
index d24f44e63a9163ccf952b5240b4a11bf5cf9a0e7..36771f8a6ea92d7e93ad46348db1ae7ace13232b 100644
--- a/services/amo/amo-base.js
+++ b/services/amo/amo-base.js
@@ -2,7 +2,8 @@ import Joi from 'joi'
 import { nonNegativeInteger } from '../validators.js'
 import { BaseJsonService } from '../index.js'
 
-const keywords = ['amo', 'firefox']
+const description =
+  '[addons.mozilla.org](https://addons.mozilla.org) (AMO) publishes extensions for Mozilla Firefox'
 
 const schema = Joi.object({
   average_daily_users: nonNegativeInteger,
@@ -26,4 +27,4 @@ class BaseAmoService extends BaseJsonService {
   }
 }
 
-export { BaseAmoService, keywords }
+export { BaseAmoService, description }
diff --git a/services/amo/amo-downloads.service.js b/services/amo/amo-downloads.service.js
index d8ca97447c50d82edc22762d917e049e3e65824c..1459a0a72a25b072ac4996d5ce866a17dd96ab86 100644
--- a/services/amo/amo-downloads.service.js
+++ b/services/amo/amo-downloads.service.js
@@ -1,8 +1,9 @@
 import { renderDownloadsBadge } from '../downloads.js'
 import { redirector, pathParams } from '../index.js'
-import { BaseAmoService } from './amo-base.js'
+import { BaseAmoService, description as baseDescription } from './amo-base.js'
+
+const description = `${baseDescription}
 
-const description = `
 Previously \`amo/d\` provided a “total downloads” badge. However,
 [updates to the v3 API](https://github.com/badges/shields/issues/3079)
 only give us weekly downloads. The route \`amo/d\` redirects to \`amo/dw\`.
diff --git a/services/amo/amo-rating.service.js b/services/amo/amo-rating.service.js
index 5930c1dd0f38be70d32eb776349d2b04bc2ee471..2569881c169ea5b55207757bb73b658aeb7350b4 100644
--- a/services/amo/amo-rating.service.js
+++ b/services/amo/amo-rating.service.js
@@ -1,7 +1,7 @@
 import { starRating } from '../text-formatters.js'
 import { floorCount as floorCountColor } from '../color-formatters.js'
 import { pathParams } from '../index.js'
-import { BaseAmoService } from './amo-base.js'
+import { BaseAmoService, description } from './amo-base.js'
 
 export default class AmoRating extends BaseAmoService {
   static category = 'rating'
@@ -11,12 +11,14 @@ export default class AmoRating extends BaseAmoService {
     '/amo/rating/{addonId}': {
       get: {
         summary: 'Mozilla Add-on Rating',
+        description,
         parameters: pathParams({ name: 'addonId', example: 'dustman' }),
       },
     },
     '/amo/stars/{addonId}': {
       get: {
         summary: 'Mozilla Add-on Stars',
+        description,
         parameters: pathParams({ name: 'addonId', example: 'dustman' }),
       },
     },
diff --git a/services/amo/amo-users.service.js b/services/amo/amo-users.service.js
index 0a4b4be526dd7db6e760838d3357963207f6212c..cd850b2b597bd8ccf0d0765ca7aa41bf2f9d5af1 100644
--- a/services/amo/amo-users.service.js
+++ b/services/amo/amo-users.service.js
@@ -1,6 +1,6 @@
 import { renderDownloadsBadge } from '../downloads.js'
 import { pathParams } from '../index.js'
-import { BaseAmoService } from './amo-base.js'
+import { BaseAmoService, description } from './amo-base.js'
 
 export default class AmoUsers extends BaseAmoService {
   static category = 'downloads'
@@ -10,6 +10,7 @@ export default class AmoUsers extends BaseAmoService {
     '/amo/users/{addonId}': {
       get: {
         summary: 'Mozilla Add-on Users',
+        description,
         parameters: pathParams({ name: 'addonId', example: 'dustman' }),
       },
     },
diff --git a/services/amo/amo-version.service.js b/services/amo/amo-version.service.js
index 219692437d0d4c29b2f32b282cddee1ecea4b3a5..50f74f8c5b28fc62ebf5089fc5847698841d59f9 100644
--- a/services/amo/amo-version.service.js
+++ b/services/amo/amo-version.service.js
@@ -1,6 +1,6 @@
 import { renderVersionBadge } from '../version.js'
 import { pathParams } from '../index.js'
-import { BaseAmoService } from './amo-base.js'
+import { BaseAmoService, description } from './amo-base.js'
 
 export default class AmoVersion extends BaseAmoService {
   static category = 'version'
@@ -10,6 +10,7 @@ export default class AmoVersion extends BaseAmoService {
     '/amo/v/{addonId}': {
       get: {
         summary: 'Mozilla Add-on Version',
+        description,
         parameters: pathParams({ name: 'addonId', example: 'dustman' }),
       },
     },
diff --git a/services/bit/bit-components.service.js b/services/bit/bit-components.service.js
index 7b40a08e4ede7f38e523f542eaa58b692cfcf786..683882da9cbf4f9d56a3c1a5af4123ecc2938ded 100644
--- a/services/bit/bit-components.service.js
+++ b/services/bit/bit-components.service.js
@@ -20,7 +20,7 @@ export default class BitComponents extends BaseJsonService {
   static openApi = {
     '/bit/collection/total-components/{owner}/{collection}': {
       get: {
-        summary: 'Bit',
+        summary: 'Bit Components',
         parameters: pathParams(
           {
             name: 'owner',
diff --git a/services/coincap/coincap-base.js b/services/coincap/coincap-base.js
index d602fb252954e416211cb211973ca466a7767205..b8e65810734829a3294daec660afb13d0b48f05d 100644
--- a/services/coincap/coincap-base.js
+++ b/services/coincap/coincap-base.js
@@ -1,5 +1,8 @@
 import { BaseJsonService } from '../index.js'
 
+const description =
+  '[Coincap](https://coincap.io/) is a cryptocurrency exchange'
+
 export default class BaseCoincapService extends BaseJsonService {
   static category = 'other'
 
@@ -19,4 +22,4 @@ export default class BaseCoincapService extends BaseJsonService {
   }
 }
 
-export { BaseCoincapService }
+export { BaseCoincapService, description }
diff --git a/services/coincap/coincap-changepercent24hr.service.js b/services/coincap/coincap-changepercent24hr.service.js
index 2906cc76349439495dce01a1bf113742333dee02..6cb5a19b8615284af8a35d21116088ed510c2b9a 100644
--- a/services/coincap/coincap-changepercent24hr.service.js
+++ b/services/coincap/coincap-changepercent24hr.service.js
@@ -1,7 +1,7 @@
 import Joi from 'joi'
 import { pathParams } from '../index.js'
 import { floorCount } from '../color-formatters.js'
-import BaseCoincapService from './coincap-base.js'
+import { BaseCoincapService, description } from './coincap-base.js'
 
 const schema = Joi.object({
   data: Joi.object({
@@ -19,6 +19,7 @@ export default class CoincapChangePercent24HrUsd extends BaseCoincapService {
     '/coincap/change-percent-24hr/{assetId}': {
       get: {
         summary: 'Coincap (Change Percent 24Hr)',
+        description,
         parameters: pathParams({
           name: 'assetId',
           example: 'bitcoin',
diff --git a/services/coincap/coincap-priceusd.service.js b/services/coincap/coincap-priceusd.service.js
index f594c68415858ecf63626492cfc24bd65467314e..1ca6e9187b5d2a9006f252214dabeb13f87b927d 100644
--- a/services/coincap/coincap-priceusd.service.js
+++ b/services/coincap/coincap-priceusd.service.js
@@ -1,6 +1,6 @@
 import Joi from 'joi'
 import { pathParams } from '../index.js'
-import BaseCoincapService from './coincap-base.js'
+import { BaseCoincapService, description } from './coincap-base.js'
 
 const schema = Joi.object({
   data: Joi.object({
@@ -18,6 +18,7 @@ export default class CoincapPriceUsd extends BaseCoincapService {
     '/coincap/price-usd/{assetId}': {
       get: {
         summary: 'Coincap (Price USD)',
+        description,
         parameters: pathParams({
           name: 'assetId',
           example: 'bitcoin',
diff --git a/services/coincap/coincap-rank.service.js b/services/coincap/coincap-rank.service.js
index 7566b3314e8f1fa1f29e6af67691d706b524fcad..75e2d017f3c4824bf519dc1dbef9bf209e7b566b 100644
--- a/services/coincap/coincap-rank.service.js
+++ b/services/coincap/coincap-rank.service.js
@@ -1,6 +1,6 @@
 import Joi from 'joi'
 import { pathParams } from '../index.js'
-import BaseCoincapService from './coincap-base.js'
+import { BaseCoincapService, description } from './coincap-base.js'
 
 const schema = Joi.object({
   data: Joi.object({
@@ -18,6 +18,7 @@ export default class CoincapRank extends BaseCoincapService {
     '/coincap/rank/{assetId}': {
       get: {
         summary: 'Coincap (Rank)',
+        description,
         parameters: pathParams({
           name: 'assetId',
           example: 'bitcoin',
diff --git a/services/conan/conan-version.service.js b/services/conan/conan-version.service.js
index 6bbdb1c945450a771262c30ff10c7c319bc301fb..2b5acef3406d2d696a3ad38b4b1d0263b22a74c1 100644
--- a/services/conan/conan-version.service.js
+++ b/services/conan/conan-version.service.js
@@ -13,6 +13,7 @@ export default class ConanVersion extends ConditionalGithubAuthV3Service {
     '/conan/v/{packageName}': {
       get: {
         summary: 'Conan Center',
+        description: '[Conan](https://conan.io/) is a package manager for C++',
         parameters: pathParams({
           name: 'packageName',
           example: 'boost',
diff --git a/services/cpan/cpan-license.service.js b/services/cpan/cpan-license.service.js
index 9f1af2fa0474876560594ae7651e843fd3285f65..d67c721a50f865b40a6ae9a2c197a3bccfc94d20 100644
--- a/services/cpan/cpan-license.service.js
+++ b/services/cpan/cpan-license.service.js
@@ -1,5 +1,5 @@
 import { pathParams } from '../index.js'
-import BaseCpanService from './cpan.js'
+import { BaseCpanService, description } from './cpan.js'
 
 export default class CpanLicense extends BaseCpanService {
   static category = 'license'
@@ -9,6 +9,7 @@ export default class CpanLicense extends BaseCpanService {
     '/cpan/l/{packageName}': {
       get: {
         summary: 'CPAN License',
+        description,
         parameters: pathParams({
           name: 'packageName',
           example: 'Config-Augeas',
diff --git a/services/cpan/cpan-version.service.js b/services/cpan/cpan-version.service.js
index 5964f2955add632931d390a6b01cf2751dffae1c..6971a3df814c22073800a27b8370daf748e911e8 100644
--- a/services/cpan/cpan-version.service.js
+++ b/services/cpan/cpan-version.service.js
@@ -1,6 +1,6 @@
 import { pathParams } from '../index.js'
 import { renderVersionBadge } from '../version.js'
-import BaseCpanService from './cpan.js'
+import { BaseCpanService, description } from './cpan.js'
 
 export default class CpanVersion extends BaseCpanService {
   static category = 'version'
@@ -10,6 +10,7 @@ export default class CpanVersion extends BaseCpanService {
     '/cpan/v/{packageName}': {
       get: {
         summary: 'CPAN Version',
+        description,
         parameters: pathParams({
           name: 'packageName',
           example: 'Config-Augeas',
diff --git a/services/cpan/cpan.js b/services/cpan/cpan.js
index 96d0c4c941332abc22127ebc395a3d401ea22301..de24f4d7ddbfa93529785cd52862185f500ffe91 100644
--- a/services/cpan/cpan.js
+++ b/services/cpan/cpan.js
@@ -6,6 +6,9 @@ const schema = Joi.object({
   license: Joi.array().items(Joi.string()).min(1).required(),
 }).required()
 
+const description =
+  '[CPAN](https://www.cpan.org/) is a package registry for Perl'
+
 export default class BaseCpanService extends BaseJsonService {
   static defaultBadgeData = { label: 'cpan' }
 
@@ -14,3 +17,5 @@ export default class BaseCpanService extends BaseJsonService {
     return this._requestJson({ schema, url })
   }
 }
+
+export { BaseCpanService, description }