Skip to main content

Query notification service IP address

When using Agora real-time audio and video, you can use the Notifications service to receive channel events.

After activating the service, when a channel event occurs, the Notifications server will deliver the event notification to your message receiving server.

If your server is behind a firewall, you need to call the IP address query API to retrieve the IP addresses of Notifications and configure your firewall to trust all these IP addresses.

Agora occasionally adjusts the Notifications IP addresses. Best practice is to call this endpoint at least every 24 hours and automatically update the firewall configuration.

Prototype

  • Method: GET
  • Endpoint: https://api.agora.io/v2/ncs/ip

Request parameters

Request header

The Content-Type field in all HTTP request headers is application/json. All requests and responses are in JSON format. All request URLs and request bodies are case-sensitive.

The Agora Channel Management RESTful APIs only support HTTPS. Before sending HTTP requests, you must generate a Base64-encoded credential with the Customer ID and Customer Secret provided by Agora, and pass the credential to the Authorization field in the HTTP request header. See RESTful authentication for details.

Request examples

Use one of the following code examples to test this request:

Shell
  • curl
    curl --request GET \    --url http://api.sd-rtn.com/v2/ncs/ip \    --header 'Accept: application/json' \    --header 'Authorization: '
  • HTTPie
    http GET http://api.sd-rtn.com/v2/ncs/ip \  Accept:application/json \  Authorization:''
  • wget
    wget --quiet \  --method GET \  --header 'Authorization: ' \  --header 'Accept: application/json' \  --output-document \  - http://api.sd-rtn.com/v2/ncs/ip
Javascript
  • Fetch
    const url = 'http://api.sd-rtn.com/v2/ncs/ip';const options = {method: 'GET', headers: {Authorization: '', Accept: 'application/json'}};try {  const response = await fetch(url, options);  const data = await response.json();  console.log(data);} catch (error) {  console.error(error);}
  • XMLHTTPRequest
    const data = null;const xhr = new XMLHttpRequest();xhr.withCredentials = true;xhr.addEventListener('readystatechange', function () {  if (this.readyState === this.DONE) {    console.log(this.responseText);  }});xhr.open('GET', 'http://api.sd-rtn.com/v2/ncs/ip');xhr.setRequestHeader('Authorization', '');xhr.setRequestHeader('Accept', 'application/json');xhr.send(data);
  • jQuery
    const settings = {  async: true,  crossDomain: true,  url: 'http://api.sd-rtn.com/v2/ncs/ip',  method: 'GET',  headers: {    Authorization: '',    Accept: 'application/json'  }};$.ajax(settings).done(function (response) {  console.log(response);});
  • Axios
    import axios from 'axios';const options = {  method: 'GET',  url: 'http://api.sd-rtn.com/v2/ncs/ip',  headers: {Authorization: '', Accept: 'application/json'}};try {  const { data } = await axios.request(options);  console.log(data);} catch (error) {  console.error(error);}
Node
  • Native
    const http = require('http');const options = {  method: 'GET',  hostname: 'api.sd-rtn.com',  port: null,  path: '/v2/ncs/ip',  headers: {    Authorization: '',    Accept: 'application/json'  }};const req = http.request(options, function (res) {  const chunks = [];  res.on('data', function (chunk) {    chunks.push(chunk);  });  res.on('end', function () {    const body = Buffer.concat(chunks);    console.log(body.toString());  });});req.end();
  • Request
    const request = require('request');const options = {  method: 'GET',  url: 'http://api.sd-rtn.com/v2/ncs/ip',  headers: {Authorization: '', Accept: 'application/json'}};request(options, function (error, response, body) {  if (error) throw new Error(error);  console.log(body);});
  • Unirest
    const unirest = require('unirest');const req = unirest('GET', 'http://api.sd-rtn.com/v2/ncs/ip');req.headers({  Authorization: '',  Accept: 'application/json'});req.end(function (res) {  if (res.error) throw new Error(res.error);  console.log(res.body);});
  • Fetch
    const fetch = require('node-fetch');const url = 'http://api.sd-rtn.com/v2/ncs/ip';const options = {method: 'GET', headers: {Authorization: '', Accept: 'application/json'}};try {  const response = await fetch(url, options);  const data = await response.json();  console.log(data);} catch (error) {  console.error(error);}
  • Axios
    const axios = require('axios').default;const options = {  method: 'GET',  url: 'http://api.sd-rtn.com/v2/ncs/ip',  headers: {Authorization: '', Accept: 'application/json'}};try {  const { data } = await axios.request(options);  console.log(data);} catch (error) {  console.error(error);}
Python
  • Python 3
    import http.clientconn = http.client.HTTPConnection("api.sd-rtn.com")headers = {    'Authorization': "",    'Accept': "application/json"}conn.request("GET", "/v2/ncs/ip", headers=headers)res = conn.getresponse()data = res.read()print(data.decode("utf-8"))
  • Requests
    import requestsurl = "http://api.sd-rtn.com/v2/ncs/ip"headers = {    "Authorization": "",    "Accept": "application/json"}response = requests.get(url, headers=headers)print(response.json())
Go
package main    import (    	  "fmt"    	  "net/http"    	  "io"    )    func main() {    	  url := "http://api.sd-rtn.com/v2/ncs/ip"    	  req, _ := http.NewRequest("GET", url, nil)    	  req.Header.Add("Authorization", "")    	  req.Header.Add("Accept", "application/json")    	  res, _ := http.DefaultClient.Do(req)    	  defer res.Body.Close()    	  body, _ := io.ReadAll(res.Body)    	  fmt.Println(res)    	  fmt.Println(string(body))    }
C
CURL *hnd = curl_easy_init();curl_easy_setopt(hnd, CURLOPT_CUSTOMREQUEST, "GET");curl_easy_setopt(hnd, CURLOPT_URL, "http://api.sd-rtn.com/v2/ncs/ip");struct curl_slist *headers = NULL;headers = curl_slist_append(headers, "Authorization: ");headers = curl_slist_append(headers, "Accept: application/json");curl_easy_setopt(hnd, CURLOPT_HTTPHEADER, headers);CURLcode ret = curl_easy_perform(hnd);
Objective-C
#import <Foundation/Foundation.h>NSDictionary *headers = @{ @"Authorization": @"",                           @"Accept": @"application/json" };NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://api.sd-rtn.com/v2/ncs/ip"]                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy                                                   timeoutInterval:10.0];[request setHTTPMethod:@"GET"];[request setAllHTTPHeaderFields:headers];NSURLSession *session = [NSURLSession sharedSession];NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {                                                if (error) {                                                    NSLog(@"%@", error);                                                } else {                                                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;                                                    NSLog(@"%@", httpResponse);                                                }                                            }];[dataTask resume];
OCaml
open Cohttp_lwt_unixopen Cohttpopen Lwtlet uri = Uri.of_string "http://api.sd-rtn.com/v2/ncs/ip" inlet headers = Header.add_list (Header.init ()) [  ("Authorization", "");  ("Accept", "application/json");] inClient.call ~headers `GET uri>>= fun (res, body_stream) ->  (* Do stuff with the result *)
C#
  • HTTPClient
    using System.Net.Http.Headers;var client = new HttpClient();var request = new HttpRequestMessage{    Method = HttpMethod.Get,    RequestUri = new Uri("http://api.sd-rtn.com/v2/ncs/ip"),    Headers =    {        { "Authorization", "" },        { "Accept", "application/json" },    },};using (var response = await client.SendAsync(request)){    response.EnsureSuccessStatusCode();    var body = await response.Content.ReadAsStringAsync();    Console.WriteLine(body);}
  • RestSharp
    var client = new RestClient("http://api.sd-rtn.com/v2/ncs/ip");var request = new RestRequest(Method.GET);request.AddHeader("Authorization", "");request.AddHeader("Accept", "application/json");IRestResponse response = client.Execute(request);
Java
  • AsyncHttp
    AsyncHttpClient client = new DefaultAsyncHttpClient();client.prepare("GET", "http://api.sd-rtn.com/v2/ncs/ip")  .setHeader("Authorization", "")  .setHeader("Accept", "application/json")  .execute()  .toCompletableFuture()  .thenAccept(System.out::println)  .join();client.close();
  • NetHttp
    HttpRequest request = HttpRequest.newBuilder()    .uri(URI.create("http://api.sd-rtn.com/v2/ncs/ip"))    .header("Authorization", "")    .header("Accept", "application/json")    .method("GET", HttpRequest.BodyPublishers.noBody())    .build();HttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());System.out.println(response.body());
  • OkHttp
    OkHttpClient client = new OkHttpClient();Request request = new Request.Builder()  .url("http://api.sd-rtn.com/v2/ncs/ip")  .get()  .addHeader("Authorization", "")  .addHeader("Accept", "application/json")  .build();Response response = client.newCall(request).execute();
  • Unirest
    HttpResponse<String> response = Unirest.get("http://api.sd-rtn.com/v2/ncs/ip")  .header("Authorization", "")  .header("Accept", "application/json")  .asString();
Http 1.1
GET /v2/ncs/ip HTTP/1.1Authorization:Accept: application/jsonHost: api.sd-rtn.com
Clojure
(require '[clj-http.client :as client])(client/get "http://api.sd-rtn.com/v2/ncs/ip" {:headers {:Authorization ""}                                               :accept :json})
Kotlin
val client = OkHttpClient()val request = Request.Builder()  .url("http://api.sd-rtn.com/v2/ncs/ip")  .get()  .addHeader("Authorization", "")  .addHeader("Accept", "application/json")  .build()val response = client.newCall(request).execute()
PHP
  • cURL
    <?php$curl = curl_init();curl_setopt_array($curl, [  CURLOPT_URL => "http://api.sd-rtn.com/v2/ncs/ip",  CURLOPT_RETURNTRANSFER => true,  CURLOPT_ENCODING => "",  CURLOPT_MAXREDIRS => 10,  CURLOPT_TIMEOUT => 30,  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,  CURLOPT_CUSTOMREQUEST => "GET",  CURLOPT_HTTPHEADER => [    "Accept: application/json",    "Authorization: "  ],]);$response = curl_exec($curl);$err = curl_error($curl);curl_close($curl);if ($err) {  echo "cURL Error #:" . $err;} else {  echo $response;}
  • Guzzle
    <?php$client = new GuzzleHttp\Client();$response = $client->request('GET', 'http://api.sd-rtn.com/v2/ncs/ip', [  'headers' => [    'Accept' => 'application/json',    'Authorization' => '',  ],]);echo $response->getBody();
PowerShell
  • WebRequest
    $headers=@{}$headers.Add("Authorization", "")$headers.Add("Accept", "application/json")$response = Invoke-WebRequest -Uri 'http://api.sd-rtn.com/v2/ncs/ip' -Method GET -Headers $headers
  • RestMethod
    $headers=@{}$headers.Add("Authorization", "")$headers.Add("Accept", "application/json")$response = Invoke-RestMethod -Uri 'http://api.sd-rtn.com/v2/ncs/ip' -Method GET -Headers $headers
R
library(httr)url <- "http://api.sd-rtn.com/v2/ncs/ip"response <- VERB("GET", url, add_headers('Authorization' = ''), content_type("application/octet-stream"), accept("application/json"))content(response, "text")
Ruby
require 'uri'require 'net/http'url = URI("http://api.sd-rtn.com/v2/ncs/ip")http = Net::HTTP.new(url.host, url.port)request = Net::HTTP::Get.new(url)request["Authorization"] = ''request["Accept"] = 'application/json'response = http.request(request)puts response.read_body
Swift
import Foundationlet headers = [  "Authorization": "",  "Accept": "application/json"]let request = NSMutableURLRequest(url: NSURL(string: "http://api.sd-rtn.com/v2/ncs/ip")! as URL,                                        cachePolicy: .useProtocolCachePolicy,                                    timeoutInterval: 10.0)request.httpMethod = "GET"request.allHTTPHeaderFields = headerslet session = URLSession.sharedlet dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in  if (error != nil) {    print(error as Any)  } else {    let httpResponse = response as? HTTPURLResponse    print(httpResponse)  }})dataTask.resume()

Response parameters

For details about possible response status codes, see Response status codes.

If the status code is not 200, the request fails. See the message field in the response body for the reason for this failure.

If the status code is 200, the request succeeds, and the response body includes the following parameters:

ParameterTypeDescription
dataObject
  • service
    • hosts
      • primaryIP: The IP address of the Notifications server. When you receive a response, you need to add the IP address (or list of IP addresses) from this field to the whitelist.

Response example

{  "data": {    "service": {      "hosts": [        {          "primaryIP": "xxx.xxx.xxx.xxx"        },        {          "primaryIP": "xxx.xxx.xxx.xxx"        }      ]    }  }}
vundefined