vessel-api-python 1.2.0__py3-none-any.whl → 1.3.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -8,6 +8,17 @@ Usage::
8
8
  result = client.search.vessels(filter_name="Ever Given")
9
9
  """
10
10
 
11
+ import warnings as _warnings
12
+
13
+ _warnings.warn(
14
+ "vessel-api-python 1.x is no longer maintained. Several endpoints it wraps "
15
+ "were retired from the service on 10 August 2026 and now return HTTP 410. "
16
+ "Upgrade to 2.x: pip install 'vessel-api-python>=2'. See the CHANGELOG for "
17
+ "the migration notes.",
18
+ DeprecationWarning,
19
+ stacklevel=2,
20
+ )
21
+
11
22
  from ._client import AsyncVesselClient, VesselClient
12
23
  from ._constants import DEFAULT_BASE_URL, VERSION
13
24
  from ._errors import (
@@ -1,6 +1,6 @@
1
1
  """Constants for the Vessel API Python SDK."""
2
2
 
3
- VERSION = "1.1.0"
3
+ VERSION = "1.3.1"
4
4
  DEFAULT_BASE_URL = "https://api.vesselapi.com/v1"
5
5
  DEFAULT_USER_AGENT = f"vesselapi-python/{VERSION}"
6
6
  DEFAULT_MAX_RETRIES = 3
@@ -130,9 +130,9 @@ class VesselsService:
130
130
  error_from_response(r.status_code, r.content)
131
131
  return TypesOwnershipResponse.model_validate(r.json())
132
132
 
133
- def positions(self, *, filter_id_type: str = "imo", filter_ids: str | None = None, pagination_limit: int | None = None, pagination_next_token: str | None = None) -> VesselPositionsResponse:
133
+ def positions(self, *, filter_id_type: str = "imo", filter_ids: str | None = None, time_from: str | None = None, time_to: str | None = None, pagination_limit: int | None = None, pagination_next_token: str | None = None) -> VesselPositionsResponse:
134
134
  """Retrieve positions for multiple vessels."""
135
- r = self._client.get("/vessels/positions", params=_strip_none({"filter.idType": filter_id_type, "filter.ids": filter_ids, "pagination.limit": pagination_limit, "pagination.nextToken": pagination_next_token}))
135
+ r = self._client.get("/vessels/positions", params=_strip_none({"filter.idType": filter_id_type, "filter.ids": filter_ids, "time.from": time_from, "time.to": time_to, "pagination.limit": pagination_limit, "pagination.nextToken": pagination_next_token}))
136
136
  error_from_response(r.status_code, r.content)
137
137
  return VesselPositionsResponse.model_validate(r.json())
138
138
 
@@ -322,15 +322,15 @@ class SearchService:
322
322
  def __init__(self, client: httpx.Client) -> None:
323
323
  self._client = client
324
324
 
325
- def vessels(self, *, filter_name: str | None = None, filter_imo: str | None = None, filter_mmsi: str | None = None, filter_flag: str | None = None, filter_vessel_type: str | None = None, filter_callsign: str | None = None, pagination_limit: int | None = None, pagination_next_token: str | None = None) -> FindVesselsResponse:
325
+ def vessels(self, *, filter_name: str | None = None, filter_imo: str | None = None, filter_mmsi: str | None = None, filter_flag: str | None = None, filter_vessel_type: str | None = None, filter_callsign: str | None = None, filter_year_built_min: int | None = None, filter_year_built_max: int | None = None, filter_class_society: str | None = None, filter_owner: str | None = None, pagination_limit: int | None = None, pagination_next_token: str | None = None) -> FindVesselsResponse:
326
326
  """Search for vessels by name, callsign, flag, type, and other filters."""
327
- r = self._client.get("/search/vessels", params=_strip_none({"filter.name": filter_name, "filter.imo": filter_imo, "filter.mmsi": filter_mmsi, "filter.flag": filter_flag, "filter.vesselType": filter_vessel_type, "filter.callsign": filter_callsign, "pagination.limit": pagination_limit, "pagination.nextToken": pagination_next_token}))
327
+ r = self._client.get("/search/vessels", params=_strip_none({"filter.name": filter_name, "filter.imo": filter_imo, "filter.mmsi": filter_mmsi, "filter.flag": filter_flag, "filter.vesselType": filter_vessel_type, "filter.callsign": filter_callsign, "filter.yearBuiltMin": filter_year_built_min, "filter.yearBuiltMax": filter_year_built_max, "filter.classSociety": filter_class_society, "filter.owner": filter_owner, "pagination.limit": pagination_limit, "pagination.nextToken": pagination_next_token}))
328
328
  error_from_response(r.status_code, r.content)
329
329
  return FindVesselsResponse.model_validate(r.json())
330
330
 
331
- def ports(self, *, filter_name: str | None = None, filter_country: str | None = None, filter_port_type: str | None = None, filter_region: str | None = None, pagination_limit: int | None = None, pagination_next_token: str | None = None) -> FindPortsResponse:
331
+ def ports(self, *, filter_name: str | None = None, filter_country: str | None = None, filter_port_type: str | None = None, filter_size: str | None = None, filter_region: str | None = None, filter_harbor_size: str | None = None, filter_harbor_use: str | None = None, pagination_limit: int | None = None, pagination_next_token: str | None = None) -> FindPortsResponse:
332
332
  """Search for ports by name, country, type, region, and other filters."""
333
- r = self._client.get("/search/ports", params=_strip_none({"filter.name": filter_name, "filter.country": filter_country, "filter.type": filter_port_type, "filter.region": filter_region, "pagination.limit": pagination_limit, "pagination.nextToken": pagination_next_token}))
333
+ r = self._client.get("/search/ports", params=_strip_none({"filter.name": filter_name, "filter.country": filter_country, "filter.type": filter_port_type, "filter.size": filter_size, "filter.region": filter_region, "filter.harborSize": filter_harbor_size, "filter.harborUse": filter_harbor_use, "pagination.limit": pagination_limit, "pagination.nextToken": pagination_next_token}))
334
334
  error_from_response(r.status_code, r.content)
335
335
  return FindPortsResponse.model_validate(r.json())
336
336
 
@@ -427,15 +427,15 @@ class LocationService:
427
427
  def __init__(self, client: httpx.Client) -> None:
428
428
  self._client = client
429
429
 
430
- def vessels_bounding_box(self, *, lat_min: float | None = None, lat_max: float | None = None, lon_min: float | None = None, lon_max: float | None = None, pagination_limit: int | None = None, pagination_next_token: str | None = None) -> VesselsWithinLocationResponse:
430
+ def vessels_bounding_box(self, *, lat_min: float | None = None, lat_max: float | None = None, lon_min: float | None = None, lon_max: float | None = None, time_from: str | None = None, time_to: str | None = None, pagination_limit: int | None = None, pagination_next_token: str | None = None) -> VesselsWithinLocationResponse:
431
431
  """Retrieve vessel positions within a bounding box."""
432
- r = self._client.get("/location/vessels/bounding-box", params=_strip_none({"filter.latBottom": lat_min, "filter.latTop": lat_max, "filter.lonLeft": lon_min, "filter.lonRight": lon_max, "pagination.limit": pagination_limit, "pagination.nextToken": pagination_next_token}))
432
+ r = self._client.get("/location/vessels/bounding-box", params=_strip_none({"filter.latBottom": lat_min, "filter.latTop": lat_max, "filter.lonLeft": lon_min, "filter.lonRight": lon_max, "time.from": time_from, "time.to": time_to, "pagination.limit": pagination_limit, "pagination.nextToken": pagination_next_token}))
433
433
  error_from_response(r.status_code, r.content)
434
434
  return VesselsWithinLocationResponse.model_validate(r.json())
435
435
 
436
- def vessels_radius(self, *, latitude: float | None = None, longitude: float | None = None, radius: float | None = None, pagination_limit: int | None = None, pagination_next_token: str | None = None) -> VesselsWithinLocationResponse:
436
+ def vessels_radius(self, *, latitude: float | None = None, longitude: float | None = None, radius: float | None = None, time_from: str | None = None, time_to: str | None = None, pagination_limit: int | None = None, pagination_next_token: str | None = None) -> VesselsWithinLocationResponse:
437
437
  """Retrieve vessel positions within a radius."""
438
- r = self._client.get("/location/vessels/radius", params=_strip_none({"filter.latitude": latitude, "filter.longitude": longitude, "filter.radius": radius, "pagination.limit": pagination_limit, "pagination.nextToken": pagination_next_token}))
438
+ r = self._client.get("/location/vessels/radius", params=_strip_none({"filter.latitude": latitude, "filter.longitude": longitude, "filter.radius": radius, "time.from": time_from, "time.to": time_to, "pagination.limit": pagination_limit, "pagination.nextToken": pagination_next_token}))
439
439
  error_from_response(r.status_code, r.content)
440
440
  return VesselsWithinLocationResponse.model_validate(r.json())
441
441
 
@@ -710,9 +710,9 @@ class AsyncVesselsService:
710
710
  error_from_response(r.status_code, r.content)
711
711
  return TypesOwnershipResponse.model_validate(r.json())
712
712
 
713
- async def positions(self, *, filter_id_type: str = "imo", filter_ids: str | None = None, pagination_limit: int | None = None, pagination_next_token: str | None = None) -> VesselPositionsResponse:
713
+ async def positions(self, *, filter_id_type: str = "imo", filter_ids: str | None = None, time_from: str | None = None, time_to: str | None = None, pagination_limit: int | None = None, pagination_next_token: str | None = None) -> VesselPositionsResponse:
714
714
  """Retrieve positions for multiple vessels."""
715
- r = await self._client.get("/vessels/positions", params=_strip_none({"filter.idType": filter_id_type, "filter.ids": filter_ids, "pagination.limit": pagination_limit, "pagination.nextToken": pagination_next_token}))
715
+ r = await self._client.get("/vessels/positions", params=_strip_none({"filter.idType": filter_id_type, "filter.ids": filter_ids, "time.from": time_from, "time.to": time_to, "pagination.limit": pagination_limit, "pagination.nextToken": pagination_next_token}))
716
716
  error_from_response(r.status_code, r.content)
717
717
  return VesselPositionsResponse.model_validate(r.json())
718
718
 
@@ -902,15 +902,15 @@ class AsyncSearchService:
902
902
  def __init__(self, client: httpx.AsyncClient) -> None:
903
903
  self._client = client
904
904
 
905
- async def vessels(self, *, filter_name: str | None = None, filter_imo: str | None = None, filter_mmsi: str | None = None, filter_flag: str | None = None, filter_vessel_type: str | None = None, filter_callsign: str | None = None, pagination_limit: int | None = None, pagination_next_token: str | None = None) -> FindVesselsResponse:
905
+ async def vessels(self, *, filter_name: str | None = None, filter_imo: str | None = None, filter_mmsi: str | None = None, filter_flag: str | None = None, filter_vessel_type: str | None = None, filter_callsign: str | None = None, filter_year_built_min: int | None = None, filter_year_built_max: int | None = None, filter_class_society: str | None = None, filter_owner: str | None = None, pagination_limit: int | None = None, pagination_next_token: str | None = None) -> FindVesselsResponse:
906
906
  """Search for vessels."""
907
- r = await self._client.get("/search/vessels", params=_strip_none({"filter.name": filter_name, "filter.imo": filter_imo, "filter.mmsi": filter_mmsi, "filter.flag": filter_flag, "filter.vesselType": filter_vessel_type, "filter.callsign": filter_callsign, "pagination.limit": pagination_limit, "pagination.nextToken": pagination_next_token}))
907
+ r = await self._client.get("/search/vessels", params=_strip_none({"filter.name": filter_name, "filter.imo": filter_imo, "filter.mmsi": filter_mmsi, "filter.flag": filter_flag, "filter.vesselType": filter_vessel_type, "filter.callsign": filter_callsign, "filter.yearBuiltMin": filter_year_built_min, "filter.yearBuiltMax": filter_year_built_max, "filter.classSociety": filter_class_society, "filter.owner": filter_owner, "pagination.limit": pagination_limit, "pagination.nextToken": pagination_next_token}))
908
908
  error_from_response(r.status_code, r.content)
909
909
  return FindVesselsResponse.model_validate(r.json())
910
910
 
911
- async def ports(self, *, filter_name: str | None = None, filter_country: str | None = None, filter_port_type: str | None = None, filter_region: str | None = None, pagination_limit: int | None = None, pagination_next_token: str | None = None) -> FindPortsResponse:
911
+ async def ports(self, *, filter_name: str | None = None, filter_country: str | None = None, filter_port_type: str | None = None, filter_size: str | None = None, filter_region: str | None = None, filter_harbor_size: str | None = None, filter_harbor_use: str | None = None, pagination_limit: int | None = None, pagination_next_token: str | None = None) -> FindPortsResponse:
912
912
  """Search for ports."""
913
- r = await self._client.get("/search/ports", params=_strip_none({"filter.name": filter_name, "filter.country": filter_country, "filter.type": filter_port_type, "filter.region": filter_region, "pagination.limit": pagination_limit, "pagination.nextToken": pagination_next_token}))
913
+ r = await self._client.get("/search/ports", params=_strip_none({"filter.name": filter_name, "filter.country": filter_country, "filter.type": filter_port_type, "filter.size": filter_size, "filter.region": filter_region, "filter.harborSize": filter_harbor_size, "filter.harborUse": filter_harbor_use, "pagination.limit": pagination_limit, "pagination.nextToken": pagination_next_token}))
914
914
  error_from_response(r.status_code, r.content)
915
915
  return FindPortsResponse.model_validate(r.json())
916
916
 
@@ -1007,15 +1007,15 @@ class AsyncLocationService:
1007
1007
  def __init__(self, client: httpx.AsyncClient) -> None:
1008
1008
  self._client = client
1009
1009
 
1010
- async def vessels_bounding_box(self, *, lat_min: float | None = None, lat_max: float | None = None, lon_min: float | None = None, lon_max: float | None = None, pagination_limit: int | None = None, pagination_next_token: str | None = None) -> VesselsWithinLocationResponse:
1010
+ async def vessels_bounding_box(self, *, lat_min: float | None = None, lat_max: float | None = None, lon_min: float | None = None, lon_max: float | None = None, time_from: str | None = None, time_to: str | None = None, pagination_limit: int | None = None, pagination_next_token: str | None = None) -> VesselsWithinLocationResponse:
1011
1011
  """Retrieve vessel positions within a bounding box."""
1012
- r = await self._client.get("/location/vessels/bounding-box", params=_strip_none({"filter.latBottom": lat_min, "filter.latTop": lat_max, "filter.lonLeft": lon_min, "filter.lonRight": lon_max, "pagination.limit": pagination_limit, "pagination.nextToken": pagination_next_token}))
1012
+ r = await self._client.get("/location/vessels/bounding-box", params=_strip_none({"filter.latBottom": lat_min, "filter.latTop": lat_max, "filter.lonLeft": lon_min, "filter.lonRight": lon_max, "time.from": time_from, "time.to": time_to, "pagination.limit": pagination_limit, "pagination.nextToken": pagination_next_token}))
1013
1013
  error_from_response(r.status_code, r.content)
1014
1014
  return VesselsWithinLocationResponse.model_validate(r.json())
1015
1015
 
1016
- async def vessels_radius(self, *, latitude: float | None = None, longitude: float | None = None, radius: float | None = None, pagination_limit: int | None = None, pagination_next_token: str | None = None) -> VesselsWithinLocationResponse:
1016
+ async def vessels_radius(self, *, latitude: float | None = None, longitude: float | None = None, radius: float | None = None, time_from: str | None = None, time_to: str | None = None, pagination_limit: int | None = None, pagination_next_token: str | None = None) -> VesselsWithinLocationResponse:
1017
1017
  """Retrieve vessel positions within a radius."""
1018
- r = await self._client.get("/location/vessels/radius", params=_strip_none({"filter.latitude": latitude, "filter.longitude": longitude, "filter.radius": radius, "pagination.limit": pagination_limit, "pagination.nextToken": pagination_next_token}))
1018
+ r = await self._client.get("/location/vessels/radius", params=_strip_none({"filter.latitude": latitude, "filter.longitude": longitude, "filter.radius": radius, "time.from": time_from, "time.to": time_to, "pagination.limit": pagination_limit, "pagination.nextToken": pagination_next_token}))
1019
1019
  error_from_response(r.status_code, r.content)
1020
1020
  return VesselsWithinLocationResponse.model_validate(r.json())
1021
1021
 
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: vessel-api-python
3
- Version: 1.2.0
3
+ Version: 1.3.1
4
4
  Summary: Python client for the Vessel Tracking API — maritime vessel tracking, port events, emissions, and navigation data.
5
5
  Project-URL: Documentation, https://vesselapi.com/docs
6
6
  Project-URL: Repository, https://github.com/vessel-api/vesselapi-python
@@ -10,7 +10,7 @@ Author-email: Vessel API <support@vesselapi.com>
10
10
  License-Expression: MIT
11
11
  License-File: LICENSE
12
12
  Keywords: ais,maritime,sdk,tracking,vessel,vesselapi
13
- Classifier: Development Status :: 5 - Production/Stable
13
+ Classifier: Development Status :: 7 - Inactive
14
14
  Classifier: Intended Audience :: Developers
15
15
  Classifier: License :: OSI Approved :: MIT License
16
16
  Classifier: Programming Language :: Python :: 3
@@ -34,6 +34,19 @@ Description-Content-Type: text/markdown
34
34
 
35
35
  # vesselapi-python
36
36
 
37
+ > [!WARNING]
38
+ > **This version is no longer maintained.** Several endpoints wrapped by 1.x
39
+ > were retired from the VesselAPI service on 10 August 2026 and now return
40
+ > HTTP 410. Please upgrade:
41
+ >
42
+ > ```bash
43
+ > pip install 'vessel-api-python>=2'
44
+ > ```
45
+ >
46
+ > 2.x removes the retired surface, requires the parameters the API requires,
47
+ > and adds unified search, repeatable filters and satellite position fallback.
48
+ > See the CHANGELOG for migration notes.
49
+
37
50
  [![CI](https://github.com/vessel-api/vesselapi-python/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/vessel-api/vesselapi-python/actions/workflows/ci.yml)
38
51
  [![PyPI](https://img.shields.io/pypi/v/vessel-api-python.svg)](https://pypi.org/project/vessel-api-python/)
39
52
  [![Python](https://img.shields.io/pypi/pyversions/vessel-api-python.svg)](https://pypi.org/project/vessel-api-python/)
@@ -0,0 +1,13 @@
1
+ vessel_api_python/__init__.py,sha256=tXflbIs9P8tI4dfCANcFFmMMRoN4yfvhm3u8aG17hsc,4960
2
+ vessel_api_python/_client.py,sha256=39yKlQ4W2TnE85sTtK7KlBzFF385Pl52I5ghyq575EA,5067
3
+ vessel_api_python/_constants.py,sha256=VOkWN2bqs6thkuz1v_weEEDLePI5s6ct5C3GI2KQVo8,244
4
+ vessel_api_python/_errors.py,sha256=pxDm36mbrviOoDRmJ-ogtlUIsyu-dHpC0jcs5f34WDU,4310
5
+ vessel_api_python/_iterator.py,sha256=SkgsGSdxLrKtw-ad8fSUPaEDDJCamAKK0PrG_P8HX-4,3198
6
+ vessel_api_python/_models.py,sha256=eawnhctWmvGK505EJzDyszTqXpI5ctRg73-uR6AVOck,30575
7
+ vessel_api_python/_services.py,sha256=PoRoHZP7PoqcUGGEaZNszm9_a1K_nTBQu_s5OaPCIqI,79094
8
+ vessel_api_python/_transport.py,sha256=_4s-65JMRwD2S435u0iuoLGH_GyLNaX8cP_uSh_u80I,6692
9
+ vessel_api_python/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
+ vessel_api_python-1.3.1.dist-info/METADATA,sha256=Bph2DeBpmw-4KURM_dpTlloDZernTYlZFC_oka6MD9w,7458
11
+ vessel_api_python-1.3.1.dist-info/WHEEL,sha256=zOwg4jB6zX2kU910N-cMawjivD6tO8NEWvE12je1bVk,87
12
+ vessel_api_python-1.3.1.dist-info/licenses/LICENSE,sha256=zoj_abq99mj8cz-Bz71XCnwB-Qv3kU1VzVXeKEntuQU,1067
13
+ vessel_api_python-1.3.1.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.29.0
2
+ Generator: hatchling 1.32.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -1,13 +0,0 @@
1
- vessel_api_python/__init__.py,sha256=kmYpzbtVfaMHRXUBoom7JqZa5hCif3vGL8y-q5n4DrA,4599
2
- vessel_api_python/_client.py,sha256=39yKlQ4W2TnE85sTtK7KlBzFF385Pl52I5ghyq575EA,5067
3
- vessel_api_python/_constants.py,sha256=Cp_uNnK0RljiWlyPmkMrVFoQtF5GpXTggSCD1SPvcyk,244
4
- vessel_api_python/_errors.py,sha256=pxDm36mbrviOoDRmJ-ogtlUIsyu-dHpC0jcs5f34WDU,4310
5
- vessel_api_python/_iterator.py,sha256=SkgsGSdxLrKtw-ad8fSUPaEDDJCamAKK0PrG_P8HX-4,3198
6
- vessel_api_python/_models.py,sha256=eawnhctWmvGK505EJzDyszTqXpI5ctRg73-uR6AVOck,30575
7
- vessel_api_python/_services.py,sha256=CDe2Op6YB9DfBCkVUikPA5VocZEKKjWO8IGeZUOwCic,77398
8
- vessel_api_python/_transport.py,sha256=_4s-65JMRwD2S435u0iuoLGH_GyLNaX8cP_uSh_u80I,6692
9
- vessel_api_python/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- vessel_api_python-1.2.0.dist-info/METADATA,sha256=GMYmgDtsCEMPKA6r4QrTOd5aL4dQOhG1Y6ANXCSHjtY,7019
11
- vessel_api_python-1.2.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
12
- vessel_api_python-1.2.0.dist-info/licenses/LICENSE,sha256=zoj_abq99mj8cz-Bz71XCnwB-Qv3kU1VzVXeKEntuQU,1067
13
- vessel_api_python-1.2.0.dist-info/RECORD,,