diff --git a/include/asterisk/res_pjsip_pubsub.h b/include/asterisk/res_pjsip_pubsub.h
index 94576d38b04c902047fa57663062b57fade2d660..4f9a7633afb916bfed872e7de0b09ea234baeadc 100644
--- a/include/asterisk/res_pjsip_pubsub.h
+++ b/include/asterisk/res_pjsip_pubsub.h
@@ -648,6 +648,19 @@ struct ast_sip_pubsub_body_supplement {
 int ast_sip_pubsub_generate_body_content(const char *content_type,
 		const char *content_subtype, struct ast_sip_body_data *data, struct ast_str **str);
 
+/*!
+ * \brief Is a body generator registered for the given type/subtype.
+ * \since 14.0.0
+ *
+ * \param type The content type of the body
+ * \param subtype The content subtype of the body
+ *
+ * \note In "plain/text", "plain" is the type and "text" is the subtype.
+ *
+ * \retval non-zero if a generator is registered.
+ */
+int ast_sip_pubsub_is_body_generator_registered(const char *type, const char *subtype);
+
 /*!
  * \since 13.0.0
  * \brief Register a body generator with the pubsub core.
diff --git a/res/res_pjsip_exten_state.c b/res/res_pjsip_exten_state.c
index 555402469e0cd651369922d6f8ed7ceb2188d5ce..6b4e758d3d17711011206e4d8e4a22fe77e14795 100644
--- a/res/res_pjsip_exten_state.c
+++ b/res/res_pjsip_exten_state.c
@@ -680,6 +680,12 @@ static int publisher_start(struct ast_sip_outbound_publish *configuration, struc
 		return -1;
 	}
 
+	if (!ast_sip_pubsub_is_body_generator_registered(body_type, body_subtype)) {
+		ast_log(LOG_ERROR, "Outbound extension state publisher '%s': '%s' body generator not registered\n",
+			name, body_full);
+		return -1;
+	}
+
 	name_size = strlen(name) + 1;
 	body_type_size = strlen(body_type) + 1;
 	body_subtype_size = strlen(body_subtype) + 1;
diff --git a/res/res_pjsip_pubsub.c b/res/res_pjsip_pubsub.c
index dc49a5fd302a59c3d7428923df8b5e9bbdaaf57c..755a154a5a49c058e586481e00ec8f7f13bb862c 100644
--- a/res/res_pjsip_pubsub.c
+++ b/res/res_pjsip_pubsub.c
@@ -3094,6 +3094,11 @@ const char *ast_sip_publication_get_event_configuration(const struct ast_sip_pub
 	return pub->event_configuration_name;
 }
 
+int ast_sip_pubsub_is_body_generator_registered(const char *type, const char *subtype)
+{
+	return !!find_body_generator_type_subtype(type, subtype);
+}
+
 int ast_sip_pubsub_register_body_generator(struct ast_sip_pubsub_body_generator *generator)
 {
 	struct ast_sip_pubsub_body_generator *existing;