Porting Blocks of Phone Numbers
Background
Phone number blocks are groups of consecutive phone numbers assigned to a specific area or provider. Unlike individual phone numbers used by people or devices, blocks are managed in batches to organize and distribute phone resources efficiently across networks.
Eligible Countries
Note: this is currently only available for German port orders.
Why is it important to indicate when I am porting in a block?
- More control over your port
- Minimize exceptions
- Phone number blocks are processed differently than individual phone numbers. They have unique rules when it comes to port outs and deletions. By indicating that you are porting in a block, it makes it easy for Telnyx to apply these unique processes/rules to your phone numbers.
Create a port order for your number block
To create a port order for your number block, use the POST https://api.telnyx.com/v2/porting_orders
API request (API reference here) and specify the block in the payload. See an example request below:
NoteDon't forget to update
YOUR_API_KEY
here.
curl --location --request POST 'https://api.telnyx.com/v2/porting_orders' \
--header 'Content-Type: application/json' \
--header 'Authorization: YOUR_API_KEY' \
--data '{
"phone_number_blocks": [
{
"phone_number_range": {
"start_at": "+4920123456000",
"end_at": "+4920123456099"
},
"activation_ranges": [
{
"start_at": "+4920123456000",
"end_at": "+4920123456099"
}
]
}
]
}'
Phone_number_range and activation_ranges
Let’s say you own a 1000 number block. In some countries, partial porting is not allowed. Even if some of those numbers are inactive, you are still required to submit a port request for the entire block.
The phone_number_range
object represents the full number block that is porting in. of extensions available for the route number. The phone_number_range
will typically be either 10 phone numbers (1 - 10), 100 phone numbers (1 - 100), or 1000 phone numbers (1 - 1000). All extensions in the phone_number_range
will port, and must all be included in the LOA.
The activation_ranges
array lets you specify which phone numbers within the block that you want active immediately upon port completion. Any phone number in the phone_number_range
that is not in the activation_ranges
array will port, but will remain inactive on your account.
Other considerations:
- The maximum size for a single block is 1000 phone numbers (
0
-999
). - The
activation_ranges
defined must be equal to or a subset of thephone_number_range
. i.e. entering anphone_number_range
between+4920123456000
-+4920123456010
and anactivation_ranges
between+4920123456000
-+4920123456100
would be considered invalid. - The
activation_ranges
defined cannot overlap. i.e. you cannot enter the ranges+4920123456005
-+4920123456012
and+4920123456007
-+4920123456014
.
Example 1: I am porting in my number block +4920123456000 - +4920123456999. However, I only want the phone numbers +4920123456000 - +4920123456775 active upon port completion. The remaining numbers will port, but I do not want them active on my account. In this scenario, my payload would include the following:
"phone_number_blocks": [
{
"phone_number_range": {
"start_at": "+4920123456000"
"end_at": "+4920123456999"
},
"activation_ranges": [
{
"start_at": "+4920123456000",
"end_at": "+4920123456775"
}
]
Example 2: I am porting in my number block +4920123456000 - +4920123456099. However, I only want the phone numbers +4920123456000 - +4920123456064, and +4920123456087 active upon port completion. The remaining numbers will port, but I do not want them active on my account. In this scenario, my payload would include the following:
"phone_number_blocks": [
{
"phone_number_range": {
"start_at": "+4920123456000"
"end_at": "+4920123456099"
},
"activation_ranges": [
{
"start_at": "+4920123456000",
"end_at": "+4920123456064"
},
{
"start_at": "+4920123456087",
"end_at": "+4920123456087"
}
]
What if I didn’t realize I was porting in a block when I created my porting order?
Let's assume that you create and submit a port order for a few individual phone numbers (+4920123456007
, +4920123456045
, and +4920123456087
. That order is eventually rejected. With the rejection reason being that those seemingly “individual” phone numbers are actually part of a block (+4920123456000
- +4920123456099
), and the entire block needs to be ported.
In this case, the porting order you created would be missing phone numbers.
Rather than canceling your port order and creating a new one from scratch, you can update your porting order to add the remaining block with a POST https://api.telnyx.com/v2/porting_orders/:porting_order_id/phone_number_blocks
API request (API reference here). See an example request below.
curl --location --request POST 'https://api.telnyx.com/v2/porting_orders/{{porting_order_id}}/phone_number_blocks' \
--header 'Content-Type: application/json' \
--header 'Authorization: ••••••' \
--data '{
"phone_number_range": {
"start_at": "+4920123456000",
"end_at": "+4920123456099"
},
"activation_ranges": [
{
"start_at": "+4920123456000",
"end_at": "+4920123456099"
}
]
}'
Any phone number that was previously absent will be added to the order.
Other considerations:
- The order should be under
draft
,in-process
, orexception
status to add a block to your order. - If you are adding a block to the port order, it must be the same country and phone number type. I.e. if you had a
DE
local
port order, you could not add aPT
toll_free
block to that order. You could only add aDE
local
block to that order.
View blocks on your order
To view the blocks associated to your porting order (if any), you can perform a GET https://api.telnyx.com/v2/porting_orders/:porting_order_id/phone_number_blocks
API request (API reference here). Sample request below:
curl --location --request GET 'https://api.telnyx.com/v2/porting_orders/{{porting_order_id}}/phone_number_blocks' \
--header 'Authorization: ••••••'
Response:
{
"data": [
{
"id": "58c49e27-8de6-47e4-bfe5-e4ecf0e94d46",
"record_type": "porting_phone_number_block",
"updated_at": "2024-06-27T20:05:18.240033Z",
"country_code": "DE",
"porting_order_id": "{{porting_order_id}}",
"phone_number_type": "local",
"created_at": "2024-06-27T20:05:18.240033Z",
"phone_number_range": {
"start_at": "+4920123456000",
"end_at": "+4920123456099"
},
"activation_ranges": [
{
"start_at": "+4920123456000",
"end_at": "+4920123456099"
}
]
}
],
"meta": {
"page_size": 25,
"page_number": 1,
"total_pages": 1,
"total_results": 1
}
}
When a block is created, it will have its own unique id
. If you query the list porting phone numbers endpoint (API reference here), the block id
will be present in the block_reference_id
attribute. See sample request below.
Request:
curl --location --globoff --request GET 'https://api.telnyx.com/v2/porting_phone_numbers?filter[porting_order_id][eq]={{porting_order_id}}' \
--header 'Authorization: ••••••'
Response:
{
"data": [
{
"id": "957df557-98f4-40da-a2e8-b412430cb512",
"activate": true,
"record_type": "porting_phone_number",
"phone_number": "+4920123456000",
"support_key": null,
"porting_order_id": "{{porting_order_id}}",
"portability_status": null,
"phone_number_type": "local",
"messaging_port_status": null,
"block_reference_id": "58c49e27-8de6-47e4-bfe5-e4ecf0e94d46",
"activation_status": null,
"requirements_status": "requirement-info-pending",
"porting_order_status": "draft"
},
…
Delete a number block
To remove a number block from a porting order, perform a DELETE https://api.telnyx.com/v2/porting_orders/:porting_order_id/phone_number_blocks/:id
API request (API reference here). Include the id
of the number block in the url path. See example request below:
Request:
curl --location --request DELETE 'https://api.telnyx.com/v2/porting_orders/{{porting_order_id}}/phone_number_blocks/58c49e27-8de6-47e4-bfe5-e4ecf0e94d46' \
--header 'Authorization: ••••••'
Response:
{
"data": {
"id": "58c49e27-8de6-47e4-bfe5-e4ecf0e94d46",
"record_type": "porting_phone_number_block",
"updated_at": "2024-06-27T20:05:18.240033Z",
"country_code": "DE",
"porting_order_id": "{{porting_order_id}}",
"phone_number_type": "local",
"created_at": "2024-06-27T20:05:18.240033Z",
"phone_number_range": {
"start_at": "+4926782349900",
"end_at": "+4926782349999"
},
"activation_ranges": [
{
"start_at": "+4920123456000",
"end_at": "+4920123456099"
}
]
}
}
All phone numbers in the deleted block will remain present on the order. The phone numbers themselves will not be deleted.
The order should be under draft
, in-process
, or exception
status to delete a block.