{"id":1417,"date":"2022-06-04T17:16:54","date_gmt":"2022-06-04T15:16:54","guid":{"rendered":"https:\/\/www.sergilehkyi.com\/?p=1417"},"modified":"2022-06-04T17:19:23","modified_gmt":"2022-06-04T15:19:23","slug":"snowflake-time-travel-in-a-nutshell","status":"publish","type":"post","link":"https:\/\/www.sergilehkyi.com\/es\/2022\/06\/snowflake-time-travel-in-a-nutshell\/","title":{"rendered":"Snowflake Time Travel in a Nutshell"},"content":{"rendered":"\n<p>Yeah, the title is a bit clickbaity, so if you are too sensitive, please stop reading, because the article won\u2019t explain to you all the details of the mentioned feature of Snowflake. But despite that, it will show some interesting things that are not mentioned in the documentation and it will help to answer at least one question in the certification exam. So, I think it\u2019s worth giving it a few minutes of your time.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Intro<\/h2>\n\n\n\n<p>Snowflake is an advanced data platform provided as Software-as-a-Service (SaaS). It enables data storage, processing, and analytic solutions that are faster, easier to use, and far more flexible than traditional offerings. Snowflake isn\u2019t a service built on top of Hadoop or Spark or any other \u201cbig data\u201d technology, it is a completely new SQL query engine designed for the cloud and cloud-only. To the user, Snowflake provides all of the functionality of an enterprise analytic database, along with many additional special features and unique capabilities.<\/p>\n\n\n\n<p>In this article, we won\u2019t go into explaining what Snowflake is but will be more specific about one of the cool features of this data platform, which is Time Travel. Let me know in the comments if you want a brief overview of this product or maybe some explanation of its other features.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Time travel<\/h2>\n\n\n\n<p>Snowflake Time Travel enables to query data as it was saved at a particular point in time and roll back to the corresponding version. It means that the intentional or unintentional changes to the underlying data can be reverted. Time Travel is a very powerful feature that allows:<\/p>\n\n\n\n<ul><li>Query data in the past that has since been updated or deleted.<\/li><li>Create clones of entire tables, schemas, and databases at or before specific points in the past.<\/li><li>Restore tables, schemas, and databases that have been dropped.<\/li><\/ul>\n\n\n\n<p>To support Time Travel, the following SQL extensions have been implemented:<\/p>\n\n\n\n<ul><li>AT | BEFORE clause which can be specified in SELECT statements and CREATE \u2026 CLONE commands (immediately after the object name). The clause uses one of the following parameters to pinpoint the exact historical data you wish to access:<ul><li>TIMESTAMP<\/li><li>OFFSET (time difference in seconds from the present time)<\/li><li>STATEMENT (identifier for statement, e.g. query ID)<\/li><\/ul><\/li><li>UNDROP command for tables, schemas, and databases.<\/li><\/ul>\n\n\n\n<p>A key component of Snowflake Time Travel is the data retention period. When data in a table is modified, including deletion of data or dropping an object containing data, Snowflake preserves the state of the data before the update. The data retention period specifies the number of days for which this historical data is preserved and, therefore, Time Travel operations (SELECT, CREATE \u2026 CLONE, UNDROP) can be performed on the data.<\/p>\n\n\n\n<p>By default, the data retention period is set to 1 day and Snowflake recommends keeping this setting as is to be able to prevent unintentional data modifications. This period also can be extended up to 90 days, but keep in mind that Time Travel incurs additional storage costs. Setting the data retention period to 0 will disable Time Travel. This feature can be enabled\/disabled on account, database, schema or table level.<\/p>\n\n\n\n<p>After the retention period expired the data is moved into Snowflake Fail-Safe and cannot be restored by the regular user. Only Snowflake Support can restore the data in Fail-Safe.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Querying historical data<\/h2>\n\n\n\n<p>When any DML operations are performed on a table, Snowflake retains previous versions of the table data for a defined period of time. This enables querying earlier versions of the data using the <a href=\"https:\/\/docs.snowflake.com\/en\/sql-reference\/constructs\/at-before.html\">AT | BEFORE<\/a> clause. Now let\u2019s see the examples. For the sake of this article, we will create a separate DB in Snowflake, a table and fill it with some seed values. Here we go:<\/p>\n\n\n\n<script src=\"https:\/\/gist.github.com\/slehkyi\/05cc71307abae9632ea74976e3e78669.js\"><\/script>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" width=\"602\" height=\"99\" src=\"https:\/\/lh5.googleusercontent.com\/Fd0bRZ_lo3a8qFXnW-6niM0wPZkl6ob0FZtWsbKyjnC4QxUfLLeu9ycdzT7kP74MoQYvr6htd86ntSOwUgxvCUidzEv_iFCoYkbLYAodleVa8CE6xvlhc1Q8JHGHtpskAAVV2Ygj6SNMx39o4w\"><\/p>\n\n\n\n<p>And we have our seed records. Now let\u2019s add some duplicates.<\/p>\n\n\n\n<script src=\"https:\/\/gist.github.com\/slehkyi\/68ba1ea1ba5546c3312096bd3d8c384f.js\"><\/script>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" width=\"602\" height=\"191\" src=\"https:\/\/lh3.googleusercontent.com\/FCgryzDbbyd-kohYPsOENhvHhbgdXvOouxbO5RaZLEvUxLETiiGDKspPhAXkRFJe6tojc-d7PAF-4fmYmkDwSACP2ws25MzNL6MvRoX93RAvJiQ7N6ZJeb5BLFqpUWLF2x4rMmPaokSd6sd2wQ\"><\/p>\n\n\n\n<p>Having duplicates in our table isn\u2019t a good idea, so we can use Time Travel to see how the data was looking before dups appeared. As was mentioned before there are few different methods to do that, let\u2019s check them all.<\/p>\n\n\n\n<script src=\"https:\/\/gist.github.com\/slehkyi\/de492e25dc3c4fa977c69e7f5a35a40b.js\"><\/script>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" width=\"602\" height=\"140\" src=\"https:\/\/lh6.googleusercontent.com\/sI7zeTS7E2VCkFj7NHcuCFjns-TANJgY7C7AtfXG4bkmo9qIrG7_rGls_6BCnRsswLkY7fve4Jd7995LWA9DJOYCKStDzjxQagHgTZJe7xGIXRXxblOy8kZQHQn0H5i3rn-8Sb9_wCWu9mSDYQ\"><\/p>\n\n\n\n<p>As you can see we are back to the first version of the data! Next queries will return the same result.<\/p>\n\n\n\n<script src=\"https:\/\/gist.github.com\/slehkyi\/c11bfde49a6551969be349b953bc1c6a.js\"><\/script>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" width=\"602\" height=\"160\" src=\"https:\/\/lh6.googleusercontent.com\/ftVYWeylUiWmeToJKyhcO8dsuAXXstSAKWjTNRsBqn11c5tOJQ92aIJj4SAxlN00hYXKtMwB4Uf2A99KYKIZWDdYjDbHaZkTrsi3ykZXpOI75_jx6dfJwl2Cf79aFSObLdeT372CMuqrQdeLMw\"><\/p>\n\n\n\n<p>Also, it is possible to restore the data before the change happened by finding the Query ID that introduced mentioned change. We can find it on the \u201cQuery History\u201d tab in \u201cActivity\u201d.<\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" width=\"602\" height=\"372\" src=\"https:\/\/lh5.googleusercontent.com\/mNVu7QgFpPxaB-zDWZQftQ1gC6zcus_bb2ocfAi14H6pdYJDKztzNb0Kk93EVskQ-IBCr2K7ysXcVE-hO1HujNjIh_4s3DqG6fYX680InJwt8EAjs-1m07bClMYH3awqIF-Fc8R4uOP3w-Ujuw\"><\/p>\n\n\n\n<script src=\"https:\/\/gist.github.com\/slehkyi\/bcceb8cfd293e6bd8a3c854a949a8e5b.js\"><\/script>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" width=\"602\" height=\"160\" src=\"https:\/\/lh6.googleusercontent.com\/ftVYWeylUiWmeToJKyhcO8dsuAXXstSAKWjTNRsBqn11c5tOJQ92aIJj4SAxlN00hYXKtMwB4Uf2A99KYKIZWDdYjDbHaZkTrsi3ykZXpOI75_jx6dfJwl2Cf79aFSObLdeT372CMuqrQdeLMw\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Cloning historical data<\/h2>\n\n\n\n<p>There is another feature in Snowflake that is worth investigating &#8211; Zero-Copy Cloning. Basically, it creates a copy of a database, schema or table. A snapshot of data present in the source object is taken when the clone is created and is made available to the cloned object. The cloned object is writable and is independent of the clone source. That is, changes made to either the source object or the clone object are not part of the other. Cloning in Snowflake is zero-copy cloning, meaning that at the time of clone creation the data is not being copied and the newly created cloned table references the existing data partitions of the mother table. But it is worth another article, so at the moment brief intro and later we will dig deeper.<\/p>\n\n\n\n<p>Cloning with Time Travel works using the same parameters:<\/p>\n\n\n\n<script src=\"https:\/\/gist.github.com\/slehkyi\/7aae52e4b3e42047627661992993c2c2.js\"><\/script>\n\n\n\n<p>The results of SELECTs are the same:<\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" width=\"602\" height=\"157\" src=\"https:\/\/lh4.googleusercontent.com\/RewNH8yXV9NWt2gQ2ayOZp5HISLLlcmzD9vF1E2se7ygt_rxG7zmNwQMkH7GfnJs5J9VS8K3XXAVWg8dpjmIH62tpIAMsh5S59z1sqUuf-TvFgC8k91SXZoS7LEBKh-vauXRwqiIsYPiT4lZjQ\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Dropping and Undropping<\/h2>\n\n\n\n<p>When a table, schema, or database is dropped, it is not immediately overwritten or removed from the system. Instead, it is retained for the data retention period for the object, during which time the object can be restored.&nbsp;<\/p>\n\n\n\n<p>To drop a table, schema, or database, the following commands are used:<\/p>\n\n\n\n<ul><li>DROP TABLE<\/li><li>DROP SCHEMA<\/li><li>DROP DATABASE<\/li><\/ul>\n\n\n\n<p>To undrop a table, schema, or database:<\/p>\n\n\n\n<ul><li>UNDROP TABLE<\/li><li>UNDROP SCHEMA<\/li><li>UNDROP DATABASE<\/li><\/ul>\n\n\n\n<p>This is actually where the fun comes. Let\u2019s start with a simple example and then go into the woods.<\/p>\n\n\n\n<p>Simple example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DROP TABLE restored_table;<\/code><\/pre>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" width=\"325\" height=\"72\" src=\"https:\/\/lh4.googleusercontent.com\/f2S2x1TCmpUyqQ-gxMc4_L56WtUwEpvVM_454Qg1OK3aat9VZPpK8dpvxzyLbkyQkbeCA29LZM_vRZeSFA34GyksIYn6mbms6oZctjv9yINlAZpjcKCHOyLX8uv96j37IRfIxL_maJlSBVvYJQ\"><\/p>\n\n\n\n<script src=\"https:\/\/gist.github.com\/slehkyi\/ebce254ed045b538a4a4f567f3feb9ce.js\"><\/script>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" width=\"602\" height=\"164\" src=\"https:\/\/lh5.googleusercontent.com\/xu05vLq8EA5iCVKLzjSqM14iVzHSuc5Ex6IcUUvhoVFFqv9sCyG4LMv2VSX5xSZIsRbk8WIECZ4yuYaik2EeZfKYg8t2lZEUKHwVcJKmFAk0vvnuHCTSBhV4lxQoTdx1Wx1_48AmHwKQy9K08w\"><\/p>\n\n\n\n<p>The dropped tables can be seen by using the command:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SHOW TABLES HISTORY;<\/code><\/pre>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" width=\"602\" height=\"83\" src=\"https:\/\/lh4.googleusercontent.com\/KG3xfUwMJdAt00VOTXKdGOJybSXqaj6s433SNIzpW0Vx_vF29BL5oAaYRwRvcPMi9l_e5GdCE6WjvoIR33ENNcXyOXAqfgf_ZqfWu7WEsl5v2zIIYsZec0rEs6M10nQJnC0V06DcWt4L8EWoVg\"><\/p>\n\n\n\n<p>In the results of the <em>SHOW TABLES HISTORY<\/em> in the column \u201c<em>dropped_on<\/em>\u201d the last time the table was dropped will be shown. If the value for the corresponding table in this column is NULL it means that the table is up and running. Dropping and undropping the same table multiple times will not create additional records in this view, only the timestamp in \u201c<em>dropped_on<\/em>\u201d will be updated.<\/p>\n\n\n\n<p>But if a table is dropped and then a new table is created with the same name, the UNDROP command will fail, stating that the table exists.<\/p>\n\n\n\n<p>As you can see in the screenshot above there are two tables restored_table_2, but one of them has a timestamp value in the column \u201cdropped_on\u201d. This is because the first time I ran the query to create this table I used the wrong schema, so I ran CREATE OR REPLACE TABLE \u2026 command, which actually dropped a wrong table and created a new one with the same name. So if now I try to UNDROP the old table with wrong records, the query will fail as stated earlier.<\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" width=\"388\" height=\"154\" src=\"https:\/\/lh4.googleusercontent.com\/n2Ea7VCbgJ0KECbA0qvYJ083qEekQI2Lxefh5aY1A8FPOt2jWl0RJyeqF1vq7noyvD0_h4N2ZS4AtiVF6WY24qC29yY8h47ZZL_xDsQ7YGHXBeTaez37LsPpwlmiDx126-l7oLhY-RxjDKvj9A\"><\/p>\n\n\n\n<p>But it doesn\u2019t mean that the data from the previous table is lost. As we saw earlier, we still can see 2 tables in SHOW TABLES HISTORY. In order to restore the original (or in this case wrong) table, the newly created table has to be renamed:<\/p>\n\n\n\n<script src=\"https:\/\/gist.github.com\/slehkyi\/4f5a8dc188964393c5ebaf252baec46e.js\"><\/script>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" width=\"602\" height=\"79\" src=\"https:\/\/lh4.googleusercontent.com\/PGx4KI4l8HdsHVEMn7FT9CZh34wgc_DPvO1eytiIkcEh6goVw3d9zhCFfPGEdGR6CgqfqJcG0Dfm9cdFrafLSBKymMRohT0f4_Vn7rppXMCjM2q5QIt3O_N5MEo9zvgaqzQ-7KReBE6Lgei1vA\"><\/p>\n\n\n\n<p>And now the UNDROP will work.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>UNDROP TABLE restored_table_2;<\/code><\/pre>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" width=\"339\" height=\"71\" src=\"https:\/\/lh5.googleusercontent.com\/GndryXUHTWzAg2JpP-QMp1CKmdSEUjoIA7zRNA67U1ACS46aqbNBLEoJO6JMoVLXLRPtak0jCsRisX4dtpOaBwFvxIFOXFqbUB6W0zBwozO762a0POAmatK-IKnQxQTi4ZapomueLk-3XzOHvw\"><\/p>\n\n\n\n<p>And we can see the wrong records I added to this table:<\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" width=\"602\" height=\"337\" src=\"https:\/\/lh6.googleusercontent.com\/c8h_qYnYyCNOxSeTJ2DvOIyk8JWAjXBKz0PggAMQQpU9c55hOtrAaFIHl1NjSgUQ1djZ6F0MN_SJjCgjfKXKYBd96krHqTMogaPEAVtCN7_yyTURKjBnRG2IA6hteitUh9RvoEcjokQv-Gol1w\"><\/p>\n\n\n\n<p>Now, I hope you won\u2019t do such a thing, but here we saw what happens if you drop a table and then create a totally new one with the same name and still we can recover an old table. So what happens if you drop this new table and then create again a new one again with the same name? Will you be able to recover the data from the most ancient table? The answer is yes. It will take some effort, but it is possible. This is how our SHOW TABLES HISTORY looks like right now, we have 5 tables, and all are up and running:<\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" width=\"602\" height=\"89\" src=\"https:\/\/lh4.googleusercontent.com\/LwXIbKrEno8RWDN_8hei5DXDkefR0ylGj0rV49FZFIN3xbIwMBWNd8s9KkCXTy61CYqD6YKr1U9TJZ5qy4a1_AW4vXfkcDkmYxjDxYIj_jgYabCefCQXIlGytxKgYciQYl8OzVyWCn1Z5Czg4w\"><\/p>\n\n\n\n<p>Let\u2019s drop restored_table and create it again using the same command and add a few new records to it:<\/p>\n\n\n\n<script src=\"https:\/\/gist.github.com\/slehkyi\/222f9599992a1c86b6c82ff71e97f89f.js\"><\/script>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" width=\"602\" height=\"211\" src=\"https:\/\/lh3.googleusercontent.com\/8L_i3XN-56ExZH62E0Nfhdweu-KQNID-E58FFkMX1gqxCmpHXBuCLK5BlCthysCz49tm688jwTe80FsCvwKS_0cpRvXdwlhKJ-hl3Vc9zbOCmCgAByKB7z6Yi-GhkLFP63X2SBVz4nIKLwSzTg\"><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SHOW TABLES HISTORY;<\/code><\/pre>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" width=\"602\" height=\"91\" src=\"https:\/\/lh5.googleusercontent.com\/GH-IkI4dTNNm9Yc-DZCMBGqa6Pyk7jNyMqX-_KH2BcRJHXJQAhrEk4u1pObqD-GaWeNUJ27eqp_o7tp8jUIkGqMoOBHupqlZro7_c42iCvXelcXidRB4SOSOHSkBmmyZzjyLzKQZtTO791MnVQ\"><\/p>\n\n\n\n<p>And now we go further and drop again restored_table and create a new one.<\/p>\n\n\n\n<script src=\"https:\/\/gist.github.com\/slehkyi\/35ec33d6b578cbdd27a7f49172705d7b.js\"><\/script>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" width=\"602\" height=\"312\" src=\"https:\/\/lh6.googleusercontent.com\/N5m2X0T3xxpShKf0LRK-dVQDeOQvxfTGlDdUHNqRuh7w3PQsFfT_fyKC736LAZ-yTcUw7A5vdR_24FW2K8mn2C8mJ-ZLXSwq3n3c3kK8cD96LmNLt-zTFXBbU0Fb3hGG4jN3w1knZm0Bkus9GQ\"><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SHOW TABLES HISTORY;<\/code><\/pre>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" width=\"602\" height=\"101\" src=\"https:\/\/lh6.googleusercontent.com\/VPVqR8pT0tS6PCsl7cgOo_Kv8PwLVtKnPU8ZheTq18pKwWKnn84loI64UXuLvlr_G13Eu8sFKM2WbQ4Gk0kW86XCS3G8r5vMJEAbjgcy3oJZs50ald2azAGrpXnCjDuF4HK7F_vUdupC-nKfYQ\"><\/p>\n\n\n\n<p>To restore the first table that was dropped we will need to go through a set of renamings. Our original table had 4 rows. Let\u2019s go. Restore the second table.<\/p>\n\n\n\n<script src=\"https:\/\/gist.github.com\/slehkyi\/b300295698dc146def92a48480e9418e.js\"><\/script>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" width=\"602\" height=\"141\" src=\"https:\/\/lh5.googleusercontent.com\/wZ3HR14eC-z9QppJd04-2H3oA8vBNhpSAOjdZdx36VPC86e83P4x3VgnlQyEG_JnYdxPnSxJrGG5Xtjew7nB6vKpfvUqehxVUtTdyLNXUGaEKiXGh5Su17zJz34QwGBkZc0ZEy9QjC2MHkiGhQ\"><\/p>\n\n\n\n<p>Restore the original table and rename it to v1<\/p>\n\n\n\n<script src=\"https:\/\/gist.github.com\/slehkyi\/adb8d7fd6835ffa4be1d858b56b13767.js\"><\/script>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" width=\"602\" height=\"123\" src=\"https:\/\/lh5.googleusercontent.com\/Ei2uPFXS1B52FSG5crBccH7PyF6jCETJNsL6exLK8QwYWNwAzOuRmCzc-RkD0btrAPzPb2aVr9j0bvR_EPSaNIhipwbqDGDsvsjaCyngB8eidrrXiJkBjEBg9-5pSn2J15Utq0wx_tVYUFddhQ\"><\/p>\n\n\n\n<script src=\"https:\/\/gist.github.com\/slehkyi\/ed80da5e7a0b167f6377adef25d1eb40.js\"><\/script>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" width=\"431\" height=\"124\" src=\"https:\/\/lh4.googleusercontent.com\/jYWZjGG09jcsvGyURHmkSgIWgE4Yy-LRvAv6wIzUfjADTzgcMcXp0rJGYJ1a_N__ZtaD_47-FVkn_EpsJ1CfJmRp4Q5DxwPmS0dy7FI6YPkMXYc-3DJTAxohCMyUF8ihrnQMSfSE0AvdY92bbw\"><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SHOW TABLES HISTORY;<\/code><\/pre>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" width=\"602\" height=\"113\" src=\"https:\/\/lh3.googleusercontent.com\/JQe7GvWv7okK6PKFck8h_DC1Qju6rRvOt49zYQDZznUi7UroFteD7XfdUbHeKSrxH_48UQJtge8HhGgEfWLLU7ciHQn4Y9kq_8f_GiBvk-p3eheUwRnUDCBKZnAxq9lkpYqWTupMq6Q8fCCyFQ\"><\/p>\n\n\n\n<p>And here we are, with all the versions of our data restored. As you can see in Snowflake it becomes obsolete the creation of different versions of the tables as you can always go back in time, but be careful with the data retention period &#8211; if it\u2019s expired you cannot get your data back that easily.&nbsp;<\/p>\n\n\n\n<p>In the end, Time Travel is a very powerful tool for:<\/p>\n\n\n\n<ul><li>Restoring data-related objects (tables, schemas, and databases) that might have been accidentally or intentionally deleted.<\/li><li>Duplicating or backing up data from key points in the past.<\/li><li>Analyzing data usage\/manipulation over specified periods of time.<\/li><\/ul>\n\n\n\n<p>Hope you find it useful \ud83d\ude09 see ya in the next one \ud83d\ude09<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"has-text-align-center\">Photo by <a href=\"https:\/\/unsplash.com\/@maddybakes?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\">Maddy Baker<\/a> on <a href=\"https:\/\/unsplash.com\/s\/photos\/snowflakes?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\">Unsplash<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Yeah, the title is a bit clickbaity, so if you are too sensitive, please stop reading, because the article won\u2019t&hellip;<\/p>\n","protected":false},"author":1,"featured_media":1419,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,5,17],"tags":[],"translation":{"provider":"WPGlobus","version":"3.0.0","language":"es","enabled_languages":["gb","es","uk"],"languages":{"gb":{"title":true,"content":true,"excerpt":false},"es":{"title":false,"content":false,"excerpt":false},"uk":{"title":false,"content":false,"excerpt":false}}},"_links":{"self":[{"href":"https:\/\/www.sergilehkyi.com\/es\/wp-json\/wp\/v2\/posts\/1417"}],"collection":[{"href":"https:\/\/www.sergilehkyi.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sergilehkyi.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sergilehkyi.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sergilehkyi.com\/es\/wp-json\/wp\/v2\/comments?post=1417"}],"version-history":[{"count":2,"href":"https:\/\/www.sergilehkyi.com\/es\/wp-json\/wp\/v2\/posts\/1417\/revisions"}],"predecessor-version":[{"id":1422,"href":"https:\/\/www.sergilehkyi.com\/es\/wp-json\/wp\/v2\/posts\/1417\/revisions\/1422"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.sergilehkyi.com\/es\/wp-json\/wp\/v2\/media\/1419"}],"wp:attachment":[{"href":"https:\/\/www.sergilehkyi.com\/es\/wp-json\/wp\/v2\/media?parent=1417"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sergilehkyi.com\/es\/wp-json\/wp\/v2\/categories?post=1417"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sergilehkyi.com\/es\/wp-json\/wp\/v2\/tags?post=1417"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}