diff --git a/.gitignore b/.gitignore
index b942f440715c29abc9a536a330c4181518c235c7..413a834f4457afcde0c58daa0811dabd4085c881 100644
--- a/.gitignore
+++ b/.gitignore
@@ -40,4 +40,5 @@ secret.properties
 config/*.crt
 
 #NodeJS
-node_modules/
\ No newline at end of file
+node_modules/
+/bin/
diff --git a/src/main/java/org/eclipsefoundation/marketplace/dto/Listing.java b/src/main/java/org/eclipsefoundation/marketplace/dto/Listing.java
index a6c93d3badc9da38f09e263ccfc937a236bd16f9..7595cba6a2044119345f3ebbf71f14fda2f26ac0 100644
--- a/src/main/java/org/eclipsefoundation/marketplace/dto/Listing.java
+++ b/src/main/java/org/eclipsefoundation/marketplace/dto/Listing.java
@@ -63,6 +63,8 @@ public class Listing extends NodeBase {
 	private List<Author> authors;
 	private List<Tag> tags;
 	private List<ListingVersion> versions;
+	private String publishStatus;
+	private String moderationStatus;
 
 	/**
 	 * Default constructor, sets lists to empty lists to stop null pointers
@@ -380,7 +382,35 @@ public class Listing extends NodeBase {
 		Objects.requireNonNull(versions);
 		this.versions = new ArrayList<>(versions);
 	}
-
+	
+	/**
+	 * @return publishStatus
+	 */
+	public String getPublishStatus() {
+		return publishStatus;
+	}
+	
+	/**
+	 * @param publishStatus
+	 */
+	public void setPublishStatus(String publishStatus) {
+		this.publishStatus = publishStatus;
+	}
+	
+	/**
+	 * @param moderationStatus
+	 */
+	public String getModerationStatus() {
+		return moderationStatus;
+	}
+	
+	/**
+	 * @param moderationStatus
+	 */
+	public void setModerationStatus(String moderationStatus) {
+		this.moderationStatus = moderationStatus;
+	}
+	
 	@Override
 	public boolean validate() {
 		return super.validate() && license != null && !authors.isEmpty() && !categoryIds.isEmpty()
diff --git a/src/main/java/org/eclipsefoundation/marketplace/dto/codecs/ListingCodec.java b/src/main/java/org/eclipsefoundation/marketplace/dto/codecs/ListingCodec.java
index ef2c7070044c8152877d7af86c23fee119e060b3..57437481eb37a68e804644637392370c38e438aa 100644
--- a/src/main/java/org/eclipsefoundation/marketplace/dto/codecs/ListingCodec.java
+++ b/src/main/java/org/eclipsefoundation/marketplace/dto/codecs/ListingCodec.java
@@ -80,6 +80,8 @@ public class ListingCodec implements CollectibleCodec<Listing> {
 		doc.put(DatabaseFieldNames.CATEGORY_IDS, value.getCategoryIds());
 		doc.put(DatabaseFieldNames.SCREENSHOTS, value.getScreenshots());
 		doc.put(DatabaseFieldNames.MARKET_IDS, value.getMarketIds());
+		doc.put(DatabaseFieldNames.PUBLISH_STATUS, value.getPublishStatus());
+		doc.put(DatabaseFieldNames.MODERATION_STATUS, value.getModerationStatus());
 		
 		// for nested document types, use the converters to safely transform into BSON
 		// documents
@@ -118,6 +120,8 @@ public class ListingCodec implements CollectibleCodec<Listing> {
 		out.setCategoryIds(document.getList(DatabaseFieldNames.CATEGORY_IDS, String.class));
 		out.setMarketIds(document.getList(DatabaseFieldNames.MARKET_IDS, String.class));
 		out.setScreenshots(document.getList(DatabaseFieldNames.SCREENSHOTS, String.class));
+		out.setPublishStatus(document.getString(DatabaseFieldNames.PUBLISH_STATUS));
+		out.setModerationStatus(document.getString(DatabaseFieldNames.MODERATION_STATUS));
 
 		// for nested document types, use the converters to safely transform into POJO
 		out.setAuthors(document.getList(DatabaseFieldNames.LISTING_AUTHORS, Document.class).stream()
diff --git a/src/main/java/org/eclipsefoundation/marketplace/dto/filter/ListingFilter.java b/src/main/java/org/eclipsefoundation/marketplace/dto/filter/ListingFilter.java
index 9aadaa4e0d7ff710be10a06ef3468bf0c22b7ac1..b949e425f246c04322379e0bc778c56bf921e315 100644
--- a/src/main/java/org/eclipsefoundation/marketplace/dto/filter/ListingFilter.java
+++ b/src/main/java/org/eclipsefoundation/marketplace/dto/filter/ListingFilter.java
@@ -37,7 +37,7 @@ public class ListingFilter implements DtoFilter<Listing> {
 
 	@Inject
 	DtoFilter<ListingVersion> listingVersionFilter;
-	
+
 	@Override
 	public List<Bson> getFilters(RequestWrapper wrap, String root) {
 		List<Bson> filters = new ArrayList<>();
@@ -73,6 +73,19 @@ public class ListingFilter implements DtoFilter<Listing> {
 		if (text.isPresent()) {
 			filters.add(Filters.text(text.get()));
 		}
+
+		// Listing publish status check
+		Optional<String> publishStatus = wrap.getFirstParam(UrlParameterNames.PUBLISH_STATUS);
+		if (publishStatus.isPresent()) {
+			filters.add(Filters.eq(DatabaseFieldNames.PUBLISH_STATUS, publishStatus.get()));
+		}
+
+		// Listing moderation status check
+		Optional<String> moderationStatus = wrap.getFirstParam(UrlParameterNames.MODERATION_STATUS);
+		if (moderationStatus.isPresent()) {
+			filters.add(Filters.eq(DatabaseFieldNames.MODERATION_STATUS, moderationStatus.get()));
+		}
+
 		return filters;
 	}
 
@@ -80,8 +93,8 @@ public class ListingFilter implements DtoFilter<Listing> {
 	public List<Bson> getAggregates(RequestWrapper wrap) {
 		List<Bson> aggs = new ArrayList<>();
 		// adds a $lookup aggregate, joining categories on categoryIDS as "categories"
-		aggs.add(Aggregates.lookup(DtoTableNames.LISTING_VERSION.getTableName(), DatabaseFieldNames.DOCID, DatabaseFieldNames.LISTING_ID,
-				DatabaseFieldNames.LISTING_VERSIONS));
+		aggs.add(Aggregates.lookup(DtoTableNames.LISTING_VERSION.getTableName(), DatabaseFieldNames.DOCID,
+				DatabaseFieldNames.LISTING_ID, DatabaseFieldNames.LISTING_VERSIONS));
 		Bson filters = listingVersionFilter.wrapFiltersToAggregate(wrap, DatabaseFieldNames.LISTING_VERSIONS);
 		if (filters != null) {
 			aggs.add(filters);
diff --git a/src/main/java/org/eclipsefoundation/marketplace/namespace/DatabaseFieldNames.java b/src/main/java/org/eclipsefoundation/marketplace/namespace/DatabaseFieldNames.java
index f3d5f575d09a909a509a13979c8389951f126c53..eec5a767ea9a34059125b51003a01a065f52c5ca 100644
--- a/src/main/java/org/eclipsefoundation/marketplace/namespace/DatabaseFieldNames.java
+++ b/src/main/java/org/eclipsefoundation/marketplace/namespace/DatabaseFieldNames.java
@@ -49,6 +49,8 @@ public final class DatabaseFieldNames {
 	public static final String FEATURE_ID = "feature_id";
 	public static final String INSTALL_STATE = "install_state";
 	public static final String SCREENSHOTS = "screenshots";
+	public static final String PUBLISH_STATUS = "publish_status";
+	public static final String MODERATION_STATUS = "moderation_status";
 
 	// catalog fields
 	public static final String CATALOG_TABS = "tabs";
diff --git a/src/main/java/org/eclipsefoundation/marketplace/namespace/UrlParameterNames.java b/src/main/java/org/eclipsefoundation/marketplace/namespace/UrlParameterNames.java
index 94045917d1f52f458542dee941d48ba7b40f8bc6..13b1b3804f54247c60b78ba2505b8ad756799d69 100644
--- a/src/main/java/org/eclipsefoundation/marketplace/namespace/UrlParameterNames.java
+++ b/src/main/java/org/eclipsefoundation/marketplace/namespace/UrlParameterNames.java
@@ -34,6 +34,8 @@ public final class UrlParameterNames {
 	public static final String DATE_FROM = "from";
 	public static final String END = "end";
 	public static final String START = "start";
+	public static final String PUBLISH_STATUS = "publish_status";
+	public static final String MODERATION_STATUS = "moderation_status";
 	
 	private UrlParameterNames() {
 	}