Poll a pairing request's status
const url = 'https://example.com/api/plugins/pairing/example';const options = {method: 'GET'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url https://example.com/api/plugins/pairing/exampleAn unknown or already-pruned request id deliberately answers 200 with status “expired” rather than 404, so the client state machine stays total and this endpoint is not an existence oracle.
Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Responses
Section titled “Responses”The current status of the pairing request.
Mirrors MacroDeck.Plugin.Protocol.Handshake.PluginPairingStatusResponse.
object
Mirrors MacroDeck.Plugin.Protocol.Handshake.PluginPairingStatuses.All.
Example
{ "status": "pending"}The caller did not arrive on a loopback remote address. Plugin endpoints are served on both the public and private listeners, but only local processes may reach them. On the pairing endpoints, on POST /api/plugins/registration, and on POST /api/plugins/sessions for a plugin holding a development credential, this status also means Developer Mode is switched off in the desktop app - such a refusal carries “reason”: “developer_mode_disabled” in the error’s details, and GET /api/plugins/protocol reports the switch ahead of time.
Mirrors MacroDeck.Plugin.Protocol.Errors.ProtocolError.
object
One of the codes v1 speaks. Drift anchor - see x-macrodeck-error-codes above.
Default English text keyed by code (MacroDeck.Plugin.Protocol.Errors.ProtocolErrorMessages). The UI localises from the code, not this string.
object
Example
{ "code": "PROTOCOL_VERSION_UNSUPPORTED"}