# generated by fastapi-codegen:
# filename: openapi.yaml
# timestamp: 2025-06-29T09:05:54+00:00
from __future__ import annotations
from datetime import datetime
from enum import Enum
from typing import Any, Dict, List, Optional, Union
from pydantic import AnyUrl, BaseModel, Field, RootModel
class AccountEventPayload(BaseModel):
balance: Optional[float] = None
class AccountId(RootModel[str]):
root: str
class Comparator(Enum):
field_ = '='
field__1 = '<'
field__ = '<='
field__2 = '>'
field___1 = '>='
field___2 = '!='
class AttributeFilter(BaseModel):
comparator: Optional[Comparator] = None
name: Optional[str] = None
value: Optional[str] = None
class Campaign(BaseModel):
id: Optional[str] = None
class Filters(BaseModel):
attributes: Optional[List[str]] = None
contacts: Optional[List[str]] = None
tags: Optional[List[str]] = None
class Code(Enum):
M = 'M'
S = 'S'
FU = 'FU'
class Trigger(BaseModel):
code: Optional[Code] = Field(
None,
description='Campaign type specifies how it sources contacts and what event triggers its execution Sort order\n * `M` - Manual\n * `S` - Scheduled\n * `FU` - File Upload\n',
)
class CampaignRequest(BaseModel):
filters: Optional[Filters] = None
template: Optional[str] = None
trigger: Optional[Trigger] = None
class CampaignResponse(BaseModel):
data: Optional[Campaign] = None
success: Optional[bool] = None
class Mobile(BaseModel):
country: Optional[str] = None
number: Optional[str] = Field(None, examples=['123-456-7890'])
class ContactIdentifiers(BaseModel):
email: Optional[str] = Field(None, examples=['chris@sakari.io'])
firstName: Optional[str] = Field(None, examples=['Chris'])
id: Optional[str] = None
lastName: Optional[str] = Field(None, examples=['Bloggs'])
mobile: Optional[Mobile] = None
class Error(BaseModel):
code: Optional[str] = Field(None, examples=['CONT-010'])
description: Optional[str] = Field(
None, examples=['Contact has requested no further communication']
)
class Error1(BaseModel):
code: Optional[str] = Field(None, examples=['CONV-001'])
message: Optional[str] = Field(None, examples=['Invalid conversation id'])
class ErrorResponse(BaseModel):
error: Optional[Error1] = None
success: Optional[bool] = Field(False, examples=[False])
class EventType(Enum):
account = 'account'
messageStatus = 'messageStatus'
messageIncoming = 'messageIncoming'
class Conversation1(BaseModel):
id: Optional[str] = None
class MediaItem(BaseModel):
filename: Optional[str] = None
type: Optional[str] = None
url: Optional[str] = None
class MessageEventPayload(BaseModel):
contact: Optional[ContactIdentifiers] = None
error: Optional[str] = None
message: Optional[str] = None
status: Optional[str] = None
class Error2(BaseModel):
code: Optional[str] = None
message: Optional[str] = None
class Pagination(BaseModel):
limit: Optional[int] = None
offset: Optional[int] = None
totalCount: Optional[int] = None
class PaginatedResponse(BaseModel):
error: Optional[Error2] = None
pagination: Optional[Pagination] = None
success: Optional[bool] = None
class PhoneNumber(BaseModel):
active: Optional[bool] = None
country: Optional[str] = None
number: Optional[str] = None
class Filters1(BaseModel):
attributes: Optional[List[Dict[str, Any]]] = None
tags: Optional[List[str]] = None
class MediaItem1(BaseModel):
url: Optional[str] = None
class Group(BaseModel):
id: Optional[str] = None
class PhoneNumberFilter(BaseModel):
group: Optional[Group] = None
class Type(Enum):
SMS = 'SMS'
MMS = 'MMS'
class Data2(BaseModel):
expires: Optional[datetime] = None
link: Optional[str] = None
class ShareFileResponse(BaseModel):
data: Optional[Data2] = None
success: Optional[bool] = None
class Tag(BaseModel):
tag: Optional[str] = None
visible: Optional[bool] = None
class Type1(Enum):
SMS = 'SMS'
Web = 'Web'
class TemplateRequest(BaseModel):
name: Optional[str] = None
template: Optional[str] = Field(
None, examples=['Hi {{{firstName}}}. Grab 20% off today only at ABC Shoes']
)
type: Optional[Type1] = Field(None, examples=['SMS'])
class TokenRequest(BaseModel):
client_id: Optional[str] = Field(
None, examples=['00000000-0000-0000-0000-00000000000']
)
client_secret: Optional[str] = Field(
None, examples=['00000000-0000-0000-0000-00000000000']
)
grant_type: Optional[str] = Field(None, examples=['client_credentials'])
class TokenResponse(BaseModel):
access_token: Optional[str] = None
token_type: Optional[str] = None
class By(BaseModel):
firstName: Optional[str] = Field(None, examples=['Joe'])
id: Optional[str] = None
lastName: Optional[str] = Field(None, examples=['Bloggs'])
class Updated(BaseModel):
at: Optional[datetime] = None
by: Optional[By] = None
class EventType1(Enum):
message_received = 'message-received'
message_status = 'message-status'
message_sent = 'message-sent'
conversation_closed = 'conversation-closed'
contact_created = 'contact-created'
contact_updated = 'contact-updated'
contact_removed = 'contact-removed'
class Webhook(BaseModel):
eventTypes: Optional[List[EventType1]] = None
url: Optional[str] = None
class WebhookResponse(BaseModel):
data: Optional[Webhook] = None
success: Optional[bool] = None
class WebhooksResponse(PaginatedResponse):
data: Optional[List[Webhook]] = None
class V1AccountsAccountIdCampaignsCampaignIdDeleteResponse(BaseModel):
success: Optional[bool] = None
class MergeStrategy(Enum):
append = 'append'
core = 'core'
remove = 'remove'
class V1AccountsAccountIdContactsContactIdDeleteResponse(BaseModel):
success: Optional[bool] = None
class V1AccountsAccountIdTemplatesTemplateIdDeleteResponse(BaseModel):
success: Optional[bool] = None
class EventType2(Enum):
contact_created = 'contact-created'
contact_updated = 'contact-updated'
contact_removed = 'contact-removed'
message_received = 'message-received'
message_sent = 'message-sent'
message_status = 'message-status'
conversation_started = 'conversation-started'
contact_opt_out = 'contact-opt-out'
contact_opt_in = 'contact-opt-in'
list_opt_out = 'list-opt-out'
list_opt_in = 'list-opt-in'
class V1AccountsAccountIdWebhooksPostRequest(BaseModel):
eventTypes: Optional[List[EventType2]] = None
url: Optional[AnyUrl] = Field(
None, examples=['https://myserver.com/send/callback/here']
)
class V1ToolsSharefilePostRequest(BaseModel):
media: Optional[bytes] = None
class AccountEvent(BaseModel):
accountId: Optional[AccountId] = None
type: Optional[EventType] = None
class CampaignsResponse(PaginatedResponse):
data: Optional[List[Campaign]] = None
class ContactRequest(ContactIdentifiers):
attributes: Optional[Dict[str, Any]] = None
tags: Optional[List[Tag]] = None
class Event(BaseModel):
accountId: Optional[AccountId] = None
data: Optional[Union[AccountEventPayload, MessageEventPayload]] = None
eventId: Optional[str] = None
type: Optional[EventType] = None
class Message(BaseModel):
contact: Optional[ContactIdentifiers] = None
conversation: Optional[Conversation1] = None
created: Optional[Updated] = None
error: Optional[Error] = None
id: Optional[str] = None
media: Optional[List[MediaItem]] = Field(
None, description='List of media objects attached to message'
)
message: Optional[str] = None
outgoing: Optional[bool] = None
phoneNumber: Optional[str] = Field(None, examples=['+1234567890'])
price: Optional[float] = None
read: Optional[bool] = None
segments: Optional[float] = None
status: Optional[str] = None
template: Optional[str] = None
updated: Optional[Updated] = None
class MessageResponse(BaseModel):
data: Optional[Message] = None
success: Optional[bool] = None
class MessagesResponse(PaginatedResponse):
data: Optional[List[Message]] = None
class SendMessagesRequest(BaseModel):
contacts: Optional[List[ContactRequest]] = None
conversationStrategy: Optional[str] = None
conversations: Optional[List[str]] = Field(
None, description='List of conversation ids to send messages to'
)
filters: Optional[Filters1] = None
media: Optional[List[MediaItem1]] = Field(
None, description='List of media objects to attach to message'
)
phoneNumberFilter: Optional[PhoneNumberFilter] = None
template: Optional[str] = None
type: Optional[Type] = None
class Template(TemplateRequest):
id: Optional[str] = None
class TemplateResponse(BaseModel):
data: Optional[Template] = None
success: Optional[bool] = None
class TemplatesResponse(PaginatedResponse):
data: Optional[List[Template]] = None
class Contact(ContactRequest):
created: Optional[Updated] = None
error: Optional[Error] = None
updated: Optional[Updated] = None
valid: Optional[bool] = None
class ContactResponse(BaseModel):
data: Optional[Contact] = None
success: Optional[bool] = True
class Data(BaseModel):
contacts: Optional[List[Contact]] = Field(None, description='Uploaded contacts')
errors: Optional[List[Contact]] = Field(
None, description='Contacts that failed validation'
)
inserted: Optional[int] = None
submitted: Optional[int] = None
success: Optional[int] = None
updated: Optional[int] = None
class ContactUploadResponse(BaseModel):
data: Optional[Data] = None
success: Optional[bool] = True
class ContactsResponse(PaginatedResponse):
data: Optional[List[Contact]] = None
class Conversation(BaseModel):
closed: Optional[bool] = None
contact: Optional[ContactIdentifiers] = None
created: Optional[Updated] = None
id: Optional[str] = None
lastMessage: Optional[Message] = None
phoneNumber: Optional[PhoneNumber] = None
unread: Optional[List[str]] = None
updated: Optional[Updated] = None
class ConversationResponse(BaseModel):
data: Optional[Conversation] = None
success: Optional[bool] = None
class ConversationsResponse(PaginatedResponse):
data: Optional[List[Conversation]] = None
class Data1(BaseModel):
estimatedPrice: Optional[float] = None
invalid: Optional[List[Contact]] = None
jobId: Optional[str] = None
messages: Optional[List[Message]] = None
requested: Optional[int] = None
valid: Optional[int] = None
class SendMessagesResponse(BaseModel):
data: Optional[Data1] = None
class V1AccountsAccountIdContactsPostResponse(
RootModel[Union[ContactsResponse, ContactUploadResponse]]
):
root: Union[ContactsResponse, ContactUploadResponse]