sendx-ruby-sdk 1.1.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +220 -81
- data/lib/sendx-ruby-sdk/api/campaign_api.rb +95 -143
- data/lib/sendx-ruby-sdk/api/contact_api.rb +129 -96
- data/lib/sendx-ruby-sdk/api/custom_field_api.rb +391 -0
- data/lib/sendx-ruby-sdk/api/email_sending_api.rb +158 -0
- data/lib/sendx-ruby-sdk/api/event_api.rb +91 -57
- data/lib/sendx-ruby-sdk/api/events_api.rb +158 -0
- data/lib/sendx-ruby-sdk/api/getting_started_api.rb +2 -2
- data/lib/sendx-ruby-sdk/api/list_api.rb +126 -91
- data/lib/sendx-ruby-sdk/api/post_api.rb +380 -0
- data/lib/sendx-ruby-sdk/api/post_category_api.rb +362 -0
- data/lib/sendx-ruby-sdk/api/post_tag_api.rb +362 -0
- data/lib/sendx-ruby-sdk/api/report_api.rb +90 -0
- data/lib/sendx-ruby-sdk/api/reports_api.rb +4 -4
- data/lib/sendx-ruby-sdk/api/sender_api.rb +28 -37
- data/lib/sendx-ruby-sdk/api/tag_api.rb +380 -0
- data/lib/sendx-ruby-sdk/api/tags_api.rb +8 -8
- data/lib/sendx-ruby-sdk/api/team_member_api.rb +147 -0
- data/lib/sendx-ruby-sdk/api/template_api.rb +391 -0
- data/lib/sendx-ruby-sdk/api/tracking_api.rb +158 -0
- data/lib/sendx-ruby-sdk/api/webhook_api.rb +362 -0
- data/lib/sendx-ruby-sdk/api_client.rb +10 -11
- data/lib/sendx-ruby-sdk/api_error.rb +3 -3
- data/lib/sendx-ruby-sdk/configuration.rb +6 -10
- data/lib/sendx-ruby-sdk/models/campaign.rb +23 -7
- data/lib/sendx-ruby-sdk/models/campaign_dashboard_data.rb +11 -5
- data/lib/sendx-ruby-sdk/models/campaign_request.rb +13 -41
- data/lib/sendx-ruby-sdk/models/contact.rb +11 -5
- data/lib/sendx-ruby-sdk/models/contact_request.rb +11 -5
- data/lib/sendx-ruby-sdk/models/create_response.rb +11 -5
- data/lib/sendx-ruby-sdk/models/custom_event_request.rb +37 -42
- data/lib/sendx-ruby-sdk/models/custom_field.rb +285 -0
- data/lib/sendx-ruby-sdk/models/customfield_customfield_id_delete200_response.rb +220 -0
- data/lib/sendx-ruby-sdk/models/dashboard_stats.rb +11 -5
- data/lib/sendx-ruby-sdk/models/delete_campaign200_response.rb +11 -5
- data/lib/sendx-ruby-sdk/models/delete_request.rb +11 -5
- data/lib/sendx-ruby-sdk/models/delete_response.rb +77 -13
- data/lib/sendx-ruby-sdk/models/e_custom_field.rb +295 -0
- data/lib/sendx-ruby-sdk/models/error_response.rb +288 -0
- data/lib/sendx-ruby-sdk/models/event_response.rb +13 -19
- data/lib/sendx-ruby-sdk/models/events_revenue_postback_get200_response.rb +229 -0
- data/lib/sendx-ruby-sdk/models/events_revenue_postback_get400_response.rb +220 -0
- data/lib/sendx-ruby-sdk/models/events_revenue_postback_get500_response.rb +220 -0
- data/lib/sendx-ruby-sdk/models/identify_error_response.rb +220 -0
- data/lib/sendx-ruby-sdk/models/identify_request.rb +52 -40
- data/lib/sendx-ruby-sdk/models/identify_response.rb +16 -19
- data/lib/sendx-ruby-sdk/models/last_sent_campaign_stat.rb +11 -5
- data/lib/sendx-ruby-sdk/models/link_stat.rb +232 -0
- data/lib/sendx-ruby-sdk/models/list_model.rb +11 -6
- data/lib/sendx-ruby-sdk/models/list_request.rb +11 -5
- data/lib/sendx-ruby-sdk/models/message_response.rb +229 -0
- data/lib/sendx-ruby-sdk/models/operation_response.rb +241 -0
- data/lib/sendx-ruby-sdk/models/postback_response.rb +229 -0
- data/lib/sendx-ruby-sdk/models/report_data.rb +11 -5
- data/lib/sendx-ruby-sdk/models/response.rb +11 -5
- data/lib/sendx-ruby-sdk/models/rest_e_campaign.rb +539 -0
- data/lib/sendx-ruby-sdk/models/rest_e_contact.rb +380 -0
- data/lib/sendx-ruby-sdk/models/rest_e_custom_field.rb +299 -0
- data/lib/sendx-ruby-sdk/models/rest_e_list.rb +238 -0
- data/lib/sendx-ruby-sdk/models/rest_e_post.rb +443 -0
- data/lib/sendx-ruby-sdk/models/rest_e_post_category.rb +238 -0
- data/lib/sendx-ruby-sdk/models/rest_e_post_tag.rb +238 -0
- data/lib/sendx-ruby-sdk/models/rest_e_sender.rb +265 -0
- data/lib/sendx-ruby-sdk/models/rest_e_tag.rb +238 -0
- data/lib/sendx-ruby-sdk/models/rest_e_template.rb +307 -0
- data/lib/sendx-ruby-sdk/models/rest_e_webhook.rb +349 -0
- data/lib/sendx-ruby-sdk/models/rest_r_campaign.rb +580 -0
- data/lib/sendx-ruby-sdk/models/rest_r_contact.rb +438 -0
- data/lib/sendx-ruby-sdk/models/rest_r_custom_field.rb +306 -0
- data/lib/sendx-ruby-sdk/models/rest_r_list.rb +291 -0
- data/lib/sendx-ruby-sdk/models/rest_r_member.rb +274 -0
- data/lib/sendx-ruby-sdk/models/rest_r_post.rb +384 -0
- data/lib/sendx-ruby-sdk/models/rest_r_post_category.rb +251 -0
- data/lib/sendx-ruby-sdk/models/rest_r_post_tag.rb +250 -0
- data/lib/sendx-ruby-sdk/models/rest_r_sender.rb +272 -0
- data/lib/sendx-ruby-sdk/models/rest_r_tag.rb +272 -0
- data/lib/sendx-ruby-sdk/models/rest_r_template.rb +366 -0
- data/lib/sendx-ruby-sdk/models/rest_r_webhook.rb +326 -0
- data/lib/sendx-ruby-sdk/models/rest_report_data.rb +312 -0
- data/lib/sendx-ruby-sdk/models/revenue_event_request.rb +37 -42
- data/lib/sendx-ruby-sdk/models/sender.rb +41 -5
- data/lib/sendx-ruby-sdk/models/sender_request.rb +31 -5
- data/lib/sendx-ruby-sdk/models/sender_response.rb +51 -5
- data/lib/sendx-ruby-sdk/models/tag.rb +11 -5
- data/lib/sendx-ruby-sdk/models/tag_request.rb +11 -5
- data/lib/sendx-ruby-sdk/models/template_email_message.rb +337 -0
- data/lib/sendx-ruby-sdk/models/track_request.rb +28 -20
- data/lib/sendx-ruby-sdk/models/track_response.rb +12 -6
- data/lib/sendx-ruby-sdk/models/webhook.rb +311 -0
- data/lib/sendx-ruby-sdk/models/webhook_object.rb +451 -0
- data/lib/sendx-ruby-sdk/models/webhook_request.rb +291 -0
- data/lib/sendx-ruby-sdk/models/x_attachment.rb +263 -0
- data/lib/sendx-ruby-sdk/models/x_email_message.rb +356 -0
- data/lib/sendx-ruby-sdk/models/x_email_response.rb +261 -0
- data/lib/sendx-ruby-sdk/models/x_from.rb +246 -0
- data/lib/sendx-ruby-sdk/models/x_reply_to.rb +246 -0
- data/lib/sendx-ruby-sdk/models/xto.rb +279 -0
- data/lib/sendx-ruby-sdk/version.rb +4 -4
- data/lib/sendx-ruby-sdk.rb +53 -25
- data/spec/api/custom_field_api_spec.rb +98 -0
- data/spec/api/email_sending_api_spec.rb +59 -0
- data/spec/api/events_api_spec.rb +59 -0
- data/spec/api/post_api_spec.rb +97 -0
- data/spec/api/post_category_api_spec.rb +95 -0
- data/spec/api/post_tag_api_spec.rb +95 -0
- data/spec/api/report_api_spec.rb +47 -0
- data/spec/api/tag_api_spec.rb +97 -0
- data/spec/api/team_member_api_spec.rb +58 -0
- data/spec/api/template_api_spec.rb +98 -0
- data/spec/api/tracking_api_spec.rb +59 -0
- data/spec/api/webhook_api_spec.rb +95 -0
- data/spec/models/custom_field_spec.rb +58 -0
- data/spec/models/customfield_customfield_id_delete200_response_spec.rb +36 -0
- data/spec/models/e_custom_field_spec.rb +64 -0
- data/spec/models/error_response_spec.rb +46 -0
- data/spec/models/events_revenue_postback_get200_response_spec.rb +42 -0
- data/spec/models/events_revenue_postback_get400_response_spec.rb +36 -0
- data/spec/models/events_revenue_postback_get500_response_spec.rb +36 -0
- data/spec/models/identify_error_response_spec.rb +36 -0
- data/spec/models/link_stat_spec.rb +42 -0
- data/spec/models/message_response_spec.rb +42 -0
- data/spec/models/operation_response_spec.rb +48 -0
- data/spec/models/postback_response_spec.rb +42 -0
- data/spec/models/rest_e_campaign_spec.rb +154 -0
- data/spec/models/rest_e_contact_spec.rb +78 -0
- data/spec/models/rest_e_custom_field_spec.rb +52 -0
- data/spec/models/rest_e_list_spec.rb +36 -0
- data/spec/models/rest_e_post_category_spec.rb +36 -0
- data/spec/models/rest_e_post_spec.rb +144 -0
- data/spec/models/rest_e_post_tag_spec.rb +36 -0
- data/spec/models/rest_e_sender_spec.rb +42 -0
- data/spec/models/rest_e_tag_spec.rb +36 -0
- data/spec/models/rest_e_template_spec.rb +66 -0
- data/spec/models/rest_e_webhook_spec.rb +84 -0
- data/spec/models/rest_r_campaign_spec.rb +178 -0
- data/spec/models/rest_r_contact_spec.rb +150 -0
- data/spec/models/rest_r_custom_field_spec.rb +58 -0
- data/spec/models/rest_r_list_spec.rb +64 -0
- data/spec/models/rest_r_member_spec.rb +72 -0
- data/spec/models/rest_r_post_category_spec.rb +54 -0
- data/spec/models/rest_r_post_spec.rb +144 -0
- data/spec/models/rest_r_post_tag_spec.rb +54 -0
- data/spec/models/rest_r_sender_spec.rb +54 -0
- data/spec/models/rest_r_tag_spec.rb +54 -0
- data/spec/models/rest_r_template_spec.rb +94 -0
- data/spec/models/rest_r_webhook_spec.rb +90 -0
- data/spec/models/rest_report_data_spec.rb +90 -0
- data/spec/models/template_email_message_spec.rb +72 -0
- data/spec/models/webhook_object_spec.rb +180 -0
- data/spec/models/webhook_request_spec.rb +78 -0
- data/spec/models/webhook_spec.rb +90 -0
- data/spec/models/x_attachment_spec.rb +42 -0
- data/spec/models/x_email_message_spec.rb +90 -0
- data/spec/models/x_email_response_spec.rb +60 -0
- data/spec/models/x_from_spec.rb +42 -0
- data/spec/models/x_reply_to_spec.rb +42 -0
- data/spec/models/xto_spec.rb +60 -0
- data/spec/spec_helper.rb +3 -3
- metadata +202 -28
@@ -0,0 +1,312 @@
|
|
1
|
+
=begin
|
2
|
+
#SendX REST API
|
3
|
+
|
4
|
+
## SendX REST API Documentation ## 🚀 Introduction The SendX API is organized around REST principles. Our API has predictable resource-oriented URLs, accepts JSON-encoded request bodies, returns JSON-encoded responses, and uses standard HTTP response codes, authentication, and verbs. **Key Features:** - 🔒 **Security**: Team-based authentication with optional member-level access - 🎯 **Resource-Oriented**: RESTful design with clear resource boundaries - 📊 **Rich Data Models**: Three-layer model system (Input/Output/Internal) - 🔗 **Relationships**: Automatic prefix handling for resource relationships - 📈 **Scalable**: Built for high-volume email marketing operations ## 🏗️ Architecture Overview SendX uses a three-layer model architecture: 1. **Input Models** (`RestE*`): For API requests 2. **Output Models** (`RestR*`): For API responses with prefixed IDs 3. **Internal Models**: Core business logic (not exposed in API) ## 🔐 Security & Authentication SendX uses API key authentication: ### Team API Key ```http X-Team-ApiKey: YOUR_TEAM_API_KEY ``` - **Required for all requests** - Team-level access to resources - Available in SendX Settings → Team API Key ## 🆔 Encrypted ID System SendX uses encrypted IDs for security and better developer experience: - **Internal IDs**: Sequential integers (not exposed) - **Encrypted IDs**: 22-character alphanumeric strings - **Prefixed IDs**: Resource-type prefixes in API responses (`contact_<22-char-id>`) ### ID Format **All resource IDs follow this pattern:** ``` <resource_prefix>_<22_character_alphanumeric_string> ``` **Example:** ```json { \"id\": \"contact_BnKjkbBBS500CoBCP0oChQ\", \"lists\": [\"list_OcuxJHdiAvujmwQVJfd3ss\", \"list_0tOFLp5RgV7s3LNiHrjGYs\"], \"tags\": [\"tag_UhsDkjL772Qbj5lWtT62VK\", \"tag_fL7t9lsnZ9swvx2HrtQ9wM\"] } ``` ## 📚 Resource Prefixes | Resource | Prefix | Example | |----------|--------|---------| | Contact | `contact_` | `contact_BnKjkbBBS500CoBCP0oChQ` | | Campaign | `campaign_` | `campaign_LUE9BTxmksSmqHWbh96zsn` | | List | `list_` | `list_OcuxJHdiAvujmwQVJfd3ss` | | Tag | `tag_` | `tag_UhsDkjL772Qbj5lWtT62VK` | | Sender | `sender_` | `sender_4vK3WFhMgvOwUNyaL4QxCD` | | Template | `template_` | `template_f3lJvTEhSjKGVb5Lwc5SWS` | | Custom Field | `field_` | `field_MnuqBAG2NPLm7PZMWbjQxt` | | Webhook | `webhook_` | `webhook_9l154iiXlZoPo7vngmamee` | | Post | `post_` | `post_XyZ123aBc456DeF789GhI` | | Post Category | `post_category_` | `post_category_YzS1wOU20yw87UUHKxMzwn` | | Post Tag | `post_tag_` | `post_tag_123XyZ456AbC` | | Member | `member_` | `member_JkL012MnO345PqR678` | ## 🎯 Best Practices ### Error Handling - **Always check status codes**: 2xx = success, 4xx = client error, 5xx = server error - **Read error messages**: Descriptive messages help debug issues - **Handle rate limits**: Respect API rate limits for optimal performance ### Data Validation - **Email format**: Must be valid email addresses - **Required fields**: Check documentation for mandatory fields - **Field lengths**: Respect maximum length constraints ### Performance - **Pagination**: Use offset/limit for large datasets - **Batch operations**: Process multiple items when supported - **Caching**: Cache responses when appropriate ## 🛠️ SDKs & Integration Official SDKs available for: - [Golang](https://github.com/sendx/sendx-go-sdk) - [Python](https://github.com/sendx/sendx-python-sdk) - [Ruby](https://github.com/sendx/sendx-ruby-sdk) - [Java](https://github.com/sendx/sendx-java-sdk) - [PHP](https://github.com/sendx/sendx-php-sdk) - [JavaScript](https://github.com/sendx/sendx-javascript-sdk) ## 📞 Support Need help? Contact us: - 💬 **Website Chat**: Available on sendx.io - 📧 **Email**: hello@sendx.io - 📚 **Documentation**: Full guides at help.sendx.io --- **API Endpoint:** `https://api.sendx.io/api/v1/rest` [<img src=\"https://run.pstmn.io/button.svg\" alt=\"Run In Postman\" style=\"width: 128px; height: 32px;\">](https://god.gw.postman.com/run-collection/33476323-44b198b0-5219-4619-a01f-cfc24d573885?action=collection%2Ffork&source=rip_markdown&collection-url=entityId%3D33476323-44b198b0-5219-4619-a01f-cfc24d573885%26entityType%3Dcollection%26workspaceId%3D6b1e4f65-96a9-4136-9512-6266c852517e)
|
5
|
+
|
6
|
+
The version of the OpenAPI document: 1.0.0
|
7
|
+
Contact: hello@sendx.io
|
8
|
+
Generated by: https://openapi-generator.tech
|
9
|
+
Generator version: 7.13.0
|
10
|
+
|
11
|
+
=end
|
12
|
+
|
13
|
+
require 'date'
|
14
|
+
require 'time'
|
15
|
+
|
16
|
+
module SendX
|
17
|
+
class RestReportData
|
18
|
+
# Unique identifier of the campaign
|
19
|
+
attr_accessor :campaign_id
|
20
|
+
|
21
|
+
attr_accessor :link_stats
|
22
|
+
|
23
|
+
# Total number of unique contacts who clicked on the link
|
24
|
+
attr_accessor :clicked_unique_contact_count
|
25
|
+
|
26
|
+
# Total number of unique contacts who opened the link
|
27
|
+
attr_accessor :opened_unique_contact_count
|
28
|
+
|
29
|
+
# Total number of contacts who sent the link
|
30
|
+
attr_accessor :sent_contact_count
|
31
|
+
|
32
|
+
# Total number of contacts who unsubscribed from the link
|
33
|
+
attr_accessor :unsubscribe_contact_count
|
34
|
+
|
35
|
+
# Total number of contacts who bounced the link
|
36
|
+
attr_accessor :bounce_contact_count
|
37
|
+
|
38
|
+
# Total number of contacts who marked the link as spam
|
39
|
+
attr_accessor :spam_contact_count
|
40
|
+
|
41
|
+
# Total number of contacts who clicked on the link
|
42
|
+
attr_accessor :clicked_contact_count
|
43
|
+
|
44
|
+
# Total number of contacts who opened the link
|
45
|
+
attr_accessor :opened_contact_count
|
46
|
+
|
47
|
+
# Attribute mapping from ruby-style variable name to JSON key.
|
48
|
+
def self.attribute_map
|
49
|
+
{
|
50
|
+
:'campaign_id' => :'campaignId',
|
51
|
+
:'link_stats' => :'linkStats',
|
52
|
+
:'clicked_unique_contact_count' => :'clickedUniqueContactCount',
|
53
|
+
:'opened_unique_contact_count' => :'openedUniqueContactCount',
|
54
|
+
:'sent_contact_count' => :'sentContactCount',
|
55
|
+
:'unsubscribe_contact_count' => :'unsubscribeContactCount',
|
56
|
+
:'bounce_contact_count' => :'bounceContactCount',
|
57
|
+
:'spam_contact_count' => :'spamContactCount',
|
58
|
+
:'clicked_contact_count' => :'clickedContactCount',
|
59
|
+
:'opened_contact_count' => :'openedContactCount'
|
60
|
+
}
|
61
|
+
end
|
62
|
+
|
63
|
+
# Returns attribute mapping this model knows about
|
64
|
+
def self.acceptable_attribute_map
|
65
|
+
attribute_map
|
66
|
+
end
|
67
|
+
|
68
|
+
# Returns all the JSON keys this model knows about
|
69
|
+
def self.acceptable_attributes
|
70
|
+
acceptable_attribute_map.values
|
71
|
+
end
|
72
|
+
|
73
|
+
# Attribute type mapping.
|
74
|
+
def self.openapi_types
|
75
|
+
{
|
76
|
+
:'campaign_id' => :'String',
|
77
|
+
:'link_stats' => :'Array<LinkStat>',
|
78
|
+
:'clicked_unique_contact_count' => :'Integer',
|
79
|
+
:'opened_unique_contact_count' => :'Integer',
|
80
|
+
:'sent_contact_count' => :'Integer',
|
81
|
+
:'unsubscribe_contact_count' => :'Integer',
|
82
|
+
:'bounce_contact_count' => :'Integer',
|
83
|
+
:'spam_contact_count' => :'Integer',
|
84
|
+
:'clicked_contact_count' => :'Integer',
|
85
|
+
:'opened_contact_count' => :'Integer'
|
86
|
+
}
|
87
|
+
end
|
88
|
+
|
89
|
+
# List of attributes with nullable: true
|
90
|
+
def self.openapi_nullable
|
91
|
+
Set.new([
|
92
|
+
])
|
93
|
+
end
|
94
|
+
|
95
|
+
# Initializes the object
|
96
|
+
# @param [Hash] attributes Model attributes in the form of hash
|
97
|
+
def initialize(attributes = {})
|
98
|
+
if (!attributes.is_a?(Hash))
|
99
|
+
fail ArgumentError, "The input argument (attributes) must be a hash in `SendX::RestReportData` initialize method"
|
100
|
+
end
|
101
|
+
|
102
|
+
# check to see if the attribute exists and convert string to symbol for hash key
|
103
|
+
acceptable_attribute_map = self.class.acceptable_attribute_map
|
104
|
+
attributes = attributes.each_with_object({}) { |(k, v), h|
|
105
|
+
if (!acceptable_attribute_map.key?(k.to_sym))
|
106
|
+
fail ArgumentError, "`#{k}` is not a valid attribute in `SendX::RestReportData`. Please check the name to make sure it's valid. List of attributes: " + acceptable_attribute_map.keys.inspect
|
107
|
+
end
|
108
|
+
h[k.to_sym] = v
|
109
|
+
}
|
110
|
+
|
111
|
+
if attributes.key?(:'campaign_id')
|
112
|
+
self.campaign_id = attributes[:'campaign_id']
|
113
|
+
end
|
114
|
+
|
115
|
+
if attributes.key?(:'link_stats')
|
116
|
+
if (value = attributes[:'link_stats']).is_a?(Array)
|
117
|
+
self.link_stats = value
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
if attributes.key?(:'clicked_unique_contact_count')
|
122
|
+
self.clicked_unique_contact_count = attributes[:'clicked_unique_contact_count']
|
123
|
+
end
|
124
|
+
|
125
|
+
if attributes.key?(:'opened_unique_contact_count')
|
126
|
+
self.opened_unique_contact_count = attributes[:'opened_unique_contact_count']
|
127
|
+
end
|
128
|
+
|
129
|
+
if attributes.key?(:'sent_contact_count')
|
130
|
+
self.sent_contact_count = attributes[:'sent_contact_count']
|
131
|
+
end
|
132
|
+
|
133
|
+
if attributes.key?(:'unsubscribe_contact_count')
|
134
|
+
self.unsubscribe_contact_count = attributes[:'unsubscribe_contact_count']
|
135
|
+
end
|
136
|
+
|
137
|
+
if attributes.key?(:'bounce_contact_count')
|
138
|
+
self.bounce_contact_count = attributes[:'bounce_contact_count']
|
139
|
+
end
|
140
|
+
|
141
|
+
if attributes.key?(:'spam_contact_count')
|
142
|
+
self.spam_contact_count = attributes[:'spam_contact_count']
|
143
|
+
end
|
144
|
+
|
145
|
+
if attributes.key?(:'clicked_contact_count')
|
146
|
+
self.clicked_contact_count = attributes[:'clicked_contact_count']
|
147
|
+
end
|
148
|
+
|
149
|
+
if attributes.key?(:'opened_contact_count')
|
150
|
+
self.opened_contact_count = attributes[:'opened_contact_count']
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
# Show invalid properties with the reasons. Usually used together with valid?
|
155
|
+
# @return Array for valid properties with the reasons
|
156
|
+
def list_invalid_properties
|
157
|
+
warn '[DEPRECATED] the `list_invalid_properties` method is obsolete'
|
158
|
+
invalid_properties = Array.new
|
159
|
+
invalid_properties
|
160
|
+
end
|
161
|
+
|
162
|
+
# Check to see if the all the properties in the model are valid
|
163
|
+
# @return true if the model is valid
|
164
|
+
def valid?
|
165
|
+
warn '[DEPRECATED] the `valid?` method is obsolete'
|
166
|
+
true
|
167
|
+
end
|
168
|
+
|
169
|
+
# Checks equality by comparing each attribute.
|
170
|
+
# @param [Object] Object to be compared
|
171
|
+
def ==(o)
|
172
|
+
return true if self.equal?(o)
|
173
|
+
self.class == o.class &&
|
174
|
+
campaign_id == o.campaign_id &&
|
175
|
+
link_stats == o.link_stats &&
|
176
|
+
clicked_unique_contact_count == o.clicked_unique_contact_count &&
|
177
|
+
opened_unique_contact_count == o.opened_unique_contact_count &&
|
178
|
+
sent_contact_count == o.sent_contact_count &&
|
179
|
+
unsubscribe_contact_count == o.unsubscribe_contact_count &&
|
180
|
+
bounce_contact_count == o.bounce_contact_count &&
|
181
|
+
spam_contact_count == o.spam_contact_count &&
|
182
|
+
clicked_contact_count == o.clicked_contact_count &&
|
183
|
+
opened_contact_count == o.opened_contact_count
|
184
|
+
end
|
185
|
+
|
186
|
+
# @see the `==` method
|
187
|
+
# @param [Object] Object to be compared
|
188
|
+
def eql?(o)
|
189
|
+
self == o
|
190
|
+
end
|
191
|
+
|
192
|
+
# Calculates hash code according to all attributes.
|
193
|
+
# @return [Integer] Hash code
|
194
|
+
def hash
|
195
|
+
[campaign_id, link_stats, clicked_unique_contact_count, opened_unique_contact_count, sent_contact_count, unsubscribe_contact_count, bounce_contact_count, spam_contact_count, clicked_contact_count, opened_contact_count].hash
|
196
|
+
end
|
197
|
+
|
198
|
+
# Builds the object from hash
|
199
|
+
# @param [Hash] attributes Model attributes in the form of hash
|
200
|
+
# @return [Object] Returns the model itself
|
201
|
+
def self.build_from_hash(attributes)
|
202
|
+
return nil unless attributes.is_a?(Hash)
|
203
|
+
attributes = attributes.transform_keys(&:to_sym)
|
204
|
+
transformed_hash = {}
|
205
|
+
openapi_types.each_pair do |key, type|
|
206
|
+
if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil?
|
207
|
+
transformed_hash["#{key}"] = nil
|
208
|
+
elsif type =~ /\AArray<(.*)>/i
|
209
|
+
# check to ensure the input is an array given that the attribute
|
210
|
+
# is documented as an array but the input is not
|
211
|
+
if attributes[attribute_map[key]].is_a?(Array)
|
212
|
+
transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) }
|
213
|
+
end
|
214
|
+
elsif !attributes[attribute_map[key]].nil?
|
215
|
+
transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]])
|
216
|
+
end
|
217
|
+
end
|
218
|
+
new(transformed_hash)
|
219
|
+
end
|
220
|
+
|
221
|
+
# Deserializes the data based on type
|
222
|
+
# @param string type Data type
|
223
|
+
# @param string value Value to be deserialized
|
224
|
+
# @return [Object] Deserialized data
|
225
|
+
def self._deserialize(type, value)
|
226
|
+
case type.to_sym
|
227
|
+
when :Time
|
228
|
+
Time.parse(value)
|
229
|
+
when :Date
|
230
|
+
Date.parse(value)
|
231
|
+
when :String
|
232
|
+
value.to_s
|
233
|
+
when :Integer
|
234
|
+
value.to_i
|
235
|
+
when :Float
|
236
|
+
value.to_f
|
237
|
+
when :Boolean
|
238
|
+
if value.to_s =~ /\A(true|t|yes|y|1)\z/i
|
239
|
+
true
|
240
|
+
else
|
241
|
+
false
|
242
|
+
end
|
243
|
+
when :Object
|
244
|
+
# generic object (usually a Hash), return directly
|
245
|
+
value
|
246
|
+
when /\AArray<(?<inner_type>.+)>\z/
|
247
|
+
inner_type = Regexp.last_match[:inner_type]
|
248
|
+
value.map { |v| _deserialize(inner_type, v) }
|
249
|
+
when /\AHash<(?<k_type>.+?), (?<v_type>.+)>\z/
|
250
|
+
k_type = Regexp.last_match[:k_type]
|
251
|
+
v_type = Regexp.last_match[:v_type]
|
252
|
+
{}.tap do |hash|
|
253
|
+
value.each do |k, v|
|
254
|
+
hash[_deserialize(k_type, k)] = _deserialize(v_type, v)
|
255
|
+
end
|
256
|
+
end
|
257
|
+
else # model
|
258
|
+
# models (e.g. Pet) or oneOf
|
259
|
+
klass = SendX.const_get(type)
|
260
|
+
klass.respond_to?(:openapi_any_of) || klass.respond_to?(:openapi_one_of) ? klass.build(value) : klass.build_from_hash(value)
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
# Returns the string representation of the object
|
265
|
+
# @return [String] String presentation of the object
|
266
|
+
def to_s
|
267
|
+
to_hash.to_s
|
268
|
+
end
|
269
|
+
|
270
|
+
# to_body is an alias to to_hash (backward compatibility)
|
271
|
+
# @return [Hash] Returns the object in the form of hash
|
272
|
+
def to_body
|
273
|
+
to_hash
|
274
|
+
end
|
275
|
+
|
276
|
+
# Returns the object in the form of hash
|
277
|
+
# @return [Hash] Returns the object in the form of hash
|
278
|
+
def to_hash
|
279
|
+
hash = {}
|
280
|
+
self.class.attribute_map.each_pair do |attr, param|
|
281
|
+
value = self.send(attr)
|
282
|
+
if value.nil?
|
283
|
+
is_nullable = self.class.openapi_nullable.include?(attr)
|
284
|
+
next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}"))
|
285
|
+
end
|
286
|
+
|
287
|
+
hash[param] = _to_hash(value)
|
288
|
+
end
|
289
|
+
hash
|
290
|
+
end
|
291
|
+
|
292
|
+
# Outputs non-array value in the form of hash
|
293
|
+
# For object, use to_hash. Otherwise, just return the value
|
294
|
+
# @param [Object] value Any valid value
|
295
|
+
# @return [Hash] Returns the value in the form of hash
|
296
|
+
def _to_hash(value)
|
297
|
+
if value.is_a?(Array)
|
298
|
+
value.compact.map { |v| _to_hash(v) }
|
299
|
+
elsif value.is_a?(Hash)
|
300
|
+
{}.tap do |hash|
|
301
|
+
value.each { |k, v| hash[k] = _to_hash(v) }
|
302
|
+
end
|
303
|
+
elsif value.respond_to? :to_hash
|
304
|
+
value.to_hash
|
305
|
+
else
|
306
|
+
value
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
end
|
311
|
+
|
312
|
+
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
=begin
|
2
2
|
#SendX REST API
|
3
3
|
|
4
|
-
## Introduction SendX is
|
4
|
+
## SendX REST API Documentation ## 🚀 Introduction The SendX API is organized around REST principles. Our API has predictable resource-oriented URLs, accepts JSON-encoded request bodies, returns JSON-encoded responses, and uses standard HTTP response codes, authentication, and verbs. **Key Features:** - 🔒 **Security**: Team-based authentication with optional member-level access - 🎯 **Resource-Oriented**: RESTful design with clear resource boundaries - 📊 **Rich Data Models**: Three-layer model system (Input/Output/Internal) - 🔗 **Relationships**: Automatic prefix handling for resource relationships - 📈 **Scalable**: Built for high-volume email marketing operations ## 🏗️ Architecture Overview SendX uses a three-layer model architecture: 1. **Input Models** (`RestE*`): For API requests 2. **Output Models** (`RestR*`): For API responses with prefixed IDs 3. **Internal Models**: Core business logic (not exposed in API) ## 🔐 Security & Authentication SendX uses API key authentication: ### Team API Key ```http X-Team-ApiKey: YOUR_TEAM_API_KEY ``` - **Required for all requests** - Team-level access to resources - Available in SendX Settings → Team API Key ## 🆔 Encrypted ID System SendX uses encrypted IDs for security and better developer experience: - **Internal IDs**: Sequential integers (not exposed) - **Encrypted IDs**: 22-character alphanumeric strings - **Prefixed IDs**: Resource-type prefixes in API responses (`contact_<22-char-id>`) ### ID Format **All resource IDs follow this pattern:** ``` <resource_prefix>_<22_character_alphanumeric_string> ``` **Example:** ```json { \"id\": \"contact_BnKjkbBBS500CoBCP0oChQ\", \"lists\": [\"list_OcuxJHdiAvujmwQVJfd3ss\", \"list_0tOFLp5RgV7s3LNiHrjGYs\"], \"tags\": [\"tag_UhsDkjL772Qbj5lWtT62VK\", \"tag_fL7t9lsnZ9swvx2HrtQ9wM\"] } ``` ## 📚 Resource Prefixes | Resource | Prefix | Example | |----------|--------|---------| | Contact | `contact_` | `contact_BnKjkbBBS500CoBCP0oChQ` | | Campaign | `campaign_` | `campaign_LUE9BTxmksSmqHWbh96zsn` | | List | `list_` | `list_OcuxJHdiAvujmwQVJfd3ss` | | Tag | `tag_` | `tag_UhsDkjL772Qbj5lWtT62VK` | | Sender | `sender_` | `sender_4vK3WFhMgvOwUNyaL4QxCD` | | Template | `template_` | `template_f3lJvTEhSjKGVb5Lwc5SWS` | | Custom Field | `field_` | `field_MnuqBAG2NPLm7PZMWbjQxt` | | Webhook | `webhook_` | `webhook_9l154iiXlZoPo7vngmamee` | | Post | `post_` | `post_XyZ123aBc456DeF789GhI` | | Post Category | `post_category_` | `post_category_YzS1wOU20yw87UUHKxMzwn` | | Post Tag | `post_tag_` | `post_tag_123XyZ456AbC` | | Member | `member_` | `member_JkL012MnO345PqR678` | ## 🎯 Best Practices ### Error Handling - **Always check status codes**: 2xx = success, 4xx = client error, 5xx = server error - **Read error messages**: Descriptive messages help debug issues - **Handle rate limits**: Respect API rate limits for optimal performance ### Data Validation - **Email format**: Must be valid email addresses - **Required fields**: Check documentation for mandatory fields - **Field lengths**: Respect maximum length constraints ### Performance - **Pagination**: Use offset/limit for large datasets - **Batch operations**: Process multiple items when supported - **Caching**: Cache responses when appropriate ## 🛠️ SDKs & Integration Official SDKs available for: - [Golang](https://github.com/sendx/sendx-go-sdk) - [Python](https://github.com/sendx/sendx-python-sdk) - [Ruby](https://github.com/sendx/sendx-ruby-sdk) - [Java](https://github.com/sendx/sendx-java-sdk) - [PHP](https://github.com/sendx/sendx-php-sdk) - [JavaScript](https://github.com/sendx/sendx-javascript-sdk) ## 📞 Support Need help? Contact us: - 💬 **Website Chat**: Available on sendx.io - 📧 **Email**: hello@sendx.io - 📚 **Documentation**: Full guides at help.sendx.io --- **API Endpoint:** `https://api.sendx.io/api/v1/rest` [<img src=\"https://run.pstmn.io/button.svg\" alt=\"Run In Postman\" style=\"width: 128px; height: 32px;\">](https://god.gw.postman.com/run-collection/33476323-44b198b0-5219-4619-a01f-cfc24d573885?action=collection%2Ffork&source=rip_markdown&collection-url=entityId%3D33476323-44b198b0-5219-4619-a01f-cfc24d573885%26entityType%3Dcollection%26workspaceId%3D6b1e4f65-96a9-4136-9512-6266c852517e)
|
5
5
|
|
6
6
|
The version of the OpenAPI document: 1.0.0
|
7
|
-
Contact:
|
7
|
+
Contact: hello@sendx.io
|
8
8
|
Generated by: https://openapi-generator.tech
|
9
|
-
Generator version: 7.
|
9
|
+
Generator version: 7.13.0
|
10
10
|
|
11
11
|
=end
|
12
12
|
|
@@ -15,19 +15,16 @@ require 'time'
|
|
15
15
|
|
16
16
|
module SendX
|
17
17
|
class RevenueEventRequest
|
18
|
-
#
|
18
|
+
# Contact email address
|
19
19
|
attr_accessor :identifier
|
20
20
|
|
21
|
-
#
|
21
|
+
# Revenue amount
|
22
22
|
attr_accessor :amount
|
23
23
|
|
24
|
-
#
|
25
|
-
attr_accessor :currency
|
26
|
-
|
27
|
-
# Source of the revenue (e.g., 'website', 'mobile app', 'partner referral').
|
24
|
+
# Source of the revenue event
|
28
25
|
attr_accessor :source
|
29
26
|
|
30
|
-
# Unix timestamp
|
27
|
+
# Unix timestamp (in seconds since January 1, 1970) representing when the event occurred.
|
31
28
|
attr_accessor :time
|
32
29
|
|
33
30
|
# Attribute mapping from ruby-style variable name to JSON key.
|
@@ -35,15 +32,19 @@ module SendX
|
|
35
32
|
{
|
36
33
|
:'identifier' => :'identifier',
|
37
34
|
:'amount' => :'amount',
|
38
|
-
:'currency' => :'currency',
|
39
35
|
:'source' => :'source',
|
40
36
|
:'time' => :'time'
|
41
37
|
}
|
42
38
|
end
|
43
39
|
|
40
|
+
# Returns attribute mapping this model knows about
|
41
|
+
def self.acceptable_attribute_map
|
42
|
+
attribute_map
|
43
|
+
end
|
44
|
+
|
44
45
|
# Returns all the JSON keys this model knows about
|
45
46
|
def self.acceptable_attributes
|
46
|
-
|
47
|
+
acceptable_attribute_map.values
|
47
48
|
end
|
48
49
|
|
49
50
|
# Attribute type mapping.
|
@@ -51,7 +52,6 @@ module SendX
|
|
51
52
|
{
|
52
53
|
:'identifier' => :'String',
|
53
54
|
:'amount' => :'Float',
|
54
|
-
:'currency' => :'String',
|
55
55
|
:'source' => :'String',
|
56
56
|
:'time' => :'Integer'
|
57
57
|
}
|
@@ -71,9 +71,10 @@ module SendX
|
|
71
71
|
end
|
72
72
|
|
73
73
|
# check to see if the attribute exists and convert string to symbol for hash key
|
74
|
+
acceptable_attribute_map = self.class.acceptable_attribute_map
|
74
75
|
attributes = attributes.each_with_object({}) { |(k, v), h|
|
75
|
-
if (!
|
76
|
-
fail ArgumentError, "`#{k}` is not a valid attribute in `SendX::RevenueEventRequest`. Please check the name to make sure it's valid. List of attributes: " +
|
76
|
+
if (!acceptable_attribute_map.key?(k.to_sym))
|
77
|
+
fail ArgumentError, "`#{k}` is not a valid attribute in `SendX::RevenueEventRequest`. Please check the name to make sure it's valid. List of attributes: " + acceptable_attribute_map.keys.inspect
|
77
78
|
end
|
78
79
|
h[k.to_sym] = v
|
79
80
|
}
|
@@ -90,22 +91,12 @@ module SendX
|
|
90
91
|
self.amount = nil
|
91
92
|
end
|
92
93
|
|
93
|
-
if attributes.key?(:'currency')
|
94
|
-
self.currency = attributes[:'currency']
|
95
|
-
else
|
96
|
-
self.currency = nil
|
97
|
-
end
|
98
|
-
|
99
94
|
if attributes.key?(:'source')
|
100
95
|
self.source = attributes[:'source']
|
101
|
-
else
|
102
|
-
self.source = nil
|
103
96
|
end
|
104
97
|
|
105
98
|
if attributes.key?(:'time')
|
106
99
|
self.time = attributes[:'time']
|
107
|
-
else
|
108
|
-
self.time = nil
|
109
100
|
end
|
110
101
|
end
|
111
102
|
|
@@ -122,18 +113,6 @@ module SendX
|
|
122
113
|
invalid_properties.push('invalid value for "amount", amount cannot be nil.')
|
123
114
|
end
|
124
115
|
|
125
|
-
if @currency.nil?
|
126
|
-
invalid_properties.push('invalid value for "currency", currency cannot be nil.')
|
127
|
-
end
|
128
|
-
|
129
|
-
if @source.nil?
|
130
|
-
invalid_properties.push('invalid value for "source", source cannot be nil.')
|
131
|
-
end
|
132
|
-
|
133
|
-
if @time.nil?
|
134
|
-
invalid_properties.push('invalid value for "time", time cannot be nil.')
|
135
|
-
end
|
136
|
-
|
137
116
|
invalid_properties
|
138
117
|
end
|
139
118
|
|
@@ -143,12 +122,29 @@ module SendX
|
|
143
122
|
warn '[DEPRECATED] the `valid?` method is obsolete'
|
144
123
|
return false if @identifier.nil?
|
145
124
|
return false if @amount.nil?
|
146
|
-
return false if @currency.nil?
|
147
|
-
return false if @source.nil?
|
148
|
-
return false if @time.nil?
|
149
125
|
true
|
150
126
|
end
|
151
127
|
|
128
|
+
# Custom attribute writer method with validation
|
129
|
+
# @param [Object] identifier Value to be assigned
|
130
|
+
def identifier=(identifier)
|
131
|
+
if identifier.nil?
|
132
|
+
fail ArgumentError, 'identifier cannot be nil'
|
133
|
+
end
|
134
|
+
|
135
|
+
@identifier = identifier
|
136
|
+
end
|
137
|
+
|
138
|
+
# Custom attribute writer method with validation
|
139
|
+
# @param [Object] amount Value to be assigned
|
140
|
+
def amount=(amount)
|
141
|
+
if amount.nil?
|
142
|
+
fail ArgumentError, 'amount cannot be nil'
|
143
|
+
end
|
144
|
+
|
145
|
+
@amount = amount
|
146
|
+
end
|
147
|
+
|
152
148
|
# Checks equality by comparing each attribute.
|
153
149
|
# @param [Object] Object to be compared
|
154
150
|
def ==(o)
|
@@ -156,7 +152,6 @@ module SendX
|
|
156
152
|
self.class == o.class &&
|
157
153
|
identifier == o.identifier &&
|
158
154
|
amount == o.amount &&
|
159
|
-
currency == o.currency &&
|
160
155
|
source == o.source &&
|
161
156
|
time == o.time
|
162
157
|
end
|
@@ -170,7 +165,7 @@ module SendX
|
|
170
165
|
# Calculates hash code according to all attributes.
|
171
166
|
# @return [Integer] Hash code
|
172
167
|
def hash
|
173
|
-
[identifier, amount,
|
168
|
+
[identifier, amount, source, time].hash
|
174
169
|
end
|
175
170
|
|
176
171
|
# Builds the object from hash
|
@@ -1,12 +1,12 @@
|
|
1
1
|
=begin
|
2
2
|
#SendX REST API
|
3
3
|
|
4
|
-
## Introduction SendX is an email marketing product. It helps you convert website visitors to customers, send them promotional emails, engage with them using drip sequences and craft custom journeys using powerful but simple automations. The SendX API is organized around REST. Our API has predictable resource-oriented URLs, accepts form-encoded request bodies, returns JSON-encoded responses, and uses standard HTTP response codes, authentication, and verbs. The SendX Rest API doesn’t support bulk updates. You can work on only one object per request. <br>
|
4
|
+
## Introduction The SendX API is organized around REST. Our API has predictable resource-oriented URLs, accepts form-encoded request bodies, returns JSON-encoded responses, and uses standard HTTP response codes, authentication, and verbs. The SendX Rest API doesn’t support bulk updates. You can work on only one object per request. <br> Our API endpoint looks like this:<br> ``` https://api.sendx.io/api/v1/rest ``` [<img src=\"https://run.pstmn.io/button.svg\" alt=\"Run In Postman\" style=\"width: 128px; height: 32px;\">](https://god.gw.postman.com/run-collection/33476323-44b198b0-5219-4619-a01f-cfc24d573885?action=collection%2Ffork&source=rip_markdown&collection-url=entityId%3D33476323-44b198b0-5219-4619-a01f-cfc24d573885%26entityType%3Dcollection%26workspaceId%3D6b1e4f65-96a9-4136-9512-6266c852517e) ## Authentication The SendX API uses API key to authenticate requests.<br> You can checkout your API key from your settings page https://app.sendx.io/setting under the section `Team Api Key`. SendX expects the API key to be included in all API requests to the server in a header that looks like the following: ``` X-Team-ApiKey: AHEZEP8192SEGH ``` Your API keys carry many privileges, so be sure to keep them secure! Do not share your secret API keys in publicly accessible areas such as GitHub, client-side code, and so forth. All API requests must be made over HTTPS. Calls made over plain HTTP will fail. API requests without authentication will also fail. ## Errors SendX uses conventional HTTP response codes to indicate the success or failure of an API request. In general: Codes in the 2xx range indicate success. Codes in the 4xx range indicate an error that failed given the information provided (e.g., a required parameter was omitted, a failed resource search, etc.). Codes in the 5xx range indicate an error with SendX’s servers (drop us a mail at support@sendx.io in case that ever happens). Here's some error codes and what they mean: <table> <tr> <th>Status Code</th> <th>Reason</th> <th>Description</th> </tr> <tr> <td>400</td> <td>Bad Request</td> <td>The request could not be understood by the server due to malformed syntax.</td> </tr> <tr> <td>401</td> <td>Unauthorized</td> <td>The request requires user authentication, e.g., due to missing or invalid authentication token.</td> </tr> <tr> <td>403</td> <td>Forbidden</td> <td>The request is understood, but it has been refused or access is not allowed.</td> </tr> <tr> <td>404</td> <td>Not Found</td> <td>The requested resource could not be found.</td> </tr> <tr> <td>406</td> <td>Not Acceptable</td> <td>The requested format is not supported by the requested method.</td> </tr> <tr> <td>422</td> <td>Unprocessable Entity</td> <td>The server understood the request, but the request is semantically erroneous (e.g., a request may contain a malformed email address).</td> </tr> <tr> <td>500</td> <td>Internal Server Error</td> <td>The server encountered an unexpected condition which prevented it from fulfilling the request.</td> </tr> </table> <br> ## API SDKs We have native SendX SDKs in the following programming languages. You can integrate with them or create your own SDK with our API specification. In case you need any assistance with respect to API then do reachout to our team from website chat or email us at hello@sendx.io <br> For checking language specific Clients: - [Golang](https://github.com/sendx/sendx-go-sdk) - [Python](https://github.com/sendx/sendx-python-sdk) - [Ruby](https://github.com/sendx/sendx-ruby-sdk) - [Java](https://github.com/sendx/sendx-java-sdk) - [PHP](https://github.com/sendx/sendx-php-sdk) - [JavaScript](https://github.com/sendx/sendx-javascript-sdk) We also have a [Javascript API](http://help.sendx.io/knowledge_base/topics/javascript-api-1) for client side integrations. --- ## Schemas The SendX API has resources related to all the major functionalities of SendX. ### Contact The Contact is a fundamental resource within SendX. It represents your customers, leads, or any person you wish to communicate with through your marketing campaigns. Once a contact is added to SendX, you can send personalized marketing campaigns, manage their details, and track their interaction with your marketing activities. SendX provides several key attributes associated with each contact. Additionally, custom fields allow you to add any extra information that may not be covered by the default fields. You can also categorize contacts using tags, and group them into lists for easier targeting in specific campaigns. Below is a detailed overview of the Contact schema. <table> <tr> <th>Field</th> <th>Type</th> <th>Description</th> <th>Example</th> </tr> <tr> <td>Id</td> <td>string</td> <td>Identifier for the contact. This field is how you can reference the contact in your application.</td> <td>ACNEFOF123R</td> </tr> <tr> <td>FirstName</td> <td>string</td> <td>The first name of the contact.</td> <td>Linus</td> </tr> <tr> <td>LastName</td> <td>string</td> <td>The last name of the contact.</td> <td>Torvalds</td> </tr> <tr> <td>Email</td> <td>string (email)</td> <td>The email address of the contact. This is a mandatory field for the contact, no SendX contact can be created without an email address.</td> <td>linus@example.com</td> </tr> <tr> <td>Company</td> <td>string</td> <td>The company of the contact.</td> <td>Linux Foundation.</td> </tr> <tr> <td>CustomFields</td> <td>object</td> <td>Custom fields and their values. This can be used to store any additional information about the contact. In SendX, this is shown as a map of custom field Id to string. Users can create their own custom fields and associate values for them with the contact.</td> <td>``` { \"124\": \"Developer/Creator\", \"223\": \"28 December 1969\" }```</td> </tr> <tr> <td>Unsubscribed</td> <td>boolean</td> <td>Indicates if the contact has unsubscribed from emails.</td> <td>false</td> </tr> <tr> <td>Bounced</td> <td>boolean</td> <td>Indicates if the contact's email has bounced.</td> <td>false</td> </tr> <tr> <td>Spam</td> <td>boolean</td> <td>Indicates if the contact marked the email as spam.</td> <td>false</td> </tr> <tr> <td>Created</td> <td>string (date-time)</td> <td>The date and time when the contact was created. This is sent in Unix time format.</td> <td>2024-10-08T09:30:00Z</td> </tr> <tr> <td>Updated</td> <td>string (date-time)</td> <td>The date and time when the contact was last updated. This is sent in Unix time format.</td> <td>2024-10-08T12:45:00Z</td> </tr> <tr> <td>Blocked</td> <td>boolean</td> <td>Indicates if the contact is blocked from receiving emails.</td> <td>false</td> </tr> <tr> <td>Dropped</td> <td>boolean</td> <td>Indicates if emails to this contact were dropped.</td> <td>false</td> </tr> <tr> <td>LTV</td> <td>integer</td> <td>Lifetime value (LTV) of the contact in currency units.</td> <td>5000</td> </tr> <tr> <td>ContactSource</td> <td>integer</td> <td>The source from which the contact was added. Possible values include: <br> <ol> <li> ContactSourceUnknown</li> <li> ContactSourceFileImport</li> <li> ContactSourceJSAPI</li> <li> ContactSourceRESTAPI</li> <li> ContactSourceManualAddition</li> <li> ContactSourcePopup</li> <li> ContactSourceForm</li> <li> ContactSourceLandingPage</li> <li> ContactSourceInstaPage</li> <li> ContactSourceSamCart</li> <li> ContactSourceWooCommerce</li> <li> ContactSourceStripe</li> <li> ContactSourcePaypal</li> <li> ContactSourceIntercom</li> <li> ContactSourceShopify</li> <li> ContactSourceWebPush</li> <li> ContactSourceConvertBox</li> <li> ContactSourceClickFunnel</li> <li> ContactSourceTeachable</li> <li> ContactSourceWoorise</li> </ol> </td> <td>4</td> </tr> <tr> <td>LastTrackedIp</td> <td>string</td> <td>The last known IP address tracked for the contact.</td> <td>192.168.0.1</td> </tr> <tr> <td>Lists</td> <td>[string]</td> <td>Array of List ids associated with the contact.</td> <td>[\"sendxlist1\",\"sendxlist2\"]</td> </tr> <tr> <td>Tags</td> <td>[string]</td> <td>Array of Tag ids associated with the contact.</td> <td>[\"sendxtag1\",\"sendxtag2\"]</td> </tr> </table> SendX REST API allows users to perform operations on any contact based on it's identifier. Identifier can be either: - Contact ID of the contact - Email of the contact ### List A List in SendX is a collection of contacts, similar to organizing a guest list for an event. Depending on how the list is configured, there are two types of opt-in mechanisms: - Single Opt-in: In this type, contacts are directly added to the list once they provide their email address, just like guests who confirm their attendance without any extra steps. - Double Opt-in: In this type, contacts are sent a confirmation email and must verify their subscription before being fully added to the list. This is like sending a \"Save the Date\" invitation, where the guest needs to RSVP before they’re officially included. These opt-in mechanisms help ensure that your contacts are either instantly subscribed (single opt-in) or confirmed (double opt-in) based on their preference. Lists allow you to group your contacts for targeted and personalized marketing campaigns. <table> <thead> <tr> <th>Field</th> <th>Type</th> <th>Description</th> <th>Example</th> </tr> </thead> <tbody> <tr> <td>Id</td> <td>string</td> <td>Encrypted identifier for the list.</td> <td>a1b2c3d4e5</td> </tr> <tr> <td>Name</td> <td>string</td> <td>Name of the list.</td> <td>Customer List</td> </tr> <tr> <td>Type</td> <td>integer</td> <td>Type of the list, which can have two values:<br/>0: SingleOptIn <br/>1: DoubleOptIn</td> <td>0</td> </tr> <tr> <td>SendThankYouMail</td> <td>bool</td> <td>Indicates if a thank-you email should be sent after subscription.</td> <td>true</td> </tr> <tr> <td>ThankYouFromName</td> <td>string</td> <td>The name shown as the sender for the thank-you email.</td> <td>Support Team</td> </tr> <tr> <td>ThankYouFromEmail</td> <td>string</td> <td>The email address from which the thank-you email is sent.</td> <td>support@sendx.com</td> </tr> <tr> <td>ThankYouMailSubject</td> <td>string</td> <td>Subject line of the thank-you email.</td> <td>Welcome to our newsletter</td> </tr> <tr> <td>ThankYouMailMessage</td> <td>string</td> <td>Content of the thank-you email.</td> <td>Thank you for subscribing!</td> </tr> <tr> <td>ThankYouSender</td> <td>string</td> <td>Sender id for the thank-you email, if applicable.</td> <td>sender_123</td> </tr> <tr> <td>ConfirmFromName</td> <td>string</td> <td>The name shown as the sender for the confirmation email.</td> <td>Support Team</td> </tr> <tr> <td>ConfirmFromEmail</td> <td>string</td> <td>The email address from which the confirmation email is sent.</td> <td>confirm@company.com</td> </tr> <tr> <td>ConfirmMailSubject</td> <td>string</td> <td>Subject line of the confirmation email.</td> <td>Please confirm your subscription</td> </tr> <tr> <td>ConfirmMailMessage</td> <td>string</td> <td>Content of the confirmation email.</td> <td>Click here to confirm!</td> </tr> <tr> <td>ConfirmSuccessPage</td> <td>string</td> <td>URL of the success page shown after email confirmation.</td> <td>https://company.com/success</td> </tr> <tr> <td>Created</td> <td>string (Date-Time)</td> <td>Timestamp when the list was created.</td> <td>2024-10-08T09:30:00Z</td> </tr> <tr> <td>Updated</td> <td>string (Date-Time)</td> <td>Timestamp when the list was last updated.</td> <td>2024-10-08T12:45:00Z</td> </tr> <tr> <td>ConfirmSender</td> <td>string</td> <td>Sender id for the confirmation email, if applicable.</td> <td>sender_313</td> </tr> <tr> <td>IsQuarantined</td> <td>bool</td> <td>Indicates if the list is quarantined. Contact support@sendx.io if you encounter this.</td> <td>false</td> </tr> </tbody> </table> ### Tag A Tag in SendX is a versatile tool that allows you to categorize and organize your contacts based on their behaviors, interests, or other attributes. By adding tags to contacts, you can create powerful filters and segments to target specific audiences in your campaigns. Tags are essential for tracking and understanding your contacts’ journey through your application or business funnel. For instance, if a contact views a product, you can assign a tag like Product X Viewed. Later, you can filter all contacts with this tag to send them personalized follow-up emails or promotional offers. This ability to categorize contacts ensures that your marketing efforts are precise and relevant. In the world of email marketing, tags are not just a tool—they are a key utility for creating personalized experiences, improving open rates, and driving higher engagement. By leveraging tags effectively, you can ensure that your contacts receive the right message at the right time. <table> <thead> <tr> <th>Field</th> <th>Type</th> <th>Description</th> <th>Example</th> </tr> </thead> <tbody> <tr> <td>Id</td> <td>string</td> <td>Identifier for the tag.</td> <td>a1b2c3d4e5</td> </tr> <tr> <td>Name</td> <td>string</td> <td>Name of the tag.</td> <td>VIP Customers</td> </tr> <tr> <td>Created</td> <td>string (Date-Time)</td> <td>Timestamp when the tag was created.</td> <td>2024-10-08T09:30:00Z</td> </tr> <tr> <td>Updated</td> <td>string (Date-Time)</td> <td>Timestamp when the tag was last updated.</td> <td>2024-10-08T12:45:00Z</td> </tr> </tbody> </table> ### Campaigns Campaign is one of the key resources in SendX as an email marketing platform. A campaign allows you to send targeted email messages to specific segments of your audience, helping to engage subscribers, promote products, or share important updates. Why is a Campaign Resource Important? Email campaigns are the cornerstone of email marketing strategies. They help you: - **Engage Customers:** Send relevant content that resonates with the audience. - **Automate Communication:** Schedule and automate emails to reach the right people at the right time. - **Track Performance:** Measure engagement, opens, clicks, and conversions to optimize future campaigns. <br> For example you might create a campaign called \"Holiday Discounts\" where you target customers who have shown interest in your products over the last three months. The campaign could send personalized emails with special discounts for the holiday season, encouraging recipients to take action. The Campaign resource in SendX provides you with a powerful toolset to not only communicate with your audience but also to enhance their experience through targeted, automated, and personalized email strategies. <table> <thead> <tr> <th>Property</th> <th>Type</th> <th>Description</th> <th>Example</th> </tr> </thead> <tbody> <tr> <td>Id</td> <td>string</td> <td> ID of the campaign</td> <td>campaign123xyz</td> </tr> <tr> <td>name</td> <td>string</td> <td>Name of the campaign</td> <td>New Year Promotion</td> </tr> <tr> <td>trackReply</td> <td>boolean</td> <td>Indicates if replies to the campaign should be tracked</td> <td>false</td> </tr> <tr> <td>status</td> <td>integer</td> <td>Current status of the campaign which can have these possible values: <br>0: Draft <br>1: Scheduled <br>2: Sending <br>3: Sent <br>4: Quarantined</td> <td>Scheduled</td> </tr> <tr> <td>scheduleType</td> <td>integer</td> <td>Type of schedule for the campaign <br>0: Schedule later <br>1: Send Now <br>2. Trigger via automation <br>3. Recurring </td> <td>0</td> </tr> <tr> <td>scheduleCondition</td> <td>string</td> <td>Condition for scheduling the campaign, in case of Send Now this field remains empty.In case of Schedule later, this field denotes the date at which the campaign will be sent in YYYY-MM-DD format</td> <td>2024-12-30</td> </tr> <tr> <td>timeCondition</td> <td>string</td> <td>Condition for scheduling the campaign, in case of Send Now this field remains empty.In case of Schedule later, this field denotes the time at which the campaign will be sent in HH:MM AM/PM format</td> <td>9:00 AM</td> </tr> <tr> <td>timezone</td> <td>string</td> <td>Timezone for the scheduled send. See `allowed timezones` for the list of allowed timezones</td> <td>America/New_York</td> </tr> <tr> <td>preferredTimeCondition</td> <td>string</td> <td>Preferred time condition for the campaign</td> <td>Send during work hours</td> </tr> <tr> <td>preferredTimezone</td> <td>string</td> <td>Preferred timezone for sending the campaign</td> <td>America/Los_Angeles</td> </tr> <tr> <td>strategy</td> <td>string</td> <td>Strategy for the campaign</td> <td>Batch sending</td> </tr> <tr> <td>sendInContactsTimezone</td> <td>boolean</td> <td>Indicates if the campaign should be sent in the recipient's timezone</td> <td>true</td> </tr> <tr> <td>smartSend</td> <td>boolean</td> <td>Indicates if smart sending should be used</td> <td>false</td> </tr> <tr> <td>isArchived</td> <td>boolean</td> <td>Indicates if the campaign is archived</td> <td>false</td> </tr> <tr> <td>sender</td> <td>string</td> <td>Unique identifier of the sender of the campaign</td> <td>sender_123</td> </tr> <tr> <td>campaignScreenshotUrl</td> <td>string</td> <td>URL of the campaign's screenshot</td> <td>https://example.com/screenshot.png</td> </tr> <tr> <td>includedSegments </td> <td>array</td> <td>List of segment IDs that are included in the campaign as receivers</td> <td>[\"segment_123\", \"segment_456\"]</td> </tr> <tr> <td>includedTags </td> <td>array</td> <td>List of tag IDs that are included in the campaign as receivers</td> <td>[\"tag_123\", \"tag_456\"]</td> </tr> <tr> <td>includedLists </td> <td>array</td> <td>List of list IDs that are included in the campaign as receivers</td> <td>[\"list_123\", \"list_456\"]</td> </tr> <tr> <td>excludedSegments </td> <td>array</td> <td>List of segment IDs that are excluded from the campaign as receivers</td> <td>[\"segment_123\", \"segment_456\"]</td> </tr> <tr> <td>excludedTags </td> <td>array</td> <td>List of tag IDs that are excluded from the campaign as receivers</td> <td>[\"tag_123\", \"tag_456\"]</td> </tr> <tr> <td>excludedLists </td> <td>array</td> <td>List of list IDs that are excluded from the campaign as receivers</td> <td>[\"list_123\", \"list_456\"]</td> </tr> </tbody> </table> Note: Here's a list of all the allowed timezones for the `timezone` field: # JavaScript API SendX Javascript API enables you to add contacts, associate tags with them and update custom fields. This guide details various functions associated with our Javascript API. - Installing Javascript Snippet - Sending API Requests - API Methods ## Installing Javascript Snippet To use SendX Javascript API you need to have SendX snippet installed on your website. Each SendX team account has a unique snippet that can be found under [Settings > Site Code](https://app.sendx.io/setting) Snippet SendX Javascript snippet gets loaded asynchronously and hence it won't affect page load time of your website. ## Sending API Requests All requests follow the same pattern. <br> ```javascript _scq.push([\"methodName\", { key: \"value\", ... }]); ``` API requests are executed asynchronously so you can safely place them anywhere on the page. The conventions are similar to what **google analytics** API follows. ## API Methods SendX Javascript API has two methods: - Identify - Track ## Identify API Method Identify API Method is used to attach data to a visitor. If a contact is not yet created then we will create the contact. In case contact already exists then we update it. ### Example Request: ```javascript _scq.push([\"identify\", { email: \"john.doe@gmail.com\", firstName: \"John\", lastName: \"Doe\", birthday: \"1989-03-03\", customFields: { \"Designation\": \"Software Engineer\", \"Age\": \"27\", \"Experience\": \"5\"}, tags: [\"Developer\", \"API Team\"], }]); ``` Note that tags are an array of strings. In case they don't exist previously then API will create them and associate them with the contact. Similarly if a custom field doesn't exist then it is first created and then associated with the contact along-with the corresponding value. In case custom field exists already then we simply update the value of it for the aforementioned contact. Custom Fields are associated with data types and which be created and edited inside the app. If a custom field is not present inside the app and an API call is made containing it, a custom field with type 'string' is created and the value set. For custom fields with data type 'number', values can be added to or subtracted from existing values. This can be done by using \"++\" or \"--\" operator before the number(e.g. \"customField_name\": \"++34\" would increase the value of existing \"customField_name\" in SendX for the contact. If it doesn't already exist, the value '- 34' would be inserted for it). We don't delete any of the properties based on identify call. What this means is that if for the same contact you did two API calls like: ### API Call A ```javascript _scq.push([\"identify\", { email: \"john.doe@gmail.com\", firstName: \"John\", birthday: \"1989-03-03\", customFields: { \"Designation\": \"Software Engineer\"}, tags: [\"Developer\"], success: function(){console.log(\"identify call successful\");}, failure: function(){console.log(\"identify failed\");}, }]); ``` ### API Call B ```javascript _scq.push([\"identify\", { email: \"john.doe@gmail.com\", customFields: { \"Age\": \"29\"}, tags: [\"API Team\"], success: function(){console.log(\"identify call successful\");}, failure: function(){console.log(\"identify failed\");}, }]); ``` The the final contact will have firstName as John, birthday as 1989-03-03 present. Also both tags Developer and API Team shall be present along with custom fields Designation and Age. Properties: - firstName: type string - lastName: type string - email: type string - newEmail: type string - company: type string - birthday: type string with format YYYY-MM-DD eg: 2016-11-21 - customFields: type map[string]string - tags: type array of string - success: Optional. Callback function which is executed on successful completion of request. - failure: Optional. Callback function which is executed when request fails or timeouts. In case email of an already existing contact needs to be updated then specify current email under email property and updated email under newEmail property. ### Response ```json { \"status\": \"200\", \"message\": \"OK\", \"data\": { \"encryptedTeamId\": \"CLdh9Ig5GLIN1u8gTRvoja\", \"encryptedId\": \"c9QF63nrBenCaAXe660byz\", \"tags\": [ \"API Team\", \"Tech\" ], \"firstName\": \"John\", \"lastName\": \"Doe\", \"email\": \"john.doe@gmail.com\", \"company\": \"\", \"birthday\": \"1989-03-03\", \"customFields\": { \"Age\": \"29\", \"Designation\": \"Software Engineer\" } } } ``` ## Track API Method Track API Method is used to track a contact. You can add or remove tags from a contact using this API. Properties: - addTags: Array of tags to be added to a contacts - removeTags: Array of tags to be removed from a contact - success: Optional. Callback function which is executed on successful completion of request. - failure: Optional. Callback function which is executed when request fails or timeouts. You can have automation rules based on tag addition as well as tag removal and they will get executed. For eg: - On user registration tag start on-boarding drip for him / her. - Account Upgrade tag start add user to paid user list and start account expansion drip. - On removal of trial user tag start up-sell trial completed users drip. ### Example Request: ```javascript _scq.push([\"track\", { \"addTags\": [\"blogger\", \"female\"], success: function(){console.log(\"track call successful\");}, failure: function(){console.log(\"track call failed\");}, }]); _scq.push([\"track\", { \"addTags\": [\"paid user\"], \"removeTags\": [\"trial user\"], success: function(){console.log(\"track call successful\");}, failure: function(){console.log(\"track call failed\");}, }]); ``` ### Response ```json { \"status\": \"200\", \"message\": \"OK\", \"data\": \"success\" } ```
|
5
5
|
|
6
6
|
The version of the OpenAPI document: 1.0.0
|
7
7
|
Contact: support@sendx.io
|
8
8
|
Generated by: https://openapi-generator.tech
|
9
|
-
Generator version: 7.
|
9
|
+
Generator version: 7.13.0
|
10
10
|
|
11
11
|
=end
|
12
12
|
|
@@ -33,9 +33,14 @@ module SendX
|
|
33
33
|
}
|
34
34
|
end
|
35
35
|
|
36
|
+
# Returns attribute mapping this model knows about
|
37
|
+
def self.acceptable_attribute_map
|
38
|
+
attribute_map
|
39
|
+
end
|
40
|
+
|
36
41
|
# Returns all the JSON keys this model knows about
|
37
42
|
def self.acceptable_attributes
|
38
|
-
|
43
|
+
acceptable_attribute_map.values
|
39
44
|
end
|
40
45
|
|
41
46
|
# Attribute type mapping.
|
@@ -61,9 +66,10 @@ module SendX
|
|
61
66
|
end
|
62
67
|
|
63
68
|
# check to see if the attribute exists and convert string to symbol for hash key
|
69
|
+
acceptable_attribute_map = self.class.acceptable_attribute_map
|
64
70
|
attributes = attributes.each_with_object({}) { |(k, v), h|
|
65
|
-
if (!
|
66
|
-
fail ArgumentError, "`#{k}` is not a valid attribute in `SendX::Sender`. Please check the name to make sure it's valid. List of attributes: " +
|
71
|
+
if (!acceptable_attribute_map.key?(k.to_sym))
|
72
|
+
fail ArgumentError, "`#{k}` is not a valid attribute in `SendX::Sender`. Please check the name to make sure it's valid. List of attributes: " + acceptable_attribute_map.keys.inspect
|
67
73
|
end
|
68
74
|
h[k.to_sym] = v
|
69
75
|
}
|
@@ -117,6 +123,36 @@ module SendX
|
|
117
123
|
true
|
118
124
|
end
|
119
125
|
|
126
|
+
# Custom attribute writer method with validation
|
127
|
+
# @param [Object] id Value to be assigned
|
128
|
+
def id=(id)
|
129
|
+
if id.nil?
|
130
|
+
fail ArgumentError, 'id cannot be nil'
|
131
|
+
end
|
132
|
+
|
133
|
+
@id = id
|
134
|
+
end
|
135
|
+
|
136
|
+
# Custom attribute writer method with validation
|
137
|
+
# @param [Object] name Value to be assigned
|
138
|
+
def name=(name)
|
139
|
+
if name.nil?
|
140
|
+
fail ArgumentError, 'name cannot be nil'
|
141
|
+
end
|
142
|
+
|
143
|
+
@name = name
|
144
|
+
end
|
145
|
+
|
146
|
+
# Custom attribute writer method with validation
|
147
|
+
# @param [Object] email Value to be assigned
|
148
|
+
def email=(email)
|
149
|
+
if email.nil?
|
150
|
+
fail ArgumentError, 'email cannot be nil'
|
151
|
+
end
|
152
|
+
|
153
|
+
@email = email
|
154
|
+
end
|
155
|
+
|
120
156
|
# Checks equality by comparing each attribute.
|
121
157
|
# @param [Object] Object to be compared
|
122
158
|
def ==(o)
|