
{"id":7182,"date":"2021-01-21T20:17:09","date_gmt":"2021-01-21T20:17:09","guid":{"rendered":"https:\/\/rax-stg-wp-aws.com\/blogs\/how-to-create-a-dynamic-dns-with-the-aws-api-and-route-53\/"},"modified":"2026-11-03T19:28:10","modified_gmt":"2026-11-03T19:28:10","slug":"how-to-create-a-dynamic-dns-with-the-aws-api-and-route-53","status":"publish","type":"blogs","link":"https:\/\/www.rackspace.com\/de\/blogs\/how-to-create-a-dynamic-dns-with-the-aws-api-and-route-53\/","title":{"rendered":"How to create a dynamic DNS with the AWS API and Route 53"},"content":{"rendered":"<p><strong><em>Originally published in February 2017, at the Onica blog <a href=\"https:\/\/onica.com\/blog\/\">here<\/a>.<\/em><\/strong><\/p>\n<p>A few of our cloud engineers were chatting about making a Dynamic DNS on Amazon Web Services; (AWS) for some personal projects. As we got to talking, I realized that although Lambda was the go-to technology, it was not needed.&nbsp;<\/p>\n<p><strong>Creating an AWS Route 53 Dynamic DNS (with API Gateway in place of Lambda)<\/strong><\/p>\n<p>You certainly wouldn\u2019t want to give the world access to your AWS account, so we&#8217;re making sure to keep the system locked down. However, as this walkthrough shows, you do not need Lambda to create a simple Dynamic DNS in Route 53.<\/p>\n<p>Our example assumes you already have a domain hosted in Route 53 and use&nbsp;<strong>acme.local<\/strong> as the domain name.<\/p>\n<p><strong>Step 1: Create your API Gateway and resource<\/strong><\/p>\n<p>Create your API Gateway and give it a description. I called mine, <strong>DynamicDNS<\/strong>.<br \/>\nCreate the resource: <em>{zone_id}<\/em>. For this exercise, I\u2019m using a little bit of&nbsp;<em>security through obscurity<\/em> by requiring the Route 53 Zone ID in the URL path. I use the `<a href=\"https:\/\/api_gw_url\/route53_zone_id\">https:\/\/api_gw_url\/route53_zone_id<\/a>` as the URL for updating.<\/p>\n<p><strong>Step 2: Create the method<\/strong><\/p>\n<p>I want the simplest HTTP request possible because I want to be able to use this anywhere. So, I create a `GET`<br \/>\nrequest and map the request to the AWS Service, Route 53. This is where all of the magic happens.<\/p>\n<p>Perform the following steps:<\/p>\n<ol>\n<li>Create a GET request for the <em>\/{zone_id}<\/em>&nbsp;resource.<\/li>\n<li>Set it to <em>AWS Service<\/em>.<\/li>\n<li>Set the <strong>Region<\/strong>&nbsp;to whatever you want. I used <em>us-west-2<\/em>, but it doesn\u2019t matter with Route53.<\/li>\n<li>Set the <strong>service<\/strong> to <em>Route 53<\/em>.<\/li>\n<li>Leave the <strong>AWS Subdomain<\/strong> blank.<\/li>\n<li>Set the <strong>HTTP Method<\/strong>&nbsp;to <em>POST<\/em>. This is the method that the AWS service API expects. You can read more about it here:&nbsp;<a href=\"https:\/\/docs.aws.amazon.com\/Route53\/latest\/APIReference\/API_ChangeResourceRecordSets.html\">Change Resource Record Rates<\/a>.<\/li>\n<li>You need to use a custom path to use the <em>{zone_id}<\/em>&nbsp;variable, so set <strong>Action Type<\/strong>&nbsp;to <em>Use path override.<\/em><\/li>\n<li>Reading the API docs linked in step 6, you can see you need to ultimately use the path <em>\/2013-04-01\/hostedzone\/&lt;Id&gt;\/rrset\/<\/em>, so set the Path Override to: <em>\/2013-04-01\/hostedzone\/{hosted_zone_id}\/rrset\/<\/em>. I explain why I used&nbsp;<em>{hosted_zone_id}<\/em> instead of <em>{zone_id}<\/em>&nbsp;a bit further down in this post.<\/li>\n<li>Give it an IAM role. The IAM role needs the following trust relationship and role:<\/li>\n<\/ol>\n<p><strong>Trust relationship<\/strong><\/p>\n<p>&nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp;&#8220;Version&#8221;: &#8220;2012-10-17&#8221;,<br \/>\n&nbsp; &nbsp; &nbsp;&#8220;Statement&#8221;: [<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#8220;Sid&#8221;: &#8220;&#8221;,<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#8220;Effect&#8221;: &#8220;Allow&#8221;,<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#8220;Principal&#8221;: {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#8220;Service&#8221;: &#8220;apigateway.amazonaws.com&#8221;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;},<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#8220;Action&#8221;: &#8220;sts:AssumeRole&#8221;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; }<br \/>\n&nbsp; &nbsp; &nbsp;]<br \/>\n&nbsp; &nbsp; }<\/p>\n<p><strong>Role<\/strong><\/p>\n<p><strong>&nbsp; <\/strong>&nbsp;{<br \/>\n&nbsp; &nbsp; &nbsp;&#8220;Version&#8221;: &#8220;2012-10-17&#8221;,<br \/>\n&nbsp; &nbsp; &nbsp;&#8220;Statement&#8221;: [<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#8220;Sid&#8221;: &#8220;Stmt1487876360000&#8221;,<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#8220;Effect&#8221;: &#8220;Allow&#8221;,<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#8220;Action&#8221;: [<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#8220;route53:ChangeResourceRecordSets&#8221;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;],<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#8220;Resource&#8221;: [<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#8220;arn:aws:route53:::hostedzone\/Z1BZA5RDXLSXJ1&#8221;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;]<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; }<br \/>\n&nbsp; &nbsp; &nbsp;]<br \/>\n&nbsp; &nbsp; }<\/p>\n<p><strong>Role<\/strong><\/p>\n<p>&nbsp; &nbsp;{<br \/>\n&nbsp; &nbsp; &nbsp;&#8220;Version&#8221;: &#8220;2012-10-17&#8221;,<br \/>\n&nbsp; &nbsp; &nbsp;&#8220;Statement&#8221;: [<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#8220;Sid&#8221;: &#8220;Stmt1487876360000&#8221;,<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#8220;Effect&#8221;: &#8220;Allow&#8221;,<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#8220;Action&#8221;: [<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#8220;route53:ChangeResourceRecordSets&#8221;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;],<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#8220;Resource&#8221;: [<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#8220;arn:aws:route53:::hostedzone\/Z1BZA5RDXLSXJ1&#8221;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;]<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; }<br \/>\n&nbsp; &nbsp; &nbsp;]<br \/>\n&nbsp; &nbsp; }<\/p>\n<p><strong>Note<\/strong>: Make sure to change the actual Zone ID above, replacing `Z1BZA5RDXLSXJ1` with your Zone ID.<\/p>\n<p><strong>Step 3: Configure body mapping templates<\/strong><\/p>\n<p>You still have more work to do with the method because it does not send the Route 53 API any actual data.<\/p>\n<ol>\n<li>Click on the <em>GET<\/em>&nbsp;Method on the left panel under <strong>Resources<\/strong>.<\/li>\n<li>Click on the <strong>Integration Request<\/strong> header.<\/li>\n<li>Scroll down to <strong>Body Mapping Templates<\/strong>&nbsp;and expand it.<\/li>\n<li>Change the <strong>Request body passthrough<\/strong> to Never. This prevents any data from passing into the AWS API. This is the single most important thing you can do to secure your AWS account for this exercise, as I discuss later.<\/li>\n<li>Create a template for <strong>application\/json<\/strong>. I created this because <strong>application\/json<\/strong>&nbsp;is the default <strong>Content Type&nbsp;<\/strong>for API Gateway. If you do not specify this, a standard cURL request does not have a content type and fails.<\/li>\n<li>In the text box near the bottom, insert your XML payload for the Route 53 API `POST` call:<\/li>\n<\/ol>\n<p>&nbsp;<em> &nbsp; &nbsp; &nbsp; &lt;ChangeResourceRecordSetsRequest xmlns=&#8221;https:\/\/route53.amazonaws.com\/doc\/2013-04-01\/&#8221;&gt;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;ChangeBatch&gt;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;Changes&gt;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;Change&gt;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;Action&gt;UPSERT&lt;\/Action&gt;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;ResourceRecordSet&gt;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;Name&gt;myddns.acme.local&lt;\/Name&gt;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;Type&gt;A&lt;\/Type&gt;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;TTL&gt;60&lt;\/TTL&gt;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;ResourceRecords&gt;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;ResourceRecord&gt;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;Value&gt;$context.identity.sourceIp&lt;\/Value&gt;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;\/ResourceRecord&gt;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;\/ResourceRecords&gt;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;\/ResourceRecordSet&gt;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;\/Change&gt;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;\/Changes&gt;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;\/ChangeBatch&gt;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &lt;\/ChangeResourceRecordSetsRequest&gt;<\/em><br \/>\n&nbsp;<\/p>\n<p><strong>Note<\/strong>: You need to change the name of the record you want to update. As stated previously, I used <strong>acme.local<\/strong>&nbsp;for this article. I selected <strong>myddns&nbsp;<\/strong>as the record to create or update.<\/p>\n<p>The magic of the dynamic DNS system happens on the \\&lt;Value\\&gt; line, where&nbsp;<em>$context.identity.sourceIp<\/em>&nbsp;is mapped to the client\u2019s IP address, updating the DNS record with whatever client or external IP address API Gateway sees.<\/p>\n<p>Setting the <strong>Request body passthrough<\/strong>&nbsp;and security to <em>Never<\/em>&nbsp;is the best thing you can do for securing your AWS Service proxy. It\u2019s not as big of a requirement with a <em>GET<\/em>&nbsp;method as we\u2019ve created because the <em>GET<\/em>&nbsp;operation does not allow for payloads. But suppose you create a <em>POST<\/em>&nbsp;or <em>PUT<\/em>&nbsp;method (both allow body data to be passed in) and select the top option <strong>When no template matches the request Content-Type header<\/strong>. If someone were to `POST` to your API Gateway URL with a<br \/>\n<em>Content-Type <\/em>you did not specify, such as <strong>application\/scriptkiddie<\/strong>, their entire payload would be passed on to the AWS Service so that the XML can override yours. Setting it to <strong>Never<\/strong> forces the payload to be the only one delivered to the AWS API.<\/p>\n<p><strong>Step 4: Use the right content type for the API call<\/strong><\/p>\n<p>When you request API Gateway, the content type you specify gets passed through to the Integration (in this case, our Integration is the Route 53 API). If you do not specify a content type, API Gateway sets your <strong>Content-Type&nbsp;<\/strong>header to <em>application\/json<\/em>. This is a problem because we need to post to Route 53 API as <em>application\/xml<\/em>. So, hardcode that in the HTTP Headers in the following steps:<\/p>\n<ol>\n<li>Expand the <strong>HTTP Headers<\/strong>&nbsp;section above <strong>Body Mapping Templates<\/strong>.<\/li>\n<li>Create a new HTTP Header.<\/li>\n<li>Set <strong>Name<\/strong>&nbsp;to: <em>Content-Type<\/em>.<\/li>\n<li>Set <strong>Mapped from<\/strong> to: <em>application\/xml<\/em>.<\/li>\n<\/ol>\n<p><strong>Note:&nbsp;<\/strong>Single apostrophes are required<\/p>\n<p><em>HTTP Header created with the apostrophes<\/em><\/p>\n<p><strong>Step 5: Configure {zone_id}<\/strong><\/p>\n<p>Remember how you created the <em>\/{zone_id}<\/em>&nbsp;resource in step 1? Well, now you can configure it. Because I don\u2019t like to use the same variable name for two different services, I converted {<em>zone_id<\/em>} to {<em>hosted_zone_id<\/em>}:<\/p>\n<ol>\n<li>Expand the <strong>URL Path Parameters<\/strong>&nbsp;section.<\/li>\n<li>Create a new path with the <strong>Name<\/strong> of <em>hosted_zone_id<\/em>.<\/li>\n<li>Set <strong>Mapped from<\/strong> to: <em>method.request.path.zone_id.<\/em>&nbsp;This is where we use <em>zone_id<\/em>&nbsp;from the original resource path and map it to <em>{hosted_zone_id}<\/em> in the <strong>Path override<\/strong>&nbsp;setting.<\/li>\n<\/ol>\n<p><strong>Step 6: Deploy<\/strong><\/p>\n<p>At this point, you can deploy your newly configured API Gateway. I used a stage called <strong>ddns<\/strong>, but you can call it whatever you like.<\/p>\n<p>You might think, \u201cHey, shouldn\u2019t we test this first?\u201d While API Gateway has a great test feature, the test is not great for us because it sets our caller IP address to a string. That string won&#8217;t work with DNS because we\u2019re setting a record. So, we have to rely on cURL to tell us if it works or not. Remember, you need your Zone ID from Route 53 to update DNS. The URL format is similar to the following example:<\/p>\n<p>&nbsp; &nbsp; <strong>https:\/\/your_api_gw_url\/stage_name\/zone_id<\/strong><\/p>\n<p>For my system, it ended up being:&nbsp;&nbsp;<strong>https:\/\/c3y150djkh.execute-api.us-west-2.amazonaws.com\/ddns\/ZICXXN1DR8UXO<\/strong>*<\/p>\n<p>On a successful `GET` request, you get a `200` response code with the ChangeInfo response. At this point, your system is working. You can verify it by waiting up to 60 seconds and then checking your Route 53 console.<br \/>\n&nbsp;<\/p>\n<p><strong>(Optional) Step 7: Secure output<\/strong><\/p>\n<p>If you do not want to see the output of your Route 53 API call, you can adjust<br \/>\nthe data to just be empty:<\/p>\n<ol>\n<li>Go to the <strong>GET Method<\/strong>&nbsp;&gt; <strong>Integration Response<\/strong>.<\/li>\n<li>Expand the <strong>200 Method Response status<\/strong> line.<\/li>\n<li>Expand <strong>Body Mapping Templates<\/strong><\/li>\n<li>Click on <strong>application\/json<\/strong>.<\/li>\n<li>Select <strong>Empty<\/strong>&nbsp;from the <strong>Generate template<\/strong>&nbsp;drop-down menu.<\/li>\n<li>Click <strong>Save<\/strong><\/li>\n<li>Redeploy your API.<\/li>\n<\/ol>\n<p><strong>(Optional) Step 8: Additional security<\/strong><\/p>\n<p>I won\u2019t go into detail, but you can optionally add additional security by adding an API Key to your method. There\u2019s <a href=\"https:\/\/docs.aws.amazon.com\/apigateway\/latest\/developerguide\/welcome.html\">plenty<\/a>&nbsp;of <a href=\"https:\/\/docs.aws.amazon.com\/apigateway\/latest\/developerguide\/api-gateway-setup-api-key-with-console.html\">documentation<\/a>&nbsp;on <a href=\"https:\/\/www.google.com\/search?q=add+api+key+to+api+gateway+method&amp;cad=h\">how to do this<\/a>. Just remember that you need to add the <em>x-api-key header<\/em>. Thus, you might end up with a cURL request like the following example:<\/p>\n<p><em>&nbsp; &nbsp; curl \\<br \/>\n&nbsp; &nbsp; -H &#8220;x-api-key: hzYAVO9Sg98nsNh81M84O2kyXVy6K1xwHD8&#8221; \\<br \/>\n&nbsp; &nbsp; &#8216;https:\/\/c3y150djkh.execute-api.us-west-2.amazonaws.com\/ddns\/ZICXXN1DR8UXO&#8217;<\/em><\/p>\n<p>We leave this step as an exercise for you. In as few as six steps, you\u2019re finished creating an AWS Route 53 Dynamic DNS.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>How to create a dynamic DNS with the AWS API and Route 53<\/p>\n","protected":false},"author":2,"featured_media":7184,"menu_order":0,"comment_status":"open","ping_status":"open","template":"","format":"standard","meta":{"content-type":"","nid":"26295","content_type":"blog","created_by":"10130","authored_on":"2023-11-25T20:17:09+00:00","field_article_industries":"","tag_category":"Technical","field_blog_author_text":"by Rackspace Technology Staff","seo_description":"Learn how to create a dynamic DNS on AWS using the Route 53 service, bypassing the need for Lambda technology and optimizing your cloud infrastructure.\r\n","field_featured_image":"","insights_image":"\/wp-content\/uploads\/2026\/blog_technical_images\/26295-insights_image-aws-technical-blog-1-insights.png","field_partners":"","rxt_platforms":"Amazon Web Services (AWS)","product":"","publisheddate":"2021-01-21T20:17:09","rxt_solutions":"Public Cloud","opengraph_tag":"","x_tag":"","teaser_flag":"Technical Blog","seo_titile":"Dynamic DNS on AWS Route 53 | Rackspace Technology","field_topics":"","field_slug":"how-to-create-a-dynamic-dns-with-the-aws-api-and-route-53","footnotes":""},"categories":[178],"tags":[204],"class_list":["post-7182","blogs","type-blogs","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","tag-technical"],"_links":{"self":[{"href":"https:\/\/www.rackspace.com\/de\/wp-json\/wp\/v2\/blogs\/7182","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.rackspace.com\/de\/wp-json\/wp\/v2\/blogs"}],"about":[{"href":"https:\/\/www.rackspace.com\/de\/wp-json\/wp\/v2\/types\/blogs"}],"author":[{"embeddable":true,"href":"https:\/\/www.rackspace.com\/de\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rackspace.com\/de\/wp-json\/wp\/v2\/comments?post=7182"}],"version-history":[{"count":1,"href":"https:\/\/www.rackspace.com\/de\/wp-json\/wp\/v2\/blogs\/7182\/revisions"}],"predecessor-version":[{"id":7183,"href":"https:\/\/www.rackspace.com\/de\/wp-json\/wp\/v2\/blogs\/7182\/revisions\/7183"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.rackspace.com\/de\/wp-json\/wp\/v2\/media\/7184"}],"wp:attachment":[{"href":"https:\/\/www.rackspace.com\/de\/wp-json\/wp\/v2\/media?parent=7182"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rackspace.com\/de\/wp-json\/wp\/v2\/categories?post=7182"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rackspace.com\/de\/wp-json\/wp\/v2\/tags?post=7182"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}