[Yandex Cloud documentation](../index.md) > [Yandex Cloud Notification Service](index.md) > Getting started > Getting started with topics

# Getting started with topics in Yandex Cloud Notification Service

{% note info %}

The service is at the [preview stage](../overview/concepts/launch-stages.md).

{% endnote %}

To enable Cloud Notification Service, request access to the service from your account manager or [technical support](https://center.yandex.cloud/support).

Cloud Notification Service (CNS) is a service for multichannel notifications of users. The service's HTTP API is compatible with the [Amazon SNS API](https://docs.aws.amazon.com/sns/latest/api/welcome.html).

To send messages to different endpoints at the same time, use topics. You can subscribe the endpoints to a _topic_ and send notifications to all of them at once.

To get started with topics:

1. [Get your cloud ready](#before-you-begin).
1. Create notification channels and endpoints: 
   
   * [Mobile push notifications](quickstart-push.md)
   * [In-browser push notifications](quickstart-browser.md)
   * [SMS](quickstart-sms.md) 
      For SMS notifications, you may add phone numbers directly to the topic rather than the channel.

1. [Create a topic](#create-topic).
1. [Subscribe endpoints to the topic](#subscribe-endpoints).
1. [Send a notification to the topic](#send-message).

# Get your cloud ready {#before-you-begin}

Sign up for Yandex Cloud and create a [billing account](../billing/concepts/billing-account.md):
1. Navigate to the [management console](https://console.yandex.cloud) and log in to Yandex Cloud or create a new account.
1. On the **[Yandex Cloud Billing](https://center.yandex.cloud/billing/accounts)** page, make sure you have a billing account linked and it has the `ACTIVE` or `TRIAL_ACTIVE` [status](../billing/concepts/billing-account-statuses.md). If you do not have a billing account, [create one](../billing/quickstart/index.md) and [link](../billing/operations/pin-cloud.md) a cloud to it.

If you have an active billing account, you can create or select a [folder](../resource-manager/concepts/resources-hierarchy.md#folder) for your infrastructure on the [cloud page](https://console.yandex.cloud/cloud).

[Learn more about clouds and folders here](../resource-manager/concepts/resources-hierarchy.md).

## Create the topic {#create-topic}

{% list tabs group=instructions %}

- Management console {#console}

  1. In the [management console](https://console.yandex.cloud), select a folder.
  1. Navigate to **Cloud Notification Service**.
  1. Select **Topics** on the left.
  1. Click **Create topic**.
  1. Enter a name for the topic. The name must be unique within Cloud Notification Service.
  1. Under **Logging**, enable the **Write logs** option.
  1. In the **Folder** list, select a folder to house the [log group](../logging/concepts/log-group.md).
  1. In the **Log group** field, select an existing log group or create a new one.
  1. Click **Create topic**.

- AWS CLI {#aws-cli}

  1. If you do not have the AWS CLI yet, [install and configure it](../storage/tools/aws-cli.md).
  1. Run this command:

     ```bash
     aws sns create-topic --name <topic_name>
     ```
     
     Where `name` is topic name, which can be any name unique within Cloud Notification Service.
     
     Learn more about the `aws sns create-topic` command in [this AWS guide](https://docs.amazonaws.cn/en_us/sns/latest/dg/sns-create-topic.html).

- AWS SDK for Python {#python}

  1. If you do not have the AWS SDK for Python (boto3) yet, [install and configure it](tools/sdk-python.md#aws-sdk).
  1. To create a push notification channel, use the following code:

     ```python
     response = client.create_topic(
         Name="<topic_name>"
     )
     
     print (f"Topic ARN:", response['TopicArn'])
     ```
     
     Where:
     
     * `Name`: Topic name, which can be any name unique within Cloud Notification Service.

{% endlist %}

## Subscribe endpoints to the topic {#subscribe-endpoints}

{% list tabs group=instructions %}

- Management console {#console}

  1. Select a topic.
  1. Select **Subscriptions** on the left.
  1. Click **Create subscription**.
  1. Select a notification channel type:
       
     * **Mobile push notifications**.
     
         Enter the endpoint ARN in `arn:aws:sns::<cloud_id>:endpoint/<platform>/<channel_name>/<endpoint_unique_id>` format. You can copy the ARN on the endpoint’s settings page.
  
     * **In-browser push notifications**.
  
         Enter the endpoint ARN in `arn:aws:sns::<cloud_id>:endpoint/<platform>/<channel_name>/<endpoint_unique_id>` format.
     
     * **SMS**.
        
         Enter your phone number in [E.164](https://en.wikipedia.org/wiki/E.164) format, e.g., `+79991112233`. You do not need to pre-add the phone number to the SMS notification channel, but you need to create the channel itself.
  
  1. Click **Create subscription**.
  
     Subscribe other endpoints to the topic in the same way.

- AWS CLI {#aws-cli}

   Run this command:

   ```bash
   aws sns subscribe \
     --topic-arn <topic_ARN> \
     --protocol <channel_type> \
     --notification-endpoint <endpoint_ARN_or_phone_number>
   ```
   
   Where:
     * `topic-arn`: Topic ARN.
     * `protocol`: Type of notification channel, e.g., `sms`, `application`.
     * `notification-endpoint`: ARN of the endpoint subscribing to the topic, in `arn:aws:sns::<cloud_id>:endpoint/<platform>/<channel_name>/<endpoint_unique_id>` format. For SMS, enter a phone number in [E.164](https://en.wikipedia.org/wiki/E.164) format, e.g., `+79991112233`.
   
   For more on the `aws sns subscribe` command, see [this AWS guide](https://docs.amazonaws.cn/en_us/sns/latest/dg/sns-create-subscribe-endpoint-to-topic.html).

- AWS SDK for Python {#python}

  Use the following code:

  ```python
  try:
      response = client.subscribe(
          TopicArn = "<topic_ARN>",
          Protocol = "<channel_type>",
          Endpoint = "<endpoint_ARN_or_phone_number>"
      )
      print(f"Topic ARN: {response['TopicArn']}")
  except botocore.exceptions.ClientError as error:
      print(f"Error: {error}")
  ```
  
  Where:
  
  * `TopicArn`: Topic ARN.
  * `Protocol`: Notification channel type, e.g., `sms` or `application`.
  * `Endpoint`: ARN of the endpoint subscribing to the topic, in `arn:aws:sns::<cloud_id>:endpoint/<platform>/<channel_name>/<endpoint_unique_id>` format. For SMS, enter a phone number in [E.164](https://en.wikipedia.org/wiki/E.164) format, e.g., `+79991112233`.

{% endlist %}

## Send a notification to the topic {#send-message}

{% list tabs group=instructions %}

- Management console {#console}

  1. Select the topic.
  1. Click **Send notification**.
  1. Select a notification type: 
       
      * **Same**: To send the same notification to all channel types.
      * **Different**: To enter different texts for different channel types.
  
  1. Enter the same text for all channels, or different texts for different channel types, in JSON format. If a channel is not specified, the notification will contain the `default` message text.
     
      Notification format in JSON:
      
      ```json
      {
        "default": "<Default_text>",
        "sms": "<Notification_text_for_sms>",
        "WEB": "<Notification_text_for_bowser>",
        "APNS": {
          "aps": {
            "alert": {
              "title": "Notification_title",
              "body": "Notification_text"
            }
          }
        },
        "GCM": {
          "notification": {
            "title": "Notification_title",
            "body": "Notification_text"
          }
        },
        "HMS": {
          "notification": {
            "title": "Notification_title",
            "body": "<Notification_text>"
          }
        },
        "RUSTORE": {
          "notification": {
            "title": "Notification_title",
            "body": "<Notification_text>"
          }
        }
      }
      ```
  
  1. Click **Send**.

- AWS CLI {#aws-cli}

  Run this command:

  To send a notification:
  
  ```bash
  aws sns publish \
  --topic-arn <topic_ARN> \
  --message-structure json \
  --message '{"default": "<notification_text>","APNS": {"aps":{"alert":"<notification_text>"}},"GCM": {"notification":{"body":"<notification_text>"}},"HMS": {"notification":{"body":"<notification_text>"}},"RUSTORE": {"notification":{"body":"<notification_text>"}},"WEB": "<notification_text>","sms": "<notification_text>"}'
  ```
  
  Where:
    * `topic-arn`: Topic ARN.
    * `message-structure`: Message format (`json`).
    * `message`: Notification text or path to the notification file. To send different notifications depending on channel type, specify the channel and notification text: If some channel is not specified, the default message will be sent.
  
  Learn more about the `aws sns publish` command in [this AWS guide](https://docs.amazonaws.cn/en_us/sns/latest/dg/sns-publish-to-topic.html).

- AWS SDK for Python {#python}

  Use the following code:

  ```python
  try:
      response = client.publish(
          TopicArn="<topic_ARN>",
          Message=json.dumps({
              "default": "<notification_text>",
              "APNS": {"aps":{"alert":"<notification_text>"}},
              "GCM": {"notification":{"body":"<notification_text>"}},
              "HMS": {"notification":{"body":"<notification_text>"}},
              "RUSTORE": {"notification":{"body":"<notification_text>"}},
              "WEB": "<notification_text>",
              "sms": "<notification_text>"
          }),
          MessageStructure="json"
      )
      print(f"Message ID: {response["MessageId"]}")
  except botocore.exceptions.ClientError as error:
      print(f"Error: {error}")
  ```
  
  Where:
  
  * `TopicArn`: Topic ARN.
  * `Message`: Notification text. You can add the same text for all channel types or different texts for each channel type. If a channel is not specified, the notification will contain the `default` message text.
  * `MessageStructure`: Message format (`json`).

{% endlist %}