{"id":3662,"date":"2025-05-08T07:02:25","date_gmt":"2025-05-08T07:02:25","guid":{"rendered":"https:\/\/mailitics.com\/index.php\/2025\/05\/08\/generating-data-dictionary-for-excel-files-using-openpyxl-and-ai-agents\/"},"modified":"2025-05-08T07:02:25","modified_gmt":"2025-05-08T07:02:25","slug":"generating-data-dictionary-for-excel-files-using-openpyxl-and-ai-agents","status":"publish","type":"post","link":"https:\/\/mailitics.com\/index.php\/2025\/05\/08\/generating-data-dictionary-for-excel-files-using-openpyxl-and-ai-agents\/","title":{"rendered":"Generating Data Dictionary for Excel Files Using OpenPyxl and AI Agents"},"content":{"rendered":"<p>    Generating Data Dictionary for Excel Files Using OpenPyxl and AI Agents<br \/>\n \t<BR><br \/>\n<BR><\/BR><br \/>\n    <!-- no image --><br \/>\n \t<BR><br \/>\n<BR><\/BR><\/p>\n<div>\n<h2 class=\"wp-block-heading\"><mdspan datatext=\"el1746681273986\" class=\"mdspan-comment\">Introduction<\/mdspan><\/h2>\n<p class=\"wp-block-paragraph\">Every company I worked for until today, there it was: the resilient MS Excel. <\/p>\n<p class=\"wp-block-paragraph\">Excel was first released in 1985 and has remained strong until today. It has survived the rise of relational databases, the evolution of many programming languages, the Internet with its infinite number of online applications, and finally, it is also surviving the era of the AI.<\/p>\n<p class=\"wp-block-paragraph\">Phew!<\/p>\n<p class=\"wp-block-paragraph\">Do you have any doubts about how resilient Excel is? I don\u2019t.<\/p>\n<p class=\"wp-block-paragraph\">I think the reason for that is its <em>practicality to start and manipulate a document quickly<\/em>. Think about this situation: we\u2019re at work, in a meeting, and suddenly the leadership shares a CSV file and asks for a quick calculation or a few calculated numbers. Now, the options are:<\/p>\n<p class=\"wp-block-paragraph\">1. Open an IDE (or a notebook) and start coding like crazy to generate a simple matplotlib graphic;<\/p>\n<p class=\"wp-block-paragraph\">2. Open Power BI, import the data, and start creating a report with dynamic graphics.<\/p>\n<p class=\"wp-block-paragraph\">3. Open the CSV in Excel, write a couple of formulas, and create a graphic.<\/p>\n<p class=\"wp-block-paragraph\">I can\u2019t speak for you, but many times I go for option 3. Especially because Excel files are compatible with everything, easily shareable, and beginner-friendly.<\/p>\n<p class=\"wp-block-paragraph\">I am saying all of this as an Introduction to make my point that I don\u2019t think that Excel files are going away anytime soon, even with the fast development of AI. Many will love that, many will hate that. <\/p>\n<p class=\"wp-block-paragraph\">So, my action here was to leverage AI to make Excel files better documented. One of the main complaints of data teams about Excel is the lack of best practices and reproducibility, given that the names of the columns can have any names and data types, but zero documentation.<\/p>\n<p class=\"wp-block-paragraph\">So, I have created an AI Agent that reads the Excel file and creates this small documentation. Here is how it works:<\/p>\n<ol class=\"wp-block-list\">\n<li class=\"wp-block-list-item\">The Excel file is converted to CSV and fed into the Large Language Model (LLM).<\/li>\n<li class=\"wp-block-list-item\">The AI Agent generates the data dictionary with column information (variable name, data type, description).<\/li>\n<li class=\"wp-block-list-item\">The data dictionary gets added as comments to the Excel file\u2019s header.<\/li>\n<li class=\"wp-block-list-item\">Output file saved with comments.<\/li>\n<\/ol>\n<p class=\"wp-block-paragraph\">Ok. Hands-on now. Let\u2019s get that done in this tutorial.<\/p>\n<h2 class=\"wp-block-heading\">Code<\/h2>\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" height=\"562\" width=\"1024\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/contributor.insightmediagroup.io\/wp-content\/uploads\/2025\/05\/a_holographic_spreadsheet_that_is_receiving_text-1024x562.jpeg?resize=1024%2C562&#038;ssl=1\" alt=\"\" class=\"wp-image-603564\"><figcaption class=\"wp-element-caption\">Let\u2019s code! | Image generated by AI. Meta Llama, 2025. https:\/\/meta.ai<\/figcaption><\/figure>\n<p class=\"wp-block-paragraph\">We will begin by setting up a virtual environment. Create a <code>venv<\/code> with the tool of your choice, such as Poetry, Python Venv, Anaconda, or UV. I really like UV, as it is the fastest and the simplest, in my opinion. If you have UV installed <a href=\"https:\/\/docs.astral.sh\/uv\/getting-started\/installation\/\">[5]<\/a>, open a terminal and create your <code>venv<\/code>.<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\">uv init data-docs\ncd data-docs\nuv venv\nuv add streamlit openpyxl pandas agno mcp google-genai<\/code><\/pre>\n<p class=\"wp-block-paragraph\">Now, let us import the necessary modules. This project was created with Python 3.12.1, but I believe Python 3.9 or higher might do the trick already. We will use:<\/p>\n<ul class=\"wp-block-list\">\n<li class=\"wp-block-list-item\">\n<strong>Agno<\/strong>: for the AI Agent management<\/li>\n<li class=\"wp-block-list-item\">\n<strong>OpenPyxl<\/strong>: for the manipulation of Excel files<\/li>\n<li class=\"wp-block-list-item\">\n<strong>Streamlit<\/strong>: for the front-end interface.<\/li>\n<li class=\"wp-block-list-item\">Pandas, OS, JSON, Dedent and Google Genai as support modules.<\/li>\n<\/ul>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-python\"># Imports\nimport os\nimport json\nimport streamlit as st\nfrom textwrap import dedent\n\nfrom agno.agent import Agent\nfrom agno.models.google import Gemini\nfrom agno.tools.file import FileTools\n\nfrom openpyxl import load_workbook\nfrom openpyxl.comments import Comment\nimport pandas as pd<\/code><\/pre>\n<p class=\"wp-block-paragraph\">Great. The next step is creating the functions we\u2019ll need to handle the Excel files and to create the AI Agent. <\/p>\n<p class=\"wp-block-paragraph\">Notice that all the functions have detailed <strong>docstrings<\/strong>. This is intentional because LLMs use docstrings to know what a given function does and decide whether to use it or not as a tool.<\/p>\n<p class=\"wp-block-paragraph\">So, if you\u2019re using Python functions as Tools for an AI Agent, make sure to use detailed docstrings. Nowadays, with free copilots such as Windsurf <a href=\"https:\/\/windsurf.com\/vscode_tutorial\">[6]<\/a> it is even easier to create them.<\/p>\n<h3 class=\"wp-block-heading\">Converting the file to CSV<\/h3>\n<p class=\"wp-block-paragraph\">This function will:<\/p>\n<ul class=\"wp-block-list\">\n<li class=\"wp-block-list-item\">Take the Excel file and read only the first 10 rows. This is enough for us to send to the LLM. Doing that, we are also preventing sending too many tokens as input and making this agent too expensive. <\/li>\n<li class=\"wp-block-list-item\">Save the file as CSV to use as input for the AI Agent. The CSV format is easier for the model to take in, as it is a bunch of text separated by commas. And we know LLMs shine working with text.<\/li>\n<\/ul>\n<p class=\"wp-block-paragraph\">Here is the function.<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-python\">def convert_to_csv(file_path:str):\n   \"\"\"\n    Use this tool to convert the excel file to CSV.\n\n    * file_path: Path to the Excel file to be converted\n    \"\"\"\n   # Load the file  \n   df = pd.read_excel(file_path).head(10)\n\n   # Convert to CSV\n   st.write(\"Converting to CSV... :leftwards_arrow_with_hook:\")\n   return df.to_csv('temp.csv', index=False)<\/code><\/pre>\n<p class=\"wp-block-paragraph\">Let\u2019s move on.<\/p>\n<h3 class=\"wp-block-heading\">Creating the Agent<\/h3>\n<p class=\"wp-block-paragraph\">The next function creates the AI agent. I am using <code>Agno<\/code> [1], as it is very versatile and easy to use. I also chose the model <code>Gemini 2.0 Flash<\/code>. During the test phase, this was the best-performing model generating the data docs. To use it, you will need an API Key from Google. Don\u2019t forget to get one here <a href=\"https:\/\/ai.google.dev\/gemini-api\/docs\/api-key\">[7]<\/a>.<\/p>\n<p class=\"wp-block-paragraph\">The function:<\/p>\n<ul class=\"wp-block-list\">\n<li class=\"wp-block-list-item\">Receives the CSV output from the previous function.<\/li>\n<li class=\"wp-block-list-item\">Passes through the AI Agent, which generates the data dictionary with column name, description, and data type.<\/li>\n<li class=\"wp-block-list-item\">Notice that the <code>description<\/code> argument is the prompt for the agent.  Make it detailed and precise.<\/li>\n<li class=\"wp-block-list-item\">The data dictionary will be saved as a <code>JSON<\/code> file using a tool called <code>FileTools<\/code> that can read and write files.<\/li>\n<li class=\"wp-block-list-item\">I have set up <code>retries=2<\/code> so we can work around any error on a first try. <\/li>\n<\/ul>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-python\">def create_agent(apy_key):\n    agent = Agent(\n        model=Gemini(id=\"gemini-2.0-flash\", api_key=apy_key),\n        description= dedent(\"\"\"\n                            You are an agent that reads the temp.csv dataset presented to you and \n                            based on the name and data type of each column header, determine the following information:\n                            - The data types of each column\n                            - The description of each column\n                            - The first column numer is 0\n\n                            Using the FileTools provided, create a data dictionary in JSON format that includes the below information:\n                            {&lt;ColNumber&gt;: {ColName: &lt;ColName&gt;, DataType: &lt;DataType&gt;, Description: &lt;Description&gt;}}\n\n                            If you are unable to determine the data type or description of a column, return 'N\/A' for that column for the missing values.\n                            \n                            \"\"\"),\n        tools=[ FileTools(read_files=True, save_files=True) ],\n        retries=2,\n        show_tool_calls=True\n        )\n\n    return agent\n<\/code><\/pre>\n<p class=\"wp-block-paragraph\">Ok. Now we need another function to save the data dictionary to the file. <\/p>\n<h3 class=\"wp-block-heading\">Adding Data Dictionary to the File\u2019s Header<\/h3>\n<p class=\"wp-block-paragraph\">This is the last function to be created. It will:<\/p>\n<ul class=\"wp-block-list\">\n<li class=\"wp-block-list-item\">Get the data dictionary <code>json<\/code> from the previous step and the original Excel file.<\/li>\n<li class=\"wp-block-list-item\">Add the data dictionary to the file\u2019s header as comments.<\/li>\n<li class=\"wp-block-list-item\">Save the output file.<\/li>\n<li class=\"wp-block-list-item\">Once the file is saved, it displays a download button for the user to get the modified file.<\/li>\n<\/ul>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-python\">def add_comments_to_header(file_path:str, data_dict:dict=\"data_dict.json\"):\n    \"\"\"\n    Use this tool to add the data dictionary {data_dict.json} as comments to the header of an Excel file and save the output file.\n\n    The function takes the Excel file path as argument and adds the {data_dict.json} as comments to each cell\n    Start counting from column 0\n    in the first row of the Excel file, using the following format:    \n        * Column Number: &lt;column_number&gt;\n        * Column Name: &lt;column_name&gt;\n        * Data Type: &lt;data_type&gt;\n        * Description: &lt;description&gt;\n\n    Parameters\n    ----------\n    * file_path : str\n        The path to the Excel file to be processed\n    * data_dict : dict\n        The data dictionary containing the column number, column name, data type, description, and number of null values\n\n    \"\"\"\n    \n    # Load the data dictionary\n    data_dict = json.load(open(data_dict))\n\n    # Load the workbook\n    wb = load_workbook(file_path)\n\n    # Get the active worksheet\n    ws = wb.active\n\n    # Iterate over each column in the first row (header)\n    for n, col in enumerate(ws.iter_cols(min_row=1, max_row=1)):\n        for header_cell in col:\n            header_cell.comment = Comment(dedent(f\"\"\"\n                              ColName: {data_dict[str(n)]['ColName']}, \n                              DataType: {data_dict[str(n)]['DataType']},\n                              Description: {data_dict[str(n)]['Description']}\n    \"\"\"),'AI Agent')\n\n    # Save the workbook\n    st.write(\"Saving File... :floppy_disk:\")\n    wb.save('output.xlsx')\n\n    # Create a download button\n    with open('output.xlsx', 'rb') as f:\n        st.download_button(\n            label=\"Download output.xlsx\",\n            data=f,\n            file_name='output.xlsx',\n            mime='application\/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\n        )\n<\/code><\/pre>\n<p class=\"wp-block-paragraph\">Ok. The next step is to glue all of this together on a Streamlit front-end script.<\/p>\n<h3 class=\"wp-block-heading\">Streamlit Front-End<\/h3>\n<p class=\"wp-block-paragraph\">In this step, I could have created a different file for the front-end and imported the functions in there. But I decided to use the same file, so let\u2019s start with the famous: <\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-python\">if __name__ == \"__main__\":<\/code><\/pre>\n<p class=\"wp-block-paragraph\">First, a couple of lines to configure the page and messages displayed in the Web Application. We will use the content <code>centered<\/code> on the page, and there is some information about how the App works.<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-python\"># Config page Streamlit\n    st.set_page_config(layout=\"centered\", \n                       page_title=\"Data Docs\", \n                       page_icon=\":paperclip:\",\n                       initial_sidebar_state=\"expanded\")\n    \n    # Title\n    st.title(\"Data Docs :paperclip:\")\n    st.subheader(\"Generate a data dictionary for your Excel file.\")\n    st.caption(\"1. Enter your Gemini API key and the path of the Excel file on the sidebar.\")\n    st.caption(\"2. Run the agent.\")\n    st.caption(\"3. The agent will generate a data dictionary and add it as comments to the header of the Excel file.\")\n    st.caption(\"ColName: &lt;ColName&gt; | DataType: &lt;DataType&gt; | Description: &lt;Description&gt;\")\n    \n    st.divider()<\/code><\/pre>\n<p class=\"wp-block-paragraph\">Next, we\u2019ll set up the sidebar, where the user can input their API Key from Google and select a <code>.xlsx<\/code> file to be modified.<\/p>\n<p class=\"wp-block-paragraph\">There is a button to run the application, another to reset the app state, and a progress bar. Nothing too fancy.<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-python\">with st.sidebar:\n        # Enter your API key\n        st.caption(\"Enter your API key and the path of the Excel file.\")\n        api_key = st.text_input(\"API key: \", placeholder=\"Google Gemini API key\", type=\"password\")\n        \n        # Upload file\n        input_file = st.file_uploader(\"File upload\", \n                                       type='xlsx')\n        \n\n        # Run the agent\n        agent_run = st.button(\"Run\")\n\n        # progress bar\n        progress_bar = st.empty()\n        progress_bar.progress(0, text=\"Initializing...\")\n\n        st.divider()\n\n        # Reset session state\n        if st.button(\"Reset Session\"):\n            st.session_state.clear()\n            st.rerun()<\/code><\/pre>\n<p class=\"wp-block-paragraph\">Once the <strong>run<\/strong> button is clicked, it triggers the rest of the code to run the Agent. Here is the sequence of steps performed:<\/p>\n<ol class=\"wp-block-list\">\n<li class=\"wp-block-list-item\">The first function is called to transform the file to CSV<\/li>\n<li class=\"wp-block-list-item\">The progress is registered on the progress bar.<\/li>\n<li class=\"wp-block-list-item\">The Agent is created.<\/li>\n<li class=\"wp-block-list-item\">Progress bar updated.<\/li>\n<li class=\"wp-block-list-item\">A prompt is fed into the agent to read the <code>temp.csv<\/code> file, create the data dictionary, and save the output to <code>data_dictionary.json<\/code>.<\/li>\n<li class=\"wp-block-list-item\">The data dictionary is printed on the screen, so the user can see what was generated while it\u2019s being saved to the Excel file.<\/li>\n<li class=\"wp-block-list-item\">The Excel file is modified and saved.<\/li>\n<\/ol>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-python\"># Create the agent\n    if agent_run:\n        # Convert Excel file to CSV\n        convert_to_csv(input_file)\n\n        # Register progress\n        progress_bar.progress(15, text=\"Processing CSV...\")\n\n        # Create the agent\n        agent = create_agent(api_key)\n\n        # Start the script\n        st.write(\"Running Agent... :runner:\")\n\n        # Register progress\n        progress_bar.progress(50, text=\"AI Agent is running...\")\n\n        # Run the agent    \n        agent.print_response(dedent(f\"\"\"\n                                1. Use FileTools to read the temp.csv as input to create the data dictionary for the columns in the dataset. \n                                2. Using the FileTools tool, save the data dictionary to a file named 'data_dict.json'.\n                                \n                                \"\"\"),\n                        markdown=True)\n\n        # Print the data dictionary\n        st.write(\"Generating Data Dictionary... :page_facing_up:\")\n        with open('data_dict.json', 'r') as f:\n            data_dict = json.load(f)\n            st.json(data_dict, expanded=False)\n\n        # Add comments to header\n        add_comments_to_header(input_file, 'data_dict.json')\n\n        # Remove temporary files\n        st.write(\"Removing temporary files... :wastebasket:\")\n        os.remove('temp.csv')\n        os.remove('data_dict.json')    \n    \n    # If file exists, show success message\n    if os.path.exists('output.xlsx'):\n        st.success(\"Done! :white_check_mark:\")\n        os.remove('output.xlsx')\n\n    # Progress bar end\n    progress_bar.progress(100, text=\"Done!\")<\/code><\/pre>\n<p class=\"wp-block-paragraph\">That\u2019s it. Here is a demonstration of the agent in action.<\/p>\n<figure class=\"wp-block-image size-full\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/contributor.insightmediagroup.io\/wp-content\/uploads\/2025\/05\/output.gif?ssl=1\" alt=\"\" class=\"wp-image-603563\"><figcaption class=\"wp-element-caption\">Data Docs added to your Excel File. Image by the author.<\/figcaption><\/figure>\n<p class=\"wp-block-paragraph\">Beautiful result!<\/p>\n<h3 class=\"wp-block-heading\">Try It<\/h3>\n<p class=\"wp-block-paragraph\">You can try the deployed app here: <a href=\"https:\/\/excel-datadocs.streamlit.app\/\">https:\/\/excel-datadocs.streamlit.app\/<\/a><\/p>\n<h2 class=\"wp-block-heading\">Before You Go<\/h2>\n<p class=\"wp-block-paragraph\">In my humble opinion, Excel files are not going away anytime soon. Loving or hating them, we\u2019ll have to stick with them for a while.<\/p>\n<p class=\"wp-block-paragraph\">Excel files are versatile, easy to handle and share, thus they are still very useful for the routine <em>ad-hoc<\/em> tasks at work.<\/p>\n<p class=\"wp-block-paragraph\">However, now we can leverage AI to help us handle those files and make them better. <a href=\"https:\/\/towardsdatascience.com\/tag\/artificial-intelligence\/\" title=\"Artificial Intelligence\">Artificial Intelligence<\/a> is touching so many points of our lives. The routine and tools at work are only another one.<\/p>\n<p class=\"wp-block-paragraph\">Let\u2019s take advantage of AI and work smarter every day!<\/p>\n<p class=\"wp-block-paragraph\">If you liked this content, find more of my work in my website and GitHub, shared below.<\/p>\n<h3 class=\"wp-block-heading\">GitHub Repository<\/h3>\n<p class=\"wp-block-paragraph\">Here is the GitHub Repository for this project.<\/p>\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/gurezende\/Data-Dictionary-GenAI\">https:\/\/github.com\/gurezende\/Data-Dictionary-GenAI<\/a><\/p>\n<h3 class=\"wp-block-heading\">Find Me<\/h3>\n<p class=\"wp-block-paragraph\">You can find more about my work on my website.<\/p>\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/gustavorsantos.me\/\">https:\/\/gustavorsantos.me<\/a><\/p>\n<h2 class=\"wp-block-heading\">References<\/h2>\n<p class=\"wp-block-paragraph\">[1. Agno Docs] <a href=\"https:\/\/docs.agno.com\/introduction\/agents\">https:\/\/docs.agno.com\/introduction\/agents<\/a><\/p>\n<p class=\"wp-block-paragraph\">[2. <a href=\"https:\/\/towardsdatascience.com\/tag\/openpyxl\/\" title=\"Openpyxl\">Openpyxl<\/a> Docs] <a href=\"https:\/\/openpyxl.readthedocs.io\/en\/stable\/index.html\">https:\/\/openpyxl.readthedocs.io\/en\/stable\/index.html<\/a><\/p>\n<p class=\"wp-block-paragraph\">[3. Streamlit Docs] <a href=\"https:\/\/docs.streamlit.io\/\">https:\/\/docs.streamlit.io\/<\/a><\/p>\n<p class=\"wp-block-paragraph\">[4. Data-Docs Web App] <a href=\"https:\/\/excel-datadocs.streamlit.app\/\">https:\/\/excel-datadocs.streamlit.app\/<\/a><\/p>\n<p class=\"wp-block-paragraph\">[5. Installing UV] <a href=\"https:\/\/docs.astral.sh\/uv\/getting-started\/installation\/\">https:\/\/docs.astral.sh\/uv\/getting-started\/installation\/<\/a><\/p>\n<p class=\"wp-block-paragraph\">[6. Windsurf Coding Copilot] <a href=\"https:\/\/windsurf.com\/vscode_tutorial\">https:\/\/windsurf.com\/vscode_tutorial<\/a><\/p>\n<p class=\"wp-block-paragraph\">[7. Google Gemini API Key] <a href=\"https:\/\/ai.google.dev\/gemini-api\/docs\/api-key\">https:\/\/ai.google.dev\/gemini-api\/docs\/api-key<\/a><\/p>\n<p>The post <a href=\"https:\/\/towardsdatascience.com\/generating-data-dictionary-for-excel-files-using-openpyxl-and-ai-agents\/\">Generating Data Dictionary for Excel Files Using OpenPyxl and AI Agents<\/a> appeared first on <a href=\"https:\/\/towardsdatascience.com\/\">Towards Data Science<\/a>.<\/p>\n<\/div>\n<p> \t<BR><br \/>\n <BR><\/BR><br \/>\n    Gustavo Santos<br \/>\n \t<BR><br \/>\n<BR><\/BR><br \/>\n<a href=\"https:\/\/towardsdatascience.com\/generating-data-dictionary-for-excel-files-using-openpyxl-and-ai-agents\/\">Go to original source<\/a><br \/>\n \t<BR><br \/>\n <BR><\/BR><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Generating Data Dictionary for Excel Files Using OpenPyxl and AI Agents Introduction Every company I worked for until today, there it was: the resilient MS Excel. Excel was first released in 1985 and has remained strong until today. It has survived the rise of relational databases, the evolution of many programming languages, the Internet with [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[678,62,69,83,245,2604,157],"tags":[98,84,2605],"class_list":["post-3662","post","type-post","status-publish","format-standard","hentry","category-agentic-ai","category-aimldsaimlds","category-artificial-intelligence","category-data-science","category-excel","category-openpyxl","category-python","tag-ai","tag-data","tag-excel"],"_links":{"self":[{"href":"https:\/\/mailitics.com\/index.php\/wp-json\/wp\/v2\/posts\/3662"}],"collection":[{"href":"https:\/\/mailitics.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mailitics.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mailitics.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/mailitics.com\/index.php\/wp-json\/wp\/v2\/comments?post=3662"}],"version-history":[{"count":0,"href":"https:\/\/mailitics.com\/index.php\/wp-json\/wp\/v2\/posts\/3662\/revisions"}],"wp:attachment":[{"href":"https:\/\/mailitics.com\/index.php\/wp-json\/wp\/v2\/media?parent=3662"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mailitics.com\/index.php\/wp-json\/wp\/v2\/categories?post=3662"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mailitics.com\/index.php\/wp-json\/wp\/v2\/tags?post=3662"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}