Send One Time Password (OTP)
API URL
URL used to send HTTP requests:
If the request does not reach its destination, repeat it on the backup server backup1.bulkgate.com.
Supported HTTP methods
POST-application/json
On top of request_quota_number the endpoint enforces an account-wide limit of 60 requests per minute. Exceeding it returns the_quota_of_send_per_minute_has_been_exceeded.
Parameters table
| PARAMETER NAME | VALUE | MANDATORY | DEFAULT VALUE |
|---|---|---|---|
| application_id | Application ID | Yes | - |
| application_token | Application token | Yes | - |
| number | Phone number to which send the verification code | Yes | - |
| country | Country code of phone number | no | The value is taken from the profile. |
| language | Language of the message text, one of the 100 supported ISO codes. An unknown code rejects the request. Without it the language is detected from the phone number. | no | null |
| code_type | Type of code. (string, int, or combined) |
no | int |
| code_length | Length of verification code (4-100). | no | 6 |
| request_quota_number | The number of requests per minute for request_quota_identification |
no | 1 |
| request_quota_identification | Identification of the "OTP user / requester" to whom the request_quota_number quota per minute will apply. We recommend using an IP address for this identification. |
Yes | - |
| trials_available_resend | Limit of available resends | no | null - unlimited |
| trials_available_verification | Limit of available verification | no | null - unlimited |
| daily_limit | Limit of available requests per day (sliding for last 24 hours) | no | null - unlimited |
| daily_limit_country | Daily limit per country as a map {"cz": 100, "sk": 50}. When filled in, only the listed countries are allowed — any other one fails with country_is_disabled. |
no | null - unlimited |
| expiration | Expiration of OTP request in seconds, after completion of this time request is not possible. A value below 60 is ignored and the default is used. |
no | 604800 - 7 days |
| channel | Alternative channels. Channels are listed in a cascade, if we are unable to deliver your message via highest priority channel, channels lower in the cascade list will be used. If none of them manages to deliver sms will be used instead. | no | SMS, Viber, RCS, WhatsApp or Text2Voice |
Channels
The channel object decides which channels deliver the code and in what order. The order of the keys in the request is the order of the cascade — if the first channel cannot deliver the code, the next one is tried. If none of them can, SMS is used.
SMS object
| PARAMETER NAME | VALUE | MANDATORY | DEFAULT VALUE |
|---|---|---|---|
| sender_id | Sender ID, see sender ID type | no | gSystem |
| sender_id_value | Sender value - gOwn (e.g. "420 777 777 777"), gText (e.g. "BulkGate"), gProfile (e.g. "423"), gMobile or gPush (KEY) |
no | null |
| domain | Url of a website that uses WebOTP for auto input of received code. | no | null |
Viber object
| PARAMETER NAME | VALUE | MANDATORY | DEFAULT VALUE |
|---|---|---|---|
| sender | Name of your registered sender for Viber | Yes | - |
| expiration | Seconds to wait until trying another channel | no | 60 |
| code_type | Code type required by Viber, stated on the approved OTP template. | no | null |
| code_reason | Reason for sending the code, required by Viber. | no | null |
| business_name | Business name shown in the message. | no | null |
RCS object
| PARAMETER NAME | VALUE | MANDATORY | DEFAULT VALUE |
|---|---|---|---|
| sender | Text sender for RCS. It must be registered first — contact our support to register it. | Yes | - |
| expiration | Seconds to wait until trying another channel | no | 60 |
| use_card | Sends the code as a card instead of plain text. | no | false |
WhatsApp object
| PARAMETER NAME | VALUE | MANDATORY | DEFAULT VALUE |
|---|---|---|---|
| sender | Your registered WhatsApp sender | Yes | - |
| template | Name of the approved WhatsApp template used to deliver the code. | No | verification_code |
| language | Template language. Without it the request-level language is used. |
No | null |
| expiration | Seconds to wait until trying another channel in the cascade. Minimum 60. |
No | 180 |
Text2Voice object
The code is read out loud. The message can be repeated so the recipient can write it down.
| PARAMETER NAME | VALUE | MANDATORY | DEFAULT VALUE |
|---|---|---|---|
| sender | Your registered caller number. | Yes | - |
| language | Voice language, one of the 47 supported ISO codes. Without it the request-level language is used. |
No | null |
| prefer_gender | Preferred voice - male or female. |
No | male |
| safety_statement | Prepends a safety notice to the call. | No | true |
| repeat | How many times the code is repeated during the call. | No | 1 |
| expiration | Seconds to wait until trying another channel in the cascade. Minimum 60. |
No | 180 |
Example request
Response
In case of success:
In case of error:
Where:
- type and error (description of the error) can be found in the error types table
- code represents http error
- detail is an additional info about the error
OTP API error types
On top of the common types the OTP API returns its own:
| TYPE | WHEN IT HAPPENS |
|---|---|
the_quota_of_send_per_minute_has_been_exceeded |
The per-minute send quota is used up. |
the_quota_of_one_additional_resend_per_minute_has_been_exceeded |
A resend sooner than 60 s after the previous one. |
the_quota_of_one_additional_resend_has_been_exceeded |
trials_available_resend is used up. |
the_quota_of_one_additional_verification_has_been_exceeded |
trials_available_verification is used up. |
daily_limit_reached |
daily_limit is used up. |
country_is_disabled |
The number's country is not listed in daily_limit_country. |
country_daily_limit_exceeded |
The daily limit for that country is used up. |
invalid_phone_number |
The number could not be recognised. |
invalid_code |
The verified code does not match. |
unknown_channel |
The cascade contains a channel the OTP API does not know. |
request_can_not_be_created |
The request could not be created. |
Thank you for your feedback.