openapi: 3.1.0 info: title: Mailmodo API description: >- Mailmodo is an AI-powered interactive email marketing and automation platform. Its public REST API enables developers to manage contacts and contact lists, trigger transactional and broadcast campaigns built from AMP-for-Email templates, send custom events into journeys, list templates and campaigns, and fetch campaign reports. All requests are authenticated via an API key issued from the Mailmodo dashboard (Settings -> API Keys) and passed in the `mmApiKey` HTTP header. version: "1.0.0" contact: name: Mailmodo url: https://www.mailmodo.com/developers/ servers: - url: https://api.mailmodo.com description: Production security: - ApiKeyAuth: [] tags: - name: Contacts description: Add, remove, archive, unsubscribe, resubscribe, and look up contacts - name: Contact Lists description: Manage the named contact lists used for segmentation and campaigns - name: Campaigns description: List campaigns, fetch reports, and trigger sends to individuals or lists - name: Templates description: List interactive AMP email templates available on the workspace - name: Events description: Send custom user events into Mailmodo journeys and segments paths: /api/v1/addToList: post: tags: [Contacts] summary: Add a Single Contact to a List description: >- Add (or update) one contact in a named contact list with optional custom attributes used for segmentation and personalization. operationId: addContactToList requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AddContactRequest' responses: '200': description: Contact added or updated content: application/json: schema: $ref: '#/components/schemas/AddContactResponse' /api/v1/addToList/batch: post: tags: [Contacts] summary: Add a Batch of Contacts to a List description: >- Add (or update) up to several thousand contacts to a list in a single request. operationId: addContactsToListBatch requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AddContactsBatchRequest' responses: '200': description: Batch accepted content: application/json: schema: $ref: '#/components/schemas/AddContactResponse' /api/v1/removeFromList: post: tags: [Contacts] summary: Remove a Contact From a List description: Remove a single contact from the named list but keep the contact record on the workspace. operationId: removeContactFromList requestBody: required: true content: application/json: schema: type: object required: [email, listName] properties: email: type: string format: email listName: type: string responses: '200': description: Contact removed from list content: application/json: schema: $ref: '#/components/schemas/AddContactResponse' /api/v1/contacts/unsubscribe: post: tags: [Contacts] summary: Unsubscribe a Contact description: Mark a contact as unsubscribed across the workspace. operationId: unsubscribeContact requestBody: required: true content: application/json: schema: type: object required: [email] properties: email: type: string format: email responses: '200': description: Contact unsubscribed content: application/json: schema: $ref: '#/components/schemas/AddContactResponse' /api/v1/contacts/resubscribe: post: tags: [Contacts] summary: Resubscribe a Contact description: Reverse the unsubscribed status for a contact. operationId: resubscribeContact requestBody: required: true content: application/json: schema: type: object required: [email] properties: email: type: string format: email responses: '200': description: Contact resubscribed content: application/json: schema: $ref: '#/components/schemas/AddContactResponse' /api/v1/contacts: delete: tags: [Contacts] summary: Archive a Contact description: Archive (soft-delete) a contact from the workspace. operationId: archiveContact parameters: - name: email in: query required: true schema: type: string format: email responses: '200': description: Contact archived content: application/json: schema: $ref: '#/components/schemas/AddContactResponse' /api/v1/getContactDetails: get: tags: [Contacts] summary: Get Contact Details description: Return profile information and list membership for a contact. operationId: getContactDetails parameters: - name: email in: query required: true schema: type: string format: email responses: '200': description: Contact details content: application/json: schema: $ref: '#/components/schemas/Contact' /api/v1/getAllContactLists: get: tags: [Contact Lists] summary: Get All Contact Lists description: Return the workspace's named contact lists with size and metadata. operationId: getAllContactLists responses: '200': description: Contact lists content: application/json: schema: type: object properties: success: type: boolean data: type: array items: $ref: '#/components/schemas/ContactList' /api/v1/triggerCampaign/{campaignId}: post: tags: [Campaigns] summary: Trigger a Transactional Campaign for One Recipient description: >- Send a configured campaign to a single recipient with merge data for personalization. Used for transactional sends and journey triggers. operationId: triggerCampaign parameters: - name: campaignId in: path required: true schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/TriggerCampaignRequest' responses: '200': description: Campaign triggered content: application/json: schema: $ref: '#/components/schemas/TriggerCampaignResponse' /api/v1/bulktriggerCampaign/{campaignId}: post: tags: [Campaigns] summary: Bulk Trigger a Campaign to Multiple Recipients description: >- Trigger a campaign for a list of recipients in a single request, with per-recipient merge data. operationId: bulkTriggerCampaign parameters: - name: campaignId in: path required: true schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/BulkTriggerCampaignRequest' responses: '200': description: Bulk send accepted content: application/json: schema: $ref: '#/components/schemas/TriggerCampaignResponse' /api/v1/campaigns: get: tags: [Campaigns] summary: List Campaigns description: Return campaigns configured on the workspace. operationId: listCampaigns responses: '200': description: Campaign list content: application/json: schema: type: object properties: success: type: boolean data: type: array items: $ref: '#/components/schemas/Campaign' /api/v1/campaignReports/{campaignId}: post: tags: [Campaigns] summary: Get Campaign Report description: Return delivery and engagement metrics for the given campaign. operationId: getCampaignReport parameters: - name: campaignId in: path required: true schema: type: string requestBody: required: false content: application/json: schema: type: object properties: startDate: type: string format: date endDate: type: string format: date responses: '200': description: Campaign report content: application/json: schema: $ref: '#/components/schemas/CampaignReport' /api/v1/getAllTemplates: get: tags: [Templates] summary: List Templates description: Return interactive AMP email templates available on the workspace. operationId: listTemplates responses: '200': description: Template list content: application/json: schema: type: object properties: success: type: boolean data: type: array items: $ref: '#/components/schemas/Template' /api/v1/addEvent: post: tags: [Events] summary: Send a Custom Event description: >- Send a custom user event into Mailmodo to drive journey enrollment, segmentation, and conditional logic. operationId: addEvent requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/EventRequest' responses: '200': description: Event accepted content: application/json: schema: $ref: '#/components/schemas/EventResponse' components: securitySchemes: ApiKeyAuth: type: apiKey in: header name: mmApiKey description: >- API key issued from the Mailmodo dashboard at https://manage.mailmodo.com/app/settings/apikey. Sent as the `mmApiKey` request header on every call. schemas: Contact: type: object properties: email: type: string format: email firstName: type: string lastName: type: string subscriptionStatus: type: string enum: [subscribed, unsubscribed, bounced, archived] lists: type: array items: type: string data: type: object additionalProperties: true AddContactRequest: type: object required: [email, listName] properties: email: type: string format: email listName: type: string data: type: object additionalProperties: true description: Optional custom attributes used for personalization and segmentation AddContactsBatchRequest: type: object required: [values, listName] properties: listName: type: string values: type: array items: $ref: '#/components/schemas/AddContactRequest' AddContactResponse: type: object properties: success: type: boolean message: type: string data: type: object additionalProperties: true ContactList: type: object properties: listId: type: string listName: type: string contactsCount: type: integer createdAt: type: string format: date-time Campaign: type: object properties: campaignId: type: string name: type: string type: type: string enum: [broadcast, transactional, journey, abtest] status: type: string createdAt: type: string format: date-time updatedAt: type: string format: date-time Template: type: object properties: templateId: type: string name: type: string amp: type: boolean createdAt: type: string format: date-time TriggerCampaignRequest: type: object required: [email] properties: email: type: string format: email data: type: object additionalProperties: true description: Merge data for template personalization addToList: type: boolean listName: type: string BulkTriggerCampaignRequest: type: object required: [recipients] properties: recipients: type: array items: type: object required: [email] properties: email: type: string format: email data: type: object additionalProperties: true TriggerCampaignResponse: type: object properties: success: type: boolean message: type: string ref: type: string CampaignReport: type: object properties: campaignId: type: string sent: type: integer delivered: type: integer opened: type: integer clicked: type: integer bounced: type: integer unsubscribed: type: integer formSubmissions: type: integer description: Submissions from AMP-for-Email interactive forms EventRequest: type: object required: [email, event_name] properties: email: type: string format: email event_name: type: string event_properties: type: object additionalProperties: true EventResponse: type: object properties: success: type: boolean message: type: string