{% note tip "" %}
If you are developing integrations for Bitrix24 using AI tools (Codex, Claude Code, Cursor), connect to the MCP server so that the assistant can utilize the official REST documentation.
{% endnote %}
Scope:
logWho can execute the method: any user
The method log.blogpost.add adds a message to the News Feed.
{% include Note on required parameters %}
#|
|| Name
type | Description ||
|| POST_MESSAGE*
string | Message text ||
|| POST_TITLE
string | Message title ||
|| DEST
array | List of recipients who will have permission to view the message.
Possible values:
SG<X>— workgroups and projects with the identifierX. You can retrieve the identifier using the sonet_group.get methodU<X>— users with the identifierX. You can retrieve the identifier using the user.get methodUA— all authorized usersDR<X>— company departments with the identifierX. You can retrieve the identifier using the department.get method
Default — UA
||
|| SPERM
array | Deprecated equivalent of DEST ||
|| FILES
array | Array of files in the format described in working with files.
Files will be uploaded to the author's Drive and linked to the message ||
|| IMPORTANT
string | Indicator of an important message.
Possible values:
Y— message is importantN— message is not important
Default — N ||
|| IMPORTANT_DATE_END
string | Date and time in ISO 8601 format until which the message will be considered important ||
|| SITE_ID
string | Site identifier.
Default — current site ||
|| USER_ID
integer | Identifier of the user on behalf of whom the message is published. Available only to administrators.
The identifier can be obtained using the user.get method.
Default — current user who initiated the method call ||
|| TAGS
string | Message tags ||
|| BACKGROUND_CODE
string | Background code of the message ||
|| PARSE_PREVIEW
string | Automatic addition of a link preview from the message text.
Possible values:
Y— attempt to generate a link preview fromPOST_MESSAGEN— do not generate a preview
Default — N ||
|| UF_*
any | Custom fields. A specific set of fields is supported, depending on the account settings ||
|#
#|
|| Name
type | Description ||
|| UF_BLOG_POST_FILE
array | Alternative to FILES.
Pass a list of Drive file identifiers in the format ['n<ID_drive_file>'].
The identifier can be obtained using the disk.storage.getchildren and disk.folder.getchildren methods.
{% note info "" %}
When specifying FILES, the UF_BLOG_POST_FILE parameter is ignored.
{% endnote %} ||
|| UF_BLOG_POST_IMPRTNT
integer | Indicator of an important message.
Automatically filled when IMPORTANT = 'Y' ||
|| UF_IMPRTANT_DATE_END
datetime | Expiration date of the important message.
Automatically filled when IMPORTANT_DATE_END is provided ||
|| UF_BLOG_POST_URL_PRV
integer | Link preview from the message text.
Automatically filled when PARSE_PREVIEW = 'Y', if the preview was successfully generated ||
|| UF_GRATITUDE
integer | Data for the Gratitude functionality in the format:
GRATITUDE_MEDAL: '<XML_ID_medal>',
GRATITUDE_EMPLOYEES: [<user_ID>]||
|| UF_BLOG_POST_VOTE
integer | Survey data in the format:
UF_BLOG_POST_VOTE: 'n<ID_survey>',
'UF_BLOG_POST_VOTE_n<ID_survey>_DATA': {
QUESTIONS: [
{
QUESTION: 'Question',
FIELD_TYPE: 0, // Selection type: 0 — one option, 1 — multiple options
ANSWERS: [
{ MESSAGE: 'Answer 1' },
{ MESSAGE: 'Answer 2' }
]
}
],
ANONYMITY: 0, // Voting anonymity: 0 — no, 1 — yes
OPTIONS: 0 // Re-voting: 0 — prohibited, 1 — allowed
}When creating a new survey, use a random identifier with the prefix n ||
|#
{% include Note on Examples %}
{% list tabs %}
-
cURL (Webhook)
curl -X POST \ -H "Content-Type: application/json" \ -H "Accept: application/json" \ -d '{"POST_TITLE":"New Regulation","POST_MESSAGE":"From November 1, the approval process is updated.","DEST":["UA"],"TAGS":"regulation,approval,update","IMPORTANT":"Y","FILES":[["first-image.jpg","iVBORw0KGgoAAAANSUhEUgAAAAUA..."],["second-image.jpg","iVBORw0KGgoAAAANSUhEUgAAAAUA..."]]}' \ https://**put_your_bitrix24_address**/rest/**put_your_user_id_here**/**put_your_webhook_here**/log.blogpost.add
-
cURL (OAuth)
curl -X POST \ -H "Content-Type: application/json" \ -H "Accept: application/json" \ -d '{"POST_TITLE":"New Regulation","POST_MESSAGE":"From November 1, the approval process is updated.","DEST":["UA"],"TAGS":"regulation,approval,update","IMPORTANT":"Y","FILES":[["first-image.jpg","iVBORw0KGgoAAAANSUhEUgAAAAUA..."],["second-image.jpg","iVBORw0KGgoAAAANSUhEUgAAAAUA..."]],"auth":"**put_access_token_here**"}' \ https://**put_your_bitrix24_address**/rest/log.blogpost.add
-
JS (TS)
// This snippet is an ES module: top-level await requires type="module" or a bundler. // $b24 is an already-initialized SDK instance (see the SDK "Get started" guide). import { Text } from '@bitrix24/b24jssdk' import type { B24Frame } from '@bitrix24/b24jssdk' declare const $b24: B24Frame try { const response = await $b24.actions.v2.call.make<number>({ method: 'log.blogpost.add', params: { POST_TITLE: 'New regulation', POST_MESSAGE: 'As of November 1, the approval process is being updated.', DEST: ['UA'], TAGS: 'regulation,approval,update', IMPORTANT: 'Y', FILES: [ ['first-image.jpg', 'iVBORw0KGgoAAAANSUhEUgAAAAUA...'], ['second-image.jpg', 'iVBORw0KGgoAAAANSUhEUgAAAAUA...'], ], }, requestId: Text.getUuidRfc4122() }) // The payload is available only on a successful response if (!response.isSuccess) { console.error(response.getErrorMessages().join('; ')) } else { const result = response.getData()!.result console.info('Created blog post with ID:', result) } } catch (error) { // Thrown on transport or SDK failures (AjaxError, SdkError, etc.) console.error(error) }
-
JS (UMD)
<!-- Load the SDK (UMD build); it is exposed as the global B24Js --> <script src="https://unpkg.com/@bitrix24/b24jssdk@1/dist/umd/index.min.js"></script> <script> async function addBlogpost() { try { // Initialize the SDK inside a Bitrix24 frame const $b24 = await B24Js.initializeB24Frame() const response = await $b24.actions.v2.call.make({ method: 'log.blogpost.add', params: { POST_TITLE: 'New regulation', POST_MESSAGE: 'As of November 1, the approval process is being updated.', DEST: ['UA'], TAGS: 'regulation,approval,update', IMPORTANT: 'Y', FILES: [ ['first-image.jpg', 'iVBORw0KGgoAAAANSUhEUgAAAAUA...'], ['second-image.jpg', 'iVBORw0KGgoAAAANSUhEUgAAAAUA...'], ], }, requestId: B24Js.Text.getUuidRfc4122() }) // The payload is available only on a successful response if (!response.isSuccess) { console.error(response.getErrorMessages().join('; ')) return } const result = response.getData().result console.info('Created blog post with ID:', result) } catch (error) { // Thrown on transport or SDK failures (AjaxError, SdkError, etc.) console.error(error) } } document.addEventListener('DOMContentLoaded', addBlogpost) </script>
-
PHP
try { $response = $b24Service ->core ->call( 'log.blogpost.add', [ 'POST_TITLE' => 'New Regulation', 'POST_MESSAGE' => 'From November 1, the approval process is updated.', 'DEST' => ['UA'], 'TAGS' => 'regulation,approval,update', 'IMPORTANT' => 'Y', 'FILES' => [ ['first-image.jpg', 'iVBORw0KGgoAAAANSUhEUgAAAAUA...'], ['second-image.jpg', 'iVBORw0KGgoAAAANSUhEUgAAAAUA...'] ] ] ); $result = $response ->getResponseData() ->getResult(); echo 'Success: ' . print_r($result, true); processData($result); } catch (Throwable $e) { error_log($e->getMessage()); echo 'Error adding blog post: ' . $e->getMessage(); }
-
BX24.js
BX24.callMethod( 'log.blogpost.add', { POST_TITLE: 'New Regulation', POST_MESSAGE: 'From November 1, the approval process is updated.', DEST: ['UA'], TAGS: 'regulation,approval,update', IMPORTANT: 'Y', FILES: [ ['first-image.jpg', 'iVBORw0KGgoAAAANSUhEUgAAAAUA...'], ['second-image.jpg', 'iVBORw0KGgoAAAANSUhEUgAAAAUA...'] ] }, function(result) { if (result.error()) { console.error(result.error(), result.error_description()); } else { console.log(result.data()); } } );
-
PHP CRest
require_once('crest.php'); $result = CRest::call( 'log.blogpost.add', [ 'POST_TITLE' => 'New Regulation', 'POST_MESSAGE' => 'From November 1, the approval process is updated.', 'DEST' => ['UA'], 'TAGS' => 'regulation,approval,update', 'IMPORTANT' => 'Y', 'FILES' => [ ['first-image.jpg', 'iVBORw0KGgoAAAANSUhEUgAAAAUA...'], ['second-image.jpg', 'iVBORw0KGgoAAAANSUhEUgAAAAUA...'] ] ] ); echo '<PRE>'; print_r($result); echo '</PRE>';
-
Go
// client and ctx are already created — see the Go SDK section res, err := client.Core().Call(ctx, "log.blogpost.add", b24.Params{ "POST_TITLE": "New Regulation", "POST_MESSAGE": "From November 1, the approval process is updated.", "DEST": []string{"UA"}, "TAGS": "regulation,approval,update", "IMPORTANT": "Y", "FILES": []any{ []string{"first-image.jpg", "iVBORw0KGgoAAAANSUhEUgAAAAUA..."}, []string{"second-image.jpg", "iVBORw0KGgoAAAANSUhEUgAAAAUA..."}, }, }) if err != nil { return fmt.Errorf("log.blogpost.add: %w", err) } var newID b24.ID if err := json.Unmarshal(res.Result, &newID); err != nil { return fmt.Errorf("parse response: %w", err) } fmt.Println("id:", newID)
{% endlist %}
HTTP Status: 200
{
"result": 217,
"time": {
"start": 1773750554,
"finish": 1773750555.955794,
"duration": 1.955794095993042,
"processing": 1,
"date_start": "2026-03-17T15:29:14+01:00",
"date_finish": "2026-03-17T15:29:15+01:00",
"operating_reset_at": 1773751154,
"operating": 0.9908020496368408
}
}#|
|| Name
type | Description ||
|| result
integer | Identifier of the created message ||
|| time
time | Information about the request execution time ||
|#
HTTP Status: 400
{
"error": "SONET_CONTROLLER_LIVEFEED_BLOGPOST_ADD_ERROR",
"error_description": "Blog post hasn't been added"
}{% include notitle Error Handling %}
#|
|| Code | Description | Value ||
|| SONET_CONTROLLER_LIVEFEED_BLOGPOST_ADD_ERROR | Blog post hasn't been added | General error saving the message, for example, when POST_MESSAGE is empty ||
|| SONET_CONTROLLER_LIVEFEED_BLOGPOST_ADD_ERROR | No destination specified | Failed to determine the message recipients ||
|| SONET_CONTROLLER_LIVEFEED_BLOGPOST_MODULE_BLOG_NOT_INSTALLED | Blog module is not installed | The blog module is not installed ||
|| SONET_CONTROLLER_LIVEFEED_BLOG_NOT_FOUND | Blog not found | Failed to retrieve the blog to which the message belongs ||
|| — | Cannot add blog post | Internal error when creating the message ||
|#
{% include System Errors %}