diff --git a/handlers/meta/handlers.go b/handlers/meta/handlers.go index 3c551471..9bc34e46 100644 --- a/handlers/meta/handlers.go +++ b/handlers/meta/handlers.go @@ -11,6 +11,7 @@ import ( "fmt" "net/http" "net/url" + "slices" "strconv" "strings" "time" @@ -51,6 +52,8 @@ var ( "account": "ACCOUNT_UPDATE", "agent": "HUMAN_AGENT", } + + wacThrottlingErrorCodes = []int{4, 80007, 130429, 131048, 131056, 133016} ) // keys for extra in channel events @@ -1090,6 +1093,10 @@ func (h *handler) requestWAC(payload whatsapp.SendRequest, accessToken string, r return courier.ErrResponseUnparseable } + if slices.Contains(wacThrottlingErrorCodes, respPayload.Error.Code) { + return courier.ErrConnectionThrottled + } + if respPayload.Error.Code != 0 { return courier.ErrFailedWithReason(strconv.Itoa(respPayload.Error.Code), respPayload.Error.Message) } diff --git a/handlers/meta/whataspp_test.go b/handlers/meta/whataspp_test.go index c2939383..23a9a664 100644 --- a/handlers/meta/whataspp_test.go +++ b/handlers/meta/whataspp_test.go @@ -696,6 +696,17 @@ var whatsappOutgoingTests = []OutgoingTestCase{ }, ExpectedError: courier.ErrResponseUnparseable, }, + { + Label: "Error Channel Contact Pair limit hit", + MsgText: "Pair limit", + MsgURN: "whatsapp:250788123123", + MockResponses: map[string][]*httpx.MockResponse{ + "*/12345_ID/messages": { + httpx.NewMockResponse(403, nil, []byte(`{ "error": {"message": "(#131056) (Business Account, Consumer Account) pair rate limit hit","code": 131056 }}`)), + }, + }, + ExpectedError: courier.ErrConnectionThrottled, + }, { Label: "Error Throttled", MsgText: "Error", @@ -705,7 +716,7 @@ var whatsappOutgoingTests = []OutgoingTestCase{ httpx.NewMockResponse(403, nil, []byte(`{ "error": {"message": "(#130429) Rate limit hit","code": 130429 }}`)), }, }, - ExpectedError: courier.ErrFailedWithReason("130429", "(#130429) Rate limit hit"), + ExpectedError: courier.ErrConnectionThrottled, }, { Label: "Error",