{"id":1359,"date":"2025-02-13T00:00:00","date_gmt":"2025-02-12T23:00:00","guid":{"rendered":"https:\/\/demo.sidekick.be\/itenium\/reduxjs-toolkit-createasyncthunk\/"},"modified":"2025-11-28T13:31:41","modified_gmt":"2025-11-28T12:31:41","slug":"reduxjs-toolkit-createasyncthunk","status":"publish","type":"post","link":"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createasyncthunk\/","title":{"rendered":"ReduxJS\/Toolkit: createAsyncThunk"},"content":{"rendered":"<p>Check <a href=\"https:\/\/redux-toolkit.js.org\/api\/createAsyncThunk#promise-lifecycle-actions\">Promise Lifecycle Actions<\/a> for the exact signatures of the pending\/rejected\/fulfilled actions.<\/p>\n<h1 id=\"reduce-it\">Reduce It<\/h1>\n<pre><code class=\"language-ts\">const mySlice = createSlice({\n  extraReducers: builder =&gt; {\n    builder.addCase(fetchStuff.fulfilled, (state, action) =&gt; {\n      \/\/ action.payload is what fetchStuff returned\n    });\n\n    builder.addCase(fetchStuff.pending, (state, action) =&gt; {});\n    builder.addCase(fetchStuff.rejected, (state, action) =&gt; {\n      \/\/ action.payload === 'Well, that failed'\n      \/\/ action.error.message === 'Rejected'\n    });\n\n    builder.addMatcher(fetchStuff.settled, (state, action) =&gt; {\n      \/\/ Called for both fulfilled and rejected\n    });\n  }\n});\n<\/code><\/pre>\n<h1 id=\"parameters\">Parameters<\/h1>\n<pre><code class=\"language-ts\">createAsyncThunk(Type, PayloadCreator, [Options]);\n<\/code><\/pre>\n<h2 id=\"1-type\">1. Type<\/h2>\n<p>A string that will be prepended with the three states and dispatched as they happen.<\/p>\n<h2 id=\"2-payloadcreator\">2. PayloadCreator<\/h2>\n<pre><code class=\"language-ts\">async (params, thunkApi) =&gt; {}\n<\/code><\/pre>\n<ul>\n<li><code>params<\/code>: What you\u2019ll call the thunk with. This could be the request body, an id, queryString variables etc<\/li>\n<li><code>thunkApi<\/code>: An object containing\n<ul>\n<li><code>dispatch<\/code>: To dispatch actions other than the three that are generated<\/li>\n<li><code>getState<\/code>: Gets the current root store state<\/li>\n<li><code>extra<\/code>: The argument passed to <code>configureStore({middleware: getDefaultMiddleware =&gt; getDefaultMiddleware({thunk: {extraArgument: \"**this**\"}})})<\/code><\/li>\n<li><code>requestId<\/code>: unique generated ID<\/li>\n<li><code>signal<\/code>: <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/AbortController\/signal\">AbortController.signal<\/a> when you want to implement cancellation (see <a href=\"https:\/\/redux-toolkit.js.org\/api\/createAsyncThunk#cancellation\">Cancellation<\/a>)<\/li>\n<li><code>rejectWithValue(value; [meta])<\/code> and <code>fulfillWithValue(value, [meta])<\/code>: or just throw\/return!<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2 id=\"3-options\">3. Options<\/h2>\n<p>An option object that can contain:<\/p>\n<ul>\n<li><code>condition<\/code>: if this function returns false, no actions will be dispatched, see <a href=\"https:\/\/redux-toolkit.js.org\/api\/createAsyncThunk#canceling-before-execution\">Canceling before execution<\/a>\n<ul>\n<li><code>dispatchConditionRejection<\/code>: if <code>condition<\/code> returned false and this field is true, the rejected action will still be dispatched<\/li>\n<\/ul>\n<\/li>\n<li><code>idGenerator<\/code>: Uses <a href=\"https:\/\/redux-toolkit.js.org\/api\/other-exports#nanoid\">nanoid<\/a> by default<\/li>\n<li><code>serializeError<\/code>: Serialize errors in a different way than <a href=\"https:\/\/github.com\/sindresorhus\/serialize-error\">sindresorhus\/serialize-error<\/a><\/li>\n<li><code>getPendingMeta<\/code>: merge extra data into <code>pendingAction.meta<\/code><\/li>\n<\/ul>\n<h1 id=\"unwrapping\">Unwrapping<\/h1>\n<p><code>createAsyncThunk<\/code> always returns a resolved promise, even if it was rejected. To get the actual contents, <code>.unwrap()<\/code> it!<\/p>\n<pre><code class=\"language-ts\">dispatch(fetchStuff({id: 42}))\n  .unwrap()\n  .then(success =&gt; {})\n  .catch(error =&gt; {})\n<\/code><\/pre>\n<h1 id=\"matchers\">Matchers<\/h1>\n<p>We already saw the <code>fetchStuff.settled<\/code> (for handling fulfilled or rejected) matcher above but there are <a href=\"https:\/\/redux-toolkit.js.org\/api\/matching-utilities#createasyncthunk-specific-matchers\">other ways<\/a> to handle multiple actions with a single matcher.<\/p>\n<pre><code class=\"language-ts\">import { isPending } from \"@reduxjs\/toolkit\";\n\ntype GenericAsyncThunk = AsyncThunk&lt;unknown, unknown, any&gt;\ntype PendingAction = ReturnType&lt;GenericAsyncThunk['pending']&gt;\ntype RejectedAction = ReturnType&lt;GenericAsyncThunk['rejected']&gt;\ntype FulfilledAction = ReturnType&lt;GenericAsyncThunk['fulfilled']&gt;\n\nconst mySlice = createSlice({\n  extraReducers: builder =&gt; {\n    builder.addMatcher&lt;RejectedAction&gt;(\n      action =&gt; action.type.endsWith('\/rejected'),\n      (state, action) =&gt; {\n        state.status = 'failed';\n      }\n    );\n\n    builder.addMatcher(isPending, (state, action) =&gt; {\n      \/\/ Or by using the existing isPending matcher utility\n      \/\/ Other utilities: isAllOf, isAnyOf\n      \/\/ isAsyncThunkAction, isFulfilled, isRejected(WithValue)\n    });\n\n    builder.addDefaultCase((state, action) =&gt; {\n      \/\/ Handle everything that was not previously handled\n      \/\/ Contrast to addMatcher which may handle an action\n      \/\/ that was already handled by other case \/ matchers\n    });\n  }\n});\n<\/code><\/pre>\n<h1 id=\"reducer-creator\">Reducer Creator<\/h1>\n<p>This alternative <code>reducers<\/code> creation allows you to add thunks without having to revert to <code>extraReducers<\/code>.<\/p>\n<pre><code class=\"language-ts\">import { buildCreateSlice, asyncThunkCreator } from \"@reduxjs\/toolkit\";\n\n\/\/ Extra setup required for adding thunks to reducers\nconst createAppSlice = buildCreateSlice({\n  creators: { asyncThunk: asyncThunkCreator },\n});\n\nconst creatorSlice = createAppSlice({\n  initialState: [],\n  reducers: create =&gt; ({\n    deleteEntity: create.reducer&lt;{id: number}&gt;((state, action) =&gt; {\n      return state.filter(x =&gt; x.id !== action.payload);\n    }),\n\n    addPartial: create.preparedReducer(\n      (todo: Partial&lt;Todo&gt;) =&gt; {\n        return {\n          payload: {\n            text: 'Default Text',\n            ...todo,\n          }\n        }\n      },\n      (state, action) =&gt; {\n        state.push(action.payload);\n      }\n    ),\n\n    \/\/ See above, requires buildCreateSlice()\n    getCreatures: create.asyncThunk(\n      async (params, thunkApi): Promise&lt;MyEntity&gt; =&gt; {\n        const res = await fetch(`\/api\/resource\/${params.id}`);\n        return res.json();\n      }, {\n        pending: state =&gt; {\n          console.log('Getting entity');\n        },\n        rejected: (state, action) =&gt; {\n          console.log('Failed getting entity');\n        },\n        fulfilled: (state, action) =&gt; {\n          state.push(action.payload);\n        }\n      }\n    ),\n  }),\n});\n<\/code><\/pre>\n<h1>Also in this series<\/h1>\n<ul>\n<li>Part 1: <a href=\"\/javascript\/reduxjs-toolkit\/\">ReduxJS\/Toolkit<\/a><\/li>\n<li>Part 2: <a href=\"\/javascript\/reduxjs-toolkit-immer\/\">ReduxJS\/Toolkit: Immer<\/a><\/li>\n<li>Part 3: <a href=\"\/javascript\/reduxjs-toolkit-createslice\/\">ReduxJS\/Toolkit: createSlice and configureStore<\/a><\/li>\n<li>This Part: ReduxJS\/Toolkit: createAsyncThunk<\/li>\n<li>Part 5: <a href=\"\/javascript\/reduxjs-toolkit-typescript\/\">ReduxJS\/Toolkit: TypeScript<\/a><\/li>\n<li>Part 6: <a href=\"\/javascript\/reduxjs-toolkit-createselector\/\">ReduxJS\/Toolkit: createSelector<\/a><\/li>\n<\/ul>\n<h1>Extras<\/h1>\n<p><b>Stuff that came into being during the making of this post<\/b><\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/itenium-be\/reduxjs-toolkit\">The &#8216;Mythical Zoos&#8217; example code and the talk pptx<\/a><\/li>\n<\/ul>\n<h1> Package Versions <i class=\"fa fa-info-circle\" style=\"float: right; color: cornflowerblue; font-size: 28px\" title=\"Package versions used for this post and in the accompanying code on Github\"><\/i><\/h1>\n<div><a href=\"https:\/\/github.com\/reduxjs\/redux-thunk\" class=\"github\"><img decoding=\"async\" src=\"https:\/\/img.shields.io\/github\/stars\/reduxjs\/redux-thunk.svg?style=social&#038;label=Star\" \/><\/a><a href=\"https:\/\/github.com\/reduxjs\/redux-thunk\">reduxjs\/redux-thunk<\/a>: v3.1.0 <\/div>\n","protected":false},"excerpt":{"rendered":"<p><code>createAsyncThunk<\/code> generates promise lifecycle action types, which you handle in the <code>extraReducers<\/code> of your slice.<\/p>\n<pre><code class=\"language-ts\">import { createAsyncThunk } from \"@reduxjs\/toolkit\";\n\nexport const fetchStuff = createAsyncThunk(\n  'resource\/action',\n  async (params, thunkApi) =&gt; {\n    try {\n      const response = await fetch(`\/api\/resource\/${params.id}`);\n      return await response.json();\n    } catch {\n      \/\/ Also possible to return a rejected Promise\n      return thunkApi.rejectWithValue(\"Well, that failed\");\n    }\n  }\n);\n<\/code><\/pre>\n<p>This dispatches the following actions (from the first \u201cType\u201d argument):<\/p>\n<ul>\n<li><code>resource\/action\/pending<\/code>: display a spinner or something?<\/li>\n<li><code>resource\/action\/rejected<\/code>: display an error message?<\/li>\n<li><code>resource\/action\/fulfilled<\/code>: while the previous two could be considered optional, you definitely want to handle this one!<\/li>\n<\/ul>\n","protected":false},"author":1,"featured_media":1965,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[3],"tags":[22,6],"class_list":["post-1359","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-javascript","tag-react","tag-tutorial"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>ReduxJS\/Toolkit: createAsyncThunk - Itenium<\/title>\n<meta name=\"robots\" content=\"noindex, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ReduxJS\/Toolkit: createAsyncThunk - Itenium\" \/>\n<meta property=\"og:description\" content=\"createAsyncThunk generates promise lifecycle action types, which you handle in the extraReducers of your slice. import { createAsyncThunk } from &quot;@reduxjs\/toolkit&quot;; export const fetchStuff = createAsyncThunk(  &#039;resource\/action&#039;,  async (params, thunkApi) =&gt; {   try {    const response = await fetch(`\/api\/resource\/${params.id}`);    return await response.json();   } catch {    \/\/ Also possible to return a rejected Promise    return thunkApi.rejectWithValue(&quot;Well, that failed&quot;);   }  } ); This dispatches the following actions (from the first \u201cType\u201d argument):resource\/action\/pending: display a spinner or something?resource\/action\/rejected: display an error message?resource\/action\/fulfilled: while the previous two could be considered optional, you definitely want to handle this one!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createasyncthunk\/\" \/>\n<meta property=\"og:site_name\" content=\"Itenium\" \/>\n<meta property=\"article:published_time\" content=\"2025-02-12T23:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-28T12:31:41+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/reduxjs-toolkit-createAsyncThunk.png\" \/>\n\t<meta property=\"og:image:width\" content=\"360\" \/>\n\t<meta property=\"og:image:height\" content=\"300\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Usdevelop\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Usdevelop\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createasyncthunk\/\",\"url\":\"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createasyncthunk\/\",\"name\":\"ReduxJS\/Toolkit: createAsyncThunk - Itenium\",\"isPartOf\":{\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createasyncthunk\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createasyncthunk\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/reduxjs-toolkit-createAsyncThunk.png\",\"datePublished\":\"2025-02-12T23:00:00+00:00\",\"dateModified\":\"2025-11-28T12:31:41+00:00\",\"author\":{\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/#\/schema\/person\/6ab401ce01e858184ee4a8667fe0f022\"},\"breadcrumb\":{\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createasyncthunk\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createasyncthunk\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createasyncthunk\/#primaryimage\",\"url\":\"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/reduxjs-toolkit-createAsyncThunk.png\",\"contentUrl\":\"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/reduxjs-toolkit-createAsyncThunk.png\",\"width\":360,\"height\":300,\"caption\":\"A high-tech command center where a digital AI assistant dispatches glowing data packets through multiple interconnected pathways labeled 'Pending', 'Fulfilled', and 'Rejected'. The room is filled with floating holographic screens displaying API call results and Redux actions in real time. The colors are vibrant, dominated by neon blues and purples, with a sleek, futuristic UI aesthetic.\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createasyncthunk\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/demo.sidekick.be\/itenium\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"ReduxJS\/Toolkit: createAsyncThunk\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/#website\",\"url\":\"https:\/\/demo.sidekick.be\/itenium\/\",\"name\":\"Itenium\",\"description\":\"We build software. We build careers.\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/demo.sidekick.be\/itenium\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/#\/schema\/person\/6ab401ce01e858184ee4a8667fe0f022\",\"name\":\"Usdevelop\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/cc8cf9b9e9d5bbe7e8d247907cc9ac8457bbfa2854b52eaddf6529adfe88ceab?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/cc8cf9b9e9d5bbe7e8d247907cc9ac8457bbfa2854b52eaddf6529adfe88ceab?s=96&d=mm&r=g\",\"caption\":\"Usdevelop\"},\"sameAs\":[\"https:\/\/demo.sidekick.be\/itenium\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"ReduxJS\/Toolkit: createAsyncThunk - Itenium","robots":{"index":"noindex","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"og_locale":"en_US","og_type":"article","og_title":"ReduxJS\/Toolkit: createAsyncThunk - Itenium","og_description":"createAsyncThunk generates promise lifecycle action types, which you handle in the extraReducers of your slice. import { createAsyncThunk } from \"@reduxjs\/toolkit\"; export const fetchStuff = createAsyncThunk(  'resource\/action',  async (params, thunkApi) =&gt; {   try {    const response = await fetch(`\/api\/resource\/${params.id}`);    return await response.json();   } catch {    \/\/ Also possible to return a rejected Promise    return thunkApi.rejectWithValue(\"Well, that failed\");   }  } ); This dispatches the following actions (from the first \u201cType\u201d argument):resource\/action\/pending: display a spinner or something?resource\/action\/rejected: display an error message?resource\/action\/fulfilled: while the previous two could be considered optional, you definitely want to handle this one!","og_url":"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createasyncthunk\/","og_site_name":"Itenium","article_published_time":"2025-02-12T23:00:00+00:00","article_modified_time":"2025-11-28T12:31:41+00:00","og_image":[{"width":360,"height":300,"url":"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/reduxjs-toolkit-createAsyncThunk.png","type":"image\/png"}],"author":"Usdevelop","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Usdevelop","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createasyncthunk\/","url":"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createasyncthunk\/","name":"ReduxJS\/Toolkit: createAsyncThunk - Itenium","isPartOf":{"@id":"https:\/\/demo.sidekick.be\/itenium\/#website"},"primaryImageOfPage":{"@id":"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createasyncthunk\/#primaryimage"},"image":{"@id":"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createasyncthunk\/#primaryimage"},"thumbnailUrl":"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/reduxjs-toolkit-createAsyncThunk.png","datePublished":"2025-02-12T23:00:00+00:00","dateModified":"2025-11-28T12:31:41+00:00","author":{"@id":"https:\/\/demo.sidekick.be\/itenium\/#\/schema\/person\/6ab401ce01e858184ee4a8667fe0f022"},"breadcrumb":{"@id":"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createasyncthunk\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createasyncthunk\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createasyncthunk\/#primaryimage","url":"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/reduxjs-toolkit-createAsyncThunk.png","contentUrl":"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/reduxjs-toolkit-createAsyncThunk.png","width":360,"height":300,"caption":"A high-tech command center where a digital AI assistant dispatches glowing data packets through multiple interconnected pathways labeled 'Pending', 'Fulfilled', and 'Rejected'. The room is filled with floating holographic screens displaying API call results and Redux actions in real time. The colors are vibrant, dominated by neon blues and purples, with a sleek, futuristic UI aesthetic."},{"@type":"BreadcrumbList","@id":"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createasyncthunk\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/demo.sidekick.be\/itenium\/"},{"@type":"ListItem","position":2,"name":"ReduxJS\/Toolkit: createAsyncThunk"}]},{"@type":"WebSite","@id":"https:\/\/demo.sidekick.be\/itenium\/#website","url":"https:\/\/demo.sidekick.be\/itenium\/","name":"Itenium","description":"We build software. We build careers.","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/demo.sidekick.be\/itenium\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/demo.sidekick.be\/itenium\/#\/schema\/person\/6ab401ce01e858184ee4a8667fe0f022","name":"Usdevelop","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/demo.sidekick.be\/itenium\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/cc8cf9b9e9d5bbe7e8d247907cc9ac8457bbfa2854b52eaddf6529adfe88ceab?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/cc8cf9b9e9d5bbe7e8d247907cc9ac8457bbfa2854b52eaddf6529adfe88ceab?s=96&d=mm&r=g","caption":"Usdevelop"},"sameAs":["https:\/\/demo.sidekick.be\/itenium"]}]}},"_links":{"self":[{"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/posts\/1359","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/comments?post=1359"}],"version-history":[{"count":2,"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/posts\/1359\/revisions"}],"predecessor-version":[{"id":2147,"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/posts\/1359\/revisions\/2147"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/media\/1965"}],"wp:attachment":[{"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/media?parent=1359"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/categories?post=1359"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/tags?post=1359"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}