kwork-api/api_reference.md
root 857d5a95c5 docs: полная документация моделей и исключений
models.py:
- KworkUser, KworkCategory, Kwork, KworkDetails
- PaginationInfo, CatalogResponse
- Project, ProjectsResponse
- Review, ReviewsResponse
- Notification, NotificationsResponse
- Dialog, AuthResponse
- ErrorDetail, APIErrorResponse
- City, Country, TimeZone
- Feature, Badge
- DataResponse

errors.py:
- KworkError (базовое)
- KworkAuthError
- KworkApiError
- KworkNotFoundError
- KworkRateLimitError
- KworkValidationError
- KworkNetworkError

Все классы задокументированы с описанием атрибутов и примерами.
2026-03-23 04:28:44 +00:00

2562 lines
60 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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__)
<a id="kwork_api"></a>
# 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)
<a id="kwork_api.KworkClient"></a>
## KworkClient
<a id="kwork_api.KworkError"></a>
## KworkError
<a id="kwork_api.KworkAuthError"></a>
## KworkAuthError
<a id="kwork_api.KworkApiError"></a>
## KworkApiError
<a id="kwork_api.__version__"></a>
#### \_\_version\_\_
<a id="kwork_api.__all__"></a>
#### \_\_all\_\_
<a id="kwork_api.client"></a>
# Module kwork\_api.client
Kwork API Client.
Main client class with authentication and all API endpoints.
<a id="kwork_api.client.logging"></a>
## logging
<a id="kwork_api.client.Any"></a>
## Any
<a id="kwork_api.client.Optional"></a>
## Optional
<a id="kwork_api.client.httpx"></a>
## httpx
<a id="kwork_api.client.HttpUrl"></a>
## HttpUrl
<a id="kwork_api.client.KworkApiError"></a>
## KworkApiError
<a id="kwork_api.client.KworkAuthError"></a>
## KworkAuthError
<a id="kwork_api.client.KworkError"></a>
## KworkError
<a id="kwork_api.client.KworkNetworkError"></a>
## KworkNetworkError
<a id="kwork_api.client.KworkNotFoundError"></a>
## KworkNotFoundError
<a id="kwork_api.client.KworkRateLimitError"></a>
## KworkRateLimitError
<a id="kwork_api.client.KworkValidationError"></a>
## KworkValidationError
<a id="kwork_api.client.APIErrorResponse"></a>
## APIErrorResponse
<a id="kwork_api.client.AuthResponse"></a>
## AuthResponse
<a id="kwork_api.client.Badge"></a>
## Badge
<a id="kwork_api.client.CatalogResponse"></a>
## CatalogResponse
<a id="kwork_api.client.City"></a>
## City
<a id="kwork_api.client.Country"></a>
## Country
<a id="kwork_api.client.DataResponse"></a>
## DataResponse
<a id="kwork_api.client.Dialog"></a>
## Dialog
<a id="kwork_api.client.Feature"></a>
## Feature
<a id="kwork_api.client.Kwork"></a>
## Kwork
<a id="kwork_api.client.KworkDetails"></a>
## KworkDetails
<a id="kwork_api.client.NotificationsResponse"></a>
## NotificationsResponse
<a id="kwork_api.client.Project"></a>
## Project
<a id="kwork_api.client.ProjectsResponse"></a>
## ProjectsResponse
<a id="kwork_api.client.Review"></a>
## Review
<a id="kwork_api.client.ReviewsResponse"></a>
## ReviewsResponse
<a id="kwork_api.client.TimeZone"></a>
## TimeZone
<a id="kwork_api.client.logger"></a>
#### logger
<a id="kwork_api.client.KworkClient"></a>
## 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` для корректного освобождения ресурсов.
<a id="kwork_api.client.KworkClient.BASE_URL"></a>
#### BASE\_URL
<a id="kwork_api.client.KworkClient.LOGIN_URL"></a>
#### LOGIN\_URL
<a id="kwork_api.client.KworkClient.TOKEN_URL"></a>
#### TOKEN\_URL
<a id="kwork_api.client.KworkClient.__init__"></a>
#### 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.
<a id="kwork_api.client.KworkClient.login"></a>
#### 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().
<a id="kwork_api.client.KworkClient.close"></a>
#### KworkClient.close
```python
async def close() -> None
```
Close HTTP client.
<a id="kwork_api.client.KworkClient.__aenter__"></a>
#### KworkClient.\_\_aenter\_\_
```python
async def __aenter__() -> "KworkClient"
```
<a id="kwork_api.client.KworkClient.__aexit__"></a>
#### KworkClient.\_\_aexit\_\_
```python
async def __aexit__(*args: Any) -> None
```
<a id="kwork_api.client.KworkClient.CatalogAPI"></a>
## 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)
<a id="kwork_api.client.KworkClient.CatalogAPI.__init__"></a>
#### CatalogAPI.\_\_init\_\_
```python
def __init__(client: "KworkClient")
```
<a id="kwork_api.client.KworkClient.CatalogAPI.get_list"></a>
#### 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)
<a id="kwork_api.client.KworkClient.CatalogAPI.get_details"></a>
#### 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}")
<a id="kwork_api.client.KworkClient.CatalogAPI.get_details_extra"></a>
#### CatalogAPI.get\_details\_extra
```python
async def get_details_extra(kwork_id: int) -> dict[str, Any]
```
Получить дополнительные детали кворка.
Возвращает расширенную информацию, которая не включена
в основной ответ get_details(). Может содержать:
- Дополнительные изображения
- Видео обзоры
- Детали пакетов услуг
- Статистику продаж
**Arguments**:
- `kwork_id` - Уникальный идентификатор кворка.
**Returns**:
Словарь с дополнительными данными. Структура зависит
от конкретного кворка и не гарантируется стабильной.
**Notes**:
Этот эндпоинт возвращает "сырые" данные без валидации.
Структура ответа может измениться без предупреждения.
<a id="kwork_api.client.KworkClient.ProjectsAPI"></a>
## 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()
<a id="kwork_api.client.KworkClient.ProjectsAPI.__init__"></a>
#### ProjectsAPI.\_\_init\_\_
```python
def __init__(client: "KworkClient")
```
<a id="kwork_api.client.KworkClient.ProjectsAPI.get_list"></a>
#### 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
)
<a id="kwork_api.client.KworkClient.ProjectsAPI.get_payer_orders"></a>
#### ProjectsAPI.get\_payer\_orders
```python
async def get_payer_orders() -> list[Project]
```
Получить заказы где вы являетесь заказчиком.
Возвращает все проекты, созданные текущим пользователем,
независимо от их статуса (открыт, в работе, завершён).
**Returns**:
Список проектов где текущий пользователь — заказчик.
**Example**:
orders = await client.projects.get_payer_orders()
for order in orders:
print(f"Заказ #{order.id}: {order.status}")
<a id="kwork_api.client.KworkClient.ProjectsAPI.get_worker_orders"></a>
#### ProjectsAPI.get\_worker\_orders
```python
async def get_worker_orders() -> list[Project]
```
Получить заказы где вы являетесь исполнителем.
Возвращает все проекты, где текущий пользователь
назначен исполнителем.
**Returns**:
Список проектов где текущий пользователь — исполнитель.
**Example**:
work = await client.projects.get_worker_orders()
active = [p for p in work if p.status == "in_progress"]
print(f"Активных заказов: {len(active)}")
<a id="kwork_api.client.KworkClient.UserAPI"></a>
## UserAPI
```python
class UserAPI()
```
Пользовательское API.
Предоставляет доступ к данным текущего пользователя:
- Профиль и информация об аккаунте
- Отзывы (полученные и оставленные)
- Избранные кворки
**Example**:
# Информация о пользователе
info = await client.user.get_info()
# Мои отзывы
reviews = await client.user.get_reviews()
# Избранные кворки
favorites = await client.user.get_favorite_kworks()
<a id="kwork_api.client.KworkClient.UserAPI.__init__"></a>
#### UserAPI.\_\_init\_\_
```python
def __init__(client: "KworkClient")
```
<a id="kwork_api.client.KworkClient.UserAPI.get_info"></a>
#### UserAPI.get\_info
```python
async def get_info() -> dict[str, Any]
```
Получить информацию о текущем пользователе.
Возвращает основные данные аккаунта:
- ID, username, email
- Баланс, рейтинг
- Статус верификации
- Настройки профиля
**Returns**:
Словарь с информацией о пользователе.
Структура зависит от ответа API.
**Example**:
info = await client.user.get_info()
- `print(f"User` - {info.get('username')}")
- `print(f"Balance` - {info.get('balance')} RUB")
<a id="kwork_api.client.KworkClient.UserAPI.get_reviews"></a>
#### UserAPI.get\_reviews
```python
async def get_reviews(user_id: Optional[int] = None,
page: int = 1) -> ReviewsResponse
```
Получить отзывы пользователя.
Если user_id не указан — возвращает отзывы текущего пользователя.
Если указан — отзывы другого пользователя по ID.
**Arguments**:
- `user_id` - ID пользователя. Если None — текущий пользователь.
- `page` - Номер страницы для пагинации (начиная с 1).
**Returns**:
ReviewsResponse содержащий:
- reviews: список отзывов на странице
- pagination: информация о пагинации
- average_rating: средний рейтинг
**Example**:
# Мои отзывы
my_reviews = await client.user.get_reviews()
# Отзывы другого пользователя
user_reviews = await client.user.get_reviews(user_id=12345)
# С пагинацией
page2 = await client.user.get_reviews(page=2)
<a id="kwork_api.client.KworkClient.UserAPI.get_favorite_kworks"></a>
#### UserAPI.get\_favorite\_kworks
```python
async def get_favorite_kworks() -> list[Kwork]
```
Получить список избранных кворков.
Возвращает все кворки, добавленные пользователем в избранное.
**Returns**:
Список избранных кворков.
**Example**:
favorites = await client.user.get_favorite_kworks()
for kwork in favorites:
- `print(f"{kwork.title}` - {kwork.price} RUB")
<a id="kwork_api.client.KworkClient.ReferenceAPI"></a>
## ReferenceAPI
```python
class ReferenceAPI()
```
Справочное API.
Предоставляет доступ к справочным данным Kwork:
- Города, страны, часовые пояса
- Доступные функции и дополнения
- Значки пользователей
Эти данные редко меняются и могут быть закэшированы.
**Example**:
# Все страны
countries = await client.reference.get_countries()
# Все города
cities = await client.reference.get_cities()
# Доступные фичи
features = await client.reference.get_features()
<a id="kwork_api.client.KworkClient.ReferenceAPI.__init__"></a>
#### ReferenceAPI.\_\_init\_\_
```python
def __init__(client: "KworkClient")
```
<a id="kwork_api.client.KworkClient.ReferenceAPI.get_cities"></a>
#### ReferenceAPI.get\_cities
```python
async def get_cities() -> list[City]
```
Получить список всех городов.
**Returns**:
Список всех городов из справочника Kwork.
**Example**:
cities = await client.reference.get_cities()
moscow = next(c for c in cities if c.name == "Москва")
<a id="kwork_api.client.KworkClient.ReferenceAPI.get_countries"></a>
#### ReferenceAPI.get\_countries
```python
async def get_countries() -> list[Country]
```
Получить список всех стран.
**Returns**:
Список всех стран с кодами и городами.
**Example**:
countries = await client.reference.get_countries()
russia = next(c for c in countries if c.code == "RU")
<a id="kwork_api.client.KworkClient.ReferenceAPI.get_timezones"></a>
#### ReferenceAPI.get\_timezones
```python
async def get_timezones() -> list[TimeZone]
```
Получить список всех часовых поясов.
**Returns**:
Список часовых поясов с названиями и смещениями.
**Example**:
timezones = await client.reference.get_timezones()
msks = next(tz for tz in timezones if "Moscow" in tz.name)
<a id="kwork_api.client.KworkClient.ReferenceAPI.get_features"></a>
#### ReferenceAPI.get\_features
```python
async def get_features() -> list[Feature]
```
Получить доступные дополнительные функции (features).
Features — это платные дополнения к кворкам:
- Увеличенные сроки
- Дополнительные правки
- Приоритетная поддержка
- и т.д.
**Returns**:
Список доступных features с названиями и ценами.
**Example**:
features = await client.reference.get_features()
for f in features:
- `print(f"{f.name}` - {f.price} RUB")
<a id="kwork_api.client.KworkClient.ReferenceAPI.get_public_features"></a>
#### ReferenceAPI.get\_public\_features
```python
async def get_public_features() -> list[Feature]
```
Получить публичные функции.
Аналогично get_features(), но возвращает только
публично доступные опции.
**Returns**:
Список публичных features.
<a id="kwork_api.client.KworkClient.ReferenceAPI.get_badges_info"></a>
#### ReferenceAPI.get\_badges\_info
```python
async def get_badges_info() -> list[Badge]
```
Получить информацию о значках пользователей.
Значки (badges) отображают достижения и статусы:
- "Профессионал"
- "Быстрый ответ"
- "Надёжный продавец"
- и т.д.
**Returns**:
Список значков с описаниями и иконками.
**Example**:
badges = await client.reference.get_badges_info()
for badge in badges:
- `print(f"{badge.name}` - {badge.description}")
<a id="kwork_api.client.KworkClient.NotificationsAPI"></a>
## NotificationsAPI
```python
class NotificationsAPI()
```
API уведомлений и сообщений.
Предоставляет доступ к системе уведомлений Kwork:
- Список уведомлений
- Получение новых уведомлений
- Диалоги с пользователями
- Заблокированные диалоги
**Example**:
# Все уведомления
notifications = await client.notifications.get_list()
# Новые уведомления
new = await client.notifications.fetch()
# Диалоги
dialogs = await client.notifications.get_dialogs()
<a id="kwork_api.client.KworkClient.NotificationsAPI.__init__"></a>
#### NotificationsAPI.\_\_init\_\_
```python
def __init__(client: "KworkClient")
```
<a id="kwork_api.client.KworkClient.NotificationsAPI.get_list"></a>
#### NotificationsAPI.get\_list
```python
async def get_list() -> NotificationsResponse
```
Получить список всех уведомлений.
Возвращает все уведомления пользователя с информацией
о прочтении.
**Returns**:
NotificationsResponse содержащий:
- notifications: список уведомлений
- unread_count: количество непрочитанных
**Example**:
notifs = await client.notifications.get_list()
- `print(f"Непрочитанных` - {notifs.unread_count}")
for n in notifs.notifications:
if not n.is_read:
- `print(f"Новое` - {n.title}")
<a id="kwork_api.client.KworkClient.NotificationsAPI.fetch"></a>
#### NotificationsAPI.fetch
```python
async def fetch() -> NotificationsResponse
```
Получить новые уведомления.
Отличается от get_list() тем, что возвращает только
уведомления, появившиеся с момента последнего запроса.
Также может обновлять счётчик непрочитанных.
**Returns**:
NotificationsResponse с новыми уведомлениями.
**Example**:
new_notifs = await client.notifications.fetch()
if new_notifs.unread_count > 0:
print(f"У вас {new_notifs.unread_count} новых уведомлений!")
<a id="kwork_api.client.KworkClient.NotificationsAPI.get_dialogs"></a>
#### NotificationsAPI.get\_dialogs
```python
async def get_dialogs() -> list[Dialog]
```
Получить список диалогов (чатов).
Возвращает все активные диалоги пользователя с другими
пользователями Kwork.
**Returns**:
Список диалогов с последней перепиской.
**Example**:
dialogs = await client.notifications.get_dialogs()
for d in dialogs:
print(f"С {d.participant.username}: {d.last_message}")
<a id="kwork_api.client.KworkClient.NotificationsAPI.get_blocked_dialogs"></a>
#### NotificationsAPI.get\_blocked\_dialogs
```python
async def get_blocked_dialogs() -> list[Dialog]
```
Получить список заблокированных диалогов.
Возвращает диалоги с пользователями, которые были
заблокированы текущим пользователем.
**Returns**:
Список заблокированных диалогов.
**Example**:
blocked = await client.notifications.get_blocked_dialogs()
- `print(f"Заблокировано` - {len(blocked)} пользователей")
<a id="kwork_api.client.KworkClient.OtherAPI"></a>
## OtherAPI
```python
class OtherAPI()
```
Прочее API.
Вспомогательные эндпоинты которые не вошли в другие категории:
- Пользовательские настройки и предпочтения (wants)
- Статусы кворков и заказов
- Персональные предложения (offers)
- Настройки профиля
- Статус онлайн/оффлайн
**Example**:
# Пользовательские предпочтения
wants = await client.other.get_wants()
# Статус кворков
status = await client.other.get_kworks_status()
# Установить статус оффлайн
await client.other.go_offline()
<a id="kwork_api.client.KworkClient.OtherAPI.__init__"></a>
#### OtherAPI.\_\_init\_\_
```python
def __init__(client: "KworkClient")
```
<a id="kwork_api.client.KworkClient.OtherAPI.get_wants"></a>
#### OtherAPI.get\_wants
```python
async def get_wants() -> dict[str, Any]
```
Получить пользовательские предпочтения (wants).
Wants — это настройки интересов пользователя:
- Предпочитаемые категории
- Ключевые слова для мониторинга
- Фильтры для поиска
**Returns**:
Словарь с настройками предпочтений.
**Example**:
wants = await client.other.get_wants()
print(wants)
<a id="kwork_api.client.KworkClient.OtherAPI.get_wants_status"></a>
#### OtherAPI.get\_wants\_status
```python
async def get_wants_status() -> dict[str, Any]
```
Получить статус предпочтений.
**Returns**:
Статус wants с метаданными.
<a id="kwork_api.client.KworkClient.OtherAPI.get_kworks_status"></a>
#### OtherAPI.get\_kworks\_status
```python
async def get_kworks_status() -> dict[str, Any]
```
Получить статусы кворков пользователя.
Возвращает информацию о статусах всех кворков
текущего пользователя (активен, на модерации, и т.д.).
**Returns**:
Словарь со статусами кворков.
**Example**:
status = await client.other.get_kworks_status()
print(status)
<a id="kwork_api.client.KworkClient.OtherAPI.get_offers"></a>
#### OtherAPI.get\_offers
```python
async def get_offers() -> dict[str, Any]
```
Получить персональные предложения.
**Returns**:
Список персональных предложений от Kwork.
<a id="kwork_api.client.KworkClient.OtherAPI.get_exchange_info"></a>
#### OtherAPI.get\_exchange\_info
```python
async def get_exchange_info() -> dict[str, Any]
```
Получить информацию об обмене валюты.
**Returns**:
Информация о курсах валют и обмене.
<a id="kwork_api.client.KworkClient.OtherAPI.get_channel"></a>
#### OtherAPI.get\_channel
```python
async def get_channel() -> dict[str, Any]
```
Получить информацию о канале пользователя.
**Returns**:
Данные канала (если есть).
<a id="kwork_api.client.KworkClient.OtherAPI.get_in_app_notification"></a>
#### OtherAPI.get\_in\_app\_notification
```python
async def get_in_app_notification() -> dict[str, Any]
```
Получить внутриприложенное уведомление.
**Returns**:
Данные in-app уведомления.
<a id="kwork_api.client.KworkClient.OtherAPI.get_security_user_data"></a>
#### OtherAPI.get\_security\_user\_data
```python
async def get_security_user_data() -> dict[str, Any]
```
Получить данные безопасности пользователя.
**Returns**:
Информация о безопасности аккаунта.
<a id="kwork_api.client.KworkClient.OtherAPI.is_dialog_allow"></a>
#### OtherAPI.is\_dialog\_allow
```python
async def is_dialog_allow(user_id: int) -> bool
```
Проверить возможность начала диалога с пользователем.
**Arguments**:
- `user_id` - ID пользователя для проверки.
**Returns**:
True если диалог разрешён, False иначе.
**Example**:
allowed = await client.other.is_dialog_allow(12345)
if allowed:
print("Можно написать сообщение")
<a id="kwork_api.client.KworkClient.OtherAPI.get_viewed_kworks"></a>
#### OtherAPI.get\_viewed\_kworks
```python
async def get_viewed_kworks() -> list[Kwork]
```
Получить просмотренные кворки.
Возвращает список кворков, которые пользователь
просматривал ранее.
**Returns**:
Список просмотренных кворков.
**Example**:
viewed = await client.other.get_viewed_kworks()
- `print(f"Просмотрено` - {len(viewed)} кворков")
<a id="kwork_api.client.KworkClient.OtherAPI.get_favorite_categories"></a>
#### OtherAPI.get\_favorite\_categories
```python
async def get_favorite_categories() -> list[int]
```
Получить ID избранных категорий.
**Returns**:
Список ID категорий, добавленных в избранное.
**Example**:
cats = await client.other.get_favorite_categories()
print(f"Избранные категории: {cats}")
<a id="kwork_api.client.KworkClient.OtherAPI.update_settings"></a>
#### OtherAPI.update\_settings
```python
async def update_settings(settings: dict[str, Any]) -> dict[str, Any]
```
Обновить настройки пользователя.
**Arguments**:
- `settings` - Словарь с настройками для обновления.
Структура зависит от конкретных настроек.
**Returns**:
Ответ API с подтверждением обновления.
**Example**:
await client.other.update_settings({
- `"email_notifications"` - True,
- `"language"` - "ru"
})
<a id="kwork_api.client.KworkClient.OtherAPI.go_offline"></a>
#### OtherAPI.go\_offline
```python
async def go_offline() -> dict[str, Any]
```
Установить статус пользователя "оффлайн".
Скрывает онлайн-статус от других пользователей.
**Returns**:
Подтверждение изменения статуса.
**Example**:
await client.other.go_offline()
<a id="kwork_api.client.KworkClient.OtherAPI.get_actor"></a>
#### OtherAPI.get\_actor
```python
async def get_actor() -> dict[str, Any]
```
Получить информацию об актёре (текущем пользователе).
**Returns**:
Данные актёра/пользователя.
<a id="kwork_api.client.KworkClient.catalog"></a>
#### KworkClient.catalog
```python
@property
def catalog() -> CatalogAPI
```
API каталога кворков.
**Returns**:
CatalogAPI для работы с каталогом.
<a id="kwork_api.client.KworkClient.projects"></a>
#### KworkClient.projects
```python
@property
def projects() -> ProjectsAPI
```
API биржи проектов.
**Returns**:
ProjectsAPI для работы с проектами.
<a id="kwork_api.client.KworkClient.user"></a>
#### KworkClient.user
```python
@property
def user() -> UserAPI
```
Пользовательское API.
**Returns**:
UserAPI для работы с профилем.
<a id="kwork_api.client.KworkClient.reference"></a>
#### KworkClient.reference
```python
@property
def reference() -> ReferenceAPI
```
Справочное API.
**Returns**:
ReferenceAPI для справочных данных.
<a id="kwork_api.client.KworkClient.notifications"></a>
#### KworkClient.notifications
```python
@property
def notifications() -> NotificationsAPI
```
API уведомлений.
**Returns**:
NotificationsAPI для уведомлений и сообщений.
<a id="kwork_api.client.KworkClient.other"></a>
#### KworkClient.other
```python
@property
def other() -> OtherAPI
```
Прочее API.
**Returns**:
OtherAPI для вспомогательных эндпоинтов.
<a id="kwork_api.models"></a>
# Module kwork\_api.models
Pydantic models for Kwork API responses.
All models follow the structure found in the HAR dump analysis.
<a id="kwork_api.models.datetime"></a>
## datetime
<a id="kwork_api.models.Any"></a>
## Any
<a id="kwork_api.models.Optional"></a>
## Optional
<a id="kwork_api.models.BaseModel"></a>
## BaseModel
<a id="kwork_api.models.Field"></a>
## Field
<a id="kwork_api.models.KworkUser"></a>
## KworkUser
```python
class KworkUser(BaseModel)
```
User information.
<a id="kwork_api.models.KworkUser.id"></a>
#### id
<a id="kwork_api.models.KworkUser.username"></a>
#### username
<a id="kwork_api.models.KworkUser.avatar_url"></a>
#### avatar\_url
<a id="kwork_api.models.KworkUser.is_online"></a>
#### is\_online
<a id="kwork_api.models.KworkUser.rating"></a>
#### rating
<a id="kwork_api.models.KworkCategory"></a>
## KworkCategory
```python
class KworkCategory(BaseModel)
```
Category information.
<a id="kwork_api.models.KworkCategory.id"></a>
#### id
<a id="kwork_api.models.KworkCategory.name"></a>
#### name
<a id="kwork_api.models.KworkCategory.slug"></a>
#### slug
<a id="kwork_api.models.KworkCategory.parent_id"></a>
#### parent\_id
<a id="kwork_api.models.Kwork"></a>
## Kwork
```python
class Kwork(BaseModel)
```
Kwork (service) information.
<a id="kwork_api.models.Kwork.id"></a>
#### id
<a id="kwork_api.models.Kwork.title"></a>
#### title
<a id="kwork_api.models.Kwork.description"></a>
#### description
<a id="kwork_api.models.Kwork.price"></a>
#### price
<a id="kwork_api.models.Kwork.currency"></a>
#### currency
<a id="kwork_api.models.Kwork.category_id"></a>
#### category\_id
<a id="kwork_api.models.Kwork.seller"></a>
#### seller
<a id="kwork_api.models.Kwork.images"></a>
#### images
<a id="kwork_api.models.Kwork.rating"></a>
#### rating
<a id="kwork_api.models.Kwork.reviews_count"></a>
#### reviews\_count
<a id="kwork_api.models.Kwork.created_at"></a>
#### created\_at
<a id="kwork_api.models.Kwork.updated_at"></a>
#### updated\_at
<a id="kwork_api.models.KworkDetails"></a>
## KworkDetails
```python
class KworkDetails(Kwork)
```
Extended kwork details.
<a id="kwork_api.models.KworkDetails.full_description"></a>
#### full\_description
<a id="kwork_api.models.KworkDetails.requirements"></a>
#### requirements
<a id="kwork_api.models.KworkDetails.delivery_time"></a>
#### delivery\_time
in days
<a id="kwork_api.models.KworkDetails.revisions"></a>
#### revisions
<a id="kwork_api.models.KworkDetails.features"></a>
#### features
<a id="kwork_api.models.KworkDetails.faq"></a>
#### faq
<a id="kwork_api.models.PaginationInfo"></a>
## PaginationInfo
```python
class PaginationInfo(BaseModel)
```
Pagination metadata.
<a id="kwork_api.models.PaginationInfo.current_page"></a>
#### current\_page
<a id="kwork_api.models.PaginationInfo.total_pages"></a>
#### total\_pages
<a id="kwork_api.models.PaginationInfo.total_items"></a>
#### total\_items
<a id="kwork_api.models.PaginationInfo.items_per_page"></a>
#### items\_per\_page
<a id="kwork_api.models.PaginationInfo.has_next"></a>
#### has\_next
<a id="kwork_api.models.PaginationInfo.has_prev"></a>
#### has\_prev
<a id="kwork_api.models.CatalogResponse"></a>
## CatalogResponse
```python
class CatalogResponse(BaseModel)
```
Catalog response with kworks and pagination.
<a id="kwork_api.models.CatalogResponse.kworks"></a>
#### kworks
<a id="kwork_api.models.CatalogResponse.pagination"></a>
#### pagination
<a id="kwork_api.models.CatalogResponse.filters"></a>
#### filters
<a id="kwork_api.models.CatalogResponse.sort_options"></a>
#### sort\_options
<a id="kwork_api.models.Project"></a>
## Project
```python
class Project(BaseModel)
```
Project (freelance order) information.
<a id="kwork_api.models.Project.id"></a>
#### id
<a id="kwork_api.models.Project.title"></a>
#### title
<a id="kwork_api.models.Project.description"></a>
#### description
<a id="kwork_api.models.Project.budget"></a>
#### budget
<a id="kwork_api.models.Project.budget_type"></a>
#### budget\_type
fixed, hourly
<a id="kwork_api.models.Project.category_id"></a>
#### category\_id
<a id="kwork_api.models.Project.customer"></a>
#### customer
<a id="kwork_api.models.Project.status"></a>
#### status
open, in_progress, completed, cancelled
<a id="kwork_api.models.Project.created_at"></a>
#### created\_at
<a id="kwork_api.models.Project.updated_at"></a>
#### updated\_at
<a id="kwork_api.models.Project.bids_count"></a>
#### bids\_count
<a id="kwork_api.models.Project.skills"></a>
#### skills
<a id="kwork_api.models.ProjectsResponse"></a>
## ProjectsResponse
```python
class ProjectsResponse(BaseModel)
```
Projects list response.
<a id="kwork_api.models.ProjectsResponse.projects"></a>
#### projects
<a id="kwork_api.models.ProjectsResponse.pagination"></a>
#### pagination
<a id="kwork_api.models.Review"></a>
## Review
```python
class Review(BaseModel)
```
Review information.
<a id="kwork_api.models.Review.id"></a>
#### id
<a id="kwork_api.models.Review.rating"></a>
#### rating
<a id="kwork_api.models.Review.comment"></a>
#### comment
<a id="kwork_api.models.Review.author"></a>
#### author
<a id="kwork_api.models.Review.kwork_id"></a>
#### kwork\_id
<a id="kwork_api.models.Review.created_at"></a>
#### created\_at
<a id="kwork_api.models.ReviewsResponse"></a>
## ReviewsResponse
```python
class ReviewsResponse(BaseModel)
```
Reviews list response.
<a id="kwork_api.models.ReviewsResponse.reviews"></a>
#### reviews
<a id="kwork_api.models.ReviewsResponse.pagination"></a>
#### pagination
<a id="kwork_api.models.ReviewsResponse.average_rating"></a>
#### average\_rating
<a id="kwork_api.models.Notification"></a>
## Notification
```python
class Notification(BaseModel)
```
Notification information.
<a id="kwork_api.models.Notification.id"></a>
#### id
<a id="kwork_api.models.Notification.type"></a>
#### type
message, order, system, etc.
<a id="kwork_api.models.Notification.title"></a>
#### title
<a id="kwork_api.models.Notification.message"></a>
#### message
<a id="kwork_api.models.Notification.is_read"></a>
#### is\_read
<a id="kwork_api.models.Notification.created_at"></a>
#### created\_at
<a id="kwork_api.models.Notification.link"></a>
#### link
<a id="kwork_api.models.NotificationsResponse"></a>
## NotificationsResponse
```python
class NotificationsResponse(BaseModel)
```
Notifications list response.
<a id="kwork_api.models.NotificationsResponse.notifications"></a>
#### notifications
<a id="kwork_api.models.NotificationsResponse.unread_count"></a>
#### unread\_count
<a id="kwork_api.models.Dialog"></a>
## Dialog
```python
class Dialog(BaseModel)
```
Dialog (chat) information.
<a id="kwork_api.models.Dialog.id"></a>
#### id
<a id="kwork_api.models.Dialog.participant"></a>
#### participant
<a id="kwork_api.models.Dialog.last_message"></a>
#### last\_message
<a id="kwork_api.models.Dialog.unread_count"></a>
#### unread\_count
<a id="kwork_api.models.Dialog.updated_at"></a>
#### updated\_at
<a id="kwork_api.models.AuthResponse"></a>
## AuthResponse
```python
class AuthResponse(BaseModel)
```
Authentication response.
<a id="kwork_api.models.AuthResponse.success"></a>
#### success
<a id="kwork_api.models.AuthResponse.user_id"></a>
#### user\_id
<a id="kwork_api.models.AuthResponse.username"></a>
#### username
<a id="kwork_api.models.AuthResponse.web_auth_token"></a>
#### web\_auth\_token
<a id="kwork_api.models.AuthResponse.message"></a>
#### message
<a id="kwork_api.models.ErrorDetail"></a>
## ErrorDetail
```python
class ErrorDetail(BaseModel)
```
Error detail from API.
<a id="kwork_api.models.ErrorDetail.code"></a>
#### code
<a id="kwork_api.models.ErrorDetail.message"></a>
#### message
<a id="kwork_api.models.ErrorDetail.field"></a>
#### field
<a id="kwork_api.models.APIErrorResponse"></a>
## APIErrorResponse
```python
class APIErrorResponse(BaseModel)
```
Standard API error response.
<a id="kwork_api.models.APIErrorResponse.success"></a>
#### success
<a id="kwork_api.models.APIErrorResponse.errors"></a>
#### errors
<a id="kwork_api.models.APIErrorResponse.message"></a>
#### message
<a id="kwork_api.models.City"></a>
## City
```python
class City(BaseModel)
```
City information.
<a id="kwork_api.models.City.id"></a>
#### id
<a id="kwork_api.models.City.name"></a>
#### name
<a id="kwork_api.models.City.country_id"></a>
#### country\_id
<a id="kwork_api.models.Country"></a>
## Country
```python
class Country(BaseModel)
```
Country information.
<a id="kwork_api.models.Country.id"></a>
#### id
<a id="kwork_api.models.Country.name"></a>
#### name
<a id="kwork_api.models.Country.code"></a>
#### code
<a id="kwork_api.models.Country.cities"></a>
#### cities
<a id="kwork_api.models.TimeZone"></a>
## TimeZone
```python
class TimeZone(BaseModel)
```
Timezone information.
<a id="kwork_api.models.TimeZone.id"></a>
#### id
<a id="kwork_api.models.TimeZone.name"></a>
#### name
<a id="kwork_api.models.TimeZone.offset"></a>
#### offset
e.g., "+03:00"
<a id="kwork_api.models.Feature"></a>
## Feature
```python
class Feature(BaseModel)
```
Feature/addon information.
<a id="kwork_api.models.Feature.id"></a>
#### id
<a id="kwork_api.models.Feature.name"></a>
#### name
<a id="kwork_api.models.Feature.description"></a>
#### description
<a id="kwork_api.models.Feature.price"></a>
#### price
<a id="kwork_api.models.Feature.type"></a>
#### type
extra, premium, etc.
<a id="kwork_api.models.Badge"></a>
## Badge
```python
class Badge(BaseModel)
```
User badge information.
<a id="kwork_api.models.Badge.id"></a>
#### id
<a id="kwork_api.models.Badge.name"></a>
#### name
<a id="kwork_api.models.Badge.description"></a>
#### description
<a id="kwork_api.models.Badge.icon_url"></a>
#### icon\_url
<a id="kwork_api.models.DataResponse"></a>
## DataResponse
```python
class DataResponse(BaseModel)
```
Generic data response wrapper.
<a id="kwork_api.models.DataResponse.success"></a>
#### success
<a id="kwork_api.models.DataResponse.data"></a>
#### data
<a id="kwork_api.models.DataResponse.message"></a>
#### message
<a id="kwork_api.errors"></a>
# Module kwork\_api.errors
Kwork API exceptions.
All exceptions provide clear error messages for debugging.
<a id="kwork_api.errors.Any"></a>
## Any
<a id="kwork_api.errors.Optional"></a>
## Optional
<a id="kwork_api.errors.KworkError"></a>
## KworkError
```python
class KworkError(Exception)
```
Base exception for all Kwork API errors.
<a id="kwork_api.errors.KworkError.__init__"></a>
#### KworkError.\_\_init\_\_
```python
def __init__(message: str, response: Optional[Any] = None)
```
<a id="kwork_api.errors.KworkError.__str__"></a>
#### KworkError.\_\_str\_\_
```python
def __str__() -> str
```
<a id="kwork_api.errors.KworkAuthError"></a>
## KworkAuthError
```python
class KworkAuthError(KworkError)
```
Authentication/authorization error.
<a id="kwork_api.errors.KworkAuthError.__init__"></a>
#### KworkAuthError.\_\_init\_\_
```python
def __init__(message: str = "Authentication failed",
response: Optional[Any] = None)
```
<a id="kwork_api.errors.KworkAuthError.__str__"></a>
#### KworkAuthError.\_\_str\_\_
```python
def __str__() -> str
```
<a id="kwork_api.errors.KworkApiError"></a>
## KworkApiError
```python
class KworkApiError(KworkError)
```
API request error (4xx, 5xx).
<a id="kwork_api.errors.KworkApiError.__init__"></a>
#### KworkApiError.\_\_init\_\_
```python
def __init__(message: str,
status_code: Optional[int] = None,
response: Optional[Any] = None)
```
<a id="kwork_api.errors.KworkApiError.__str__"></a>
#### KworkApiError.\_\_str\_\_
```python
def __str__() -> str
```
<a id="kwork_api.errors.KworkNotFoundError"></a>
## KworkNotFoundError
```python
class KworkNotFoundError(KworkApiError)
```
Resource not found (404).
<a id="kwork_api.errors.KworkNotFoundError.__init__"></a>
#### KworkNotFoundError.\_\_init\_\_
```python
def __init__(resource: str, response: Optional[Any] = None)
```
<a id="kwork_api.errors.KworkRateLimitError"></a>
## KworkRateLimitError
```python
class KworkRateLimitError(KworkApiError)
```
Rate limit exceeded (429).
<a id="kwork_api.errors.KworkRateLimitError.__init__"></a>
#### KworkRateLimitError.\_\_init\_\_
```python
def __init__(message: str = "Rate limit exceeded",
response: Optional[Any] = None)
```
<a id="kwork_api.errors.KworkValidationError"></a>
## KworkValidationError
```python
class KworkValidationError(KworkApiError)
```
Validation error (400).
<a id="kwork_api.errors.KworkValidationError.__init__"></a>
#### KworkValidationError.\_\_init\_\_
```python
def __init__(message: str = "Validation failed",
fields: Optional[dict[str, list[str]]] = None,
response: Optional[Any] = None)
```
<a id="kwork_api.errors.KworkValidationError.__str__"></a>
#### KworkValidationError.\_\_str\_\_
```python
def __str__() -> str
```
<a id="kwork_api.errors.KworkNetworkError"></a>
## KworkNetworkError
```python
class KworkNetworkError(KworkError)
```
Network/connection error.
<a id="kwork_api.errors.KworkNetworkError.__init__"></a>
#### KworkNetworkError.\_\_init\_\_
```python
def __init__(message: str = "Network error", response: Optional[Any] = None)
```
<a id="kwork_api.errors.KworkNetworkError.__str__"></a>
#### KworkNetworkError.\_\_str\_\_
```python
def __str__() -> str
```