{
"success": false,
"error": "Failed to initiate transaction"
}
Numbers & Port-in
Submit a port-in
The only port-in submission endpoint — there is no POST /api/v1.1/port-ins.
Move an existing number from another carrier into Spenza. Always
asynchronous.
Two contract exceptions worth calling out:
Requires an account role, not just a valid bearer token —
Admin, Super Admin, or Standard Admin.
Response is not on the standard envelope. Success is a flat
{ success, transactionId, statusEndpoint, message, timestamp } —
no data wrapper — and statusEndpoint points at the singular
legacy path /api/v3/transaction/{id}/status (not the plural
/api/v3/transactions/{id} used everywhere else — both resolve, but
this is the literal value returned). A synchronous validation error
is { success: false, error: "<plain string>", timestamp } — note
error is a bare string here, not an {code, message} object.
Identify the target line via plan, or via Operator + network
directly. Idempotency is supported via an Idempotency-Key header
(handled inline, not the standard interceptor) — a replay returns the
same shape with message: "Port-in already initiated (idempotent replay)".
Any string unique to this logical request. On a retry with the same key
and the same request body, the original response is replayed verbatim
(with an Idempotency-Replayed: true response header) instead of the
action repeating. Reusing the key with a different body or on a
different route returns 409 IDEMPOTENCY_KEY_REUSED. A replay attempted
while the original call is still in flight returns 409 CONFLICT.
Optional — omit it and the endpoint behaves exactly as it would otherwise.
Port-in initiated (note the flat, non-enveloped shape).
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Spenza Partner API","colors":{"primary":"#4A90E2","light":"#6BA7EA","dark":"#3A7BC8"},"logo":{"light":"https://mintcdn.com/spenza/GJzB73Y-B-hhARyI/logo/spenza.png?fit=max\u0026auto=format\u0026n=GJzB73Y-B-hhARyI\u0026q=85\u0026s=fbc1eb2578f28d2a746d4705efa218e1","dark":"https://mintcdn.com/spenza/Z5R2JpHgh3kjkBT1/logo/spenza-dark.png?fit=max\u0026auto=format\u0026n=Z5R2JpHgh3kjkBT1\u0026q=85\u0026s=9c5f62da35c95508b83e786be10cf4b7","href":"https://spenza.com/"},"favicon":"https://mintcdn.com/spenza/6rGuabM28__mWZpe/favicon.jpg?fit=max\u0026auto=format\u0026n=6rGuabM28__mWZpe\u0026q=85\u0026s=c7c9675b82abf1acd84122e31e933cfb","navbar":{"links":[{"href":"https://spenza.com/","label":"Home"},{"href":"https://spenza.com/support/","label":"Support"},{"href":"/postman-collection","label":"Postman"},{"href":"https://status.spenza.com","label":"Status"}],"primary":{"type":"button","label":"Login","href":"https://web.spenza.com/login"}},"footer":{"socials":{"website":"https://spenza.com/"}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"spenza","hasAudioNarration":false,"actualSubdomain":"spenza","customDomains":["docs.spenza.com"],"gitSource":{"type":"github","owner":"isimplexityorg","repo":"api-backend","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"collectionId":"9f05c287-fff5-4ced-bfc1-a43e5cd9c20a","liveDeploymentHistoryId":"6ae2f8bd3ff06ac66ce60a8e","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae2f8bd3ff06ac66ce60a8e"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ae2f8bd3ff06ac66ce60a8e","clientVersion":"0.0.4045","searchFilterCounts":[{"language":"default","tag":"API Reference","count":85},{"language":"default","tag":"Webhooks","count":8},{"language":"default","tag":"Device Groups","count":7},{"language":"default","tag":"SIM Groups","count":7},{"language":"default","tag":"SIMs","count":7},{"language":"default","tag":"User Groups","count":7},{"language":"default","tag":"Overview","count":5},{"language":"default","tag":"Reference","count":5},{"language":"default","tag":"Billing","count":5},{"language":"default","tag":"Plans \u0026 Catalog","count":5}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/numbers-\u0026-port-in/submit-a-port-in","slug":"/api-reference/numbers-\u0026-port-in/submit-a-port-in","pageMetadata":{"title":"Submit a port-in","description":"**The only port-in submission endpoint** — there is no `POST /api/v1.1/port-ins`.\nMove an existing number from another carrier into Spenza. Always\nasynchronous.\n\n**Two contract exceptions worth calling out:**\n1. **Requires an account role**, not just a valid bearer token —\n `Admin`, `Super Admin`, or `Standard Admin`.\n2. **Response is not on the standard envelope.** Success is a flat\n `{ success, transactionId, statusEndpoint, message, timestamp }` —\n no `data` wrapper — and `statusEndpoint` points at the **singular**\n legacy path `/api/v3/transaction/{id}/status` (not the plural\n `/api/v3/transactions/{id}` used everywhere else — both resolve, but\n this is the literal value returned). A synchronous validation error\n is `{ success: false, error: \"\u003cplain string>\", timestamp }` — note\n `error` is a bare string here, not an `{code, message}` object.\n\nIdentify the target line via `plan`, or via `Operator` + `network`\ndirectly. Idempotency is supported via an `Idempotency-Key` header\n(handled inline, not the standard interceptor) — a replay returns the\nsame shape with `message: \"Port-in already initiated (idempotent replay)\"`.\n","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/v3/port-in","href":"/api-reference/numbers-\u0026-port-in/submit-a-port-in","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n li: \"li\",\n ol: \"ol\",\n p: \"p\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"The only port-in submission endpoint\"\n }), \" — there is no \", _jsx(_components.code, {\n children: \"POST /api/v1.1/port-ins\"\n }), \".\\nMove an existing number from another carrier into Spenza. Always\\nasynchronous.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: _jsx(_components.strong, {\n children: \"Two contract exceptions worth calling out:\"\n })\n }), \"\\n\", _jsxs(_components.ol, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: \"Requires an account role\"\n }), \", not just a valid bearer token —\\n\", _jsx(_components.code, {\n children: \"Admin\"\n }), \", \", _jsx(_components.code, {\n children: \"Super Admin\"\n }), \", or \", _jsx(_components.code, {\n children: \"Standard Admin\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: \"Response is not on the standard envelope.\"\n }), \" Success is a flat\\n\", _jsx(_components.code, {\n children: \"{ success, transactionId, statusEndpoint, message, timestamp }\"\n }), \" —\\nno \", _jsx(_components.code, {\n children: \"data\"\n }), \" wrapper — and \", _jsx(_components.code, {\n children: \"statusEndpoint\"\n }), \" points at the \", _jsx(_components.strong, {\n children: \"singular\"\n }), \"\\nlegacy path \", _jsx(_components.code, {\n children: \"/api/v3/transaction/{id}/status\"\n }), \" (not the plural\\n\", _jsx(_components.code, {\n children: \"/api/v3/transactions/{id}\"\n }), \" used everywhere else — both resolve, but\\nthis is the literal value returned). A synchronous validation error\\nis \", _jsx(_components.code, {\n children: \"{ success: false, error: \\\"\u003cplain string>\\\", timestamp }\"\n }), \" — note\\n\", _jsx(_components.code, {\n children: \"error\"\n }), \" is a bare string here, not an \", _jsx(_components.code, {\n children: \"{code, message}\"\n }), \" object.\"]\n }), \"\\n\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Identify the target line via \", _jsx(_components.code, {\n children: \"plan\"\n }), \", or via \", _jsx(_components.code, {\n children: \"Operator\"\n }), \" + \", _jsx(_components.code, {\n children: \"network\"\n }), \"\\ndirectly. Idempotency is supported via an \", _jsx(_components.code, {\n children: \"Idempotency-Key\"\n }), \" header\\n(handled inline, not the standard interceptor) — a replay returns the\\nsame shape with \", _jsx(_components.code, {\n children: \"message: \\\"Port-in already initiated (idempotent replay)\\\"\"\n }), \".\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Submit a port-in","description":"**The only port-in submission endpoint** — there is no `POST /api/v1.1/port-ins`.\nMove an existing number from another carrier into Spenza. Always\nasynchronous.\n\n**Two contract exceptions worth calling out:**\n1. **Requires an account role**, not just a valid bearer token —\n `Admin`, `Super Admin`, or `Standard Admin`.\n2. **Response is not on the standard envelope.** Success is a flat\n `{ success, transactionId, statusEndpoint, message, timestamp }` —\n no `data` wrapper — and `statusEndpoint` points at the **singular**\n legacy path `/api/v3/transaction/{id}/status` (not the plural\n `/api/v3/transactions/{id}` used everywhere else — both resolve, but\n this is the literal value returned). A synchronous validation error\n is `{ success: false, error: \"\u003cplain string>\", timestamp }` — note\n `error` is a bare string here, not an `{code, message}` object.\n\nIdentify the target line via `plan`, or via `Operator` + `network`\ndirectly. Idempotency is supported via an `Idempotency-Key` header\n(handled inline, not the standard interceptor) — a replay returns the\nsame shape with `message: \"Port-in already initiated (idempotent replay)\"`.\n","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/v3/port-in","href":"/api-reference/numbers-\u0026-port-in/submit-a-port-in","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["Numbers \u0026 Port-in"],"summary":"Submit a port-in","operationId":"createPortIn","description":"**The only port-in submission endpoint** — there is no `POST /api/v1.1/port-ins`.\nMove an existing number from another carrier into Spenza. Always\nasynchronous.\n\n**Two contract exceptions worth calling out:**\n1. **Requires an account role**, not just a valid bearer token —\n `Admin`, `Super Admin`, or `Standard Admin`.\n2. **Response is not on the standard envelope.** Success is a flat\n `{ success, transactionId, statusEndpoint, message, timestamp }` —\n no `data` wrapper — and `statusEndpoint` points at the **singular**\n legacy path `/api/v3/transaction/{id}/status` (not the plural\n `/api/v3/transactions/{id}` used everywhere else — both resolve, but\n this is the literal value returned). A synchronous validation error\n is `{ success: false, error: \"\u003cplain string>\", timestamp }` — note\n `error` is a bare string here, not an `{code, message}` object.\n\nIdentify the target line via `plan`, or via `Operator` + `network`\ndirectly. Idempotency is supported via an `Idempotency-Key` header\n(handled inline, not the standard interceptor) — a replay returns the\nsame shape with `message: \"Port-in already initiated (idempotent replay)\"`.\n","security":[],"parameters":["befceb5e-4d25-41fa-920d-7ceafdf7576b"],"requestBody":"79602faa-b608-4c88-913b-fc42d1d877a6","responses":{"200":"222d7cfb-02d9-4f56-a057-17904c4cd62d","400":"22bbaba9-d1c1-497d-8f23-762304226ffa","500":"25dbee95-74ae-45f2-89a2-c005d98f892a"},"method":"post","type":"path","servers":["9985245e-477a-47ad-977d-32b247cc3dad"],"path":"/api/v3/port-in","baseUrlOptions":["https://api.spenza.com"],"title":"Submit a port-in","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"befceb5e-4d25-41fa-920d-7ceafdf7576b":{"name":"Idempotency-Key","in":"header","required":false,"description":"Any string unique to this logical request. On a retry with the same key\nand the same request body, the original response is replayed verbatim\n(with an `Idempotency-Replayed: true` response header) instead of the\naction repeating. Reusing the key with a **different** body or on a\ndifferent route returns `409 IDEMPOTENCY_KEY_REUSED`. A replay attempted\nwhile the original call is still in flight returns `409 CONFLICT`.\nOptional — omit it and the endpoint behaves exactly as it would otherwise.\n","schema":{"type":"string","example":"a1b2c3d4-idem-key-001","isRequired":false,"description":"Any string unique to this logical request. On a retry with the same key\nand the same request body, the original response is replayed verbatim\n(with an `Idempotency-Replayed: true` response header) instead of the\naction repeating. Reusing the key with a **different** body or on a\ndifferent route returns `409 IDEMPOTENCY_KEY_REUSED`. A replay attempted\nwhile the original call is still in flight returns `409 CONFLICT`.\nOptional — omit it and the endpoint behaves exactly as it would otherwise.\n","uniqueKey":"","typeLabel":"string"}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["portInNumber","currentCarrierName","currentAccountNumber","currentAccountPassword","currentBillingAddress","employeeEmail","employeeName"],"properties":{"portInNumber":{"type":"string","description":"10-15 digits, optional leading +, cannot be all zeros.","example":"+15555551234","isRequired":true,"uniqueKey":"portInNumber","typeLabel":"string"},"currentCarrierName":{"type":"string","example":"Verizon","isRequired":true,"uniqueKey":"currentCarrierName","typeLabel":"string"},"currentAccountNumber":{"type":"string","example":"1234567890","isRequired":true,"uniqueKey":"currentAccountNumber","typeLabel":"string"},"currentAccountPassword":{"type":"string","description":"Losing carrier's account PIN (FCC LNP) — treat like a credential, never log it.","example":"1234","isRequired":true,"uniqueKey":"currentAccountPassword","typeLabel":"string"},"currentBillingAddress":{"type":"object","required":["street1","city","state","zip"],"properties":{"street1":{"type":"string","example":"123 Main St","isRequired":true,"uniqueKey":"currentBillingAddress.street1","typeLabel":"string"},"city":{"type":"string","example":"New York","isRequired":true,"uniqueKey":"currentBillingAddress.city","typeLabel":"string"},"state":{"type":"string","description":"US state, 2-letter or full name.","example":"NY","isRequired":true,"uniqueKey":"currentBillingAddress.state","typeLabel":"string"},"zip":{"type":"string","example":"10011","isRequired":true,"uniqueKey":"currentBillingAddress.zip","typeLabel":"string"},"street2":{"type":"string","example":"Apt 4B","uniqueKey":"currentBillingAddress.street2","typeLabel":"string"}},"isRequired":true,"uniqueKey":"currentBillingAddress","typeLabel":"object"},"employeeEmail":{"type":"string","format":"email","description":"Auto-creates the user on this account if no match exists.","example":"jane@example.com","isRequired":true,"uniqueKey":"employeeEmail","typeLabel":"string\u003cemail>"},"employeeName":{"type":"string","description":"Used when auto-creating the user.","example":"Jane Doe","isRequired":true,"uniqueKey":"employeeName","typeLabel":"string"},"plan":{"type":"string","description":"Plan/product name; operator+network derived from it. Required when Operator/network are absent.","example":"AT\u0026T 5GB","uniqueKey":"plan","typeLabel":"string"},"Operator":{"type":"string","description":"Required when plan is absent.","example":"AT\u0026T","uniqueKey":"Operator","typeLabel":"string"},"network":{"type":"string","description":"Required when plan is absent.","example":"AT\u0026T","uniqueKey":"network","typeLabel":"string"},"iccid":{"type":"string","description":"19-20 digits.","example":"8901260853182965429","uniqueKey":"iccid","typeLabel":"string"},"targetPortinClassification":{"type":"string","enum":["mvno","iot"],"uniqueKey":"targetPortinClassification","typeLabel":"enum\u003cstring>"},"subscriberName":{"type":"string","description":"Defaults to employeeName if omitted.","example":"Jane Doe","uniqueKey":"subscriberName","typeLabel":"string"},"metaData":{"type":"object","description":"Free-form partner metadata for correlation.","uniqueKey":"metaData","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"portInNumber":"+15555551234","currentCarrierName":"Verizon","currentAccountNumber":"1234567890","currentAccountPassword":"1234","currentBillingAddress":{"street1":"123 Main St","city":"New York","state":"NY","zip":"10011","street2":"Apt 4B"},"employeeEmail":"jane@example.com","employeeName":"Jane Doe","plan":"AT\u0026T 5GB","Operator":"AT\u0026T","network":"AT\u0026T","iccid":"8901260853182965429","subscriberName":"Jane Doe","metaData":{}}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"222d7cfb-02d9-4f56-a057-17904c4cd62d":{"description":"Port-in initiated (note the flat, non-enveloped shape).","content":{"application/json":{"example":{"success":true,"transactionId":"v3_1715567890123_abc123def456","statusEndpoint":"/api/v3/transaction/v3_1715567890123_abc123def456/status","message":"Port-in initiated","timestamp":"2026-07-31T09:00:00.000Z"},"examples":{"Example":{"title":"Example","value":{"success":true,"transactionId":"v3_1715567890123_abc123def456","statusEndpoint":"/api/v3/transaction/v3_1715567890123_abc123def456/status","message":"Port-in initiated","timestamp":"2026-07-31T09:00:00.000Z"}}},"exampleType":"examples"}},"exampleType":"examples"},"22bbaba9-d1c1-497d-8f23-762304226ffa":{"description":"Plan not found, or plan has no operator/network configured. `error` is a plain string, not an object.","content":{"application/json":{"example":{"success":false,"error":"Plan 'AT0001' not found","timestamp":"2026-07-31T09:00:00.000Z"},"examples":{"Example":{"title":"Example","value":{"success":false,"error":"Plan 'AT0001' not found","timestamp":"2026-07-31T09:00:00.000Z"}}},"exampleType":"examples"}},"exampleType":"examples"},"25dbee95-74ae-45f2-89a2-c005d98f892a":{"description":"Transaction could not be initiated.","content":{"application/json":{"example":{"success":false,"error":"Failed to initiate transaction"},"examples":{"Example":{"title":"Example","value":{"success":false,"error":"Failed to initiate transaction"}}},"exampleType":"examples"}},"exampleType":"examples"}},"security":{},"servers":{"9985245e-477a-47ad-977d-32b247cc3dad":{"url":"https://api.spenza.com","description":"Production"}}},"originalFileLocation":"openapi.yaml"},"subdomain":"spenza","siteName":"Spenza Partner API","title":"Submit a port-in - Spenza Partner API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-29T07:35:45.677Z","originalFileLocation":"api-reference/numbers-\u0026-port-in/submit-a-port-in.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"The only port-in submission endpoint — there is no POST /api/v1.1/port-ins. Move an existing number from another carrier into Spenza. Always asynchronous. Two contract exceptions worth calling out: 1. Requires an account role, not just a valid bearer token — Admin, Super Admin, or Standard Admin. 2. Response is not on the standard envelope. Success is a flat { success, transactionId, statusEndpoint, message, timestamp } — no data wrapper — and statusEndpoint points at the singular legacy path /api/v3/transaction/{id}/status (not the plural /api/v3/transactions/{id} used everywhere else — both resolve, but this is the literal value returned). A synchronous validation error is { success: false, error: \u0026quot;\u0026quot;, timestamp } — note error is a bare string here, not an {code, message} object. Identify the target line via plan, or via Operator + network directly. Idempotency is supported via an Idempotency-Key header (handled inline, not the standard interceptor) — a replay returns the same shape with message: \u0026quot;Port-in already initiated (idempotent replay)\u0026quot;.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Spenza Partner API\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/spenza/a8hAv7eroJmUmmEz/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/spenza/a8hAv7eroJmUmmEz/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/spenza/a8hAv7eroJmUmmEz/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/spenza/a8hAv7eroJmUmmEz/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/spenza/a8hAv7eroJmUmmEz/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/spenza/a8hAv7eroJmUmmEz/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/spenza/a8hAv7eroJmUmmEz/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/spenza/a8hAv7eroJmUmmEz/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/spenza/a8hAv7eroJmUmmEz/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Submit a port-in - Spenza Partner API\">\u003cmeta data-mint-head property=\"og:description\" content=\"The only port-in submission endpoint — there is no POST /api/v1.1/port-ins. Move an existing number from another carrier into Spenza. Always asynchronous. Two contract exceptions worth calling out: 1. Requires an account role, not just a valid bearer token — Admin, Super Admin, or Standard Admin. 2. Response is not on the standard envelope. Success is a flat { success, transactionId, statusEndpoint, message, timestamp } — no data wrapper — and statusEndpoint points at the singular legacy path /api/v3/transaction/{id}/status (not the plural /api/v3/transactions/{id} used everywhere else — both resolve, but this is the literal value returned). A synchronous validation error is { success: false, error: \u0026quot;\u0026quot;, timestamp } — note error is a bare string here, not an {code, message} object. Identify the target line via plan, or via Operator + network directly. Idempotency is supported via an Idempotency-Key header (handled inline, not the standard interceptor) — a replay returns the same shape with message: \u0026quot;Port-in already initiated (idempotent replay)\u0026quot;.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Spenza Partner API\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.spenza.com/api-reference/numbers-\u0026amp;-port-in/submit-a-port-in\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://spenza.mintlify.app/_mintlify/api/og/v2?division=Numbers+%26+Port-in\u0026amp;title=Submit+a+port-in\u0026amp;description=**The+only+port-in+submission+endpoint**+%E2%80%94+there+is+no+%60POST+%2Fapi%2Fv1.1%2Fport-ins%60.%0AMove+an+existing+number+from+another+carrier+into+Spenza.+Always%0Aasynchronous.\u0026amp;theme=d935d10a2668cab1092b6754\u0026amp;signature=522fdedf893baf2035599ddcab5f308ff6f4c9d817019f07436a4527e8e0eb39\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Submit a port-in - Spenza Partner API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"The only port-in submission endpoint — there is no POST /api/v1.1/port-ins. Move an existing number from another carrier into Spenza. Always asynchronous. Two contract exceptions worth calling out: 1. Requires an account role, not just a valid bearer token — Admin, Super Admin, or Standard Admin. 2. Response is not on the standard envelope. Success is a flat { success, transactionId, statusEndpoint, message, timestamp } — no data wrapper — and statusEndpoint points at the singular legacy path /api/v3/transaction/{id}/status (not the plural /api/v3/transactions/{id} used everywhere else — both resolve, but this is the literal value returned). A synchronous validation error is { success: false, error: \u0026quot;\u0026quot;, timestamp } — note error is a bare string here, not an {code, message} object. Identify the target line via plan, or via Operator + network directly. Idempotency is supported via an Idempotency-Key header (handled inline, not the standard interceptor) — a replay returns the same shape with message: \u0026quot;Port-in already initiated (idempotent replay)\u0026quot;.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://spenza.mintlify.app/_mintlify/api/og/v2?division=Numbers+%26+Port-in\u0026amp;title=Submit+a+port-in\u0026amp;description=**The+only+port-in+submission+endpoint**+%E2%80%94+there+is+no+%60POST+%2Fapi%2Fv1.1%2Fport-ins%60.%0AMove+an+existing+number+from+another+carrier+into+Spenza.+Always%0Aasynchronous.\u0026amp;theme=d935d10a2668cab1092b6754\u0026amp;signature=522fdedf893baf2035599ddcab5f308ff6f4c9d817019f07436a4527e8e0eb39\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/spenza/a8hAv7eroJmUmmEz/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Spenza Partner API\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#4A90E2\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.spenza.com/api-reference/numbers-\u0026amp;-port-in/submit-a-port-in\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/numbers-%26-port-in/submit-a-port-in.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.spenza.com/#organization\",\"name\":\"Spenza Partner API\",\"url\":\"https://docs.spenza.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/spenza/GJzB73Y-B-hhARyI/logo/spenza.png?fit=max\u0026auto=format\u0026n=GJzB73Y-B-hhARyI\u0026q=85\u0026s=fbc1eb2578f28d2a746d4705efa218e1\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.spenza.com#website\",\"name\":\"Spenza Partner API\",\"url\":\"https://docs.spenza.com\",\"publisher\":{\"@id\":\"https://docs.spenza.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.spenza.com/api-reference/numbers-\u0026-port-in/submit-a-port-in#webpage\",\"url\":\"https://docs.spenza.com/api-reference/numbers-\u0026-port-in/submit-a-port-in\",\"name\":\"Submit a port-in\",\"description\":\"The only port-in submission endpoint — there is no POST /api/v1.1/port-ins. Move an existing number from another carrier into Spenza. Always asynchronous. Two contract exceptions worth calling out: 1. Requires an account role, not just a valid bearer token — Admin, Super Admin, or Standard Admin. 2. Response is not on the standard envelope. Success is a flat { success, transactionId, statusEndpoint, message, timestamp } — no data wrapper — and statusEndpoint points at the singular legacy path /api/v3/transaction/{id}/status (not the plural /api/v3/transactions/{id} used everywhere else — both resolve, but this is the literal value returned). A synchronous validation error is { success: false, error: \\\"\\\", timestamp } — note error is a bare string here, not an {code, message} object. Identify the target line via plan, or via Operator + network directly. Idempotency is supported via an Idempotency-Key header (handled inline, not the standard interceptor) — a replay returns the same shape with message: \\\"Port-in already initiated (idempotent replay)\\\".\",\"dateModified\":\"2026-10-29T07:35:45.677Z\",\"isPartOf\":{\"@id\":\"https://docs.spenza.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.spenza.com/api-reference/numbers-\u0026-port-in/submit-a-port-in#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.spenza.com/api-reference/numbers-\u0026-port-in/submit-a-port-in#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"API Reference\",\"item\":\"https://docs.spenza.com/api-reference/authentication/exchange-credentials-for-a-token\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Numbers \u0026 Port-in\",\"item\":\"https://docs.spenza.com/api-reference/numbers-\u0026-port-in/list-port-in-requests\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Submit a port-in\",\"item\":\"https://docs.spenza.com/api-reference/numbers-\u0026-port-in/submit-a-port-in\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.spenza.com/api-reference/numbers-\u0026-port-in/submit-a-port-in#apireference\",\"headline\":\"Submit a port-in\",\"name\":\"Submit a port-in\",\"description\":\"The only port-in submission endpoint — there is no POST /api/v1.1/port-ins. Move an existing number from another carrier into Spenza. Always asynchronous. Two contract exceptions worth calling out: 1. Requires an account role, not just a valid bearer token — Admin, Super Admin, or Standard Admin. 2. Response is not on the standard envelope. Success is a flat { success, transactionId, statusEndpoint, message, timestamp } — no data wrapper — and statusEndpoint points at the singular legacy path /api/v3/transaction/{id}/status (not the plural /api/v3/transactions/{id} used everywhere else — both resolve, but this is the literal value returned). A synchronous validation error is { success: false, error: \\\"\\\", timestamp } — note error is a bare string here, not an {code, message} object. Identify the target line via plan, or via Operator + network directly. Idempotency is supported via an Idempotency-Key header (handled inline, not the standard interceptor) — a replay returns the same shape with message: \\\"Port-in already initiated (idempotent replay)\\\".\",\"url\":\"https://docs.spenza.com/api-reference/numbers-\u0026-port-in/submit-a-port-in\",\"mainEntityOfPage\":{\"@id\":\"https://docs.spenza.com/api-reference/numbers-\u0026-port-in/submit-a-port-in#webpage\"},\"dateModified\":\"2026-10-29T07:35:45.677Z\",\"publisher\":{\"@id\":\"https://docs.spenza.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.spenza.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Spenza Partner API\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Spenza Partner API","nav":{"global":null,"groups":[{"group":"Overview","pages":[{"title":"Introduction","href":"/introduction"},{"title":"Getting Started","href":"/getting-started"},{"title":"Core Concepts","href":"/core-concepts"},{"title":"Authentication","href":"/authentication"},{"title":"Quickstart","href":"/quickstart"}]},{"group":"Build","pages":[{"title":"Guides","href":"/guides"},{"title":"Webhooks","href":"/webhooks"},{"title":"Postman Collection","href":"/postman-collection"}]},{"group":"Reference","pages":[{"title":"Errors","href":"/errors"},{"title":"Rate Limits","href":"/rate-limits"},{"title":"Environments \u0026 Versioning","href":"/environments-versioning"},{"title":"Security \u0026 Best Practices","href":"/security"},{"title":"SDKs \u0026 Code Examples","href":"/sdks"}]},{"group":"Help","pages":[{"title":"API Status \u0026 Maintenance","href":"/status"},{"title":"FAQ \u0026 Troubleshooting","href":"/faq"},{"title":"Support","href":"/support"}]},{"group":"API Reference","pages":[{"group":"Authentication","pages":[{"title":"Exchange credentials for a token","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/v1.1/auth/token","href":"/api-reference/authentication/exchange-credentials-for-a-token"}]},{"group":"SIMs","pages":[{"title":"List SIMs","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/sims","href":"/api-reference/sims/list-sims"},{"title":"Get a SIM by ICCID","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/sims/{iccid}","href":"/api-reference/sims/get-a-sim-by-iccid"},{"title":"Get SIM usage","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/sims/{iccid}/usage","href":"/api-reference/sims/get-sim-usage"},{"title":"Assign a SIM to a user","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/v1.1/sims/{iccid}/assign","href":"/api-reference/sims/assign-a-sim-to-a-user"},{"title":"Request a new phone number","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/v1.1/sims/{iccid}/renew-number","href":"/api-reference/sims/request-a-new-phone-number"},{"title":"Get a SIM's current service state","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/sims/{iccid}/service-state","href":"/api-reference/sims/get-a-sims-current-service-state"},{"title":"Enable or disable voice, SMS, and/or data on a SIM","deprecated":null,"version":null,"openapi":"/openapi.yaml patch /api/v1.1/sims/{iccid}/service-state","href":"/api-reference/sims/enable-or-disable-voice-sms-andor-data-on-a-sim"}]},{"group":"Subscriptions","pages":[{"title":"List subscriptions","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/subscriptions","href":"/api-reference/subscriptions/list-subscriptions"},{"title":"Get a SIM's subscription","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/sims/{iccid}/subscription","href":"/api-reference/subscriptions/get-a-sims-subscription"},{"title":"Cancel a subscription","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/v1.1/subscriptions/{iccid}/cancel","href":"/api-reference/subscriptions/cancel-a-subscription"}]},{"group":"Plans \u0026 Catalog","pages":[{"title":"List plans","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/plans","href":"/api-reference/plans-\u0026-catalog/list-plans"},{"title":"Get a plan","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/plans/{planId}","href":"/api-reference/plans-\u0026-catalog/get-a-plan"},{"title":"List SIM products","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/sim-products","href":"/api-reference/plans-\u0026-catalog/list-sim-products"},{"title":"Purchase a plan (synchronous)","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/v1.1/plans/purchase","href":"/api-reference/plans-\u0026-catalog/purchase-a-plan-synchronous"},{"title":"Purchase a plan (asynchronous)","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/v3/plans/purchase","href":"/api-reference/plans-\u0026-catalog/purchase-a-plan-asynchronous"}]},{"group":"eSIM","pages":[{"title":"Provision an eSIM, optionally with a plan","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/v1.1/esim","href":"/api-reference/esim/provision-an-esim-optionally-with-a-plan"},{"title":"Get eSIM activation QR","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/esim/{iccid}/qr","href":"/api-reference/esim/get-esim-activation-qr"}]},{"group":"Billing","pages":[{"title":"List invoices","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/invoices","href":"/api-reference/billing/list-invoices"},{"title":"Get an invoice","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/invoices/{id}","href":"/api-reference/billing/get-an-invoice"},{"title":"Download invoice PDF","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/invoices/{id}/pdf","href":"/api-reference/billing/download-invoice-pdf"},{"title":"Get credit balance","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/credit-balance","href":"/api-reference/billing/get-credit-balance"},{"title":"Add prepaid credit","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/v1.1/top-up","href":"/api-reference/billing/add-prepaid-credit"}]},{"group":"Users","pages":[{"title":"List users","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/users","href":"/api-reference/users/list-users"},{"title":"Create a user","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/v1.1/users","href":"/api-reference/users/create-a-user"},{"title":"Get a user","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/users/{email}","href":"/api-reference/users/get-a-user"},{"title":"Update a user","deprecated":null,"version":null,"openapi":"/openapi.yaml put /api/v1.1/users/{email}","href":"/api-reference/users/update-a-user"},{"title":"Delete a user","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /api/v1.1/users/{email}","href":"/api-reference/users/delete-a-user"}]},{"group":"Orders \u0026 Transactions","pages":[{"title":"List orders","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/orders","href":"/api-reference/orders-\u0026-transactions/list-orders"},{"title":"Get an order","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/orders/{id}","href":"/api-reference/orders-\u0026-transactions/get-an-order"},{"title":"List transactions","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/transactions","href":"/api-reference/orders-\u0026-transactions/list-transactions"}]},{"group":"Numbers \u0026 Port-in","pages":[{"title":"List port-in requests","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/port-ins","href":"/api-reference/numbers-\u0026-port-in/list-port-in-requests"},{"title":"Check port-in eligibility","description":"Check whether a number is eligible for port-in without submitting one —\nread-only, no order created. An ineligible number is a `200` with\n`eligible: false`, not an HTTP error. Only the **SpenzaJ** carrier\nactually implements this check today; every other carrier (Simetry,\nSoracom, EsimGo, CiscoJasper, Granite, Webbing, Boom) returns `501`.\n","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/v1.1/port-in/eligibility","href":"/api-reference/numbers-\u0026-port-in/check-port-in-eligibility"},{"title":"Submit a port-in","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/v3/port-in","href":"/api-reference/numbers-\u0026-port-in/submit-a-port-in"}]},{"group":"Messaging","pages":[{"title":"Send an SMS","description":"Send a Mobile-Originated (MO) SMS from a number provisioned on your\naccount. Requires the account's `Admin` role tier. **MO SMS is only\nimplemented for some operators** (SpenzaJ today) — everyone else gets\n`501`. This is a synchronous endpoint that returns `201` directly\n(NestJS's default for `@Post()`, since the handler has no `@HttpCode`\noverride); it does not follow the async `202` + transaction-polling\npattern used elsewhere. `fromNumber`, `toNumber`, and `text` are all\nshown as `required` below to reflect this endpoint's actual runtime\nbehavior — enforcement happens in controller logic, not in the\nunderlying DTO. `toNumber` is only validated for E.164 format; it is\nnot checked against any ownership/allow-list.\n","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/v1.1/sms","href":"/api-reference/messaging/send-an-sms"}]},{"group":"Webhooks","pages":[{"title":"List webhook registrations","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/webhooks","href":"/api-reference/webhooks/list-webhook-registrations"},{"title":"Register or update a webhook","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/v1.1/webhooks","href":"/api-reference/webhooks/register-or-update-a-webhook"},{"title":"Get a webhook registration","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/webhooks/{id}","href":"/api-reference/webhooks/get-a-webhook-registration"},{"title":"Update a webhook registration","deprecated":null,"version":null,"openapi":"/openapi.yaml put /api/v1.1/webhooks/{id}","href":"/api-reference/webhooks/update-a-webhook-registration"},{"title":"Delete a webhook registration","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /api/v1.1/webhooks/{id}","href":"/api-reference/webhooks/delete-a-webhook-registration"},{"title":"Send a test event","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/v1.1/webhooks/{id}/test","href":"/api-reference/webhooks/send-a-test-event"},{"title":"List webhook deliveries","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/webhook-deliveries","href":"/api-reference/webhooks/list-webhook-deliveries"},{"title":"Redeliver a webhook event","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/v1.1/webhook-deliveries/{id}/redeliver","href":"/api-reference/webhooks/redeliver-a-webhook-event"}]},{"group":"Voice Quality","pages":[{"title":"List voice quality webhooks","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/voice-quality/webhooks","href":"/api-reference/voice-quality/list-voice-quality-webhooks"},{"title":"Register a voice quality webhook","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/v1.1/voice-quality/webhooks","href":"/api-reference/voice-quality/register-a-voice-quality-webhook"},{"title":"Get a voice quality webhook","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/voice-quality/webhooks/{id}","href":"/api-reference/voice-quality/get-a-voice-quality-webhook"},{"title":"Delete a voice quality webhook","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /api/v1.1/voice-quality/webhooks/{id}","href":"/api-reference/voice-quality/delete-a-voice-quality-webhook"},{"title":"Voicetestcompleted","version":null,"deprecated":null,"openapi":"/openapi.yaml webhook voice.test.completed","href":"/api-reference/voice-quality/voicetestcompleted"}]},{"group":"SIP Gateway","pages":[{"title":"Get your SIP gateway configuration","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1/customer/register-sip","href":"/api-reference/sip-gateway/get-your-sip-gateway-configuration"},{"title":"Register or update your SIP gateway","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/v1/customer/register-sip","href":"/api-reference/sip-gateway/register-or-update-your-sip-gateway"},{"title":"Delete your SIP gateway configuration","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /api/v1/customer/register-sip","href":"/api-reference/sip-gateway/delete-your-sip-gateway-configuration"}]},{"group":"Notifications","pages":[{"title":"List notifications","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/notifications","href":"/api-reference/notifications/list-notifications"},{"title":"Get notification preferences","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/notification-preferences","href":"/api-reference/notifications/get-notification-preferences"},{"title":"Update a notification preference","deprecated":null,"version":null,"openapi":"/openapi.yaml put /api/v1.1/notification-preferences","href":"/api-reference/notifications/update-a-notification-preference"}]},{"group":"Device Groups","pages":[{"title":"List device-groups","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/device-groups","href":"/api-reference/device-groups/list-device-groups"},{"title":"Create a device-group","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/v1.1/device-groups","href":"/api-reference/device-groups/create-a-device-group"},{"title":"Get a device-group","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/device-groups/{name}","href":"/api-reference/device-groups/get-a-device-group"},{"title":"Update a device-group","deprecated":null,"version":null,"openapi":"/openapi.yaml put /api/v1.1/device-groups/{name}","href":"/api-reference/device-groups/update-a-device-group"},{"title":"Delete a device-group","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /api/v1.1/device-groups/{name}","href":"/api-reference/device-groups/delete-a-device-group"},{"title":"Move a device into this group","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/v1.1/device-groups/{name}/devices","href":"/api-reference/device-groups/move-a-device-into-this-group"},{"title":"Remove a device from this group","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /api/v1.1/device-groups/{name}/devices/{meid}","href":"/api-reference/device-groups/remove-a-device-from-this-group"}]},{"group":"SIM Groups","pages":[{"title":"List sim-groups","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/sim-groups","href":"/api-reference/sim-groups/list-sim-groups"},{"title":"Create a sim-group","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/v1.1/sim-groups","href":"/api-reference/sim-groups/create-a-sim-group"},{"title":"Get a sim-group","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/sim-groups/{name}","href":"/api-reference/sim-groups/get-a-sim-group"},{"title":"Update a sim-group","deprecated":null,"version":null,"openapi":"/openapi.yaml put /api/v1.1/sim-groups/{name}","href":"/api-reference/sim-groups/update-a-sim-group"},{"title":"Delete a sim-group","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /api/v1.1/sim-groups/{name}","href":"/api-reference/sim-groups/delete-a-sim-group"},{"title":"Move a SIM into this group","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/v1.1/sim-groups/{name}/sims","href":"/api-reference/sim-groups/move-a-sim-into-this-group"},{"title":"Remove a SIM from this group","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /api/v1.1/sim-groups/{name}/sims/{iccid}","href":"/api-reference/sim-groups/remove-a-sim-from-this-group"}]},{"group":"User Groups","pages":[{"title":"List user-groups","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/user-groups","href":"/api-reference/user-groups/list-user-groups"},{"title":"Create a user-group","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/v1.1/user-groups","href":"/api-reference/user-groups/create-a-user-group"},{"title":"Get a user-group","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/user-groups/{name}","href":"/api-reference/user-groups/get-a-user-group"},{"title":"Update a user-group","deprecated":null,"version":null,"openapi":"/openapi.yaml put /api/v1.1/user-groups/{name}","href":"/api-reference/user-groups/update-a-user-group"},{"title":"Delete a user-group","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /api/v1.1/user-groups/{name}","href":"/api-reference/user-groups/delete-a-user-group"},{"title":"Move a user into this group","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/v1.1/user-groups/{name}/members","href":"/api-reference/user-groups/move-a-user-into-this-group"},{"title":"Remove a user from this group","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /api/v1.1/user-groups/{name}/members/{email}","href":"/api-reference/user-groups/remove-a-user-from-this-group"}]},{"group":"Devices","pages":[{"title":"List devices in your catalog","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/team-devices","href":"/api-reference/devices/list-devices-in-your-catalog"},{"title":"Get a device","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/devices/{imei}","href":"/api-reference/devices/get-a-device"},{"title":"Assign a device to a user","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/v1.1/devices/{imei}/assign","href":"/api-reference/devices/assign-a-device-to-a-user"},{"title":"Unassign a device","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/v1.1/devices/{imei}/unassign","href":"/api-reference/devices/unassign-a-device"}]},{"group":"Team Members","pages":[{"title":"List team members","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/team-members","href":"/api-reference/team-members/list-team-members"},{"title":"Invite a teammate as an admin","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/v1.1/team-members","href":"/api-reference/team-members/invite-a-teammate-as-an-admin"},{"title":"Get a team member","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v1.1/team-members/{email}","href":"/api-reference/team-members/get-a-team-member"},{"title":"Update a team member","deprecated":null,"version":null,"openapi":"/openapi.yaml put /api/v1.1/team-members/{email}","href":"/api-reference/team-members/update-a-team-member"},{"title":"Remove a team member","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /api/v1.1/team-members/{email}","href":"/api-reference/team-members/remove-a-team-member"}]},{"group":"Async Status","pages":[{"title":"Poll the status of any v3 async operation","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/v3/transactions/{transactionId}","href":"/api-reference/async-status/poll-the-status-of-any-v3-async-operation"}]}]}]},"basePath":"","title":"Submit a port-in - Spenza Partner API","buildId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","deploymentId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-DCDCdBVX.js","utils-ME8dDnLe.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-0e84ACsd.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-wgRBj-ia.js","snippetPresets-C11Sgb-o.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-C0lapOpP.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-ZeRQV8fF.js","shallow-BupWh095.js","getApiPlaygroundDisplay-BnYQO2Ss.js","CodeSnippet-RKKOc8c_.js","CodeSnippets-Drf_m8wS.js","Page-Bevw23-4.js","getPastedJson-u6QiPzNZ.js","icon-Bb-CBSxO.js","MethodPill-F7l5AI7V.js","DuplicateIcon-IiAXkdSg.js","createIcon-FliI8EBc.js","DynamicMarkdown-B62XqCSI.js","SectionHeading-Dj31pT03.js","axios-vUo_bRtp.js","Markdown-BOgQCTwD.js","clsx-BIWXJmsZ.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-DKZWslLH.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-UDqbR6xh.js"]}