Register a phone number
package main
import ( "fmt" "strings" "net/http" "io")
func main() {
url := "https://api.kirimdev.com/v1/106540352242922/register"
payload := strings.NewReader("{ \"pin\": \"123456\" }")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "order-20260910-0001") req.Header.Add("Authorization", "Bearer <token>") req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close() body, _ := io.ReadAll(res.Body)
fmt.Println(res) fmt.Println(string(body))
}const url = 'https://api.kirimdev.com/v1/106540352242922/register';const options = { method: 'POST', headers: { 'Idempotency-Key': 'order-20260910-0001', Authorization: 'Bearer <token>', 'Content-Type': 'application/json' }, body: '{"pin":"123456"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}use serde_json::json;use reqwest;
#[tokio::main]pub async fn main() { let url = "https://api.kirimdev.com/v1/106540352242922/register";
let payload = json!({"pin": "123456"});
let mut headers = reqwest::header::HeaderMap::new(); headers.insert("Idempotency-Key", "order-20260910-0001".parse().unwrap()); headers.insert("Authorization", "Bearer <token>".parse().unwrap()); headers.insert("Content-Type", "application/json".parse().unwrap());
let client = reqwest::Client::new(); let response = client.post(url) .headers(headers) .json(&payload) .send() .await;
let results = response.unwrap() .json::<serde_json::Value>() .await .unwrap();
dbg!(results);}curl --request POST \ --url https://api.kirimdev.com/v1/106540352242922/register \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --header 'Idempotency-Key: order-20260910-0001' \ --data '{ "pin": "123456" }'Register a WhatsApp Business number for Cloud API sending using its 6-digit two-step-verification PIN. This is the API equivalent of the dashboard’s “Register” action — use it to finish onboarding a number that Meta reports as not yet CONNECTED, or to recover a number degraded with a “not registered” error. The account row must already exist: connect the number first via a customer setup link / embedded signup, then find its phone_number_id from GET /v1/accounts (rows whose status isn’t connected or whose meta_status isn’t CONNECTED are the ones that need this call). PIN semantics mirror Meta: if the number already has two-step verification the PIN must match the existing one; if it doesn’t, the PIN you send becomes the number’s permanent PIN. A wrong PIN, cooldown, or other Meta business error returns 422 whatsapp_registration_failed with a descriptive message. Unlike the other per-account endpoints, this one accepts numbers in any (non-connected) state — that’s the whole point.
Authorizations
Section titled “Authorizations ”Parameters
Section titled “ Parameters ”Path Parameters
Section titled “Path Parameters ”Meta WhatsApp Business phone_number_id of the connected account that should send / own this resource. Discoverable via GET /v1/accounts (returned as phone_number_id on each row).
Example
106540352242922Meta WhatsApp Business phone_number_id of the connected account that should send / own this resource. Discoverable via GET /v1/accounts (returned as phone_number_id on each row).
Header Parameters
Section titled “Header Parameters ”Optional retry key. Reusing the same key with the same method, path, and body within 24 hours returns the original response; reusing it for a different request returns 422.
Example
order-20260910-0001Optional retry key. Reusing the same key with the same method, path, and body within 24 hours returns the original response; reusing it for a different request returns 422.
Request Body
Section titled “Request Body ”object
The WhatsApp number’s 6-digit two-step-verification PIN. Must match the existing PIN if one is set; otherwise it becomes the number’s permanent PIN.
Example
123456Responses
Section titled “ Responses ”Number registered — it can send now.
object
The requested resource.
object
Kirim lifecycle status after registration (typically connected).
Meta’s phone-number status after registration.
Unique request identifier to include when contacting support.
Example
{ "data": { "object": "phone_number_registration", "phone_number_id": "106540352242922", "registered": true, "status": "connected", "meta_status": "CONNECTED" }, "request_id": "req_01HXYZABCDEFGHJKMNPQRSTVWX"}Validation failure
object
object
Human-readable explanation of the error.
Request field associated with the error, when applicable.
Unique request identifier to include when contacting support.
Examples
A field value is invalid.
{ "error": { "type": "invalid_request_error", "code": "invalid_field_value", "message": "A field value is invalid.", "request_id": "req_01HXYZABCDEFGHJKMNPQRSTVWX" }}Authentication failure
object
object
Human-readable explanation of the error.
Request field associated with the error, when applicable.
Unique request identifier to include when contacting support.
Examples
The provided API key is invalid.
{ "error": { "type": "authentication_error", "code": "invalid_api_key", "message": "The provided API key is invalid.", "request_id": "req_01HXYZABCDEFGHJKMNPQRSTVWX" }}Resource not found
object
object
Human-readable explanation of the error.
Request field associated with the error, when applicable.
Unique request identifier to include when contacting support.
Examples
Resource not found.
{ "error": { "type": "not_found", "code": "resource_not_found", "message": "Resource not found.", "request_id": "req_01HXYZABCDEFGHJKMNPQRSTVWX" }}Conflict (e.g. template already exists, webhook subscription disabled, setup link inactive)
object
object
Human-readable explanation of the error.
Request field associated with the error, when applicable.
Unique request identifier to include when contacting support.
Examples
A registration for this WhatsApp number is already in progress. Retry in a moment.
{ "error": { "type": "conflict", "code": "registration_in_progress", "message": "A registration for this WhatsApp number is already in progress. Retry in a moment.", "request_id": "req_01HXYZABCDEFGHJKMNPQRSTVWX" }}Semantic failure (e.g. idempotency key reuse, pre-send compliance guard, media not found)
object
object
Human-readable explanation of the error.
Request field associated with the error, when applicable.
Unique request identifier to include when contacting support.
Examples
WhatsApp number registration failed. Check the two-step-verification PIN and try again.
{ "error": { "type": "invalid_request_error", "code": "whatsapp_registration_failed", "message": "WhatsApp number registration failed. Check the two-step-verification PIN and try again.", "request_id": "req_01HXYZABCDEFGHJKMNPQRSTVWX" }}Rate limit exceeded
object
object
Human-readable explanation of the error.
Request field associated with the error, when applicable.
Unique request identifier to include when contacting support.
Examples
Rate limit exceeded.
{ "error": { "type": "rate_limit_error", "code": "rate_limit_exceeded", "message": "Rate limit exceeded.", "request_id": "req_01HXYZABCDEFGHJKMNPQRSTVWX" }}Internal server error
object
object
Human-readable explanation of the error.
Request field associated with the error, when applicable.
Unique request identifier to include when contacting support.
Examples
An unexpected error occurred.
{ "error": { "type": "api_error", "code": "internal_error", "message": "An unexpected error occurred.", "request_id": "req_01HXYZABCDEFGHJKMNPQRSTVWX" }}Upstream WhatsApp error
object
object
Human-readable explanation of the error.
Request field associated with the error, when applicable.
Unique request identifier to include when contacting support.
Examples
Upstream WhatsApp API failed; please retry.
{ "error": { "type": "api_error", "code": "whatsapp_upstream_error", "message": "Upstream WhatsApp API failed; please retry.", "request_id": "req_01HXYZABCDEFGHJKMNPQRSTVWX" }}