Properties
| Name | Type | Description |
|---|---|---|
| id | string | A unique identifier that is assigned when the message is created. |
| type | string | The message direction |
| from | string | The address part of the sender id |
| to | string | The phone number of the recipient |
| body | string | The content of the message |
| encoding | string | The type of the content. See the `encoding` field for more information. |
| protocolId | integer | See the `protocolId` field for more information. |
| messageClass | integer | See the `messageClass` field for more information. |
| numberOfParts | integer | The number of parts. If this is a concatenated message, the number of parts will be more than 1. Note that this field does not have a value in the submission response. |
| creditCost | number | The cost of the message (in credits). Note that this field does not have a value in the submission response. |
| submission | object | Identifies the submission. |
| status | object | The status of the message |
| relatedSentMessageId | stringnull | This field has a value only if the type is RECEIVED. With SMS messages, it is not possible to link a reply directly with a specific sent message. However, if you specified `REPLIABLE` in the `from` pr |
| userSuppliedId | stringnull | This is the value you supplied in the `userSuppliedId` field. Has a value only if the `type` is SENT. |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://raw.githubusercontent.com/api-evangelist/bulksms/main/json-schema/bulksms-message-schema.json",
"title": "Message",
"x-generated": "2026-10-14",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/bulksms-openapi.yaml#/components/schemas/Message",
"type": "object",
"required": [
"id",
"type",
"to",
"body",
"status"
],
"properties": {
"id": {
"description": "A unique identifier that is assigned when the message is created.",
"type": "string"
},
"type": {
"description": "The message direction",
"type": "string",
"enum": [
"SENT",
"RECEIVED"
]
},
"from": {
"description": "The address part of the sender id",
"type": "string"
},
"to": {
"description": "The phone number of the recipient",
"type": "string"
},
"body": {
"description": "The content of the message",
"type": "string"
},
"encoding": {
"description": "The type of the content. See the `encoding` field for more information.",
"type": "string",
"enum": [
"TEXT",
"UNICODE",
"BINARY"
]
},
"protocolId": {
"description": "See the `protocolId` field for more information.",
"type": "integer",
"format": "int32"
},
"messageClass": {
"description": "See the `messageClass` field for more information.",
"type": "integer",
"format": "int32"
},
"numberOfParts": {
"description": "The number of parts. If this is a concatenated message, the number of parts will be more than 1. Note that this field does not have a value in the submission response.",
"type": "integer",
"format": "int32"
},
"creditCost": {
"description": "The cost of the message (in credits). Note that this field does not have a value in the submission response.",
"type": "number",
"format": "float"
},
"submission": {
"description": "Identifies the submission.\n",
"type": "object",
"required": [
"id",
"date"
],
"properties": {
"id": {
"description": "A unique identity shared by all messages that were created from the same submission. This field should be ignored if the `type` is not SENT.",
"type": "string"
},
"date": {
"description": "The date and time the submission was processed. If the `type` is RECEIVED, this field reflects the date and time the received message was processed.",
"type": "string",
"format": "date-time"
}
}
},
"status": {
"description": "The status of the message",
"type": "object",
"required": [
"id",
"type"
],
"properties": {
"id": {
"description": "A concatenated value A.B where A is the `status.type` and B is the `status.subtype`.\nIt there is no value for `subtype` then B takes string value `\"null\"` (e.g. `\"SENT.null\"`).\n",
"type": "string"
},
"type": {
"description": "\nACCEPTED Message accepted for delivery. Only returned for initial message submissions.\n\nSCHEDULED Message accepted for delivery at a later date. Only returned for initial message submissions.\n\nSENT Message has been relayed away from our systems.\n\nDELIVERED Successfully delivered to phone.\n\nUNKNOWN Message is in an unknown state.\n\nFAILED Delivery failed.\n",
"type": "string",
"enum": [
"ACCEPTED",
"SCHEDULED",
"SENT",
"DELIVERED",
"UNKNOWN",
"FAILED"
]
},
"subtype": {
"description": "Has a value only if the `type` is FAILED.\n\nEXPIRED Delivery failed because message expired before delivery was possible.\n\nHANDSET_ERROR Delivery failed because of a problem related to the phone (e.g. message storage area full).\n\nBLOCKED Your account has been blocked from sending to this phone (e.g. recipient replied STOP to block communication).\n\nNOT_SENT Message delivery was not attempted: either we could not find a way to deliver the message (e.g. an invalid phone number), or delivery was blocked by fraud/abuse risk filtering. Please contact Support - you may need to have a setting enabled on your account to enable this messaging.\n",
"type": [
"string",
"null"
],
"enum": [
"EXPIRED",
"HANDSET_ERROR",
"BLOCKED",
"NOT_SENT"
]
}
}
},
"relatedSentMessageId": {
"description": "This field has a value only if the type is RECEIVED.\nWith SMS messages, it is not possible to link a reply directly with a specific sent message. However, if you specified `REPLIABLE` in the `from` property, BulkSMS will link any reply to the most recent message sent to a given phone number.\n\nThe `relatedSentMessageId` property keeps the information about this link.\n\nYou can use this property to derive an implicit conversation from a set of messages.\n - If a received reply message has a `relatedSentMessageId`, you can use it to retrieve the last message that was sent before the reply was received.\n - If you have the `id` of the sent message and you want all the received messages that relate to it, you can use the List Related Messages Operation.\n",
"type": [
"string",
"null"
]
},
"userSuppliedId": {
"description": "This is the value you supplied in the `userSuppliedId` field.\nHas a value only if the `type` is SENT.\n",
"type": [
"string",
"null"
]
}
}
}
Work with this as data
Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for schemas
4 MCP tools reach this
find_json_schemasBrowse and filter every JSON Schema in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/bulksms-message"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.