{"id":671,"date":"2022-10-27T21:40:00","date_gmt":"2022-10-28T02:40:00","guid":{"rendered":"https:\/\/blog.felineflock.com\/?p=671"},"modified":"2024-01-03T22:18:46","modified_gmt":"2024-01-04T04:18:46","slug":"salesforce-backup-made-easy-daily-automation-with-github-actions","status":"publish","type":"post","link":"https:\/\/blog.felineflock.com\/index.php\/2022\/10\/27\/salesforce-backup-made-easy-daily-automation-with-github-actions\/","title":{"rendered":"Salesforce Backup Made Easy:  Daily Automation with GitHub Actions"},"content":{"rendered":"\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"474\" height=\"248\" src=\"https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/image-36.png\" alt=\"\" class=\"wp-image-672\" srcset=\"https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/image-36.png 474w, https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/image-36-300x157.png 300w\" sizes=\"auto, (max-width: 474px) 100vw, 474px\" \/><\/figure>\n\n\n\n<p id=\"ember3006\">Steps to implement daily backups of a Salesforce org with GitHub Actions:<\/p>\n\n\n\n<p id=\"ember3008\"><strong>1) Preparing the GitHub repository<\/strong><\/p>\n\n\n\n<p id=\"ember3009\">Decide the project name and whether to use production (login) or sandbox (test).<\/p>\n\n\n\n<p id=\"ember3010\">Create a repository in GitHub.<\/p>\n\n\n\n<p id=\"ember3011\">2) In the GitHub repository root, create the file <strong>sfdx-project.json<\/strong> below, change the project name and URL and commit:<\/p>\n\n\n\n<p id=\"ember3012\">(you can copy <a href=\"https:\/\/raw.githubusercontent.com\/fmendes\/GitHubActionScripts\/main\/sfdx-project.json\">this file<\/a> and modify it)<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p id=\"ember3012\"><code>{ <\/code><\/p>\n\n\n\n<p><code>&nbsp; \"packageDirectories\": [&nbsp; &nbsp;&nbsp; {<\/code><\/p>\n\n\n\n<p><code>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; \"path\": \"force-app\",<\/code><\/p>\n\n\n\n<p><code>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;\"default\": true<\/code><\/p>\n\n\n\n<p><code>&nbsp; &nbsp;&nbsp; }&nbsp; ],<\/code><\/p>\n\n\n\n<p><code>&nbsp; \"name\": \"PROJECT_NAME_HERE\",<\/code><\/p>\n\n\n\n<p><code>&nbsp; \"namespace\": \"\",<\/code><\/p>\n\n\n\n<p><code>&nbsp; \"sfdcLoginUrl\": \"https:\/\/login_or_test_here.salesforce.com\/\",<\/code><\/p>\n\n\n\n<p><code>&nbsp; \"sourceApiVersion\": \"55.0\" <\/code><\/p>\n\n\n\n<p><code>}<\/code><\/p>\n<\/blockquote>\n\n\n\n<p id=\"ember3012\"><merlin-component id=\"merlin-code-summarizer\" class=\"merlin-code-summarizer\"><\/merlin-component><\/p>\n\n\n\n<p id=\"ember3013\">3) In the GitHub repository root, create the file <strong>package.xml<\/strong> below and commit:<\/p>\n\n\n\n<p id=\"ember3014\">(you can copy <a href=\"https:\/\/raw.githubusercontent.com\/fmendes\/GitHubActionScripts\/main\/package.xml\">this file<\/a>)<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt; &lt;Package xmlns=&#8221;http:\/\/soap.sforce.com\/2006\/04\/metadata&#8221;&gt; &lt;types&gt; &lt;members&gt;*&lt;\/members&gt; &lt;name&gt;ApexClass&lt;\/name&gt; &lt;\/types&gt; &lt;types&gt; &lt;members&gt;*&lt;\/members&gt; &lt;name&gt;ApexComponent&lt;\/name&gt; &lt;\/types&gt; &lt;types&gt; &lt;members&gt;*&lt;\/members&gt; &lt;name&gt;ApexPage&lt;\/name&gt; &lt;\/types&gt; &lt;types&gt; &lt;members&gt;*&lt;\/members&gt; &lt;name&gt;ApexTrigger&lt;\/name&gt; &lt;\/types&gt; &lt;types&gt; &lt;members&gt;*&lt;\/members&gt; &lt;name&gt;AuraDefinitionBundle&lt;\/name&gt; &lt;\/types&gt; &lt;types&gt; &lt;members&gt;*&lt;\/members&gt; &lt;name&gt;CustomField&lt;\/name&gt; &lt;\/types&gt; &lt;types&gt; &lt;members&gt;*&lt;\/members&gt; &lt;name&gt;CustomLabels&lt;\/name&gt; &lt;\/types&gt; &lt;types&gt; &lt;members&gt;*&lt;\/members&gt; &lt;name&gt;CustomMetadata&lt;\/name&gt; &lt;\/types&gt; &lt;types&gt; &lt;members&gt;*&lt;\/members&gt; &lt;name&gt;CustomObject&lt;\/name&gt; &lt;\/types&gt; &lt;types&gt; &lt;members&gt;*&lt;\/members&gt; &lt;name&gt;FieldSet&lt;\/name&gt; &lt;\/types&gt; &lt;types&gt; &lt;members&gt;*&lt;\/members&gt; &lt;name&gt;FlexiPage&lt;\/name&gt; &lt;\/types&gt; &lt;types&gt; &lt;members&gt;*&lt;\/members&gt; &lt;name&gt;Flow&lt;\/name&gt; &lt;\/types&gt; &lt;types&gt; &lt;members&gt;*&lt;\/members&gt; &lt;name&gt;FlowCategory&lt;\/name&gt; &lt;\/types&gt; &lt;types&gt; &lt;members&gt;*&lt;\/members&gt; &lt;name&gt;FlowDefinition&lt;\/name&gt; &lt;\/types&gt; &lt;types&gt; &lt;members&gt;*&lt;\/members&gt; &lt;name&gt;LightningComponentBundle&lt;\/name&gt; &lt;\/types&gt; &lt;types&gt; &lt;members&gt;*&lt;\/members&gt; &lt;name&gt;LightningMessageChannel&lt;\/name&gt; &lt;\/types&gt; &lt;types&gt; &lt;members&gt;*&lt;\/members&gt; &lt;name&gt;NamedCredential&lt;\/name&gt; &lt;\/types&gt; &lt;types&gt; &lt;members&gt;*&lt;\/members&gt; &lt;name&gt;PermissionSet&lt;\/name&gt; &lt;\/types&gt; &lt;types&gt; &lt;members&gt;*&lt;\/members&gt; &lt;name&gt;RemoteSiteSetting&lt;\/name&gt; &lt;\/types&gt; &lt;types&gt; &lt;members&gt;*&lt;\/members&gt; &lt;name&gt;StaticResource&lt;\/name&gt; &lt;\/types&gt; &lt;types&gt; &lt;members&gt;*&lt;\/members&gt; &lt;name&gt;ValidationRule&lt;\/name&gt; &lt;\/types&gt; &lt;types&gt; &lt;members&gt;*&lt;\/members&gt; &lt;name&gt;Workflow&lt;\/name&gt; &lt;\/types&gt; &lt;types&gt; &lt;members&gt;*&lt;\/members&gt; &lt;name&gt;WorkflowFieldUpdate&lt;\/name&gt; &lt;\/types&gt; &lt;types&gt; &lt;members&gt;*&lt;\/members&gt; &lt;name&gt;WorkflowRule&lt;\/name&gt; &lt;\/types&gt; &lt;types&gt; &lt;members&gt;*&lt;\/members&gt; &lt;name&gt;WorkflowTask&lt;\/name&gt; &lt;\/types&gt; &lt;version&gt;54.0&lt;\/version&gt; &lt;\/Package&gt;<\/p>\n<\/blockquote>\n\n\n\n<p id=\"ember3014\"><merlin-component id=\"merlin-code-summarizer\" class=\"merlin-code-summarizer\"><\/merlin-component><code><merlin-component id=\"merlin-code-summarizer\" class=\"merlin-code-summarizer\"><\/merlin-component><\/code><\/p>\n\n\n\n<p id=\"ember3015\"><strong>4) Getting authentication URL from the org<\/strong><\/p>\n\n\n\n<p id=\"ember3016\">With SFDX installed, on Terminal, execute this command after changing the project name and URL (single line, no breaks):<\/p>\n\n\n\n<p id=\"ember3016\"><code>sfdx force:auth:web:login --setalias PROJECT_NAME_HERE --instanceurl https:\/\/login_or_test_here.salesforce.com --setdefaultusername<\/code><\/p>\n\n\n\n<p id=\"ember3017\">5) It will prompt to login on the browser, then execute on Terminal:<\/p>\n\n\n\n<p id=\"ember3017\"><code>sfdx force:org:display -u PROJECT_NAME_HERE --verbose<\/code><\/p>\n\n\n\n<p id=\"ember3018\">6) Copy to the Clipboard the entry immediately after &#8220;<strong>Sfdx Auth Url<\/strong>&#8220;. It should be something like <em>force:\/\/PlatformCLI::<\/em><a href=\"http:\/\/invalid\/\/\"><em>6Bep&#8230;3ad@instancename.sandbox.my.salesforce.com<\/em><\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"305\" src=\"https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/image-37-1024x305.png\" alt=\"\" class=\"wp-image-673\" srcset=\"https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/image-37-1024x305.png 1024w, https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/image-37-300x89.png 300w, https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/image-37-768x229.png 768w, https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/image-37-1536x458.png 1536w, https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/image-37.png 2034w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p id=\"ember3020\"><strong>7) Storing authentication URL in GitHub safely<\/strong><\/p>\n\n\n\n<p id=\"ember3021\">On GitHub, go to Settings \/ Secrets \/ Actions and create a new repository secret with the name &#8220;ORG_SFDX_URL&#8221; and paste the content copied in the previous step.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"582\" src=\"https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/image-38-1024x582.png\" alt=\"\" class=\"wp-image-674\" srcset=\"https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/image-38-1024x582.png 1024w, https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/image-38-300x171.png 300w, https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/image-38-768x437.png 768w, https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/image-38.png 1488w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p id=\"ember3023\">8) On GitHub, go to Actions, configure a simple workflow and name the script file &#8220;<strong>syncRepositoryToOrg.yml<\/strong>&#8220;.<\/p>\n\n\n\n<p id=\"ember3024\">(you can copy <a href=\"https:\/\/raw.githubusercontent.com\/fmendes\/GitHubActionScripts\/main\/syncRepositoryToOrg.yml\">this file<\/a>)<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"256\" src=\"https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/image-39-1024x256.png\" alt=\"\" class=\"wp-image-675\" srcset=\"https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/image-39-1024x256.png 1024w, https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/image-39-300x75.png 300w, https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/image-39-768x192.png 768w, https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/image-39-1536x384.png 1536w, https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/image-39.png 1586w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p id=\"ember3026\"><strong>9) Setting up GitHub Action to backup the org<\/strong><\/p>\n\n\n\n<p id=\"ember3027\">Copy the contents below into the new YML script and press &#8220;Start commit&#8221; (green button at top right).<\/p>\n\n\n\n<p id=\"ember3028\">(you can copy <a href=\"https:\/\/raw.githubusercontent.com\/fmendes\/GitHubActionScripts\/main\/syncRepositoryToOrg.yml\">this file<\/a>)<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>name: Detect changes in the org and sync into the repository<\/p>\n\n\n\n<p># When the workflow will run<\/p>\n\n\n\n<p>on:<\/p>\n\n\n\n<p>schedule:<\/p>\n\n\n\n<p># Runs at 12:00 UTC every day.<\/p>\n\n\n\n<p>&#8211; cron: &#8216;0 12 * * *&#8217;<\/p>\n\n\n\n<p># Allows you to run this workflow manually from the Actions tab<\/p>\n\n\n\n<p>workflow_dispatch:<\/p>\n\n\n\n<p>inputs:<\/p>\n\n\n\n<p># this will be refered to as ${{ github.event.inputs.commit_text }}<\/p>\n\n\n\n<p>commit_text:<\/p>\n\n\n\n<p>description: &#8216;Commit text to use&#8217;<\/p>\n\n\n\n<p>required: true<\/p>\n\n\n\n<p>default: &#8216;New Manual Sync commit&#8217;<\/p>\n\n\n\n<p>jobs:<\/p>\n\n\n\n<p>sync_job:<\/p>\n\n\n\n<p>runs-on: ubuntu-latest<\/p>\n\n\n\n<p>steps:<\/p>\n\n\n\n<p>&#8211; name: Install Salesforce CLI<\/p>\n\n\n\n<p>run: |<\/p>\n\n\n\n<p>wget https:\/\/developer.salesforce.com\/media\/salesforce-cli\/sfdx\/channels\/stable\/sfdx-linux-x64.tar.xz<\/p>\n\n\n\n<p>mkdir ~\/sfdx<\/p>\n\n\n\n<p>tar xJf sfdx-linux-x64.tar.xz -C ~\/sfdx &#8211;strip-components 1<\/p>\n\n\n\n<p>echo &#8220;$HOME\/sfdx\/bin&#8221; &gt;&gt; $GITHUB_PATH<\/p>\n\n\n\n<p>~\/sfdx\/bin\/sfdx version<\/p>\n\n\n\n<p>&#8211; name: &#8216;Checkout source code&#8217;<\/p>\n\n\n\n<p>uses: actions\/checkout@main<\/p>\n\n\n\n<p>&#8211; name: &#8216;Create file to authenticate to the org via SFDX&#8217;<\/p>\n\n\n\n<p>run: echo ${{ secrets.ORG_SFDX_URL }} &gt; DEV-LOGIN.txt<\/p>\n\n\n\n<p>&#8211; name: &#8216;Authenticate to the org using SFDX&#8217;<\/p>\n\n\n\n<p>run: sfdx force:auth:sfdxurl:store -f DEV-LOGIN.txt -d -a backupfiles<\/p>\n\n\n\n<p>&#8211; name: &#8216;Create project with manifest, Copy package.xml, Navigate to the project folder, Download metadata using SFDX&#8217;<\/p>\n\n\n\n<p>run: |<\/p>\n\n\n\n<p>rm DEV-LOGIN.txt<\/p>\n\n\n\n<p>if test -d &#8220;.\/backupfiles\/force-app&#8221;; then<\/p>\n\n\n\n<p>echo force-app folder exists<\/p>\n\n\n\n<p>else<\/p>\n\n\n\n<p>sfdx force:project:create &#8211;projectname backupfiles &#8211;manifest<\/p>\n\n\n\n<p>fi<\/p>\n\n\n\n<p>if test -f &#8220;.\/backupfiles\/sfdx-project.json&#8221;; then<\/p>\n\n\n\n<p>echo sfdx-project.json file exists<\/p>\n\n\n\n<p>else<\/p>\n\n\n\n<p>cp .\/sfdx-project.json .\/backupfiles\/sfdx-project.json<\/p>\n\n\n\n<p>fi<\/p>\n\n\n\n<p>if test -f &#8220;.\/backupfiles\/manifest\/package.xml&#8221;; then<\/p>\n\n\n\n<p>echo package.xml file exists<\/p>\n\n\n\n<p>else<\/p>\n\n\n\n<p>cp .\/package.xml .\/backupfiles\/manifest<\/p>\n\n\n\n<p># below causes ERROR running force:source:manifest:create: This directory does not contain a valid Salesforce DX project.<\/p>\n\n\n\n<p>#sfdx force:source:manifest:create -m ApexClass,ApexComponent,ApexPage,ApexTrigger,AuraDefinitionBundle,CustomField,CustomLabels,CustomMetadata,CustomObject,FieldSet,FlexiPage,Flow,FlowCategory,FlowDefinition,LightningComponentBundle,LightningMessageChannel,NamedCredential,PermissionSet,RemoteSiteSetting,StaticResource,ValidationRule,Workflow,WorkflowFieldUpdate,WorkflowRule,WorkflowTask -o .\/backupfiles\/manifest<\/p>\n\n\n\n<p>fi<\/p>\n\n\n\n<p>cd .\/backupfiles<\/p>\n\n\n\n<p>sfdx force:source:retrieve -u backupfiles -x manifest\/package.xml<\/p>\n\n\n\n<p>&#8211; name: Save repository owner email<\/p>\n\n\n\n<p>run: |<\/p>\n\n\n\n<p>echo &#8220;owner_email=$(git log -n 1 &#8211;pretty=format:%ae )&#8221; &gt;&gt; $GITHUB_ENV<\/p>\n\n\n\n<p>&#8211; name: Stage files and check for modified files<\/p>\n\n\n\n<p>id: git-check<\/p>\n\n\n\n<p>run: |<\/p>\n\n\n\n<p>git init<\/p>\n\n\n\n<p>git config user.email &#8220;${{ env.owner_email }}&#8221;<\/p>\n\n\n\n<p>git config user.name &#8220;${{ github.repository_owner }}&#8221;<\/p>\n\n\n\n<p>git add .<\/p>\n\n\n\n<p>echo &#8220;modified=$(if git diff-index &#8211;quiet HEAD &#8211;; then echo &#8220;false&#8221;; else echo &#8220;true&#8221;; fi)&#8221; &gt;&gt; $GITHUB_OUTPUT<\/p>\n\n\n\n<p>&#8211; name: Commit and push if there modified files<\/p>\n\n\n\n<p>if: steps.git-check.outputs.modified == &#8216;true&#8217;<\/p>\n\n\n\n<p>run: |<\/p>\n\n\n\n<p>git commit -m &#8220;${{ github.event.inputs.commit_text }} on ${{ github.event.repository.updated_at }}&#8221;<\/p>\n\n\n\n<p>echo &#8220;git-push=$(git push -u origin main)\\n&#8221; &gt;&gt; $GITHUB_OUTPUT<\/p>\n<\/blockquote>\n\n\n\n<p id=\"ember3028\"><\/p>\n\n\n\n<p id=\"ember3029\"><strong>10) Running the backup for the first time<\/strong><\/p>\n\n\n\n<p id=\"ember3030\">Go to Actions and click &#8220;Detect changes in the org and backup\u2026&#8221;, then click &#8220;Run workflow&#8221;. It will ask what branch to run the workflow from and the commit text to use (enter your choices). Click the green button &#8220;Run workflow&#8221;.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"285\" src=\"https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/image-40-1024x285.png\" alt=\"\" class=\"wp-image-676\" srcset=\"https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/image-40-1024x285.png 1024w, https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/image-40-300x83.png 300w, https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/image-40-768x214.png 768w, https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/image-40-1536x427.png 1536w, https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/image-40-2048x570.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p id=\"ember3032\">11) The workflow will be queued. You can click on it to see it being executed. The source code will be stored in the &#8220;backupfiles&#8221; folder.<\/p>\n\n\n\n<p id=\"ember3033\">12) In addition, the workflow will check your org every day at midnight (UTC) and backup any changes.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Steps to implement daily backups of a Salesforce org with GitHub Actions: 1) Preparing the GitHub repository Decide the project name and whether to use production (login) or sandbox (test). Create a repository in GitHub. 2) In the GitHub repository root, create the file sfdx-project.json below, change the project name and URL and commit: (you [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-671","post","type-post","status-publish","format-standard","hentry","category-blog"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/blog.felineflock.com\/index.php\/wp-json\/wp\/v2\/posts\/671","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.felineflock.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.felineflock.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.felineflock.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.felineflock.com\/index.php\/wp-json\/wp\/v2\/comments?post=671"}],"version-history":[{"count":1,"href":"https:\/\/blog.felineflock.com\/index.php\/wp-json\/wp\/v2\/posts\/671\/revisions"}],"predecessor-version":[{"id":677,"href":"https:\/\/blog.felineflock.com\/index.php\/wp-json\/wp\/v2\/posts\/671\/revisions\/677"}],"wp:attachment":[{"href":"https:\/\/blog.felineflock.com\/index.php\/wp-json\/wp\/v2\/media?parent=671"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.felineflock.com\/index.php\/wp-json\/wp\/v2\/categories?post=671"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.felineflock.com\/index.php\/wp-json\/wp\/v2\/tags?post=671"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}