Showing results for 
Search instead for 
Did you mean: 
Sign up Log in

Next challenges

Recent achievements

  • Global
  • Personal


  • Give kudos
  • Received
  • Given


  • Global

Trophy case

Kudos (beta program)

Kudos logo

You've been invited into the Kudos (beta program) private group. Chat with others in the program, or give feedback to Atlassian.

View group

It's not the same without you

Join the community to find out what other Atlassian users are discussing, debating and creating.

Atlassian Community Hero Image Collage

List broken macros in Confluence


I'd like to clean up our instance of Confluence, removing some of the plugins we don't need. I want to remove the plugins in the test environment, then try and get a list of pages with broken macros..


Is there any plugins / user macros that can obtain such a list?





3 answers

1 vote

You can use macroName: in the search to find pages using a specific macro.

Listing pages with broken macros is a bit harder though.

Thank you - that was enough for me to find what I needed.

There is a plugin that can remove a macro from every page in your confluence instance. You can even replace it with a different string/macro.  You might want to check that out. It also lists the occurences of that macro.


It doesn't list broken macros. I don't think there is a possibility fot that.


Hi Mark,

I thought something like this would be useful, so I whipped up a short python script:

import xmlrpclib
import codecs

confluenceUrl = "https://<your-server>"
server = xmlrpclib.ServerProxy(confluenceUrl + '/rpc/xmlrpc')
username = 'username'
password = 'password'
token = server.confluence2.login(username, password)
spaceSummary = server.confluence2.getSpaces(token)
for space in spaceSummary:
    log = ""
    log += "<hr>\n"
    log += "<p>Searching in space " + space["name"] + " - " + space["key"] + "</p>\n"
    log += "<hr>\n"
    print log
    with'logfile.html', 'a', encoding='utf-8') as f: 
    spacePages = server.confluence2.getPages(token, space["key"])
    for page in spacePages:
        pageContent = server.confluence2.renderContent(token, "", page["id"], "", {'style': 'clean'})
        if '<span class="error">Unknown macro:' in pageContent:
            log = ""
            log += "<p>Page " + page["title"] + " has broken macros!</p>\n"
            log += "<p>Page ID: " + page["id"] + "</p>\n"
            log += '<p>Page URL: <a href="' + page["url"] + '">' + page["url"] + '</a></p><p> </p>\n'
            log += "<p>----</p>\n"
            print log
            with'logfile.html', 'a', encoding='utf-8') as f: 

It will go through every page on your site and see whether it has broken macros on it and outputs the results with links to the pages in an HTML file.  I would run it off-hours (or on your test instance) since it hits the server pretty hard, but we have a fairly good size instance and it only took about 5-10 minutes to run.  I only tested it with plain Python 2.7.8 and Confluence 5.5, but it should work fine on other versions.

Doesn't work in Cloud.

Traceback (most recent call last):
File "./", line 10, in <module>
token = server.confluence2.login(username, password)
File "/usr/lib64/python2.7/", line 1240, in __call__
return self.__send(self.__name, args)
File "/usr/lib64/python2.7/", line 1599, in __request
File "/usr/lib64/python2.7/", line 1280, in request
return self.single_request(host, handler, request_body, verbose)
File "/usr/lib64/python2.7/", line 1328, in single_request
xmlrpclib.ProtocolError: <ProtocolError for 404 Not Found>

It seems like you might be missing the full context Path.  Usually Cloud instances are

Try updating your URL to that and hopefully it should work.

@Stephen Deutsch, spot on. Correcting the URL got it to run. Although I now get a 504 time out after a few minutes.

@Stephen Deutsch: Nice example.

Does anyone know whether something like this is possible through the REST API as well, since XML-RPC is now a deprecated API?

For python 3.x you need to replace 

import xmlrpclib
server = xmlrpclib.ServerProxy(confluenceUrl + '/rpc/xmlrpc')


from xmlrpc import client
server = client.ServerProxy(confluenceUrl + '/rpc/xmlrpc')

Suggest an answer

Log in or Sign up to answer
Community showcase
Posted in Confluence

What do you think is the most *delightful* Confluence feature? Comment for a prize!

- Create your own custom emoji 🔥 - "Shake for Feedback" on mobile 📱 - An endless supply of GIFs via GIPHY 🤩 Is there anything quite as nice as a pleasant surprise? Comment below with what...

402 views 23 8
Join discussion

Community Events

Connect with like-minded Atlassian users at free events near you!

Find an event

Connect with like-minded Atlassian users at free events near you!

Unfortunately there are no Community Events near you at the moment.

Host an event

You're one step closer to meeting fellow Atlassian users at your local event. Learn more about Community Events

Events near you