One way to talk to somebody else's API
2026年6月23日
A connector layer landed: one base class, one credential convention, one result shape, and a dozen services on top of it.
It came out of wapps.nu, which is a multichannel inbox and therefore mostly other people's APIs. Eighteen of them, each with its own client, its own idea of what an error looks like and its own place to keep a key. Adding the nineteenth meant reading the eighteenth to remember the house style.
Connector is that house style, written down. It resolves credentials from a section in data/creds.ini, offers get, post, put, patch, del and form over the existing HTTP() transport, and every call returns the same obj(ok, status, data, error) regardless of what the service chose to send. Retry is opt-in and deliberately narrow: only idempotent methods, only on 429 and 5xx, and it honours Retry-After rather than inventing its own backoff. Pagination is handled once. A connector describes its own credential fields through fields(), so a settings screen can render itself.
Shipped with it: Shopify, Lightspeed, Slack, Telegram, Twilio, MessageBird, Resend, Moneybird, Exact Online, Microsoft Graph, Google Calendar and Google Sheets.
A connector that needs OAuth extends OAuthConnector and gets TokenStore, which persists tokens at mode 0600, locks the refresh cycle so two processes cannot both refresh, and fails closed when it cannot take the lock.
Engine 1.0. See the Integrations chapter.