SiteInfo reads the scopes a key holds. XenForo sends key.scopes as a map of scope to true, not the list its documentation describes, so $scopes was always empty and hasScope() false for every key that is not allowed all scopes. Both shapes are read
The error-response log line carries the error codes, not the response body
Breaking: the transport is bound under the container key xenforo.http_client instead of Psr\Http\Client\ClientInterface. Rebind xenforo.http_client from any service provider to replace it; binding ClientInterface no longer affects this package
xenforo.http_client is bound only when nothing has bound it already, so an application's override is kept in either provider order
The service provider no longer binds Psr\Http\Client\ClientInterface
InvalidConfiguration::httpClientNotPsr18() is raised when xenforo.http_client does not resolve to a PSR-18 client
A 4xx is logged at info, not error: XenForo answered, and the typed exception carries the answer. error is for a forum that did not - a transport failure, a 5xx, a 2xx that is not JSON
The query string is left out of every logged URI, since on a lookup endpoint it is the lookup
1.2.0 (2026-09-13)
Client::withKey($baseUri, $key, $client) - the short form for an API key, so the ordinary case no longer names a Config and an ApiKey to accept both defaults
README states which XenForo versions answer which endpoints - 154 of the 162 on 2.3, 144 on 2.2, 124 on 2.1 - measured on a real forum of each
The write exercise no longer stops at threads/{id}/mark-read on a forum older than 2.2
hampel/xenforo-api-laravel
1.1.0 (2026-09-14)
XenForoManager::build() makes a client from an array of settings, for a forum that is not in config/xenforo.php. It takes the same keys as an entry under xenforo.forums, applies the same validation and credential selection, sends through the same transport, and is not memoised
InvalidConfiguration::missingUrl() and actingUserWithoutKey() accept null for settings passed to build()
README: Laravel Zero does not discover packages, so the provider must be listed in config/app.php and the facade imported by class name
README and PendingRequestClient docblock: RequestSending fires for requests the API client makes; ResponseReceived and ConnectionFailed do not