# Table of Contents
* [kwork\_api](#kwork_api)
* [KworkClient](#kwork_api.KworkClient)
* [KworkError](#kwork_api.KworkError)
* [KworkAuthError](#kwork_api.KworkAuthError)
* [KworkApiError](#kwork_api.KworkApiError)
* [\_\_version\_\_](#kwork_api.__version__)
* [\_\_all\_\_](#kwork_api.__all__)
* [kwork\_api.client](#kwork_api.client)
* [logging](#kwork_api.client.logging)
* [Any](#kwork_api.client.Any)
* [Optional](#kwork_api.client.Optional)
* [httpx](#kwork_api.client.httpx)
* [HttpUrl](#kwork_api.client.HttpUrl)
* [KworkApiError](#kwork_api.client.KworkApiError)
* [KworkAuthError](#kwork_api.client.KworkAuthError)
* [KworkError](#kwork_api.client.KworkError)
* [KworkNetworkError](#kwork_api.client.KworkNetworkError)
* [KworkNotFoundError](#kwork_api.client.KworkNotFoundError)
* [KworkRateLimitError](#kwork_api.client.KworkRateLimitError)
* [KworkValidationError](#kwork_api.client.KworkValidationError)
* [APIErrorResponse](#kwork_api.client.APIErrorResponse)
* [AuthResponse](#kwork_api.client.AuthResponse)
* [Badge](#kwork_api.client.Badge)
* [CatalogResponse](#kwork_api.client.CatalogResponse)
* [City](#kwork_api.client.City)
* [Country](#kwork_api.client.Country)
* [DataResponse](#kwork_api.client.DataResponse)
* [Dialog](#kwork_api.client.Dialog)
* [Feature](#kwork_api.client.Feature)
* [Kwork](#kwork_api.client.Kwork)
* [KworkDetails](#kwork_api.client.KworkDetails)
* [NotificationsResponse](#kwork_api.client.NotificationsResponse)
* [Project](#kwork_api.client.Project)
* [ProjectsResponse](#kwork_api.client.ProjectsResponse)
* [Review](#kwork_api.client.Review)
* [ReviewsResponse](#kwork_api.client.ReviewsResponse)
* [TimeZone](#kwork_api.client.TimeZone)
* [logger](#kwork_api.client.logger)
* [KworkClient](#kwork_api.client.KworkClient)
* [BASE\_URL](#kwork_api.client.KworkClient.BASE_URL)
* [LOGIN\_URL](#kwork_api.client.KworkClient.LOGIN_URL)
* [TOKEN\_URL](#kwork_api.client.KworkClient.TOKEN_URL)
* [\_\_init\_\_](#kwork_api.client.KworkClient.__init__)
* [login](#kwork_api.client.KworkClient.login)
* [close](#kwork_api.client.KworkClient.close)
* [\_\_aenter\_\_](#kwork_api.client.KworkClient.__aenter__)
* [\_\_aexit\_\_](#kwork_api.client.KworkClient.__aexit__)
* [CatalogAPI](#kwork_api.client.KworkClient.CatalogAPI)
* [ProjectsAPI](#kwork_api.client.KworkClient.ProjectsAPI)
* [UserAPI](#kwork_api.client.KworkClient.UserAPI)
* [ReferenceAPI](#kwork_api.client.KworkClient.ReferenceAPI)
* [NotificationsAPI](#kwork_api.client.KworkClient.NotificationsAPI)
* [OtherAPI](#kwork_api.client.KworkClient.OtherAPI)
* [catalog](#kwork_api.client.KworkClient.catalog)
* [projects](#kwork_api.client.KworkClient.projects)
* [user](#kwork_api.client.KworkClient.user)
* [reference](#kwork_api.client.KworkClient.reference)
* [notifications](#kwork_api.client.KworkClient.notifications)
* [other](#kwork_api.client.KworkClient.other)
* [kwork\_api.models](#kwork_api.models)
* [datetime](#kwork_api.models.datetime)
* [Any](#kwork_api.models.Any)
* [Optional](#kwork_api.models.Optional)
* [BaseModel](#kwork_api.models.BaseModel)
* [Field](#kwork_api.models.Field)
* [KworkUser](#kwork_api.models.KworkUser)
* [id](#kwork_api.models.KworkUser.id)
* [username](#kwork_api.models.KworkUser.username)
* [avatar\_url](#kwork_api.models.KworkUser.avatar_url)
* [is\_online](#kwork_api.models.KworkUser.is_online)
* [rating](#kwork_api.models.KworkUser.rating)
* [KworkCategory](#kwork_api.models.KworkCategory)
* [id](#kwork_api.models.KworkCategory.id)
* [name](#kwork_api.models.KworkCategory.name)
* [slug](#kwork_api.models.KworkCategory.slug)
* [parent\_id](#kwork_api.models.KworkCategory.parent_id)
* [Kwork](#kwork_api.models.Kwork)
* [id](#kwork_api.models.Kwork.id)
* [title](#kwork_api.models.Kwork.title)
* [description](#kwork_api.models.Kwork.description)
* [price](#kwork_api.models.Kwork.price)
* [currency](#kwork_api.models.Kwork.currency)
* [category\_id](#kwork_api.models.Kwork.category_id)
* [seller](#kwork_api.models.Kwork.seller)
* [images](#kwork_api.models.Kwork.images)
* [rating](#kwork_api.models.Kwork.rating)
* [reviews\_count](#kwork_api.models.Kwork.reviews_count)
* [created\_at](#kwork_api.models.Kwork.created_at)
* [updated\_at](#kwork_api.models.Kwork.updated_at)
* [KworkDetails](#kwork_api.models.KworkDetails)
* [full\_description](#kwork_api.models.KworkDetails.full_description)
* [requirements](#kwork_api.models.KworkDetails.requirements)
* [delivery\_time](#kwork_api.models.KworkDetails.delivery_time)
* [revisions](#kwork_api.models.KworkDetails.revisions)
* [features](#kwork_api.models.KworkDetails.features)
* [faq](#kwork_api.models.KworkDetails.faq)
* [PaginationInfo](#kwork_api.models.PaginationInfo)
* [current\_page](#kwork_api.models.PaginationInfo.current_page)
* [total\_pages](#kwork_api.models.PaginationInfo.total_pages)
* [total\_items](#kwork_api.models.PaginationInfo.total_items)
* [items\_per\_page](#kwork_api.models.PaginationInfo.items_per_page)
* [has\_next](#kwork_api.models.PaginationInfo.has_next)
* [has\_prev](#kwork_api.models.PaginationInfo.has_prev)
* [CatalogResponse](#kwork_api.models.CatalogResponse)
* [kworks](#kwork_api.models.CatalogResponse.kworks)
* [pagination](#kwork_api.models.CatalogResponse.pagination)
* [filters](#kwork_api.models.CatalogResponse.filters)
* [sort\_options](#kwork_api.models.CatalogResponse.sort_options)
* [Project](#kwork_api.models.Project)
* [id](#kwork_api.models.Project.id)
* [title](#kwork_api.models.Project.title)
* [description](#kwork_api.models.Project.description)
* [budget](#kwork_api.models.Project.budget)
* [budget\_type](#kwork_api.models.Project.budget_type)
* [category\_id](#kwork_api.models.Project.category_id)
* [customer](#kwork_api.models.Project.customer)
* [status](#kwork_api.models.Project.status)
* [created\_at](#kwork_api.models.Project.created_at)
* [updated\_at](#kwork_api.models.Project.updated_at)
* [bids\_count](#kwork_api.models.Project.bids_count)
* [skills](#kwork_api.models.Project.skills)
* [ProjectsResponse](#kwork_api.models.ProjectsResponse)
* [projects](#kwork_api.models.ProjectsResponse.projects)
* [pagination](#kwork_api.models.ProjectsResponse.pagination)
* [Review](#kwork_api.models.Review)
* [id](#kwork_api.models.Review.id)
* [rating](#kwork_api.models.Review.rating)
* [comment](#kwork_api.models.Review.comment)
* [author](#kwork_api.models.Review.author)
* [kwork\_id](#kwork_api.models.Review.kwork_id)
* [created\_at](#kwork_api.models.Review.created_at)
* [ReviewsResponse](#kwork_api.models.ReviewsResponse)
* [reviews](#kwork_api.models.ReviewsResponse.reviews)
* [pagination](#kwork_api.models.ReviewsResponse.pagination)
* [average\_rating](#kwork_api.models.ReviewsResponse.average_rating)
* [Notification](#kwork_api.models.Notification)
* [id](#kwork_api.models.Notification.id)
* [type](#kwork_api.models.Notification.type)
* [title](#kwork_api.models.Notification.title)
* [message](#kwork_api.models.Notification.message)
* [is\_read](#kwork_api.models.Notification.is_read)
* [created\_at](#kwork_api.models.Notification.created_at)
* [link](#kwork_api.models.Notification.link)
* [NotificationsResponse](#kwork_api.models.NotificationsResponse)
* [notifications](#kwork_api.models.NotificationsResponse.notifications)
* [unread\_count](#kwork_api.models.NotificationsResponse.unread_count)
* [Dialog](#kwork_api.models.Dialog)
* [id](#kwork_api.models.Dialog.id)
* [participant](#kwork_api.models.Dialog.participant)
* [last\_message](#kwork_api.models.Dialog.last_message)
* [unread\_count](#kwork_api.models.Dialog.unread_count)
* [updated\_at](#kwork_api.models.Dialog.updated_at)
* [AuthResponse](#kwork_api.models.AuthResponse)
* [success](#kwork_api.models.AuthResponse.success)
* [user\_id](#kwork_api.models.AuthResponse.user_id)
* [username](#kwork_api.models.AuthResponse.username)
* [web\_auth\_token](#kwork_api.models.AuthResponse.web_auth_token)
* [message](#kwork_api.models.AuthResponse.message)
* [ErrorDetail](#kwork_api.models.ErrorDetail)
* [code](#kwork_api.models.ErrorDetail.code)
* [message](#kwork_api.models.ErrorDetail.message)
* [field](#kwork_api.models.ErrorDetail.field)
* [APIErrorResponse](#kwork_api.models.APIErrorResponse)
* [success](#kwork_api.models.APIErrorResponse.success)
* [errors](#kwork_api.models.APIErrorResponse.errors)
* [message](#kwork_api.models.APIErrorResponse.message)
* [City](#kwork_api.models.City)
* [id](#kwork_api.models.City.id)
* [name](#kwork_api.models.City.name)
* [country\_id](#kwork_api.models.City.country_id)
* [Country](#kwork_api.models.Country)
* [id](#kwork_api.models.Country.id)
* [name](#kwork_api.models.Country.name)
* [code](#kwork_api.models.Country.code)
* [cities](#kwork_api.models.Country.cities)
* [TimeZone](#kwork_api.models.TimeZone)
* [id](#kwork_api.models.TimeZone.id)
* [name](#kwork_api.models.TimeZone.name)
* [offset](#kwork_api.models.TimeZone.offset)
* [Feature](#kwork_api.models.Feature)
* [id](#kwork_api.models.Feature.id)
* [name](#kwork_api.models.Feature.name)
* [description](#kwork_api.models.Feature.description)
* [price](#kwork_api.models.Feature.price)
* [type](#kwork_api.models.Feature.type)
* [Badge](#kwork_api.models.Badge)
* [id](#kwork_api.models.Badge.id)
* [name](#kwork_api.models.Badge.name)
* [description](#kwork_api.models.Badge.description)
* [icon\_url](#kwork_api.models.Badge.icon_url)
* [DataResponse](#kwork_api.models.DataResponse)
* [success](#kwork_api.models.DataResponse.success)
* [data](#kwork_api.models.DataResponse.data)
* [message](#kwork_api.models.DataResponse.message)
* [kwork\_api.errors](#kwork_api.errors)
* [Any](#kwork_api.errors.Any)
* [Optional](#kwork_api.errors.Optional)
* [KworkError](#kwork_api.errors.KworkError)
* [\_\_init\_\_](#kwork_api.errors.KworkError.__init__)
* [\_\_str\_\_](#kwork_api.errors.KworkError.__str__)
* [KworkAuthError](#kwork_api.errors.KworkAuthError)
* [\_\_init\_\_](#kwork_api.errors.KworkAuthError.__init__)
* [\_\_str\_\_](#kwork_api.errors.KworkAuthError.__str__)
* [KworkApiError](#kwork_api.errors.KworkApiError)
* [\_\_init\_\_](#kwork_api.errors.KworkApiError.__init__)
* [\_\_str\_\_](#kwork_api.errors.KworkApiError.__str__)
* [KworkNotFoundError](#kwork_api.errors.KworkNotFoundError)
* [\_\_init\_\_](#kwork_api.errors.KworkNotFoundError.__init__)
* [KworkRateLimitError](#kwork_api.errors.KworkRateLimitError)
* [\_\_init\_\_](#kwork_api.errors.KworkRateLimitError.__init__)
* [KworkValidationError](#kwork_api.errors.KworkValidationError)
* [\_\_init\_\_](#kwork_api.errors.KworkValidationError.__init__)
* [\_\_str\_\_](#kwork_api.errors.KworkValidationError.__str__)
* [KworkNetworkError](#kwork_api.errors.KworkNetworkError)
* [\_\_init\_\_](#kwork_api.errors.KworkNetworkError.__init__)
* [\_\_str\_\_](#kwork_api.errors.KworkNetworkError.__str__)
# Module kwork\_api
Kwork.ru API Client
Unofficial Python client for Kwork.ru API.
**Example**:
from kwork_api import KworkClient
# Login with credentials
client = await KworkClient.login("username", "password")
# Or restore from token
client = KworkClient(token="your_web_auth_token")
# Get catalog
catalog = await client.catalog.get_list(page=1)
## KworkClient
## KworkError
## KworkAuthError
## KworkApiError
#### \_\_version\_\_
#### \_\_all\_\_
# Module kwork\_api.client
Kwork API Client.
Main client class with authentication and all API endpoints.
## logging
## Any
## Optional
## httpx
## HttpUrl
## KworkApiError
## KworkAuthError
## KworkError
## KworkNetworkError
## KworkNotFoundError
## KworkRateLimitError
## KworkValidationError
## APIErrorResponse
## AuthResponse
## Badge
## CatalogResponse
## City
## Country
## DataResponse
## Dialog
## Feature
## Kwork
## KworkDetails
## NotificationsResponse
## Project
## ProjectsResponse
## Review
## ReviewsResponse
## TimeZone
#### logger
## KworkClient
```python
class KworkClient()
```
Асинхронный клиент для Kwork.ru API.
Предоставляет доступ ко всем основным эндпоинтам Kwork API:
- Каталог кворков и поиск
- Биржа проектов (фриланс заказы)
- Пользовательские данные и отзывы
- Уведомления и сообщения
- Справочные данные (города, страны, категории)
Аутентификация:
Клиент использует двухэтапную аутентификацию Kwork:
1. POST /signIn — получение session cookies
2. POST /getWebAuthToken — получение web_auth_token
Примеры использования:
# Вход по логину/паролю
async with await KworkClient.login("username", "password") as client:
catalog = await client.catalog.get_list(page=1)
# Восстановление сессии по токену
client = KworkClient(token="saved_web_auth_token")
user_info = await client.user.get_info()
# Работа с проектами
projects = await client.projects.get_list(page=1)
my_orders = await client.projects.get_payer_orders()
**Attributes**:
- `catalog` - Доступ к каталогу кворков
- `projects` - Доступ к бирже проектов
- `user` - Пользовательские эндпоинты
- `reference` - Справочные данные
- `notifications` - Уведомления и сообщения
- `other` - Прочие эндпоинты
**Notes**:
Клиент поддерживает context manager для автоматического закрытия соединения.
Рекомендуется использовать `async with` для корректного освобождения ресурсов.
#### BASE\_URL
#### LOGIN\_URL
#### TOKEN\_URL
#### KworkClient.\_\_init\_\_
```python
def __init__(token: Optional[str] = None,
cookies: Optional[dict[str, str]] = None,
timeout: float = 30.0,
base_url: Optional[str] = None)
```
Инициализация клиента.
Создаёт неаутентифицированный клиент или восстанавливает сессию
по ранее полученному токену.
**Arguments**:
- `token` - Web auth token, полученный через `getWebAuthToken` или `login()`.
Если указан, автоматически добавляется в cookies.
- `cookies` - Session cookies из предыдущей аутентификации.
Обычно не требуется — устанавливаются автоматически из token.
- `timeout` - Таймаут HTTP запросов в секундах. По умолчанию 30 секунд.
- `base_url` - Кастомный базовый URL. Используется только для тестирования.
**Example**:
# Новый клиент без аутентификации
client = KworkClient()
# Восстановление сессии
client = KworkClient(token="eyJ0eXAiOiJKV1QiLCJhbGc...")
# Клиент с кастомным таймаутом
client = KworkClient(timeout=60.0)
**Notes**:
Для полноценной работы API требуется аутентификация.
Используйте `login()` или передайте сохранённый token.
#### KworkClient.login
```python
@classmethod
async def login(cls,
username: str,
password: str,
timeout: float = 30.0) -> "KworkClient"
```
Аутентификация по логину и паролю.
Выполняет двухэтапный процесс аутентификации Kwork:
1. POST /signIn — проверка учётных данных, получение session cookies
2. POST /getWebAuthToken — обмен cookies на web_auth_token
Полученный токен и cookies сохраняются в клиенте для последующих запросов.
**Arguments**:
- `username` - Логин или email аккаунта Kwork.
- `password` - Пароль аккаунта Kwork.
- `timeout` - Таймаут запросов в секундах. Применяется к каждому этапу.
**Returns**:
Полностью аутентифицированный экземпляр KworkClient,
готовый к работе с API.
**Raises**:
- `KworkAuthError` - Если логин/пароль неверны или токен не получен.
- `KworkNetworkError` - Если произошла ошибка сети.
**Example**:
# Базовое использование
client = await KworkClient.login("myuser", "mypassword")
# С кастомным таймаутом
client = await KworkClient.login("user", "pass", timeout=60.0)
# Сохранение токена для повторного использования
token = client._token
# Позже: client = KworkClient(token=token)
Security:
Пароль не сохраняется в клиенте. Только token и cookies.
Рекомендуется сохранять token для повторного использования
вместо хранения пароля.
**Notes**:
Токен имеет ограниченное время жизни. При получении 401 ошибки
необходимо выполнить повторный login().
#### KworkClient.close
```python
async def close() -> None
```
Close HTTP client.
#### KworkClient.\_\_aenter\_\_
```python
async def __aenter__() -> "KworkClient"
```
#### KworkClient.\_\_aexit\_\_
```python
async def __aexit__(*args: Any) -> None
```
## CatalogAPI
```python
class CatalogAPI()
```
API каталога кворков.
Предоставляет доступ к каталогу услуг Kwork:
- Поиск и фильтрация кворков
- Получение детальной информации
- Категории и сортировка
**Example**:
# Получить первую страницу каталога
catalog = await client.catalog.get_list(page=1)
# Фильтрация по категории
catalog = await client.catalog.get_list(category_id=5)
# Детали конкретного кворка
details = await client.catalog.get_details(kwork_id=12345)
#### CatalogAPI.\_\_init\_\_
```python
def __init__(client: "KworkClient")
```
#### CatalogAPI.get\_list
```python
async def get_list(page: int = 1,
category_id: Optional[int] = None,
sort: str = "recommend") -> CatalogResponse
```
Получить список кворков из каталога.
Основной эндпоинт для поиска и просмотра кворков.
Возвращает пагинированный список с возможностью фильтрации.
**Arguments**:
- `page` - Номер страницы для пагинации (начиная с 1).
- `category_id` - ID категории для фильтрации.
Если None — все категории.
- `sort` - Опция сортировки. Варианты:
- "recommend" — по рекомендации (по умолчанию)
- "price_asc" — по возрастанию цены
- "price_desc" — по убыванию цены
- "rating" — по рейтингу
- "reviews" — по количеству отзывов
- "newest" — по дате создания
**Returns**:
CatalogResponse содержащий:
- kworks: список кворков на странице
- pagination: информация о пагинации
- filters: доступные фильтры
- sort_options: доступные опции сортировки
**Example**:
# Первая страница, сортировка по цене
response = await client.catalog.get_list(
page=1,
sort="price_asc"
)
for kwork in response.kworks:
- `print(f"{kwork.title}` - {kwork.price} RUB")
# Пагинация
if response.pagination and response.pagination.has_next:
next_page = await client.catalog.get_list(page=2)
#### CatalogAPI.get\_details
```python
async def get_details(kwork_id: int) -> KworkDetails
```
Получить полную информацию о кворке.
Возвращает расширенную информацию о кворке включая:
- Полное описание и требования
- Сроки выполнения и количество правок
- Дополнительные опции (features)
- FAQ от продавца
**Arguments**:
- `kwork_id` - Уникальный идентификатор кворка.
**Returns**:
KworkDetails с полной информацией о кворке.
**Raises**:
- `KworkNotFoundError` - Если кворк с таким ID не найден.
**Example**:
details = await client.catalog.get_details(12345)
- `print(f"Название` - {details.title}")
- `print(f"Цена` - {details.price} {details.currency}")
- `print(f"Срок` - {details.delivery_time} дней")
- `print(f"Правки` - {details.revisions}")
#### CatalogAPI.get\_details\_extra
```python
async def get_details_extra(kwork_id: int) -> dict[str, Any]
```
Получить дополнительные детали кворка.
Возвращает расширенную информацию, которая не включена
в основной ответ get_details(). Может содержать:
- Дополнительные изображения
- Видео обзоры
- Детали пакетов услуг
- Статистику продаж
**Arguments**:
- `kwork_id` - Уникальный идентификатор кворка.
**Returns**:
Словарь с дополнительными данными. Структура зависит
от конкретного кворка и не гарантируется стабильной.
**Notes**:
Этот эндпоинт возвращает "сырые" данные без валидации.
Структура ответа может измениться без предупреждения.
## ProjectsAPI
```python
class ProjectsAPI()
```
API биржи проектов (фриланс заказы).
Предоставляет доступ к заказам на фриланс:
- Просмотр открытых проектов
- Заказы где вы заказчик (payer)
- Заказы где вы исполнитель (worker)
**Example**:
# Новые проекты
projects = await client.projects.get_list(page=1)
# Мои заказы как заказчика
my_orders = await client.projects.get_payer_orders()
# Мои заказы как исполнителя
my_work = await client.projects.get_worker_orders()
#### ProjectsAPI.\_\_init\_\_
```python
def __init__(client: "KworkClient")
```
#### ProjectsAPI.get\_list
```python
async def get_list(page: int = 1,
category_id: Optional[int] = None) -> ProjectsResponse
```
Получить список проектов с биржи.
Основной эндпоинт для просмотра доступных заказов.
Возвращает пагинированный список проектов.
**Arguments**:
- `page` - Номер страницы (начиная с 1).
- `category_id` - ID категории для фильтрации.
Если None — все категории.
**Returns**:
ProjectsResponse содержащий:
- projects: список проектов на странице
- pagination: информация о пагинации
**Example**:
# Все новые проекты
response = await client.projects.get_list(page=1)
for project in response.projects:
- `print(f"{project.title}` - {project.budget} {project.budget_type}")
# Только категория "Разработка"
dev_projects = await client.projects.get_list(
page=1,
category_id=5
)
#### ProjectsAPI.get\_payer\_orders
```python
async def get_payer_orders() -> list[Project]
```
Get orders where user is customer.
**Returns**:
List of projects
#### ProjectsAPI.get\_worker\_orders
```python
async def get_worker_orders() -> list[Project]
```
Get orders where user is performer.
**Returns**:
List of projects
## UserAPI
```python
class UserAPI()
```
User API endpoints.
#### UserAPI.\_\_init\_\_
```python
def __init__(client: "KworkClient")
```
#### UserAPI.get\_info
```python
async def get_info() -> dict[str, Any]
```
Get current user info.
**Returns**:
User info dict
#### UserAPI.get\_reviews
```python
async def get_reviews(user_id: Optional[int] = None,
page: int = 1) -> ReviewsResponse
```
Get user reviews.
**Arguments**:
- `user_id` - User ID (None for current user)
- `page` - Page number
**Returns**:
ReviewsResponse
#### UserAPI.get\_favorite\_kworks
```python
async def get_favorite_kworks() -> list[Kwork]
```
Get favorite kworks.
**Returns**:
List of kworks
## ReferenceAPI
```python
class ReferenceAPI()
```
Reference data (cities, countries, etc.) endpoints.
#### ReferenceAPI.\_\_init\_\_
```python
def __init__(client: "KworkClient")
```
#### ReferenceAPI.get\_cities
```python
async def get_cities() -> list[City]
```
Get all cities.
#### ReferenceAPI.get\_countries
```python
async def get_countries() -> list[Country]
```
Get all countries.
#### ReferenceAPI.get\_timezones
```python
async def get_timezones() -> list[TimeZone]
```
Get all timezones.
#### ReferenceAPI.get\_features
```python
async def get_features() -> list[Feature]
```
Get available features.
#### ReferenceAPI.get\_public\_features
```python
async def get_public_features() -> list[Feature]
```
Get public features.
#### ReferenceAPI.get\_badges\_info
```python
async def get_badges_info() -> list[Badge]
```
Get badges info.
## NotificationsAPI
```python
class NotificationsAPI()
```
Notifications and messages endpoints.
#### NotificationsAPI.\_\_init\_\_
```python
def __init__(client: "KworkClient")
```
#### NotificationsAPI.get\_list
```python
async def get_list() -> NotificationsResponse
```
Get notifications list.
#### NotificationsAPI.fetch
```python
async def fetch() -> NotificationsResponse
```
Fetch new notifications.
#### NotificationsAPI.get\_dialogs
```python
async def get_dialogs() -> list[Dialog]
```
Get dialogs list.
#### NotificationsAPI.get\_blocked\_dialogs
```python
async def get_blocked_dialogs() -> list[Dialog]
```
Get blocked dialogs.
## OtherAPI
```python
class OtherAPI()
```
Other API endpoints.
#### OtherAPI.\_\_init\_\_
```python
def __init__(client: "KworkClient")
```
#### OtherAPI.get\_wants
```python
async def get_wants() -> dict[str, Any]
```
Get user wants.
#### OtherAPI.get\_wants\_status
```python
async def get_wants_status() -> dict[str, Any]
```
Get wants status.
#### OtherAPI.get\_kworks\_status
```python
async def get_kworks_status() -> dict[str, Any]
```
Get kworks status.
#### OtherAPI.get\_offers
```python
async def get_offers() -> dict[str, Any]
```
Get offers.
#### OtherAPI.get\_exchange\_info
```python
async def get_exchange_info() -> dict[str, Any]
```
Get exchange info.
#### OtherAPI.get\_channel
```python
async def get_channel() -> dict[str, Any]
```
Get channel info.
#### OtherAPI.get\_in\_app\_notification
```python
async def get_in_app_notification() -> dict[str, Any]
```
Get in-app notification.
#### OtherAPI.get\_security\_user\_data
```python
async def get_security_user_data() -> dict[str, Any]
```
Get security user data.
#### OtherAPI.is\_dialog\_allow
```python
async def is_dialog_allow(user_id: int) -> bool
```
Check if dialog is allowed.
#### OtherAPI.get\_viewed\_kworks
```python
async def get_viewed_kworks() -> list[Kwork]
```
Get viewed kworks.
#### OtherAPI.get\_favorite\_categories
```python
async def get_favorite_categories() -> list[int]
```
Get favorite categories.
#### OtherAPI.update\_settings
```python
async def update_settings(settings: dict[str, Any]) -> dict[str, Any]
```
Update user settings.
#### OtherAPI.go\_offline
```python
async def go_offline() -> dict[str, Any]
```
Set user status to offline.
#### OtherAPI.get\_actor
```python
async def get_actor() -> dict[str, Any]
```
Get actor info.
#### KworkClient.catalog
```python
@property
def catalog() -> CatalogAPI
```
Catalog API.
#### KworkClient.projects
```python
@property
def projects() -> ProjectsAPI
```
Projects API.
#### KworkClient.user
```python
@property
def user() -> UserAPI
```
User API.
#### KworkClient.reference
```python
@property
def reference() -> ReferenceAPI
```
Reference data API.
#### KworkClient.notifications
```python
@property
def notifications() -> NotificationsAPI
```
Notifications API.
#### KworkClient.other
```python
@property
def other() -> OtherAPI
```
Other endpoints.
# Module kwork\_api.models
Pydantic models for Kwork API responses.
All models follow the structure found in the HAR dump analysis.
## datetime
## Any
## Optional
## BaseModel
## Field
## KworkUser
```python
class KworkUser(BaseModel)
```
User information.
#### id
#### username
#### avatar\_url
#### is\_online
#### rating
## KworkCategory
```python
class KworkCategory(BaseModel)
```
Category information.
#### id
#### name
#### slug
#### parent\_id
## Kwork
```python
class Kwork(BaseModel)
```
Kwork (service) information.
#### id
#### title
#### description
#### price
#### currency
#### category\_id
#### seller
#### images
#### rating
#### reviews\_count
#### created\_at
#### updated\_at
## KworkDetails
```python
class KworkDetails(Kwork)
```
Extended kwork details.
#### full\_description
#### requirements
#### delivery\_time
in days
#### revisions
#### features
#### faq
## PaginationInfo
```python
class PaginationInfo(BaseModel)
```
Pagination metadata.
#### current\_page
#### total\_pages
#### total\_items
#### items\_per\_page
#### has\_next
#### has\_prev
## CatalogResponse
```python
class CatalogResponse(BaseModel)
```
Catalog response with kworks and pagination.
#### kworks
#### pagination
#### filters
#### sort\_options
## Project
```python
class Project(BaseModel)
```
Project (freelance order) information.
#### id
#### title
#### description
#### budget
#### budget\_type
fixed, hourly
#### category\_id
#### customer
#### status
open, in_progress, completed, cancelled
#### created\_at
#### updated\_at
#### bids\_count
#### skills
## ProjectsResponse
```python
class ProjectsResponse(BaseModel)
```
Projects list response.
#### projects
#### pagination
## Review
```python
class Review(BaseModel)
```
Review information.
#### id
#### rating
#### comment
#### author
#### kwork\_id
#### created\_at
## ReviewsResponse
```python
class ReviewsResponse(BaseModel)
```
Reviews list response.
#### reviews
#### pagination
#### average\_rating
## Notification
```python
class Notification(BaseModel)
```
Notification information.
#### id
#### type
message, order, system, etc.
#### title
#### message
#### is\_read
#### created\_at
#### link
## NotificationsResponse
```python
class NotificationsResponse(BaseModel)
```
Notifications list response.
#### notifications
#### unread\_count
## Dialog
```python
class Dialog(BaseModel)
```
Dialog (chat) information.
#### id
#### participant
#### last\_message
#### unread\_count
#### updated\_at
## AuthResponse
```python
class AuthResponse(BaseModel)
```
Authentication response.
#### success
#### user\_id
#### username
#### web\_auth\_token
#### message
## ErrorDetail
```python
class ErrorDetail(BaseModel)
```
Error detail from API.
#### code
#### message
#### field
## APIErrorResponse
```python
class APIErrorResponse(BaseModel)
```
Standard API error response.
#### success
#### errors
#### message
## City
```python
class City(BaseModel)
```
City information.
#### id
#### name
#### country\_id
## Country
```python
class Country(BaseModel)
```
Country information.
#### id
#### name
#### code
#### cities
## TimeZone
```python
class TimeZone(BaseModel)
```
Timezone information.
#### id
#### name
#### offset
e.g., "+03:00"
## Feature
```python
class Feature(BaseModel)
```
Feature/addon information.
#### id
#### name
#### description
#### price
#### type
extra, premium, etc.
## Badge
```python
class Badge(BaseModel)
```
User badge information.
#### id
#### name
#### description
#### icon\_url
## DataResponse
```python
class DataResponse(BaseModel)
```
Generic data response wrapper.
#### success
#### data
#### message
# Module kwork\_api.errors
Kwork API exceptions.
All exceptions provide clear error messages for debugging.
## Any
## Optional
## KworkError
```python
class KworkError(Exception)
```
Base exception for all Kwork API errors.
#### KworkError.\_\_init\_\_
```python
def __init__(message: str, response: Optional[Any] = None)
```
#### KworkError.\_\_str\_\_
```python
def __str__() -> str
```
## KworkAuthError
```python
class KworkAuthError(KworkError)
```
Authentication/authorization error.
#### KworkAuthError.\_\_init\_\_
```python
def __init__(message: str = "Authentication failed",
response: Optional[Any] = None)
```
#### KworkAuthError.\_\_str\_\_
```python
def __str__() -> str
```
## KworkApiError
```python
class KworkApiError(KworkError)
```
API request error (4xx, 5xx).
#### KworkApiError.\_\_init\_\_
```python
def __init__(message: str,
status_code: Optional[int] = None,
response: Optional[Any] = None)
```
#### KworkApiError.\_\_str\_\_
```python
def __str__() -> str
```
## KworkNotFoundError
```python
class KworkNotFoundError(KworkApiError)
```
Resource not found (404).
#### KworkNotFoundError.\_\_init\_\_
```python
def __init__(resource: str, response: Optional[Any] = None)
```
## KworkRateLimitError
```python
class KworkRateLimitError(KworkApiError)
```
Rate limit exceeded (429).
#### KworkRateLimitError.\_\_init\_\_
```python
def __init__(message: str = "Rate limit exceeded",
response: Optional[Any] = None)
```
## KworkValidationError
```python
class KworkValidationError(KworkApiError)
```
Validation error (400).
#### KworkValidationError.\_\_init\_\_
```python
def __init__(message: str = "Validation failed",
fields: Optional[dict[str, list[str]]] = None,
response: Optional[Any] = None)
```
#### KworkValidationError.\_\_str\_\_
```python
def __str__() -> str
```
## KworkNetworkError
```python
class KworkNetworkError(KworkError)
```
Network/connection error.
#### KworkNetworkError.\_\_init\_\_
```python
def __init__(message: str = "Network error", response: Optional[Any] = None)
```
#### KworkNetworkError.\_\_str\_\_
```python
def __str__() -> str
```