Ghost Admin API: Handling 429 rate limits & Knex pool timeouts when batch-provisioning temporary members

Hi all,

We are currently integrating our self-hosted Ghost instance (v5.105.0 running on Docker Compose with MySQL 8.0) as an internal documentation and guest knowledge portal for our physical office facilities.

As part of integrating an on-prem visitor management system with our internal network, our local webhook middleware listens for front-desk check-in badge scans and provisions temporary guest members in Ghost using the `@tryghost/admin-api` SDK so arriving visitors can access local Wi-Fi guides and facility resources.

During morning arrival peaks (bursts of 15–25 concurrent kiosk check-in events within a few seconds), our Node.js worker starts throwing rate limit and connection pool errors from Ghost:

```text

GhostAdminAPIError: Too Many Requests

at MemberResource.add (/node_modules/@tryghost/admin-api/lib/index.js:142:19)

at async syncVisitorRecord (file:///opt/middleware/worker.js:68:21) {

name: ‘TooManyRequestsError’,

statusCode: 429,

message: ‘Too many attempts try again in an hour’

}

And occasionally when we retry with exponential backoff:

text

KnexTimeoutError: Knex: Timeout acquiring a connection. The pool is probably full.

Here is a simplified snippet of our sync worker:

javascript

import GhostAdminAPI from ‘@tryghost/admin-api’;

const api = new GhostAdminAPI({

url: ‘https://portal.internal.company.com’,

key: process.env.GHOST_ADMIN_API_KEY,

version: ‘v5.0’

});

export async function onVisitorCheckIn(visitor) {

return await api.members.add({

email: visitor.email,

name: visitor.fullName,

labels: [‘day-pass’, `building-${visitor.facilityId}`],

note: `Checked in via reception kiosk at ${new Date().toISOString()}`

}, { send_email: false });

}

A couple of questions for anyone working with high-throughput Ghost Admin API integrations:

  1. Does Ghost enforce the same brute-force / IP rate limiting on the Admin API (signed with JWT Admin API Keys) as it does on public content endpoints, and is there an environment variable or config setting (e.g. in config.production.json) to adjust the rate limit tier for local trusted subnet IPs?
  2. Has anyone implemented a bulk/batch member creation pattern without triggering Knex connection pool exhaustion in the default Ghost Docker configuration?

Any architectural tips or recommended concurrency thresholds would be greatly appreciated!