Transmit Message API

Current v2 REST API covering SMS, MMS, WhatsApp and RCS, plus API-managed webhooks with event-type filtering and sender registration with phone verification. 22 operations across 15 paths, OpenAPI 3.0.3 with 127 component schemas and RFC 9457 problem details. Authenticated with an API key in the x-api-key header.

OpenAPI Specification

kudosity-transmit-message-openapi-original.yml Raw ↑
{"openapi":"3.0.3","info":{"title":"Transmit Message API","description":"Transmit APIs","version":"20250101","x-go-package":"github.com/oapi-codegen/runtime"},"servers":[{"url":"https://api.transmitmessage.com"}],"security":[{"ApiKeyAuth":[]}],"tags":[{"name":"MMS","description":"The primary method of sending MMS"},{"name":"SMS","description":"The primary method of sending SMS.\n\nYou can elect to pass us the recipient numbers from your database each time you make an API call.\n\nIn order to send to a local number for a recipient the Sender virtual number needs to be in the same country.\n\nYou can pass us the recipient number in international format and we will deliver your message with the Sender virtual number on your account for the same country.\n\nIf you do not have a Sender virtual number for the same country we will use a local number for the country you are sending to in order to deliver your message.\n\nList of countries we currently deliver to: [Global Delivery List](https://help.kudosity.com/support/solutions/articles/44001077065-global-sms-delivery-list)"},{"name":"Webhook","description":"Our webhooks API allows you to subscribe to events for SMS, MMS, and RCS messages. Using them requires you to have URLs (https) configured on your account that can receive POST requests over the internet.\n\nThe `event_type` field is an enum that specifies which event to subscribe to:\n\n- LINK_HIT\n- OPT_OUT\n- MMS_STATUS\n- MMS_INBOUND\n- SMS_INBOUND\n- SMS_STATUS\n- RCS_STATUS\n    \n\nFor status events, the nested `status` field is an enum with these values:\n\n- FAILED: Failed because of an error from the carrier or handset.\n    \n- SENT: Submitted to the carrier.\n- ACCEPTED: Accepted by the carrier and delivery may have been attempted (but is not confirmed).\n- DELIVERED: Delivered to handset.\n- SOFT_BOUNCE: Undeliverable due to handset being switched off, out of range or other temporary deliverability issue.\n- HARD_BOUNCE: Handset was disconnected.\n- OTHER: Any other status from the carrier.\n    \n\n## Link Hit\n\nThe `LINK_HIT` event is triggered any time a recipient visits a link that is tracked. Track Links is an optional flag on the send message API calls. Along with the URL that was being tracked is a hits field indicating how many visits this tracked link has in total and a source_message which contains the track link sent to the recipient.\n\n###### Example Payloads\n\n```json Hit link in MMS {\n  \"event_type\": \"LINK_HIT\",\n  \"timestamp\": \"2021-05-06T05:19:42Z\",\n  \"link_hit\": {\n    \"hits\": 1,\n    \"url\": \"https://www.example.com/abc\",\n    \"source_message\": {\n      \"type\": \"MMS\",\n      \"id\": \"b50e4dc1-e57f-459c-a15c-526bee00a4c4\",\n      \"message\": \"Hey, Check this out! http://clckme.info/KYhSsuIH Opt-out reply STOP\",\n      \"message_ref\": \"D701\",\n      \"recipient\": \"61435790000\",\n      \"sender\": \"61481074191\",\n      \"subject\": \"Hello\",\n      \"content_urls\": [\n        \"https://res.cloudinary.com/burstsms/image/upload/v1618798563/284KB_qgqtbe.jpg\"\n      ]\n    }\n  }\n} ``` ```json Hit link in SMS {\n  \"event_type\": \"LINK_HIT\",\n  \"timestamp\": \"2021-07-20T23:14:04Z\",\n  \"link_hit\": {\n    \"hits\": 1,\n    \"url\": \"https://www.example.com/abc\",\n    \"source_message\": {\n      \"type\": \"SMS\",\n      \"id\": \"faf68308-16cd-4cf9-aef7-47342bd405be\",\n      \"message\": \"Hey, Check this out! http://clckme.info/KYhSsuIH for Opt-out reply STOP or hit opt out link - http://nsub.me/vqHTcCsh \",\n      \"message_ref\": \"D301\",\n      \"recipient\": \"61435795809\",\n      \"sender\": \"61481074185\"\n    }\n  }\n} ```\n## Opt Out\n\nThe `OPT_OUT` event is triggered when a recipient has visited an opt-out link in a message they have received or by sending a message with the text \"STOP\".\n\nUsing parameter \\[opt-out-link\\] in message body, inserts the opt-out link.\n\nThe source field will be set according to the method a recipient has used to opt-out and contain a value of either link or SMS.\n  \n\n###### Example Payloads\n\n```json Opt out via link {\n  \"event_type\": \"OPT_OUT\",\n  \"timestamp\": \"2021-05-06T05:16:20Z\",\n  \"opt_out\": {\n    \"source\": \"LINK_HIT\",\n    \"source_message\": {\n      \"type\": \"SMS\",\n      \"id\": \"a51ebe4e-a412-440e-a8d9-464e68a521cc\",\n      \"message\": \"Hey, Check this out! http://clckme.info/KYhSsuIH for Opt-out reply STOP or hit opt out link - http://nsub.me/vqHTcCsh\",\n      \"message_ref\": \"ncc5009d\",\n      \"recipient\": \"61435790000\",\n      \"sender\": \"61481074190\"  \n    }\n  }\n} ``` ```json Opt out via message {\n  \"event_type\": \"OPT_OUT\",\n  \"timestamp\": \"2021-05-06T05:16:20Z\",\n  \"opt_out\": {\n    \"source\": \"SMS_INBOUND\",\n    \"source_message\": {\n      \"type\": \"SMS\",\n      \"id\": \"a51ebe4e-a412-440e-a8d9-464e68a521cc\",\n      \"message\": \"Hey, Check this out! http://clckme.info/KYhSsuIH for Opt-out reply STOP or hit opt out link - http://nsub.me/vqHTcCsh\",\n      \"message_ref\": \"ncc5009d\",\n      \"recipient\": \"61435790000\",\n      \"sender\": \"61481074190\"\n    }\n  }\n} ```\n## MMS Status\n\nThe `MMS_STATUS` event data is posted to you for changes to an MMS message status. These are currently only comprised of internal statuses (SENT, FAILED).\n\n###### Example Payload\n\n```json {\n  \"event_type\": \"MMS_STATUS\",\n  \"timestamp\": \"2021-05-06T05:19:33Z\",\n  \"status\": {\n    \"type\": \"MMS\",\n    \"id\": \"b50e4dc1-e57f-459c-a15c-526bee00a4c4\",\n    \"message_ref\": \"D7001\",\n    \"recipient\": \"61435790000\",\n    \"sender\": \"61481074191\",\n    \"status\": \"SENT\"\n  }\n} ```\n## SMS Inbound\n\nThe `SMS_INBOUND` event is posted to you on receipt of an SMS sent from a recipient to one of the senders listed on your account. For convenience we will try and find a message that you have sent to this recipient from that sender and supply it as the `last_message` field. This is useful for determining if an inbound message is potentially a reply. The `routed_via` field will display when a shared local number has been used to deliver your message.\n\n###### Example Payload\n\n```json {\n  \"event_type\": \"SMS_INBOUND\",\n  \"timestamp\": \"2021-05-06T05:16:33Z\",\n  \"mo\": {\n    \"type\":\"SMS\",\n    \"id\": \"alss-2way-605b31c7-d2c49104\",\n    \"message\": \"Stop\",\n    \"recipient\": \"61481074190\",\n    \"routed_via\": \"447507333300\",\n    \"sender\": \"447507222200\",\n    \"last_message\": {\n      \"type\":\"SMS\",\n      \"id\": \"a51ebe4e-a412-440e-a8d9-464e68a521cc\",     \n      \"message\": \"Hey, check this out!\",\n      \"message_ref\": \"ncc5009d\",\n      \"recipient\": \"447507222200\",\n      \"routed_via\": \"447507333300\",\n      \"sender\": \"61481074190\"\n    }\n  }\n} ```\n## SMS Status\n\nThe `SMS_STATUS` event data is posted to you for changes to a SMS message status. Multiple status events can be triggered for a single message.\n\nThe `routed_via` field will display when a shared local number has been used to deliver your message.\n\n###### Example Payload\n\n```json {\n  \"event_type\": \"SMS_STATUS\",\n  \"timestamp\": \"2021-05-06T05:16:07Z\",\n  \"status\": {\n    \"type\": \"SMS\",\n    \"id\": \"a51ebe4e-a412-440e-a8d9-464e68a521cc\",\n    \"message_ref\": \"ncc5009d\",\n    \"recipient\": \"447507222200\",\n    \"routed_via\": \"447507333300\",\n    \"sender\": \"61481074190\",\n    \"status\": \"SENT\"\n  }\n} ```\n## RCS Status\n\nThe `RCS_STATUS` event data is posted to you for changes to an RCS message status. RCS supports enhanced status tracking including read receipts.\n\nRCS-specific statuses include:\n\n- SENT: Submitted to the carrier.\n- DELIVERED: Delivered to handset.\n- FAILED: Failed because of an error from the carrier or handset.\n- READ: Message was read by the recipient (RCS-specific feature).\n\n###### Example Payload\n\n```json {\n  \"event_type\": \"RCS_STATUS\",\n  \"timestamp\": \"2025-01-07T05:16:07Z\",\n  \"webhook_id\": \"fd0e6485-b905-44c1-bd55-fee1d0d6d864\",\n  \"webhook_name\": \"RCS Status Webhook\",\n  \"status\": {\n    \"type\": \"RCS\",\n    \"id\": \"6fdae71c-dad7-4c36-9734-a69693ecf3b4\",\n    \"message_ref\": \"order-12345\",\n    \"recipient\": \"+447903749662\",\n    \"sender\": \"DemoSender\",\n    \"status\": \"READ\"\n  }\n} ```"}],"paths":{"/v2/whatsapp/messages":{"get":{"tags":["WhatsApp"],"summary":"List WhatsApp messages","description":"Retrieves a list of WhatsApp messages for your account with flexible date filtering.\n\nMessages are returned in reverse chronological order (newest first).\n\n**Date Filtering:**\n- Preset ranges (last_week, last_thirty, last_month): Calculated using your account timezone\n- Custom date ranges: Use RFC3339 timestamps (max 90 days)\n- The 'all' option provides up to 365 days of history\n- All timestamps in responses are returned in UTC format\n\n**Pagination:**\n- Cursor-based pagination for efficient data retrieval\n- Control page size with the limit parameter (1-100 messages per page)\n","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"date_range","in":"query","description":"Predefined date range filter. Preset ranges use your account timezone to calculate relative dates:\n- 'last_week': Last 7 days from midnight in your account timezone\n- 'last_thirty': Last 30 days from midnight in your account timezone\n- 'last_month': Previous calendar month in your account timezone\n- 'all': All dates (limited to last 365 days) - default\n- 'custom_date': Use start_date and end_date parameters with explicit RFC3339 timestamps\n","schema":{"type":"string","enum":["last_week","last_thirty","last_month","all","custom_date"],"default":"all","x-go-type-skip-optional-pointer":true},"example":"all"},{"name":"start_date","in":"query","description":"Start date for custom date range in RFC3339 format (e.g., 2025-08-26T10:30:00Z).\nRequired when date_range is 'custom_date'.\nMust be before end_date.\n","schema":{"type":"string","x-go-type-skip-optional-pointer":true},"example":"2025-12-01T00:00:00Z"},{"name":"end_date","in":"query","description":"End date for custom date range in RFC3339 format (e.g., 2025-08-26T23:59:59Z).\nRequired when date_range is 'custom_date'.\nMust be after start_date.\nThe range between start_date and end_date cannot exceed 90 days.\n","schema":{"type":"string","x-go-type-skip-optional-pointer":true},"example":"2025-12-31T23:59:59Z"},{"name":"limit","in":"query","required":false,"description":"Maximum number of messages to return per page (1-100, default 25).","schema":{"type":"integer","format":"int32","minimum":1,"maximum":100,"default":25,"x-go-type-skip-optional-pointer":true},"example":25},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor returned from a previous request.\nPass the next_cursor or prev_cursor value from a previous response\nto fetch the next or previous page of results. Omit for the first page.\n","schema":{"type":"string","x-go-type-skip-optional-pointer":true},"example":"MTIzNDU2"},{"name":"direction","in":"query","description":"Pagination direction when using a cursor:\n- 'next': Get older messages (default, moves forward through history)\n- 'prev': Get newer messages (moves backward through history)\n","schema":{"type":"string","enum":["next","prev"],"default":"next","x-go-type-skip-optional-pointer":true},"example":"next"},{"name":"campaign_id","in":"query","required":false,"description":"Restrict results to messages belonging to a single campaign (UUID).\nOmit to return messages across all campaigns.\n","schema":{"type":"string","format":"uuid","x-go-type":"string","x-go-type-skip-optional-pointer":true},"example":"9b2e4c1a-7f3d-4a8b-9c5e-2d1f6a8b3c4d"}],"responses":{"200":{"$ref":"#/components/responses/ListWhatsappMessagesSuccessResponse"},"400":{"$ref":"#/components/responses/InputValidationResponse"},"401":{"$ref":"#/components/responses/UnauthorizedErrorResponse"},"500":{"$ref":"#/components/responses/InternalServerErrorResponse"}}},"post":{"tags":["WhatsApp"],"summary":"Send WhatsApp message","description":"Sends a single templated message to a single recipient. Templates need to be registered and pre-approved by WhatsApp.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WhatsappRequest"}}}},"responses":{"200":{"$ref":"#/components/responses/SuccessResponse"},"400":{"$ref":"#/components/responses/InputValidationResponse"},"429":{"$ref":"#/components/responses/TooManyRequestsErrorResponse"},"500":{"$ref":"#/components/responses/InternalServerErrorResponse"}}}},"/v2/whatsapp/messages/{id}":{"get":{"tags":["WhatsApp"],"summary":"Get WhatsApp message","description":"Retrieves details of a previously sent WhatsApp message by its unique identifier.\nReturns message content, delivery status, and metadata.\n","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Unique identifier of the WhatsApp message to retrieve","schema":{"type":"string","format":"uuid","example":"550e8400-e29b-41d4-a716-446655440000"}}],"responses":{"200":{"$ref":"#/components/responses/GetWhatsappSuccessResponse"},"401":{"$ref":"#/components/responses/UnauthorizedErrorResponse"},"404":{"$ref":"#/components/responses/NotFoundErrorResponse"},"500":{"$ref":"#/components/responses/InternalServerErrorResponse"}}}},"/v2/rcs/messages":{"get":{"tags":["RCS"],"summary":"List RCS messages","description":"Retrieves a list of RCS messages for your account with flexible date filtering.\n\nMessages are returned in reverse chronological order (newest first).\n\n**Date Filtering:**\n- Preset ranges (last_week, last_thirty, last_month): Calculated using your account timezone\n- Custom date ranges: Use RFC3339 timestamps (max 90 days)\n- The 'all' option provides up to 365 days of history\n- All timestamps in responses are returned in UTC format\n\n**Pagination:**\n- Cursor-based pagination for efficient data retrieval\n- Control page size with the limit parameter (1-100 messages per page)\n","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"date_range","in":"query","description":"Predefined date range filter. Preset ranges use your account timezone to calculate relative dates:\n- 'last_week': Last 7 days from midnight in your account timezone\n- 'last_thirty': Last 30 days from midnight in your account timezone\n- 'last_month': Previous calendar month in your account timezone\n- 'all': All dates (limited to last 365 days) - default\n- 'custom_date': Use start_date and end_date parameters with explicit RFC3339 timestamps\n","schema":{"type":"string","enum":["last_week","last_thirty","last_month","all","custom_date"],"default":"all","x-go-type-skip-optional-pointer":true},"example":"all"},{"name":"start_date","in":"query","description":"Start date for custom date range in RFC3339 format (e.g., 2025-08-26T10:30:00Z).\nRequired when date_range is 'custom_date'.\nMust be before end_date.\n","schema":{"type":"string","x-go-type-skip-optional-pointer":true},"example":"2025-12-01T00:00:00Z"},{"name":"end_date","in":"query","description":"End date for custom date range in RFC3339 format (e.g., 2025-08-26T23:59:59Z).\nRequired when date_range is 'custom_date'.\nMust be after start_date.\nThe range between start_date and end_date cannot exceed 90 days.\n","schema":{"type":"string","x-go-type-skip-optional-pointer":true},"example":"2025-12-31T23:59:59Z"},{"name":"limit","in":"query","required":false,"description":"Maximum number of messages to return per page (1-100, default 25).","schema":{"type":"integer","format":"int32","minimum":1,"maximum":100,"default":25,"x-go-type-skip-optional-pointer":true},"example":25},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor returned from a previous request.\nPass the next_cursor or prev_cursor value from a previous response\nto fetch the next or previous page of results. Omit for the first page.\n","schema":{"type":"string","x-go-type-skip-optional-pointer":true},"example":"MTIzNDU2"},{"name":"direction","in":"query","description":"Pagination direction when using a cursor:\n- 'next': Get older messages (default, moves forward through history)\n- 'prev': Get newer messages (moves backward through history)\n","schema":{"type":"string","enum":["next","prev"],"default":"next","x-go-type-skip-optional-pointer":true},"example":"next"}],"responses":{"200":{"$ref":"#/components/responses/ListRcsMessagesSuccessResponse"},"400":{"$ref":"#/components/responses/InputValidationResponse"},"401":{"$ref":"#/components/responses/UnauthorizedErrorResponse"},"500":{"$ref":"#/components/responses/InternalServerErrorResponse"}}},"post":{"tags":["RCS"],"summary":"Send RCS message","description":"This endpoint is in beta and may change in future versions.\nSends an RCS message to a single recipient.\n","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RcsRequest"}}}},"responses":{"200":{"$ref":"#/components/responses/RCSSuccessResponse"},"400":{"$ref":"#/components/responses/InputValidationResponse"},"401":{"$ref":"#/components/responses/UnauthorizedErrorResponse"},"500":{"$ref":"#/components/responses/InternalServerErrorResponse"}}}},"/v2/rcs/capabilities":{"post":{"tags":["RCS"],"summary":"Check RCS capability for phone numbers","description":"Synchronously checks whether a list of phone numbers can receive RCS from your sender.\n\nUse this **before** sending to decide between RCS and SMS fallback. Designed for routing-time lookups: small batches (1–10 numbers recommended for best latency), immediate response.\n\nResults are best-effort and reflect capability at the moment of the lookup. **Do not use this as a hard gate** on sending — treat `UNKNOWN` as reachable and rely on SMS fallback for hard delivery guarantees.\n","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RcsCapabilityCheckRequest"}}}},"responses":{"200":{"$ref":"#/components/responses/RcsCapabilityCheckSuccessResponse"},"400":{"$ref":"#/components/responses/InputValidationResponse"},"401":{"$ref":"#/components/responses/UnauthorizedErrorResponse"},"403":{"$ref":"#/components/responses/ForbiddenErrorResponse"},"429":{"$ref":"#/components/responses/TooManyRequestsErrorResponse"},"500":{"$ref":"#/components/responses/InternalServerErrorResponse"}}}},"/v2/rcs/messages/{id}":{"get":{"tags":["RCS"],"summary":"Get RCS message","description":"Retrieves details of a previously sent RCS message by its unique identifier.\nReturns message content, delivery status, and metadata.\n","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Unique identifier of the RCS message to retrieve","schema":{"type":"string","format":"uuid","example":"550e8400-e29b-41d4-a716-446655440000"}}],"responses":{"200":{"$ref":"#/components/responses/GetSuccessResponse"},"401":{"$ref":"#/components/responses/UnauthorizedErrorResponse"},"404":{"$ref":"#/components/responses/NotFoundErrorResponse"},"500":{"$ref":"#/components/responses/InternalServerErrorResponse"}}}},"/v2/sms/{id}":{"get":{"tags":["SMS"],"summary":"Get SMS","description":"Retrieves information about an existing SMS message. You only need to supply the unique message id that was returned upon message creation.","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","description":"Unique ID of the sent SMS","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"A single SMS message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SMSResponse"}}}},"404":{"description":"SMS not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"SMS not found"}}}}}}}}},"/v2/sms":{"get":{"tags":["SMS"],"summary":"List SMS","description":"Retrieves a list of SMS messages. You can limit the number of messages returned and filter by properties listed in the parameters section.","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"query","in":"query","description":"Filter query parameters are added to the URL. Use as:\n?limit=1&page=2&start_date=2024-01-01T00:00:00Z\n","schema":{"$ref":"#/components/schemas/ListSMSRequest"}}],"responses":{"200":{"description":"A list of SMS messages","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListSMSResponse"}}}}}},"post":{"tags":["SMS"],"summary":"Send SMS","description":"Send a message from sender to recipient using the values shown in the parameters section.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendSMSRequest"}}}},"responses":{"200":{"description":"The SMS that was sent","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SMSResponse"}}}}}}},"/v2/mms":{"post":{"tags":["MMS"],"summary":"Send MMS","description":"The Send MMS endpoint allows you to send multimedia messages (MMS) to recipients. ","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MMSSendRequest"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MMSResponse"},"example":{"id":"6fdae71c-dad7-4c36-9734-a69693ec2318","recipient":"61435795809","sender":"61481074185","country":"AU","subject":"USS Enterprise","message":"Check out this amazing specimen.","message_ref":"ncc1701d","content_urls":["http://res.cloudinary.com/burstsms/image/upload/v1590111670/enterprise-d_ghf9t8.jpg"],"status":"pending","track_links":true,"created_at":"2022-03-29T04:42:01.631708761Z","updated_at":"2022-03-29T04:42:01.631708761Z"}}}}}}},"/v2/mms/{id}":{"get":{"tags":["MMS"],"summary":"Get MMS","description":"This request retrieves the information of an existing sent MMS message. You only need to supply the unique message id that was returned upon creation.","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Unique ID of the sent MMS","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"A single MMS message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MMSResponse"},"example":{"id":"6fdae71c-dad7-4c36-9734-a69693ec2318","recipient":"61435795809","sender":"61481074185","country":"AU","subject":"USS Enterprise","message":"Check out this amazing specimen.","message_ref":"ncc1701d","content_urls":["http://res.cloudinary.com/burstsms/image/upload/v1590111670/enterprise-d_ghf9t8.jpg"],"status":"sent","track_links":true,"created_at":"2022-03-29T04:42:01.631708Z","updated_at":"2022-03-29T04:42:01.776094Z"}}}},"400":{"description":"Invalid MMS ID","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"invalid MMS ID"}}}}}},"404":{"description":"MMS not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"MMS not found"}}}}}}}}},"/v2/webhook":{"post":{"tags":["Webhook"],"summary":"Create Webhook","security":[{"ApiKeyAuth":[]}],"description":"We use webhooks to let your application know when events happen, such as receiving an SMS message. When the event occurs, the system makes an HTTP request (usually a POST) to the URL you configured for the webhook. The request will include details of the event such as the incoming phone number or the body of an incoming message.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookRequest"}}}},"responses":{"201":{"description":"Webhook created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookResponse"}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Validation Error: rate_limit: greater than the maximum value of 10000"}}}}}}}},"get":{"tags":["Webhook"],"summary":"Retrieve all webhooks","security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"A list of webhooks","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookListResponse"}}}}}}},"/v2/webhook/{id}":{"get":{"tags":["Webhook"],"summary":"Get a webhook by ID","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","description":"Unique ID of the webhook","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"A single webhook","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookResponse"}}}},"404":{"description":"Webhook not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Webhook not found"}}}}}}}},"put":{"tags":["Webhook"],"summary":"Update Webhook","description":"Updates the webhook. Any fields not provided in the request body will reset to their default values.","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","description":"Unique identifier for the webhook","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookRequest"}}}},"responses":{"200":{"description":"Webhook updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookResponse"}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Validation Error: event_type: required"}}}}}}}},"delete":{"tags":["Webhook"],"summary":"Delete Webhook","parameters":[{"name":"id","in":"path","schema":{"type":"string","format":"uuid"},"required":true,"description":"Unique ID of the webhook"}],"responses":{"200":{"description":"Webhook deletion confirmation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookDeleteResponse"}}}},"400":{"description":"Invalid webhook ID","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"invalid webhook ID"}}}}}},"404":{"description":"Webhook not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Webhook not found"}}}}}}}}},"/v2/senders/registrations":{"get":{"tags":["Senders"],"summary":"List sender registrations","security":[{"ApiKeyAuth":[]}],"description":"Returns a paginated list of sender registrations for the authenticated account.\n\n  - If the account does not use parent/child accounts, the API returns registrations for the authenticated account.\n  - If the account is a parent account, the API returns registrations for the parent account and all child accounts.\n","parameters":[{"name":"page","in":"query","required":false,"description":"Page number to return (1-based). Default 1.","schema":{"type":"integer","minimum":1,"default":1,"x-go-type-skip-optional-pointer":true},"example":1},{"name":"limit","in":"query","required":false,"description":"Maximum number of results per page. Default 25, maximum 100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":25,"x-go-type-skip-optional-pointer":true},"example":25},{"name":"child_account_id","in":"query","required":false,"description":"Filter registrations by child account ID. Returns only registrations belonging to the specified child account.","schema":{"type":"string","x-go-type-skip-optional-pointer":true},"example":"1234"},{"name":"sender","in":"query","required":false,"description":"Filter registrations by sender phone number in E.164 format (e.g., 61412312312).","schema":{"type":"string","x-go-type-skip-optional-pointer":true},"example":"61412312312"},{"name":"status","in":"query","required":false,"description":"Filter registrations by status. Accepts one or more comma-separated values. Valid values: PENDING_APPROVAL, VERIFIED, REJECTED, CANCELLED.\n","schema":{"type":"string","x-go-type-skip-optional-pointer":true},"example":"VERIFIED"}],"responses":{"200":{"$ref":"#/components/responses/ListSenderRegistrationsSuccessResponse"},"400":{"$ref":"#/components/responses/InputValidationResponse"},"401":{"$ref":"#/components/responses/UnauthorizedErrorResponse"},"500":{"$ref":"#/components/responses/InternalServerErrorResponse"}}},"post":{"tags":["Senders"],"summary":"Create a sender registration","security":[{"ApiKeyAuth":[]}],"description":"Creates a sender registration and sets `status` to `PENDING_APPROVAL`.\n\n  - If the account does not use parent/child accounts, the API ignores `child_account_id` and registers the sender for the authenticated account.\n  - If the account is a parent account and you omit `child_account_id`, the API registers the sender for the parent account.\n  - If you provide `child_account_id`, the API registers the sender for that child account.\n  - If a registration for the same sender was already created within the last 30 minutes (for the same account or child account), the API returns `429 Too Many Requests`. This prevents abuse of the verification retry limit.\n  - Any existing `PENDING_APPROVAL` registration for the same sender (for the same account or child account) is automatically cancelled before the new one is created.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SenderRegistrationRequest"},"example":{"sender":"61412312312","country":"AU","type":"PERSONAL_MOBILE_NUMBER","child_account_id":"1234"}}}},"responses":{"201":{"$ref":"#/components/responses/SenderRegistrationSuccessResponse"},"400":{"$ref":"#/components/responses/InputValidationResponse"},"401":{"$ref":"#/components/responses/UnauthorizedErrorResponse"},"409":{"$ref":"#/components/responses/ConflictErrorResponse"},"429":{"$ref":"#/components/responses/TooManyRequestsErrorResponse"},"500":{"$ref":"#/components/responses/InternalServerErrorResponse"}}}},"/v2/senders/phone-numbers/{phone_number}":{"delete":{"tags":["Senders"],"summary":"Delete a sender by phone number","security":[{"ApiKeyAuth":[]}],"description":"Deletes a sender phone number from the account.\n\n  - If the account does not use parent/child accounts, the API ignores `child_account_id` and deletes the sender from the authenticated account.\n  - If the account is a parent account and you omit `child_account_id`, the API deletes the sender from the parent account.\n  - If you provide `child_account_id`, the API deletes the sender from that child account.\n","parameters":[{"name":"phone_number","in":"path","required":true,"description":"The phone number to delete in E.164 international format, for example 61412312312.","schema":{"type":"string"},"example":"61412312312"},{"name":"child_account_id","in":"query","required":false,"description":"Child account ID to delete the sender from. Ignored for accounts without parent/child accounts. If omitted for a parent account, the API deletes the sender from the parent account.","schema":{"type":"string"},"example":"456"}],"responses":{"204":{"$ref":"#/components/responses/SenderDeleteNoContentResponse"},"400":{"$ref":"#/components/responses/InputValidationResponse"},"401":{"$ref":"#/components/responses/UnauthorizedErrorResponse"},"404":{"$ref":"#/components/responses/NotFoundErrorResponse"},"500":{"$ref":"#/components/responses/InternalServerErrorResponse"}}}},"/v2/senders/registrations/{registration_id}/verifications":{"post":{"tags":["Senders"],"summary":"Request a verification code","security":[{"ApiKeyAuth":[]}],"description":"Requests a verification code for a sender registration. This endpoint supports registrations with `type` = `PERSONAL_MOBILE_NUMBER` only.\n\n  - The API delivers the code to the registered sender number using the selected `method`, such as `SMS`.\n  - Codes expire after 30 minutes.\n  - You have a maximum of 5 attempts to confirm the code.\n","parameters":[{"name":"registration_id","in":"path","required":true,"description":"Unique identifier for the sender registration.","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationRequest"},"example":{"method":"SMS","originating_sender":"61400000000"}}}},"responses":{"201":{"$ref":"#/components/responses/VerificationSuccessResponse"},"400":{"$ref":"#/components/responses/InputValidationResponse"},"401":{"$ref":"#/components/responses/UnauthorizedErrorResponse"},"404":{"$ref":"#/components/responses/NotFoundErro

# --- truncated at 32 KB (127 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/kudosity/refs/heads/main/openapi/kudosity-transmit-message-openapi-original.yml