Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
## Unreleased

ENHANCEMENTS:
* Add `getRedirectsUsage` to `BillingUsage` for the `billing-usage/v1/redirects` endpoint
* Deprecate `tsig` and `views` DDI resources
* Deprecate `pulsar/query/decision/customer` endpoints

## 0.29.0 (July 15th, 2026)

ENHANCEMENTS:
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,14 @@ See the [examples directory](https://github.com/ns1/ns1-python/tree/master/examp
Documentation
=============

If you don't yet have an NS1 account, [signup here (free)](https://ns1.com/signup/)
If you don't yet have an NS1 account, [signup here (free)](https://www.ibm.com/account/reg/us-en/signup?formid=urx-54055)

You'll need an API Key. To create one, login to [the portal](https://my.nsone.net/)
and click on the Account button in the top right. Select Settings & Users, then
add a new API Key at the bottom.

* [Documentation at ReadTheDocs](https://ns1-python.readthedocs.org/en/latest/)
* [NS1 REST API Documentation](https://ns1.com/api/)
* [NS1 REST API Documentation](https://developer.ibm.com/apis/catalog/ns1--ibm-ns1-connect-api/api/API--ns1--ibm-ns1-connect-api)

Tests
=====
Expand Down
2 changes: 1 addition & 1 deletion doc/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ Python SDK for NS1 DNS Platform
===============================

.. image:: _static/ns1.png
:target: https://ns1.com/
:target: https://www.ibm.com/products/ns1-connect


About
Expand Down
24 changes: 21 additions & 3 deletions ns1/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -165,12 +165,21 @@ def user(self):

def tsig(self):
"""
Return a new raw REST interface to tsgi resources
Return a new raw REST interface to tsig resources.

:rtype: :py:class:`ns1.rest.tsig.Tsgi`
.. deprecated::
The TSIG key API is deprecated and will be removed in a future release.

:rtype: :py:class:`ns1.rest.tsig.Tsig`
"""
import warnings
import ns1.rest.tsig

warnings.warn(
"NS1.tsig() is deprecated and will be removed in a future release.",
DeprecationWarning,
stacklevel=2,
)
return ns1.rest.tsig.Tsig(self.config)

def apikey(self):
Expand Down Expand Up @@ -205,12 +214,21 @@ def acls(self):

def views(self):
"""
Return a new raw REST interface to View resources
Return a new raw REST interface to View resources.

.. deprecated::
The Views API is deprecated and will be removed in a future release.

:rtype: :py:class:`ns1.rest.views.Views`
"""
import warnings
import ns1.rest.views

warnings.warn(
"NS1.views() is deprecated and will be removed in a future release.",
DeprecationWarning,
stacklevel=2,
)
return ns1.rest.views.Views(self.config)

def datasets(self):
Expand Down
9 changes: 9 additions & 0 deletions ns1/rest/billing_usage.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,15 @@ def getFilterChainsUsage(self, callback=None, errback=None):
params={},
)

def getRedirectsUsage(self, callback=None, errback=None):
return self._make_request(
"GET",
f"{self.ROOT}/redirects",
callback=callback,
errback=errback,
params={},
)

def getLimits(self, from_unix, to_unix, callback=None, errback=None):
return self._make_request(
"GET",
Expand Down
57 changes: 57 additions & 0 deletions ns1/rest/pulsar_decisions.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
#
# License under The MIT License (MIT). See LICENSE in project root.
#
import warnings

from . import resource

try:
Expand Down Expand Up @@ -134,6 +136,17 @@ def get_filters_time(self, callback=None, errback=None, **kwargs):
def get_decision_customer(
self, customer_id, callback=None, errback=None, **kwargs
):
"""
.. deprecated::
The ``pulsar/query/decision/customer`` API is deprecated and will
be removed in a future release.
"""
warnings.warn(
"Decisions.get_decision_customer is deprecated and will be"
" removed in a future release.",
DeprecationWarning,
stacklevel=2,
)
path = self._make_query_url(
"decision/customer/%s" % customer_id, **kwargs
)
Expand All @@ -147,6 +160,17 @@ def get_decision_customer(
def get_decision_customer_undetermined(
self, customer_id, callback=None, errback=None, **kwargs
):
"""
.. deprecated::
The ``pulsar/query/decision/customer`` API is deprecated and will
be removed in a future release.
"""
warnings.warn(
"Decisions.get_decision_customer_undetermined is deprecated and"
" will be removed in a future release.",
DeprecationWarning,
stacklevel=2,
)
path = self._make_query_url(
"decision/customer/%s/undetermined" % customer_id, **kwargs
)
Expand All @@ -166,6 +190,17 @@ def get_decision_record(
errback=None,
**kwargs
):
"""
.. deprecated::
The ``pulsar/query/decision/customer`` API is deprecated and will
be removed in a future release.
"""
warnings.warn(
"Decisions.get_decision_record is deprecated and will be"
" removed in a future release.",
DeprecationWarning,
stacklevel=2,
)
path = self._make_query_url(
"decision/customer/%s/record/%s/%s"
% (customer_id, domain, rec_type),
Expand All @@ -187,6 +222,17 @@ def get_decision_record_undetermined(
errback=None,
**kwargs
):
"""
.. deprecated::
The ``pulsar/query/decision/customer`` API is deprecated and will
be removed in a future release.
"""
warnings.warn(
"Decisions.get_decision_record_undetermined is deprecated and"
" will be removed in a future release.",
DeprecationWarning,
stacklevel=2,
)
path = self._make_query_url(
"decision/customer/%s/record/%s/%s/undetermined"
% (customer_id, domain, rec_type),
Expand All @@ -202,6 +248,17 @@ def get_decision_record_undetermined(
def get_decision_total(
self, customer_id, callback=None, errback=None, **kwargs
):
"""
.. deprecated::
The ``pulsar/query/decision/customer`` API is deprecated and will
be removed in a future release.
"""
warnings.warn(
"Decisions.get_decision_total is deprecated and will be"
" removed in a future release.",
DeprecationWarning,
stacklevel=2,
)
path = self._make_query_url(
"decision/customer/%s/total" % customer_id, **kwargs
)
Expand Down
53 changes: 53 additions & 0 deletions ns1/rest/tsig.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,19 @@
#
# License under The MIT License (MIT). See LICENSE in project root.
#
import warnings

from . import permissions
from . import resource


class Tsig(resource.BaseResource):
"""
.. deprecated::
The TSIG key API is deprecated and will be removed in a future release.
Use :py:class:`ns1.rest.zones.Zones` zone-level TSIG configuration instead.
"""

ROOT = "tsig"

PASSTHRU_FIELDS = [
Expand All @@ -27,6 +35,15 @@ def create(
errback=None,
**kwargs
):
"""
.. deprecated::
The TSIG key API is deprecated and will be removed in a future release.
"""
warnings.warn(
"Tsig.create is deprecated and will be removed in a future release.",
DeprecationWarning,
stacklevel=2,
)
body = {"algorithm": algorithm, "secret": secret}
if "permissions" not in kwargs:
body["permissions"] = permissions._default_perms
Expand All @@ -50,6 +67,15 @@ def update(
errback=None,
**kwargs
):
"""
.. deprecated::
The TSIG key API is deprecated and will be removed in a future release.
"""
warnings.warn(
"Tsig.update is deprecated and will be removed in a future release.",
DeprecationWarning,
stacklevel=2,
)
body = {"algorithm": algorithm, "secret": secret}
self._buildStdBody(body, kwargs)

Expand All @@ -62,6 +88,15 @@ def update(
)

def delete(self, tsig_name, callback=None, errback=None):
"""
.. deprecated::
The TSIG key API is deprecated and will be removed in a future release.
"""
warnings.warn(
"Tsig.delete is deprecated and will be removed in a future release.",
DeprecationWarning,
stacklevel=2,
)
return self._make_request(
"DELETE",
"%s/%s" % (self.ROOT, tsig_name),
Expand All @@ -70,11 +105,29 @@ def delete(self, tsig_name, callback=None, errback=None):
)

def list(self, callback=None, errback=None):
"""
.. deprecated::
The TSIG key API is deprecated and will be removed in a future release.
"""
warnings.warn(
"Tsig.list is deprecated and will be removed in a future release.",
DeprecationWarning,
stacklevel=2,
)
return self._make_request(
"GET", "%s" % self.ROOT, callback=callback, errback=errback
)

def retrieve(self, tsig_name, callback=None, errback=None):
"""
.. deprecated::
The TSIG key API is deprecated and will be removed in a future release.
"""
warnings.warn(
"Tsig.retrieve is deprecated and will be removed in a future release.",
DeprecationWarning,
stacklevel=2,
)
return self._make_request(
"GET",
"%s/%s" % (self.ROOT, tsig_name),
Expand Down
51 changes: 51 additions & 0 deletions ns1/rest/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,17 @@
# Copyright (c) 2014 NSONE, Inc.
#
# License under The MIT License (MIT). See LICENSE in project root.
import warnings

from . import resource


class Views(resource.BaseResource):
"""
.. deprecated::
The Views API is deprecated and will be removed in a future release.
"""

ROOT = "views"
INT_FIELDS = [
"preference",
Expand All @@ -25,6 +31,15 @@ def _buildBody(self, view_name, **kwargs):
return body

def create(self, view_name, callback=None, errback=None, **kwargs):
"""
.. deprecated::
The Views API is deprecated and will be removed in a future release.
"""
warnings.warn(
"Views.create is deprecated and will be removed in a future release.",
DeprecationWarning,
stacklevel=2,
)
body = self._buildBody(view_name, **kwargs)

return self.create_raw(
Expand All @@ -34,6 +49,15 @@ def create(self, view_name, callback=None, errback=None, **kwargs):
def create_raw(
self, view_name, body, callback=None, errback=None, **kwargs
):
"""
.. deprecated::
The Views API is deprecated and will be removed in a future release.
"""
warnings.warn(
"Views.create_raw is deprecated and will be removed in a future release.",
DeprecationWarning,
stacklevel=2,
)
return self._make_request(
"PUT",
"%s/%s" % (self.ROOT, view_name),
Expand All @@ -43,6 +67,15 @@ def create_raw(
)

def update(self, view_name, callback=None, errback=None, **kwargs):
"""
.. deprecated::
The Views API is deprecated and will be removed in a future release.
"""
warnings.warn(
"Views.update is deprecated and will be removed in a future release.",
DeprecationWarning,
stacklevel=2,
)
body = self._buildBody(view_name, **kwargs)

return self._make_request(
Expand All @@ -54,6 +87,15 @@ def update(self, view_name, callback=None, errback=None, **kwargs):
)

def delete(self, view_name, callback=None, errback=None):
"""
.. deprecated::
The Views API is deprecated and will be removed in a future release.
"""
warnings.warn(
"Views.delete is deprecated and will be removed in a future release.",
DeprecationWarning,
stacklevel=2,
)
return self._make_request(
"DELETE",
"%s/%s" % (self.ROOT, view_name),
Expand All @@ -62,6 +104,15 @@ def delete(self, view_name, callback=None, errback=None):
)

def retrieve(self, view_name, callback=None, errback=None):
"""
.. deprecated::
The Views API is deprecated and will be removed in a future release.
"""
warnings.warn(
"Views.retrieve is deprecated and will be removed in a future release.",
DeprecationWarning,
stacklevel=2,
)
return self._make_request(
"GET",
"%s/%s" % (self.ROOT, view_name),
Expand Down
Loading
Loading