{"id":1540,"date":"2024-12-04T12:06:11","date_gmt":"2024-12-04T17:06:11","guid":{"rendered":"https:\/\/www.brunerd.com\/blog\/?p=1540"},"modified":"2025-02-25T13:39:15","modified_gmt":"2025-02-25T18:39:15","slug":"detecting-apple-intelligence-and-chatgpt-integration-status","status":"publish","type":"post","link":"https:\/\/www.brunerd.com\/blog\/2024\/12\/04\/detecting-apple-intelligence-and-chatgpt-integration-status\/","title":{"rendered":"Detecting Apple Intelligence and ChatGPT Integration Status"},"content":{"rendered":"\n<p>UPDATE: Heads up, either by shear coincidence or my salty appeal to not play hide and seek, the ability to detect Apple Intelligence will no longer be found in the binary plist data of <code>com.apple.gms.availability.key<\/code> in the user&#8217;s .GlobalPreferences domain on macOS 15.4 and up. I&#8217;ve updated my GitHub script <a href=\"https:\/\/github.com\/brunerd\/macAdminTools\/blob\/main\/Jamf\/EAs\/OS-Apple%20Intelligence%20Availability.sh\">OS-Apple Intelligence Availability.sh<\/a> and I&#8217;ve also added a simple POC one-liner below.<\/p>\n\n\n\n<p>Run a Jamf shop? Would you like to collect stats on who&#8217;s turned on Apple Intelligence so far? That is, if your company hasn&#8217;t already had you put the kibosh on it! Personally I think <a href=\"https:\/\/support.apple.com\/guide\/mac-help\/get-started-with-apple-intelligence-mchl46361784\/15.0\/mac\/15.0\" target=\"_blank\" rel=\"noreferrer noopener\">Apple Intelligence<\/a> and it&#8217;s <a href=\"https:\/\/security.apple.com\/blog\/private-cloud-compute\/\" target=\"_blank\" rel=\"noreferrer noopener\">Private Cloud Compute<\/a> are a <a href=\"https:\/\/support.apple.com\/guide\/mac-help\/apple-intelligence-and-privacy-mchlfc0d4779\/15.0\/mac\/15.0\" target=\"_blank\" rel=\"noreferrer noopener\">secure and private<\/a> way to use things like the <a href=\"https:\/\/support.apple.com\/guide\/mac-help\/use-writing-tools-mchldcd6c260\/15.0\/mac\/15.0\" target=\"_blank\" rel=\"noreferrer noopener\">Writing Tools<\/a> to proofread, make list or tables, etc. without wondering if your corporate data is being used in further LLM training. If your company is so enlightened and you&#8217;d like to see which Macs have Apple Intelligence enabled, read on! Or perhaps, you&#8217;d just like to see how it&#8217;s done. It&#8217;s not as straightforward as you might think, Apple engineers are <em>really<\/em> into obfuscation these days!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Finding the Suspects<\/h2>\n\n\n\n<p>The first part of the fun is hunting down which file might indicate the status of Apple Intelligence. I closed all other apps except System Settings, toggled Apple Intelligence on and off and tried a few things: Looking at <code>\/Library\/Preferences<\/code> in Finder sorted by date (in this case make sure to <a href=\"https:\/\/www.google.com\/search?rls=en&amp;q=show+hidden+files+mac&amp;ie=UTF-8&amp;oe=UTF-8\" target=\"_blank\" rel=\"noreferrer noopener\">show hidden files<\/a>), running <a href=\"https:\/\/fsmonitor.com\" target=\"_blank\" rel=\"noreferrer noopener\">FSMonitor<\/a> to see things visualized, running <code>fs_usage -w -f filesys | grep plist<\/code> while screen recording in Quicktime to see the exact moment I enabled\/disable Apple Intelligence. After some toggling it is determined that <code>~\/Library\/Preferences\/.GlobalPreferences.plist<\/code> is our target. A few days later I re-discovered Bob Gendler&#8217;s excellent <a href=\"https:\/\/boberito.medium.com\/config-profile-and-manage-all-the-things-just-about-cafea8627d4b\" target=\"_blank\" rel=\"noreferrer noopener\">post<\/a> about using the command <code>log stream --debug --predicate 'process == \"cfprefsd\" &amp;&amp; eventMessage CONTAINS \"wrote the key\"'<\/code> to help narrow things down and this also confirmed this is the file (as well as many others) being written to when it&#8217;s enabled.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Obfuscation Investigations<\/h2>\n\n\n\n<p>Let&#8217;s look at <code>~\/Library\/Preferences\/.GlobalPreferences.plist<\/code> and see if we can find the exact key name. This file is a bit special in that you can do the <em>same thing <s>5<\/s> 6 different ways<\/em> with defaults! Run one of these commands as the console user <em>not<\/em> root:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>defaults read ~\/Library\/Preferences\/.GlobalPreferences.plist<\/code><\/li>\n\n\n\n<li><code>defaults read ~\/Library\/Preferences\/.GlobalPreferences<\/code><\/li>\n\n\n\n<li><code>defaults read NSGlobalDomain<\/code><\/li>\n\n\n\n<li><code>defaults read -globalDomain<\/code><\/li>\n\n\n\n<li><code>defaults read -g<\/code><\/li>\n\n\n\n<li><code>defaults read \"Apple Global Domain\"<\/code>\n<ul class=\"wp-block-list\">\n<li>Bonus update: \ud83d\udc46Shows up in <code>defaults read<\/code> and nowhere else<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>Regardless of how we do it though, the output for the <code>com.apple.gms.availability<\/code> keys is abridged and <strong>useless<\/strong> to us in this form.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-72.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"105\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-72-1024x105.png\" alt=\"\" class=\"wp-image-1541\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-72-1024x105.png 1024w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-72-300x31.png 300w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-72-768x79.png 768w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-72-1536x158.png 1536w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-72.png 1812w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>What&#8217;s going on? What is this halting hexadecimal hodgepodge? Let&#8217;s use <code>defaults export -g -<\/code> to print the contents to in XML1 format (BTW you won&#8217;t find <code>export<\/code> documented in the man page, after a decade it still only exists in <code>defaults -h<\/code> help).<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-73.png\"><img loading=\"lazy\" decoding=\"async\" width=\"804\" height=\"234\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-73.png\" alt=\"\" class=\"wp-image-1545\" style=\"width:563px;height:auto\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-73.png 804w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-73-300x87.png 300w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-73-768x224.png 768w\" sizes=\"auto, (max-width: 804px) 100vw, 804px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>Ah, OK, these keys are <code>&lt;data&gt;<\/code> types which contain <code>base64<\/code> encoded strings. The contents are possibly binary data. We&#8217;ve already established that <code>defaults<\/code> is <em>not<\/em> going to be useful to us. In my previous post <a href=\"https:\/\/www.brunerd.com\/blog\/2022\/03\/07\/respecting-focus-and-meeting-status-in-your-mac-scripts-aka-dont-be-a-jerk\/\">Respecting Focus and Meeting Status in Your Mac scripts (aka Don\u2019t Be a Jerk)<\/a> we are able to extract the data using <code>plutil -extract<\/code> however because these key names contains periods (aka &#8220;full stop&#8221; U+2E) this clashes with plutil&#8217;s shoddy &#8220;keypath&#8221; parsing, which uses periods to delimit the path but <em>doesn&#8217;t<\/em> respect escaping periods with a backslashes (which is <em>not hard to do<\/em> as my JSON tool <a href=\"https:\/\/www.brunerd.com\/blog\/2022\/02\/22\/ljt-1-0-0-a-little-json-tool-for-your-shell-script\/\">ljt<\/a> can handles this). So all we are left with is <code>\/usr\/libexec\/PlistBuddy<\/code> let&#8217;s give that a try: <code>\/usr\/libexec\/PlistBuddy ~\/Library\/Preferences\/.GlobalPreferences.plist -c \"print :com.apple.gms.availability.key<\/code> (Spoiler alert the key is: <code>com.apple.gms.availability.key<\/code>)<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-74.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"119\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-74-1024x119.png\" alt=\"\" class=\"wp-image-1547\" style=\"width:722px;height:auto\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-74-1024x119.png 1024w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-74-300x35.png 300w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-74-768x89.png 768w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-74.png 1514w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>OK! There we go, it&#8217;s a binary plist inside the key of a plist! &#8220;Brilliant&#8221; Apple, really. \ud83d\ude44 Alright then, let&#8217;s pipe this through <code>plutil -convert xml1 - -o -<\/code> and get some ASCII XML yeah?<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-81.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"95\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-81-1024x95.png\" alt=\"\" class=\"wp-image-1579\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-81-1024x95.png 1024w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-81-300x28.png 300w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-81-768x71.png 768w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-81-1536x142.png 1536w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-81.png 1726w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Pardon moi, but <em>what the shit is this!?<\/em> \ud83d\udca9 <code>file<\/code> said it was an &#8220;Apple binary property list&#8221; \u2013 <em>according to those first bytes<\/em>. Let&#8217;s look at it run through <code>xxd<\/code> to see if we can find more clues.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-76.png\"><img loading=\"lazy\" decoding=\"async\" width=\"882\" height=\"116\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-76.png\" alt=\"\" class=\"wp-image-1549\" style=\"width:654px;height:auto\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-76.png 882w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-76-300x39.png 300w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-76-768x101.png 768w\" sizes=\"auto, (max-width: 882px) 100vw, 882px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>Aha! There is an extraneous newline (<code>0x0a<\/code>) that <code>PlistBuddy<\/code> is outputting (annoying but at least consistent!). Why can&#8217;t that just be ignored? Because <a href=\"https:\/\/medium.com\/@karaiskc\/understanding-apples-binary-property-list-format-281e6da00dbd\" target=\"_blank\" rel=\"noreferrer noopener\">apparently<\/a> the last byte of a binary plist is the offset table, mess that up and it all falls apart. So what we need to do is trim this dangling newline. For this I consulted ChatGPT and <code>perl -pe 'chomp if eof'<\/code> is the magic we need. BTW ChatGPT does well for me to ask very targeted and direct questions like this, I don&#8217;t ask it to write entire scripts but sometimes it will have insights into different methods I&#8217;d never considered.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-77.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"189\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-77-1024x189.png\" alt=\"\" class=\"wp-image-1551\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-77-1024x189.png 1024w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-77-300x55.png 300w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-77-768x142.png 768w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-77.png 1396w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>OMG. SRSLY? Apple is writing data encoded binary plist data containing a single integer value <em>in an array<\/em>?! <strong>ATTN: Craig Federighi<\/strong>: Please tell your engineers to stop junking up an otherwise elegant system with these obfuscation games. Alright, let&#8217;s bring it home and get the value with this: <code>\/usr\/libexec\/PlistBuddy ~\/Library\/Preferences\/.GlobalPreferences.plist -c \"print :com.apple.gms.availability.key\" | perl -pe 'chomp if eof' | plutil -convert xml1 - -o - | plutil -extract 0 raw - -o -<\/code><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-78.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"67\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-78-1024x67.png\" alt=\"\" class=\"wp-image-1552\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-78-1024x67.png 1024w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-78-300x20.png 300w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-78-768x51.png 768w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-78.png 1398w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>There we go: <strong>0<\/strong> (zero), which means Apple Intelligence is <strong>on<\/strong>. When it&#8217;s <strong>2<\/strong>, it&#8217;s off. Yet another key like <a href=\"https:\/\/www.brunerd.com\/blog\/2024\/09\/27\/getting-ahead-of-private-wi-fi-address-changes-in-macos-sequoia\/\" target=\"_blank\" rel=\"noreferrer noopener\">PrivateMACAddressModeSystemSetting<\/a> which has the <em>opposite<\/em> meaning of what you might expect. BTW I&#8217;ve yet to see the value as 1, except for this <a href=\"https:\/\/x.com\/zhuowei\/status\/1801184476828959207\" target=\"_blank\" rel=\"noreferrer noopener\">June Tweet<\/a> where someone writes a 1 to turn on Writing Tools on a beta. BTW this key only <strong>indicates<\/strong> the state, in my testing it <em>does not<\/em> <strong>affect<\/strong> the state, meaning if you change the value (and even do a <code>killall cfprefsd<\/code>) all it will do is blank out the Apple Intelligence toggle for a moment and then it&#8217;ll sort itself out and display the true state. <\/p>\n\n\n\n<p>[UPDATE: Here&#8217;s a <em>simple<\/em> hacky POC method that works on all version of Sequoia: <code>awk -F '= |;' '\/=\/{print $2}' &lt;&lt;&lt; \"$(defaults read ~\/Library\/Preferences\/com.apple.CloudSubscriptionFeatures.optIn.plist)\"<\/code> My script at <a href=\"https:\/\/github.com\/brunerd\/macAdminTools\/blob\/main\/Jamf\/EAs\/OS-Apple%20Intelligence%20Availability.sh\">OS-Apple Intelligence Availability.sh<\/a> does a more thorough job get the correct iCloud AccountDSID. ]<\/p>\n\n\n\n<p>And yes there is <a href=\"https:\/\/snelson.us\/2024\/10\/apple-intelligence-extension-attribute\/\" target=\"_blank\" rel=\"noreferrer noopener\"><em>another way<\/em><\/a> to get the state of Apple Intelligence however it makes the assumption that you only have one account in <code>MobileMeAccounts.plist<\/code> to determine your <code>AccountDSID<\/code> and then query yet another file but if you have <em>more than one<\/em> Apple Account, you know like for all your purchases in: iTunes\/Music\/App Store there may be multiple accounts (** cough** <strong>merge accounts Apple!<\/strong> **cough**)  so it may return an erroneous results if you have more than one account. [UPDATE: Actually the cause of more than one dictionary in the <code>Accounts<\/code> array in <code>MobileMeAccounts.plist<\/code> is from <strong>additional Mail accounts<\/strong>. My updated <a href=\"https:\/\/github.com\/brunerd\/macAdminTools\/blob\/main\/Jamf\/EAs\/OS-Apple%20Intelligence%20Availability.sh\" target=\"_blank\" rel=\"noreferrer noopener\">script<\/a> has a quick and novel way to get the correct <code>AccountDSID<\/code>. <em>Also<\/em>, you can now <a href=\"https:\/\/support.apple.com\/en-us\/117294\" target=\"_blank\" rel=\"noreferrer noopener\">Migrate purchases from one Apple Account to another Apple Account<\/a> too! \u2764\ufe0f]<\/p>\n\n\n\n<p>The ChatGPT integration is actually a cinch to determine. I used the same method above to find the plist and then, because the engineers on this didn&#8217;t play games with encoded binary plist data within a plist, all you need to do is simply ask: <code>defaults read com.apple.siri.generativeassistantsettings isEnabled<\/code> and amazingly <code>0<\/code> means <strong>off<\/strong> and <code>1<\/code> means <strong>on<\/strong>, imagine that!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Usable Extension Attributes<\/h2>\n\n\n\n<p>You&#8217;ve made it this far, here&#8217;s the goods: <a href=\"https:\/\/github.com\/brunerd\/macAdminTools\/blob\/main\/Jamf\/EAs\/OS-Apple%20Intelligence%20Availability.sh\">OS-Apple Intelligence Availability.sh<\/a> [now updated for 15.4] and <a href=\"https:\/\/github.com\/brunerd\/macAdminTools\/blob\/main\/Jamf\/EAs\/OS-Apple%20Intelligence%20ChatGPT%20Status.sh\">OS-Apple Intelligence ChatGPT Status.sh<\/a> they are fully commented and when you run them here&#8217;s what they return. I&#8217;m trying out a new way to output both values and their interpretations, because let&#8217;s be honest, we are &#8220;reading tea leaves&#8221; here. \ud83c\udf75 None of this is officially documented by Apple and always subject to change. If a new value pops up, it will still be reported in the output. You won&#8217;t have to scramble to fix the extension attribute <em>right away<\/em>, just adjust the criteria in your Smart Group to match the value in the parentheses if there&#8217;s a policy that depends on it.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-79.png\"><img loading=\"lazy\" decoding=\"async\" width=\"572\" height=\"174\" src=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-79.png\" alt=\"\" class=\"wp-image-1553\" srcset=\"https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-79.png 572w, https:\/\/www.brunerd.com\/blog\/wp-content\/uploads\/image-79-300x91.png 300w\" sizes=\"auto, (max-width: 572px) 100vw, 572px\" \/><\/a><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">Closing Thoughts<\/h2>\n\n\n\n<p>What an absolute <strong>pain<\/strong> it was to get a single numerical value from a single key! To that end after I had written these extension attributes I went to work over the Thanksgiving break and wrote a tool to make this effortless. I&#8217;ll be releasing this tool, which will work as both a standalone tool and a shell script function in the coming days!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>UPDATE: Heads up, either by shear coincidence or my salty appeal to not play hide and seek, the ability to detect Apple Intelligence will no longer be found in the binary plist data of com.apple.gms.availability.key in the user&#8217;s .GlobalPreferences domain on macOS 15.4 and up. I&#8217;ve updated my GitHub script OS-Apple Intelligence Availability.sh and I&#8217;ve [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,19,46,12],"tags":[27,20,47,25,22,24],"class_list":["post-1540","post","type-post","status-publish","format-standard","hentry","category-apple","category-bash","category-jamf","category-scripting","tag-apple","tag-bash","tag-jamf","tag-macos","tag-scripting","tag-shell"],"_links":{"self":[{"href":"https:\/\/www.brunerd.com\/blog\/wp-json\/wp\/v2\/posts\/1540","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.brunerd.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.brunerd.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.brunerd.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.brunerd.com\/blog\/wp-json\/wp\/v2\/comments?post=1540"}],"version-history":[{"count":20,"href":"https:\/\/www.brunerd.com\/blog\/wp-json\/wp\/v2\/posts\/1540\/revisions"}],"predecessor-version":[{"id":1649,"href":"https:\/\/www.brunerd.com\/blog\/wp-json\/wp\/v2\/posts\/1540\/revisions\/1649"}],"wp:attachment":[{"href":"https:\/\/www.brunerd.com\/blog\/wp-json\/wp\/v2\/media?parent=1540"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.brunerd.com\/blog\/wp-json\/wp\/v2\/categories?post=1540"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.brunerd.com\/blog\/wp-json\/wp\/v2\/tags?post=1540"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}