Official Sinch API skills for AI coding agents — SMS, Voice, Verification, Numbers, Mailgun email, and more.
71
89%
Does it follow best practices?
Impact
—
No eval scenarios have been run
Advisory
Suggest reviewing before use
The Imported Numbers and Hosting Orders API imports non-Sinch phone numbers for use with Sinch SMS without porting. It manages the lifecycle from qualification through text-enablement, including LOA generation and carrier OSR updates.
Before generating code, ask the user these clarifying questions:
Wait for answers, then follow the matching workflow below.
User wants to work with imported numbers →
├─ Import numbers
│ ├─ Single number → Workflow A (Import Number)
│ └─ Bulk (≤5) → Workflow B (Bulk Import via Hosting Order)
├─ Qualify numbers → Workflow C (Qualify → email invoices)
├─ Text-enable numbers
│ ├─ Standard numbers → Workflow D (Text-Enable)
│ └─ Toll-Free → Workflow D variant (TF endpoint)
├─ Check order status → Workflow E (Hosting Order Status)
└─ Manage numbers → Workflow F (CRUD operations)+ (e.g., +12025550134).addNumbers, the user must email invoices to orders@sinch.com. Takes 1–3 business days."", then set new values in a separate request.callbackUrl per-request.states, type, servicePlanId, campaignId are all required.migrateToSinchTmo is read-only on responses. Exception: writable in hostingOrders:importNumbers requests.Store credentials in environment variables — never hardcode tokens or keys in commands or source code:
export SINCH_PROJECT_ID="your-project-id"
export SINCH_KEY_ID="your-key-id"
export SINCH_KEY_SECRET="your-key-secret"
export SINCH_ACCESS_TOKEN="your-oauth-token"
export SERVICE_PLAN_ID="your-service-plan-id"
export CAMPAIGN_ID="your-10dlc-campaign-id"Ensure that authentication headers are properly set when making API calls. The Imported Numbers / Hosting Orders API uses Bearer token authentication:
-H "Authorization: Bearer $SINCH_ACCESS_TOKEN"See sinch-authentication for full auth setup. This API uses OAuth2 client credentials (production) or Basic Auth (testing only, rate-limited). For OAuth2, see how to obtain {SINCH_ACCESS_TOKEN} in the auth skill (do not mint your own JWT).
Base URL: https://imported.numbers.api.sinch.com
Region: US and CA only. Single global endpoint (not regionalized).
curl -X POST \
"https://imported.numbers.api.sinch.com/v1/projects/$SINCH_PROJECT_ID/importedNumbers" \
-H "Authorization: Bearer $SINCH_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"phoneNumber": "+11234567890",
"regionCode": "US",
"displayName": "My Number",
"smsConfiguration": {
"servicePlanId": "$SERVICE_PLAN_ID",
"campaignId": "$CAMPAIGN_ID"
},
"callbackUrl": "https://example.com/callback"
}'ELIGIBLE_CHECK_PENDING → ELIGIBLE / NOT_ELIGIBLE → VERIFICATION_PENDING → VERIFIED / VERIFICATION_FAILED / VERIFICATION_BLOCKED → HOSTING_IN_PROGRESS → HOSTING_DONE / HOSTING_FAILED.DRAFT → SUBMITTED → WAITING_FOR_LOA_SIGNATURE → IN_PROGRESS → COMPLETED / REJECTED. Type: IMPORT or TYPE_TEXT_ENABLE.directLoaInfo, resellerLoaInfo, blanketLoaInfo (empty {}).scheduledOsrUpdateTime.Ask for: phoneNumber, regionCode, servicePlanId. Optional: campaignId, displayName, callbackUrl.
POST /importedNumbersGET /importedNumbers/{phoneNumber}Numbers with their own NNID must complete NNID provisioning first.
API docs: Import number → Get imported number
Ask for: numbers (list, max 5), regionCode, servicePlanId. Optional: campaignId, callbackUrl, migrateToSinchTmo.
POST /hostingOrders:importNumbersGET /hostingOrders/{orderId} — wait for COMPLETEDGET /hostingOrders/{orderId}/numbers — check per-number statusLimit: 5 numbers per request by default. Contact account manager to increase.
API docs: Import numbers → Get order → List order numbers
Ask for: list of phoneNumbers (E.164).
POST /qualifiedNumbers:addNumbers (body: {"phoneNumbers": [...]})GET /qualifiedNumbers/{phoneNumber} — wait for ELIGIBLE stateAPI docs: Create batch → Get qualified number
Ask for: numbers (list, max 500), regionCode, servicePlanId, and LOA info. Optional: campaignId, nnid, scheduledOsrUpdateTime, callbackUrl.
Determine LOA type:
Direct customer → directLoaInfo (authorized person, address, voice carrier)
Reseller → resellerLoaInfo (business name + authorized person, address, voice carrier)
Blanket LOA → blanketLoaInfo: {} (pre-approved with account manager)
1. Text-enable via POST /qualifiedNumbers:textEnableNumbers (or POST /hostingOrders:textEnableNumbers for full order response)
2. LOA sent to authorized person's email for e-signature — confirm email is correct before submitting
3. Track hosting order: GET /hostingOrders/{orderId}
For Toll-Free, use POST /qualifiedNumbers:textEnableTollFreeNumbers or POST /hostingOrders:textEnableTollFreeNumbers instead.
API docs: Text-enable (qualified) · Text-enable (hosting order) · TF (qualified) · TF (hosting order)
GET /hostingOrders?states=...&type=...&servicePlanId=...&campaignId=... (all four required)GET /hostingOrders/{orderId}GET /hostingOrders/{orderId}/report (shows totals for OSR, SMS provisioned, campaign linked)GET /hostingOrders/{orderId}/numbersAPI docs: List orders · Get order · Get report · List order numbers
Imported numbers: list, get, update, delete via /importedNumbers and /importedNumbers/{phoneNumber}.
Qualified numbers: list (requires states param), get, delete via /qualifiedNumbers.
Voice challenge (ownership verification):
POST /qualifiedNumbers/{phone}:sendVoiceChallenge — triggers voice call with codePOST /qualifiedNumbers/{phone}:verifyVoiceChallenge — body: {"code": "1234"}API docs: List imported · Update imported · Delete imported · List qualified · Send challenge · Verify challenge
Callback URLs are set per-request via callbackUrl on import and text-enable operations (not project-level). Configure HMAC signing via PATCH /callbackConfiguration with {"hmacSecret": "..."} — verifies payloads via X-Sinch-Signature header.
See references/callbacks.md for full payload schema, event types, and failure codes.
Allowlist these IPs: 54.76.19.159, 54.78.194.39, 54.155.83.128
hostingOrders:importNumbers allows 5 numbers by default. Use POST /importedNumbers for single numbers.GET /importedNumbers/{phoneNumber} first.SUBMITTED → WAITING_FOR_LOA_SIGNATURE → IN_PROGRESS → COMPLETED / REJECTED.skills
sinch-10dlc
references
sinch-authentication
sinch-conversation-api
sinch-elastic-sip-trunking
references
sinch-fax-api
sinch-imported-numbers-hosting-orders
references
sinch-in-app-calling
sinch-mailgun
references
sinch-mailgun-inspect
references
sinch-mailgun-optimize
references
sinch-mailgun-validate
sinch-number-lookup-api
sinch-number-order-api
sinch-numbers-api
references
sinch-porting-api
sinch-provisioning-api
sinch-sdks
sinch-verification-api