Skip to main content
Glama
models.py11 kB
# 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]

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ag2-mcp-servers/sakari'

If you have feedback or need assistance with the MCP directory API, please join our Discord server