Note
This does not appear to be a Python SDK issue. I was able to reproduce the behavior directly using raw curl requests against the Asana REST API without involving the Python SDK.
I am raising the question here because the issue was discovered while implementing a Python-based automation pipeline for generating project status updates, and I am hoping to either:
- understand the intended API approach,
- learn about any available workarounds,
- or be directed to a more appropriate place to ask about status update formatting behavior.
Summary/Background
I have a python pipeline for automating project status updates through the Asana API. I observed a discrepancy between formatting available in the Asana UI and formatting available through the html_text field.
The Asana status update editor provides Heading 1 and Heading 2 formatting options. However, when retrieving a manually-created status update through the API, these headings are returned as <strong> tags.
This suggests that generating <strong> through the API should produce equivalent results. But <strong> simply makes it bold, it's not the same as the manually created headings in the UI and behaves differently. In particular, headers as sections carry over between status updates but not API-created <strong> elements.
As a result, to my knowledge, it is currently not possible to generate status updates with headers or sections through the API that behave identically to status updates created through the UI.
Use Case
We have a Python-based automation pipeline that generates structured project status updates in batches.
In our example, the generated updates follow a consistent format:
- Summary
- Key Achievements
- Risks & Issues
- Next Steps
- Comments
The goal is for automated updates to be consistent with manually-created updates so that teams can continue using existing status update workflows and avoid any confusion.
Investigation
Existing Status Update Created Through the UI
Retrieving a manually-created status update:
curl --request GET \
--url "https://app.asana.com/api/1.0/project_statuses/<gid>?opt_fields=text,html_text"
returns:
<body>
<strong>Summary</strong>
This is my summary
----------------------------------------
<strong>Next steps</strong>
These are my next steps
----------------------------------------
</body>
This indicates that UI-created headings are represented as <strong> when retrieved through the API.
API-Created <strong>
Creating a status update using:
<body><strong>Hello World</strong></body>
works correctly.
The status update is created successfully and the same HTML is returned when retrieving the status update. But, noticablly, it differs from sections in Asana, e.g.:

("Hello World" is simply bold, not a header.)
API-Created <h1>
Creating a status update using:
<body><h1>Hello World</h1></body>
does not produce a heading.
Instead, the returned content is:
<body><body><h1>Hello World</h1></body></body>
which causes the entire payload to be escaped and rendered as literal text.
Additional Tag Testing
Relatedly, I've tested some more html tags, such as:
| Tag |
Result |
<strong> |
Works |
<em> |
Works |
<u> |
Works |
<ul> / <li> |
Works |
<h1> |
Entire payload escaped |
<br> |
Entire payload escaped |
Functional Difference Between UI Headings and <strong>
The main issue is that status headings cannot be created through the API. In our context, apart from visual differences, the problem is that in general batch updates via API will always differ from manual ones and the headers come with neat features that cannot be achieved through <strong>.
For example:
- Create a status update manually through the Asana UI.
- Format section titles using Heading 1 or Heading 2.
- Create a subsequent status update.
The editor automatically carries forward the existing heading structure into the new status update, which is a very useful feature and is part of our team's workflow.
However, when generating the same section titles through the API using <strong>, the resulting text is treated as ordinary content and does not participate in this carry-over behavior.
Expected Behavior
Option 1
Add support for heading elements such as <h1>, <h2> (or whatever the supported rich-text equivalent may be) within project status updates endpoint.
Option 2
Document how UI-created headings are internally represented and how equivalent headings can be generated through the API using html_text.
Option 3
If UI-equivalent headings cannot currently be created through the API, provide recommended workarounds for automation scenarios where generated status updates should behave similarly to manually-created status updates.
Questions
- What is the supported formatting model behind project status update headings?
- Why are UI-created headings returned as
<strong> when retrieved through the API?
- Is there a way to create true Heading 1 / Heading 2 elements through the API?
- If not, what would be the recommended workaround for automation workflows that need to generate status updates compatible with the UI's heading and section behavior?
Thank you very much for any leads in advance!
Note
This does not appear to be a Python SDK issue. I was able to reproduce the behavior directly using raw curl requests against the Asana REST API without involving the Python SDK.
I am raising the question here because the issue was discovered while implementing a Python-based automation pipeline for generating project status updates, and I am hoping to either:
Summary/Background
I have a python pipeline for automating project status updates through the Asana API. I observed a discrepancy between formatting available in the Asana UI and formatting available through the
html_textfield.The Asana status update editor provides Heading 1 and Heading 2 formatting options. However, when retrieving a manually-created status update through the API, these headings are returned as
<strong>tags.This suggests that generating
<strong>through the API should produce equivalent results. But<strong>simply makes it bold, it's not the same as the manually created headings in the UI and behaves differently. In particular, headers as sections carry over between status updates but not API-created<strong>elements.As a result, to my knowledge, it is currently not possible to generate status updates with headers or sections through the API that behave identically to status updates created through the UI.
Use Case
We have a Python-based automation pipeline that generates structured project status updates in batches.
In our example, the generated updates follow a consistent format:
The goal is for automated updates to be consistent with manually-created updates so that teams can continue using existing status update workflows and avoid any confusion.
Investigation
Existing Status Update Created Through the UI
Retrieving a manually-created status update:
curl --request GET \ --url "https://app.asana.com/api/1.0/project_statuses/<gid>?opt_fields=text,html_text"returns:
This indicates that UI-created headings are represented as
<strong>when retrieved through the API.API-Created
<strong>Creating a status update using:
works correctly.
The status update is created successfully and the same HTML is returned when retrieving the status update. But, noticablly, it differs from sections in Asana, e.g.:
API-Created
<h1>Creating a status update using:
does not produce a heading.
Instead, the returned content is:
which causes the entire payload to be escaped and rendered as literal text.
Additional Tag Testing
Relatedly, I've tested some more html tags, such as:
<strong><em><u><ul>/<li><h1><br>Functional Difference Between UI Headings and
<strong>The main issue is that status headings cannot be created through the API. In our context, apart from visual differences, the problem is that in general batch updates via API will always differ from manual ones and the headers come with neat features that cannot be achieved through
<strong>.For example:
The editor automatically carries forward the existing heading structure into the new status update, which is a very useful feature and is part of our team's workflow.
However, when generating the same section titles through the API using
<strong>, the resulting text is treated as ordinary content and does not participate in this carry-over behavior.Expected Behavior
Option 1
Add support for heading elements such as
<h1>,<h2>(or whatever the supported rich-text equivalent may be) within project status updates endpoint.Option 2
Document how UI-created headings are internally represented and how equivalent headings can be generated through the API using
html_text.Option 3
If UI-equivalent headings cannot currently be created through the API, provide recommended workarounds for automation scenarios where generated status updates should behave similarly to manually-created status updates.
Questions
<strong>when retrieved through the API?Thank you very much for any leads in advance!