# List new content available to users

**URL:** <https://forums.concretecms.org/t/list-new-content-available-to-users/9756>\
**Category:** Developing with Concrete\
**Tags:** api\
**Created:** [February 2, 2026, 10:55am UTC](https://forums.concretecms.org/t/list-new-content-available-to-users/9756 "2026-02-02T10:55:14Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![pibou](https://forums.concretecms.org/user_avatar/forums.concretecms.org/pibou/32/5178_2.png) [@pibou](https://forums.concretecms.org/u/pibou)\
**Post date:** [February 2, 2026, 10:55am UTC](https://forums.concretecms.org/t/list-new-content-available-to-users/9756/1 "2026-02-02T10:55:14Z")

</div>

Hello,

i am looking to develop a functionality that lists new content available to users. It would provide a list of last contents published with a link and, if possible, a brief description.

Using PageVersionApproveListener, I managed to retrieve the currently approved version of the page, the previously approved version of the same page and i am able to detect new Blocks based on isOriginal and getBlockRelationID.  
It does not handle scheduled publication.

Adding a new page works fine. Adding blocks to that page works fine.  
But it does not seem to work at all when, for instance in provided test site, adding a new ressource : it creates a new block with a different RelationId (although it is an update of an existing block) that appears as a creation to my code.

What is the right approach ?

---

<div class="post-metadata">

**Author:** ![mnakalay](https://forums.concretecms.org/user_avatar/forums.concretecms.org/mnakalay/32/6276_2.png) [@mnakalay](https://forums.concretecms.org/u/mnakalay)\
**Post date:** [February 2, 2026, 8:31pm UTC](https://forums.concretecms.org/t/list-new-content-available-to-users/9756/2 "2026-02-02T20:31:37Z")

</div>

Hello. I’m not too clear on what you’re trying to do.

Are you trying to list newly added pages or newly updated pages?

---

<div class="post-metadata">

**Author:** ![pibou](https://forums.concretecms.org/user_avatar/forums.concretecms.org/pibou/32/5178_2.png) [@pibou](https://forums.concretecms.org/u/pibou)\
**Post date:** [February 3, 2026, 7:05am UTC](https://forums.concretecms.org/t/list-new-content-available-to-users/9756/3 "2026-02-03T07:05:26Z")

</div>

Hello,

thanks for your answer.  
I’m trying indeed to capture exclusively new content. To make it more clear :  
creating a new blog entry, i identify a new Block : it is original and its BlockRelationID is not present in previously approved version  
Updating this same block creates a new Block but its BlockRelationID is present in previously approved version. I discard it, this a modification.

But when i update attributes (eg : description) of the Block (in designer page) : a new Block is created with a new BlockRelationID.

I want to be able to identify that last case.

---

<div class="post-metadata">

**Author:** ![mnakalay](https://forums.concretecms.org/user_avatar/forums.concretecms.org/mnakalay/32/6276_2.png) [@mnakalay](https://forums.concretecms.org/u/mnakalay)\
**Post date:** [February 3, 2026, 1:05pm UTC](https://forums.concretecms.org/t/list-new-content-available-to-users/9756/4 "2026-02-03T13:05:42Z")

</div>

In the situation you’re describing, the event `on_block_duplicate` is triggered.  
Through this event you get both the old and new block. And through the block you can get the page or pages it is on.

Here are the docs concerning events: [Application Events :: Concrete CMS](https://documentation.concretecms.org/9-x/developers/security/events)

---

<div class="post-metadata">

**Author:** ![pibou](https://forums.concretecms.org/user_avatar/forums.concretecms.org/pibou/32/5178_2.png) [@pibou](https://forums.concretecms.org/u/pibou)\
**Post date:** [February 3, 2026, 1:10pm UTC](https://forums.concretecms.org/t/list-new-content-available-to-users/9756/5 "2026-02-03T13:10:54Z")

</div>

Thank you.  
I have managed to make it work by (brute force) generating and comparing the display for Blocks.  
This seems a quite neat solution.
