{"id":18722,"library":"redux-api-middleware-interceptor","title":"Redux API Middleware Interceptor","description":"A Redux middleware that wraps redux-api-middleware to intercept API calls, allowing automatic header injection (e.g., JWT), base URL prepending, and callbacks for request lifecycle events (init, success, failure). Works with redux-api-middleware ^2.0.0 and Redux's applyMiddleware. Simple API: pass a config object to the exported function. Two releases: 1.0.4 is current stable. Not frequently updated, but functional for its niche.","status":"active","version":"1.0.4","language":"javascript","source_language":"en","source_url":"https://github.com/hamxabaig/redux-api-interceptor","tags":["javascript","redux","interceptor","actions","redux-interceptor","middleware","universal","react","isomorphic"],"install":[{"cmd":"npm install redux-api-middleware-interceptor","lang":"bash","label":"npm"},{"cmd":"yarn add redux-api-middleware-interceptor","lang":"bash","label":"yarn"},{"cmd":"pnpm add redux-api-middleware-interceptor","lang":"bash","label":"pnpm"}],"dependencies":[{"reason":"Peer dependency – this package acts as a wrapper around its middleware.","package":"redux-api-middleware","optional":false}],"imports":[{"note":"Default export as a function. CommonJS users must require the module directly: const interceptor = require('redux-api-middleware-interceptor') and it will work directly (no .default needed).","wrong":"const interceptor = require('redux-api-middleware-interceptor').default","symbol":"interceptor","correct":"import interceptor from 'redux-api-middleware-interceptor'"},{"note":"CALL_API is re-exported from the parent package, not from interceptor. Always import from redux-api-middleware.","wrong":"import { CALL_API } from 'redux-api-middleware-interceptor'","symbol":"CALL_API","correct":"import { CALL_API } from 'redux-api-middleware'"},{"note":"Standard Redux exports; not part of interceptor package.","wrong":"import { applyMiddleware, createStore } from 'redux-api-middleware-interceptor'","symbol":"applyMiddleware / createStore","correct":"import { applyMiddleware, createStore } from 'redux'"}],"quickstart":{"code":"import { applyMiddleware, createStore } from 'redux';\nimport thunk from 'redux-thunk';\nimport interceptor from 'redux-api-middleware-interceptor';\nimport { CALL_API, apiMiddleware } from 'redux-api-middleware';\n\nconst store = createStore(\n  reducer,\n  applyMiddleware(\n    interceptor({\n      headers: (origHeaders, state) => ({\n        ...origHeaders,\n        Authorization: state.auth?.jwt ? `Bearer ${state.auth.jwt}` : '',\n      }),\n      getURL: (url, state) => `https://api.example.com${url}`,\n      onRequestInit: (state) => console.log('API request started'),\n      onRequestSuccess: (state, response) => console.log('API request succeeded', response),\n      onRequestFail: (state, error) => console.error('API request failed', error),\n    }),\n    apiMiddleware,\n    thunk\n  )\n);\n\n// Usage: dispatch an RSAA action as usual\nstore.dispatch({\n  [CALL_API]: {\n    endpoint: '/users',\n    method: 'GET',\n    types: ['REQUEST', 'SUCCESS', 'FAILURE']\n  }\n});","lang":"javascript","description":"Shows complete setup: interceptor middleware injected before apiMiddleware, with custom headers, base URL, and lifecycle callbacks."},"warnings":[{"fix":"Ensure order: interceptor(config), apiMiddleware, thunk, etc.","message":"Interceptor middleware must be placed before redux-api-middleware's apiMiddleware in the middleware chain.","severity":"gotcha","affected_versions":">=1.0.0"},{"fix":"Provide a function to getURL; e.g., getURL: (url, state) => `https://base${url}`","message":"If getURL is not defined, interceptor will not transform URLs; if defined but not a function, throws an error.","severity":"gotcha","affected_versions":">=1.0.0"},{"fix":"Ensure the function always returns a headers object, e.g., return { ...origHeaders, ...myHeaders };","message":"When using headers as a function, it must return an object; otherwise original headers are silently used.","severity":"gotcha","affected_versions":">=1.0.0"},{"fix":"Only provide callbacks as functions. Use null or omit them if not needed.","message":"onRequestInit, onRequestSuccess, onRequestFail callbacks are optional but must be functions if provided, otherwise throws error.","severity":"gotcha","affected_versions":">=1.0.0"},{"fix":"Ensure all API calls use RSAA action with [CALL_API] to benefit from interceptor.","message":"The interceptor only modifies requests made via redux-api-middleware's CALL_API symbol; regular fetch calls are unaffected.","severity":"gotcha","affected_versions":">=1.0.0"}],"env_vars":null,"last_verified":"2026-04-25T00:00:00.000Z","next_check":"2026-07-24T00:00:00.000Z","problems":[{"fix":"Change getURL to a function: getURL: (url, state) => `https://example.com${url}`","cause":"getURL config property is provided but is not a function (e.g., string or object).","error":"Uncaught Error: [redux-api-middleware-interceptor] getURL must be a function"},{"fix":"Use const interceptor = require('redux-api-middleware-interceptor'); then call interceptor({...}) as function.","cause":"Importing default export incorrectly in CommonJS or forgetting to call interceptor().","error":"Uncaught TypeError: interceptor is not a function"},{"fix":"Check your store's state tree and adjust the headers function to access state.auth?.jwt or equivalent.","cause":"State shape does not match expectations: trying to access state.auth.jwt but auth reducer is not at that path.","error":"TypeError: Cannot read property 'jwt' of undefined"}],"ecosystem":"npm","meta_description":null,"install_score":null,"install_tag":null,"quickstart_score":null,"quickstart_tag":null}