DevelopersAPI referencePhone

Telephony API

REST endpoints for telephony in SKUFlow: 13 operations with parameters, request and response fields, permissions and curl examples.

Base URL: https://app.skuflow.ai/api. Every call needs Authorization: Bearer skf_… (Authentication); {organizationId} ($ORGANIZATION_ID in the examples) is your business's id.

OperationEndpointRisk
Telephony account statusGET /organizations/{organizationId}/telephonyread
Choose the Twilio accountPOST /organizations/{organizationId}/telephony/sourcesensitive
Find a texting numberGET /organizations/{organizationId}/telephony/numbers/availableread
Text through SKUFlowPOST /organizations/{organizationId}/telephony/textingsensitive
Can the texting number be replacedGET /organizations/{organizationId}/telephony/texting/replacementread
Replace the texting numberPOST /organizations/{organizationId}/telephony/texting/replacesensitive
A2P 10DLC registrationGET /organizations/{organizationId}/telephony/a2pread
Register for A2P 10DLCPOST /organizations/{organizationId}/telephony/a2psensitive
Check an A2P registration before submittingGET /organizations/{organizationId}/telephony/a2p/readinessread
Resend the sole proprietor confirmation textPOST /organizations/{organizationId}/telephony/a2p/otpsensitive
Check the A2P status nowPOST /organizations/{organizationId}/telephony/a2p/refreshwrite
Telephony usage this monthGET /organizations/{organizationId}/telephony/usageread
Run telephony jobs nowPOST /organizations/{organizationId}/telephony/runwrite

Telephony account status

GET /organizations/{organizationId}/telephony

Which Twilio account the business's calls and texts run on (MANAGED: its SKUFlow sub-account, billed at Twilio's cost + 20%; OWN: its own Twilio account), the sub-account's state (ACTIVE, SUSPENDED while the SKUFlow subscription is unpaid or cancelled, CLOSED), the managed texting number, the A2P 10DLC status, numbers scheduled for release and warnings for the owner. Read-only.

Permissionchannels.manage (Owner, Admin)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP tooltelephony_status (toolset settings)

Example

curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/telephony" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
modeenumSKUFLOW_TWILIO on this server (fake = simulated). One of fake, live, off.
sourceenumManaged: numbers, minutes and texts from SKUFlow (Twilio sub-account, billed at Twilio's cost + 20%). OWN: the business's own Twilio account (connected in Settings → Messaging). One of MANAGED, OWN.
subaccountobject or nullThe SKUFlow sub-account; null until the phone system or managed texting is first turned on.
subaccount.accountSidHintstringLast characters of the sub-account SID.
subaccount.statusenumOne of ACTIVE, SUSPENDED, CLOSED.
subaccount.fakeboolean
subaccount.suspendReasonstring or nullUNPAID or CANCELED.
subaccount.suspendedAtstring (date-time) or null
subaccount.closeAfterstring (date-time) or nullNumbers are released then unless the subscription is restarted.
subaccount.closedAtstring (date-time) or null
subaccount.createdAtstring (date-time)
textingobject
texting.providerKeystringskuflow (managed), twilio (own account) or test.
texting.numberobject or null
texting.number.idstring
texting.number.e164string
texting.number.labelstring
a2pStatusenumOne of NOT_STARTED, PROFILE_SUBMITTED, BRAND_PENDING, OTP_PENDING, BRAND_APPROVED, CAMPAIGN_PENDING, APPROVED, FAILED.
releasingarray of object
releasing[].idstring
releasing[].e164string
releasing[].releaseAfterstring (date-time)
warningsarray of object
warnings[].kindenumOne of SUSPENDED, CLOSING, NUMBERS_RELEASING, A2P_REQUIRED, A2P_FAILED.
warnings[].messagestring
warnings[].atstring (date-time) or null
trialobjectThe free trial's telephony limits.
trial.limitedbooleanThe free trial's limits apply (no card).
trial.limitsobject
trial.limits.numbersnumber
trial.limits.callMinutesnumber
trial.usageobject
trial.usage.numbersnumber
trial.usage.callMinutesnumber
trial.canAddNumberboolean
trial.callsPausedboolean
trial.messagesarray of stringWhat is paused, in plain words.
autoNumberobjectThe automatic texting number bought for every new business.
autoNumber.statusenumpending / provisioning: SKUFlow is getting the business's texting number; done: it has one (e164); failed: retried automatically (error, nextAttemptAt); off: none is bought automatically (skipReason). One of pending, provisioning, done, failed, off.
autoNumber.e164string or null
autoNumber.errorstring or null
autoNumber.skipReasonstring or nullOWN_ACCOUNT, HAS_TEXTING or SUBSCRIPTION_INACTIVE when skipped.
autoNumber.nextAttemptAtstring (date-time) or null

Choose the Twilio account

POST /organizations/{organizationId}/telephony/source

Money: MANAGED moves calls (and, once a SKUFlow texting number is chosen, texts) to the business's SKUFlow Twilio sub-account, made now if needed; numbers, minutes and other usage are then billed at Twilio's cost + 20%. Turning MANAGED on needs the owner's acceptance of the phone system's usage terms: a current one on record, or acknowledgement with the priceVersion shown (billing.plan → addons[phone].terms); otherwise 409 with the current terms. OWN goes back to the business's own Twilio account (it must be connected in Settings → Messaging first). Numbers already set up stay where they are.

Permissionphone.manage (Owner, Admin)
Risksensitive, OAuth scope skuflow.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.
MCP tooltelephony_chooseSource (toolset settings)
ApprovalWaits for your approval in SKUFlow when called with an API key or a connected app: the first call answers 428 APPROVAL_REQUIRED; once you approve it, repeat the call with the X-SKUFlow-Approval header. See Approvals.

Request body

FieldTypeRequiredDescription
sourceenumYesManaged: numbers, minutes and texts from SKUFlow (Twilio sub-account, billed at Twilio's cost + 20%). OWN: the business's own Twilio account (connected in Settings → Messaging). One of MANAGED, OWN.
acknowledgementobjectNoThe owner's acceptance of the terms shown (billing.plan → addons[].terms). Missing or stale: 409 with the current terms.
acknowledgement.priceVersionstringYesterms.priceVersion as it was shown. Up to 64 characters.
acknowledgement.acceptedtrueYesThe owner ticked “I understand usage is billed on top of the monthly fee”.

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/telephony/source" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"source":"MANAGED"}'

Response

200: the answer's fields
FieldTypeDescription
modeenumSKUFLOW_TWILIO on this server (fake = simulated). One of fake, live, off.
sourceenumManaged: numbers, minutes and texts from SKUFlow (Twilio sub-account, billed at Twilio's cost + 20%). OWN: the business's own Twilio account (connected in Settings → Messaging). One of MANAGED, OWN.
subaccountobject or nullThe SKUFlow sub-account; null until the phone system or managed texting is first turned on.
subaccount.accountSidHintstringLast characters of the sub-account SID.
subaccount.statusenumOne of ACTIVE, SUSPENDED, CLOSED.
subaccount.fakeboolean
subaccount.suspendReasonstring or nullUNPAID or CANCELED.
subaccount.suspendedAtstring (date-time) or null
subaccount.closeAfterstring (date-time) or nullNumbers are released then unless the subscription is restarted.
subaccount.closedAtstring (date-time) or null
subaccount.createdAtstring (date-time)
textingobject
texting.providerKeystringskuflow (managed), twilio (own account) or test.
texting.numberobject or null
texting.number.idstring
texting.number.e164string
texting.number.labelstring
a2pStatusenumOne of NOT_STARTED, PROFILE_SUBMITTED, BRAND_PENDING, OTP_PENDING, BRAND_APPROVED, CAMPAIGN_PENDING, APPROVED, FAILED.
releasingarray of object
releasing[].idstring
releasing[].e164string
releasing[].releaseAfterstring (date-time)
warningsarray of object
warnings[].kindenumOne of SUSPENDED, CLOSING, NUMBERS_RELEASING, A2P_REQUIRED, A2P_FAILED.
warnings[].messagestring
warnings[].atstring (date-time) or null
trialobjectThe free trial's telephony limits.
trial.limitedbooleanThe free trial's limits apply (no card).
trial.limitsobject
trial.limits.numbersnumber
trial.limits.callMinutesnumber
trial.usageobject
trial.usage.numbersnumber
trial.usage.callMinutesnumber
trial.canAddNumberboolean
trial.callsPausedboolean
trial.messagesarray of stringWhat is paused, in plain words.
autoNumberobjectThe automatic texting number bought for every new business.
autoNumber.statusenumpending / provisioning: SKUFlow is getting the business's texting number; done: it has one (e164); failed: retried automatically (error, nextAttemptAt); off: none is bought automatically (skipReason). One of pending, provisioning, done, failed, off.
autoNumber.e164string or null
autoNumber.errorstring or null
autoNumber.skipReasonstring or nullOWN_ACCOUNT, HAS_TEXTING or SUBSCRIPTION_INACTIVE when skipped.
autoNumber.nextAttemptAtstring (date-time) or null

Find a texting number

GET /organizations/{organizationId}/telephony/numbers/available

US local numbers that can text, available to buy in the business's SKUFlow account, by area code and / or digits or letters inside the number (contains, e.g. 4210 or PRINT), and what the number would cost a month (offer: Twilio's cost + 20%, or included: the texting number is included on every plan). Call before POST /telephony/texting with buyE164 (or POST /telephony/texting/replace to swap the current texting number). Makes the SKUFlow sub-account the first time (no charge until a number is bought).

Permissionchannels.manage (Owner, Admin)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP tooltelephony_availableNumbers (toolset settings)

Parameters

NameInTypeRequiredDescription
areaCodequerystringNoThree-digit US area code, e.g. 512. Optional when contains is given.
containsquerystringNoDigits or letters the number must contain, anywhere (Twilio Contains): 2–10 of 0-9, A-Z (phone keypad: PRINT = 77468) and * for any one digit, e.g. 4210 or 555****. Spaces and dashes are ignored. With neither field, any US local number. Up to 20 characters.

Example

curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/telephony/numbers/available" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
itemsarray of object
items[].e164string+E.164; pass it as buyE164 / e164 to buy it.
items[].localitystring or nullTwilio's rate center (city), when known.
items[].regionstring or nullTwo-letter state, when known.
offerobjectWhat one more number costs the business a month.
offer.monthlyCentsintegerA local number's monthly price at Twilio's cost + 20%, in cents.
offer.includedbooleanThis number would not be billed (included).
offer.includedByenum or nullTexting: the texting number on every plan; PHONE_ADDON: the phone add-on's number. One of TEXTING, PHONE_ADDON.
offer.sourceenumTwilio's live price, or the fallback table. One of twilio, fallback.

Text through SKUFlow

POST /organizations/{organizationId}/telephony/texting

Money, customer-visible: makes the business's texts go out of its SKUFlow Twilio sub-account from phoneNumberId (one of its SKUFlow numbers) or a number bought now (buyE164, from GET /telephony/numbers/available; billed monthly at Twilio's cost + 20%). Replaces the SMS provider in Settings → Messaging (your own Twilio credentials are removed) and switches the business to SKUFlow-managed telephony. Texts keep going through consent, quiet hours and the queue; texts from a live account start once the A2P 10DLC registration is approved.

Permissionchannels.manage (Owner, Admin)
Risksensitive, OAuth scope skuflow.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.
MCP tooltelephony_setupTexting (toolset settings)
ApprovalOver MCP, this tool asks for your OK first (in the AI app when it supports it, otherwise in SKUFlow). See Approvals.

Request body

FieldTypeRequiredDescription
phoneNumberIdstringNoOne of the business's SKUFlow numbers.
buyE164stringNoA number to buy, +E.164. Up to 32 characters.
labelstringNoUp to 60 characters.

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/telephony/texting" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"phoneNumberId":"phoneNumber_id","buyE164":"string","label":"string"}'

Response

200: the answer's fields
FieldTypeDescription
modeenumSKUFLOW_TWILIO on this server (fake = simulated). One of fake, live, off.
sourceenumManaged: numbers, minutes and texts from SKUFlow (Twilio sub-account, billed at Twilio's cost + 20%). OWN: the business's own Twilio account (connected in Settings → Messaging). One of MANAGED, OWN.
subaccountobject or nullThe SKUFlow sub-account; null until the phone system or managed texting is first turned on.
subaccount.accountSidHintstringLast characters of the sub-account SID.
subaccount.statusenumOne of ACTIVE, SUSPENDED, CLOSED.
subaccount.fakeboolean
subaccount.suspendReasonstring or nullUNPAID or CANCELED.
subaccount.suspendedAtstring (date-time) or null
subaccount.closeAfterstring (date-time) or nullNumbers are released then unless the subscription is restarted.
subaccount.closedAtstring (date-time) or null
subaccount.createdAtstring (date-time)
textingobject
texting.providerKeystringskuflow (managed), twilio (own account) or test.
texting.numberobject or null
texting.number.idstring
texting.number.e164string
texting.number.labelstring
a2pStatusenumOne of NOT_STARTED, PROFILE_SUBMITTED, BRAND_PENDING, OTP_PENDING, BRAND_APPROVED, CAMPAIGN_PENDING, APPROVED, FAILED.
releasingarray of object
releasing[].idstring
releasing[].e164string
releasing[].releaseAfterstring (date-time)
warningsarray of object
warnings[].kindenumOne of SUSPENDED, CLOSING, NUMBERS_RELEASING, A2P_REQUIRED, A2P_FAILED.
warnings[].messagestring
warnings[].atstring (date-time) or null
trialobjectThe free trial's telephony limits.
trial.limitedbooleanThe free trial's limits apply (no card).
trial.limitsobject
trial.limits.numbersnumber
trial.limits.callMinutesnumber
trial.usageobject
trial.usage.numbersnumber
trial.usage.callMinutesnumber
trial.canAddNumberboolean
trial.callsPausedboolean
trial.messagesarray of stringWhat is paused, in plain words.
autoNumberobjectThe automatic texting number bought for every new business.
autoNumber.statusenumpending / provisioning: SKUFlow is getting the business's texting number; done: it has one (e164); failed: retried automatically (error, nextAttemptAt); off: none is bought automatically (skipReason). One of pending, provisioning, done, failed, off.
autoNumber.e164string or null
autoNumber.errorstring or null
autoNumber.skipReasonstring or nullOWN_ACCOUNT, HAS_TEXTING or SUBSCRIPTION_INACTIVE when skipped.
autoNumber.nextAttemptAtstring (date-time) or null

Can the texting number be replaced

GET /organizations/{organizationId}/telephony/texting/replacement

Before POST /telephony/texting/replace: whether the business's SKUFlow texting number can be swapped for another now, and what happens. Allowed before an A2P 10DLC registration is submitted (or after one refused before the brand was approved): the old number is released afterwards unless something else uses it (oldNumber.keptBecause). Refused while the registration is under review, and for an approved sole proprietor (one number per campaign). After a standard brand is approved the new number joins its Messaging Service first; with an approved campaign the old number is kept. cost says what it adds to the bill. Read-only.

Permissionchannels.manage (Owner, Admin)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP tooltelephony_textingReplacement (toolset settings)

Example

curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/telephony/texting/replacement" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
currentobject or nullThe texting number today.
current.idstring
current.e164string
current.labelstring
allowedboolean
modeenum or nullBEFORE_REGISTRATION: no A2P campaign holds the number yet. JOIN_CAMPAIGN: the new number joins the approved brand's Messaging Service first. One of BEFORE_REGISTRATION, JOIN_CAMPAIGN.
refusalenum or nullWhy not: no SKUFlow texting number yet; the A2P registration is under review; a sole proprietor's campaign takes one number; the free trial's one number / one change. One of NO_TEXTING_NUMBER, UNDER_REVIEW, SOLE_PROPRIETOR, TRIAL.
messagestring or nullThe refusal in plain words.
warningstring or nullWhat to know before replacing (shown in the confirmation).
oldNumberobject
oldNumber.willReleasebooleanThe old number is given back to Twilio after the swap.
oldNumber.keptBecausearray of enum
costobject
cost.monthlyCentsintegerA local number's monthly price at Twilio's cost + 20%, in cents.
cost.thisMonthCentsintegerAbout what the swap adds to this month's bill: numbers are billed a month at a time, with no refund for a released one (0 when the phone add-on's included number covers it).
cost.extraMonthlyCentsintegerAdded every month after: the kept old number's price (0 when it is released or included).
trialobject
trial.limitedboolean
trial.replacementsLeftinteger or null

Replace the texting number

POST /organizations/{organizationId}/telephony/texting/replace

Money, customer-visible, destructive: swaps the business's SKUFlow texting number for buyE164 (bought now; from GET /telephony/numbers/available) or phoneNumberId (one of its SKUFlow numbers). Call GET /telephony/texting/replacement first: refused with 409 for the same reasons (A2P registration under review, an approved sole proprietor, the free trial's one change). The new number is in place (and in the A2P Messaging Service when there is one) before texts move to it; then the old number is released back to Twilio unless something else uses it (ring routing, tracking, call history, an approved campaign). Customers see the new number on every text from now on. A number is billed monthly at Twilio's cost + 20% (the texting number is included), with no refund for the released number's month.

Permissionchannels.manage (Owner, Admin)
Risksensitive, OAuth scope skuflow.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.
MCP tooltelephony_replaceTextingNumber (toolset settings)
ApprovalOver MCP, this tool asks for your OK first (in the AI app when it supports it, otherwise in SKUFlow). See Approvals.

Request body

FieldTypeRequiredDescription
buyE164stringNoA number to buy, +E.164. Up to 32 characters.
phoneNumberIdstringNoOne of the business's SKUFlow numbers.
labelstringNoName for a bought number. Up to 60 characters.

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/telephony/texting/replace" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"buyE164":"string","phoneNumberId":"phoneNumber_id","label":"string"}'

Response

200: the answer's fields
FieldTypeDescription
modeenumSKUFLOW_TWILIO on this server (fake = simulated). One of fake, live, off.
sourceenumManaged: numbers, minutes and texts from SKUFlow (Twilio sub-account, billed at Twilio's cost + 20%). OWN: the business's own Twilio account (connected in Settings → Messaging). One of MANAGED, OWN.
subaccountobject or nullThe SKUFlow sub-account; null until the phone system or managed texting is first turned on.
subaccount.accountSidHintstringLast characters of the sub-account SID.
subaccount.statusenumOne of ACTIVE, SUSPENDED, CLOSED.
subaccount.fakeboolean
subaccount.suspendReasonstring or nullUNPAID or CANCELED.
subaccount.suspendedAtstring (date-time) or null
subaccount.closeAfterstring (date-time) or nullNumbers are released then unless the subscription is restarted.
subaccount.closedAtstring (date-time) or null
subaccount.createdAtstring (date-time)
textingobject
texting.providerKeystringskuflow (managed), twilio (own account) or test.
texting.numberobject or null
texting.number.idstring
texting.number.e164string
texting.number.labelstring
a2pStatusenumOne of NOT_STARTED, PROFILE_SUBMITTED, BRAND_PENDING, OTP_PENDING, BRAND_APPROVED, CAMPAIGN_PENDING, APPROVED, FAILED.
releasingarray of object
releasing[].idstring
releasing[].e164string
releasing[].releaseAfterstring (date-time)
warningsarray of object
warnings[].kindenumOne of SUSPENDED, CLOSING, NUMBERS_RELEASING, A2P_REQUIRED, A2P_FAILED.
warnings[].messagestring
warnings[].atstring (date-time) or null
trialobjectThe free trial's telephony limits.
trial.limitedbooleanThe free trial's limits apply (no card).
trial.limitsobject
trial.limits.numbersnumber
trial.limits.callMinutesnumber
trial.usageobject
trial.usage.numbersnumber
trial.usage.callMinutesnumber
trial.canAddNumberboolean
trial.callsPausedboolean
trial.messagesarray of stringWhat is paused, in plain words.
autoNumberobjectThe automatic texting number bought for every new business.
autoNumber.statusenumpending / provisioning: SKUFlow is getting the business's texting number; done: it has one (e164); failed: retried automatically (error, nextAttemptAt); off: none is bought automatically (skipReason). One of pending, provisioning, done, failed, off.
autoNumber.e164string or null
autoNumber.errorstring or null
autoNumber.skipReasonstring or nullOWN_ACCOUNT, HAS_TEXTING or SUBSCRIPTION_INACTIVE when skipped.
autoNumber.nextAttemptAtstring (date-time) or null
replacementobject
replacement.fromstringThe old texting number.
replacement.tostringThe new texting number.
replacement.oldNumberobject
replacement.oldNumber.idstring
replacement.oldNumber.e164string
replacement.oldNumber.releasedboolean
replacement.oldNumber.keptBecausearray of enum
replacement.oldNumber.releaseErrorstring or nullTwilio refused the release: the number is kept; release it in Settings → Phone.

A2P 10DLC registration

GET /organizations/{organizationId}/telephony/a2p

The business's A2P 10DLC registration in its SKUFlow sub-account (US carriers require it for texts from business numbers): NOT_STARTED, PROFILE_SUBMITTED, BRAND_PENDING, OTP_PENDING (a sole proprietor must reply YES to the confirmation text), BRAND_APPROVED, CAMPAIGN_PENDING, APPROVED or FAILED (with issues: what Twilio refused, per field, in plain English), what was submitted, and suggestions from the business profile, website and the signed-in person. Read-only.

Permissionchannels.manage (Owner, Admin)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP tooltelephony_a2p (toolset settings)

Example

curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/telephony/a2p" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
statusenumOne of NOT_STARTED, PROFILE_SUBMITTED, BRAND_PENDING, OTP_PENDING, BRAND_APPROVED, CAMPAIGN_PENDING, APPROVED, FAILED.
brandTypeenumOne of STANDARD, SOLE_PROPRIETOR.
brandStatusstring or null
identityStatusstring or nullTwilio's brand identity check: SELF_DECLARED, UNVERIFIED, VERIFIED, VETTED_VERIFIED.
customerProfileStatusstring or nullTrust Hub customer profile status.
trustProductStatusstring or nullTrust Hub A2P bundle status.
campaignStatusstring or null
messagingServiceSidstring or null
failureReasonstring or null
issuesarray of objectWhy it was refused, per field (empty unless FAILED).
issues[].sourceenumWhich step refused it. One of profile, trust, brand, otp, campaign, submit.
issues[].codeinteger or nullTwilio's error code (twilio.com/docs/api/errors/{code}).
issues[].fieldstring or nullThe registration field to change (e.g. ein, messageFlow, sampleMessages.0).
issues[].messagestringWhat to fix, in plain English.
issues[].detailstring or nullTwilio's own words.
fakeboolean
submittedAtstring (date-time) or null
approvedAtstring (date-time) or null
lastCheckedAtstring (date-time) or null
otpSentAtstring (date-time) or nullSole proprietor: when the confirmation text went to the owner's mobile (reply YES within 24 hours).
textingNumberstring or nullThe SKUFlow texting number being registered.
detailsobject or nullWhat was submitted.
details.brandTypeenumSTANDARD for a business with an EIN; SOLE_PROPRIETOR without one (the owner confirms by text; one number). One of STANDARD, SOLE_PROPRIETOR. Default STANDARD.
details.legalNamestringThe legal business name exactly as on the IRS EIN letter (CP 575 / 147C); a sole proprietor's business or full name. Up to 255 characters.
details.businessTypeenumOne of Sole Proprietorship, Partnership, Limited Liability Corporation, Co-operative, Non-profit Corporation, Corporation.
details.industryenumOne of CONSTRUCTION, PROFESSIONAL_SERVICES, REAL_ESTATE, RETAIL, AUTOMOTIVE, ENERGY, HEALTHCARE, TRANSPORTATION. Default CONSTRUCTION.
details.einstringThe business's EIN (US tax id); required for STANDARD, empty for SOLE_PROPRIETOR. Default ``.
details.companyTypeenumOne of private, public, non-profit. Default private.
details.websiteUrlstring (uri)Up to 500 characters.
details.privacyUrlstring (uri)The public privacy policy (must say mobile numbers are not shared for marketing). Up to 2048 characters.
details.termsUrlstring (uri)The public terms with the SMS program details. Up to 2048 characters.
details.streetstringUp to 200 characters.
details.citystringUp to 100 characters.
details.regionstringTwo-letter US state. Up to 2 characters.
details.postalCodestring
details.representativeobject
details.representative.firstNamestringUp to 100 characters.
details.representative.lastNamestringUp to 100 characters.
details.representative.emailstring (email)
details.representative.phonestring
details.representative.titlestringBusiness title, e.g. Owner. Up to 100 characters.
details.representative.jobPositionenumOne of Director, GM, VP, CEO, CFO, General Counsel, Other. Default Director.
details.useCaseenumOne of CUSTOMER_CARE, ACCOUNT_NOTIFICATION, MIXED, MARKETING. Default MIXED.
details.descriptionstringUp to 1024 characters.
details.messageFlowstringUp to 2048 characters.
details.sampleMessagesarray of stringUp to 5 items.
details.hasEmbeddedLinksbooleanDefault true.
details.hasEmbeddedPhonebooleanDefault true.
defaultsobjectSuggestions from the business's profile, website and the signed-in person for the form.
defaults.brandTypeenumOne of STANDARD, SOLE_PROPRIETOR.
defaults.legalNamestring
defaults.businessTypeenumOne of Sole Proprietorship, Partnership, Limited Liability Corporation, Co-operative, Non-profit Corporation, Corporation.
defaults.websiteUrlstring
defaults.privacyUrlstring
defaults.termsUrlstring
defaults.optInUrlstringThe public page with the texting consent checkbox.
defaults.streetstring
defaults.citystring
defaults.regionstring
defaults.postalCodestring
defaults.representativeobject
defaults.representative.firstNamestring
defaults.representative.lastNamestring
defaults.representative.emailstring
defaults.representative.phonestring
defaults.descriptionstring
defaults.messageFlowstring
defaults.sampleMessagesarray of string

Register for A2P 10DLC

POST /organizations/{organizationId}/telephony/a2p

Money, sends data out: submits the business (legal name, EIN, address, website, an authorized representative) and its texting campaign (use case, description, opt-in flow, sample messages) to Twilio and The Campaign Registry from the business's SKUFlow sub-account. Twilio's brand and campaign fees are billed at cost + 20%. brandType STANDARD needs the EIN; SOLE_PROPRIETOR (no EIN) registers the owner, who then confirms by replying YES to a text (OTP_PENDING; one number, lower volume). Needs a SKUFlow texting number first, and refused with 400 and data.items while GET /telephony/a2p/readiness has a failure (call it first). Approval takes days: the status updates by itself (GET /telephony/a2p). A FAILED registration can be corrected and submitted again: issues name the fields Twilio refused; a failed campaign under an approved brand is replaced (a new campaign vetting fee).

Permissionchannels.manage (Owner, Admin)
Risksensitive, OAuth scope skuflow.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.
MCP tooltelephony_submitA2p (toolset settings)
ApprovalOver MCP, this tool asks for your OK first (in the AI app when it supports it, otherwise in SKUFlow). See Approvals.

Request body

FieldTypeRequiredDescription
brandTypeenumNoSTANDARD for a business with an EIN; SOLE_PROPRIETOR without one (the owner confirms by text; one number). One of STANDARD, SOLE_PROPRIETOR. Default STANDARD.
legalNamestringYesThe legal business name exactly as on the IRS EIN letter (CP 575 / 147C); a sole proprietor's business or full name. Up to 255 characters.
businessTypeenumYesOne of Sole Proprietorship, Partnership, Limited Liability Corporation, Co-operative, Non-profit Corporation, Corporation.
industryenumNoOne of CONSTRUCTION, PROFESSIONAL_SERVICES, REAL_ESTATE, RETAIL, AUTOMOTIVE, ENERGY, HEALTHCARE, TRANSPORTATION. Default CONSTRUCTION.
einstringNoThe business's EIN (US tax id); required for STANDARD, empty for SOLE_PROPRIETOR. Default ``.
companyTypeenumNoOne of private, public, non-profit. Default private.
websiteUrlstringYes
privacyUrlstringNoThe public privacy policy (must say mobile numbers are not shared for marketing).
termsUrlstringNoThe public terms with the SMS program details.
streetstringYesUp to 200 characters.
citystringYesUp to 100 characters.
regionstringYesTwo-letter US state. Up to 2 characters.
postalCodestringYes
representativeobjectYes
representative.firstNamestringYesUp to 100 characters.
representative.lastNamestringYesUp to 100 characters.
representative.emailstring (email)Yes
representative.phonestringYes
representative.titlestringYesBusiness title, e.g. Owner. Up to 100 characters.
representative.jobPositionenumNoOne of Director, GM, VP, CEO, CFO, General Counsel, Other. Default Director.
useCaseenumNoOne of CUSTOMER_CARE, ACCOUNT_NOTIFICATION, MIXED, MARKETING. Default MIXED.
descriptionstringYesUp to 1024 characters.
messageFlowstringYesUp to 2048 characters.
sampleMessagesarray of stringYesUp to 5 items.
hasEmbeddedLinksbooleanNoDefault true.
hasEmbeddedPhonebooleanNoDefault true.

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/telephony/a2p" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"legalName":"string","businessType":"Sole Proprietorship","websiteUrl":"https://example.com","street":"string","city":"string","region":"string","postalCode":"string","representative":{"firstName":"string","lastName":"string","email":"dana@example.com","phone":"+15555550123","title":"string"},"description":"string","messageFlow":"string","sampleMessages":["string"]}'

Response

200: the answer's fields
FieldTypeDescription
statusenumOne of NOT_STARTED, PROFILE_SUBMITTED, BRAND_PENDING, OTP_PENDING, BRAND_APPROVED, CAMPAIGN_PENDING, APPROVED, FAILED.
brandTypeenumOne of STANDARD, SOLE_PROPRIETOR.
brandStatusstring or null
identityStatusstring or nullTwilio's brand identity check: SELF_DECLARED, UNVERIFIED, VERIFIED, VETTED_VERIFIED.
customerProfileStatusstring or nullTrust Hub customer profile status.
trustProductStatusstring or nullTrust Hub A2P bundle status.
campaignStatusstring or null
messagingServiceSidstring or null
failureReasonstring or null
issuesarray of objectWhy it was refused, per field (empty unless FAILED).
issues[].sourceenumWhich step refused it. One of profile, trust, brand, otp, campaign, submit.
issues[].codeinteger or nullTwilio's error code (twilio.com/docs/api/errors/{code}).
issues[].fieldstring or nullThe registration field to change (e.g. ein, messageFlow, sampleMessages.0).
issues[].messagestringWhat to fix, in plain English.
issues[].detailstring or nullTwilio's own words.
fakeboolean
submittedAtstring (date-time) or null
approvedAtstring (date-time) or null
lastCheckedAtstring (date-time) or null
otpSentAtstring (date-time) or nullSole proprietor: when the confirmation text went to the owner's mobile (reply YES within 24 hours).
textingNumberstring or nullThe SKUFlow texting number being registered.
detailsobject or nullWhat was submitted.
details.brandTypeenumSTANDARD for a business with an EIN; SOLE_PROPRIETOR without one (the owner confirms by text; one number). One of STANDARD, SOLE_PROPRIETOR. Default STANDARD.
details.legalNamestringThe legal business name exactly as on the IRS EIN letter (CP 575 / 147C); a sole proprietor's business or full name. Up to 255 characters.
details.businessTypeenumOne of Sole Proprietorship, Partnership, Limited Liability Corporation, Co-operative, Non-profit Corporation, Corporation.
details.industryenumOne of CONSTRUCTION, PROFESSIONAL_SERVICES, REAL_ESTATE, RETAIL, AUTOMOTIVE, ENERGY, HEALTHCARE, TRANSPORTATION. Default CONSTRUCTION.
details.einstringThe business's EIN (US tax id); required for STANDARD, empty for SOLE_PROPRIETOR. Default ``.
details.companyTypeenumOne of private, public, non-profit. Default private.
details.websiteUrlstring (uri)Up to 500 characters.
details.privacyUrlstring (uri)The public privacy policy (must say mobile numbers are not shared for marketing). Up to 2048 characters.
details.termsUrlstring (uri)The public terms with the SMS program details. Up to 2048 characters.
details.streetstringUp to 200 characters.
details.citystringUp to 100 characters.
details.regionstringTwo-letter US state. Up to 2 characters.
details.postalCodestring
details.representativeobject
details.representative.firstNamestringUp to 100 characters.
details.representative.lastNamestringUp to 100 characters.
details.representative.emailstring (email)
details.representative.phonestring
details.representative.titlestringBusiness title, e.g. Owner. Up to 100 characters.
details.representative.jobPositionenumOne of Director, GM, VP, CEO, CFO, General Counsel, Other. Default Director.
details.useCaseenumOne of CUSTOMER_CARE, ACCOUNT_NOTIFICATION, MIXED, MARKETING. Default MIXED.
details.descriptionstringUp to 1024 characters.
details.messageFlowstringUp to 2048 characters.
details.sampleMessagesarray of stringUp to 5 items.
details.hasEmbeddedLinksbooleanDefault true.
details.hasEmbeddedPhonebooleanDefault true.
defaultsobjectSuggestions from the business's profile, website and the signed-in person for the form.
defaults.brandTypeenumOne of STANDARD, SOLE_PROPRIETOR.
defaults.legalNamestring
defaults.businessTypeenumOne of Sole Proprietorship, Partnership, Limited Liability Corporation, Co-operative, Non-profit Corporation, Corporation.
defaults.websiteUrlstring
defaults.privacyUrlstring
defaults.termsUrlstring
defaults.optInUrlstringThe public page with the texting consent checkbox.
defaults.streetstring
defaults.citystring
defaults.regionstring
defaults.postalCodestring
defaults.representativeobject
defaults.representative.firstNamestring
defaults.representative.lastNamestring
defaults.representative.emailstring
defaults.representative.phonestring
defaults.descriptionstring
defaults.messageFlowstring
defaults.sampleMessagesarray of string

Check an A2P registration before submitting

GET /organizations/{organizationId}/telephony/a2p/readiness

Runs the checks that keep an A2P 10DLC registration from being rejected, without sending anything: texting number, legal name vs business type (match the IRS EIN letter), EIN, physical address, website / privacy / terms open publicly (fetched now), the privacy policy's SMS clause and the booking page's consent checkbox, the representative, the campaign text and samples (business name, STOP), lengths and restricted content. Checks what was submitted, else the suggestions; websiteUrl, privacyUrl, termsUrl check other addresses. Each item is pass, warn or fail; POST /telephony/a2p is refused while any fails. Read-only.

Permissionchannels.manage (Owner, Admin)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP tooltelephony_a2pReadiness (toolset settings)

Parameters

NameInTypeRequiredDescription
websiteUrlquerystringNo
privacyUrlquerystringNo
termsUrlquerystringNo

Example

curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/telephony/a2p/readiness" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
readybooleanNo failures: the registration may be submitted.
itemsarray of object
items[].keystring
items[].statusenumfail blocks the submission; warn is advice. One of pass, warn, fail.
items[].messagestring
items[].fieldstringThe registration field to fix.
items[].fixenumFixed elsewhere: website (Website → legal pages, request form checkbox) or texting (Settings → Messaging number). One of website, texting.
factsobjectWhat the server checked; the form re-runs the same rules on what is typed.
facts.textingNumberstring or null
facts.complianceobject or null
facts.compliance.businessNamestring
facts.compliance.siteUrlstring or null
facts.compliance.sitePublishedboolean
facts.compliance.optInUrlstring
facts.compliance.optInHasConsentboolean
facts.compliance.privacyHasSmsClauseboolean
facts.reachableobjectWhether each URL opened (null: not checked).

Resend the sole proprietor confirmation text

POST /organizations/{organizationId}/telephony/a2p/otp

Sends a text: a sole proprietor's brand is confirmed by its owner replying YES to a text Twilio sends to the representative's mobile (valid 24 hours). This asks Twilio to send it again; only while the status is OTP_PENDING, at most every five minutes.

Permissionchannels.manage (Owner, Admin)
Risksensitive, OAuth scope skuflow.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.
MCP tooltelephony_resendA2pOtp (toolset settings)
ApprovalOver MCP, this tool asks for your OK first (in the AI app when it supports it, otherwise in SKUFlow). See Approvals.

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/telephony/a2p/otp" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
statusenumOne of NOT_STARTED, PROFILE_SUBMITTED, BRAND_PENDING, OTP_PENDING, BRAND_APPROVED, CAMPAIGN_PENDING, APPROVED, FAILED.
brandTypeenumOne of STANDARD, SOLE_PROPRIETOR.
brandStatusstring or null
identityStatusstring or nullTwilio's brand identity check: SELF_DECLARED, UNVERIFIED, VERIFIED, VETTED_VERIFIED.
customerProfileStatusstring or nullTrust Hub customer profile status.
trustProductStatusstring or nullTrust Hub A2P bundle status.
campaignStatusstring or null
messagingServiceSidstring or null
failureReasonstring or null
issuesarray of objectWhy it was refused, per field (empty unless FAILED).
issues[].sourceenumWhich step refused it. One of profile, trust, brand, otp, campaign, submit.
issues[].codeinteger or nullTwilio's error code (twilio.com/docs/api/errors/{code}).
issues[].fieldstring or nullThe registration field to change (e.g. ein, messageFlow, sampleMessages.0).
issues[].messagestringWhat to fix, in plain English.
issues[].detailstring or nullTwilio's own words.
fakeboolean
submittedAtstring (date-time) or null
approvedAtstring (date-time) or null
lastCheckedAtstring (date-time) or null
otpSentAtstring (date-time) or nullSole proprietor: when the confirmation text went to the owner's mobile (reply YES within 24 hours).
textingNumberstring or nullThe SKUFlow texting number being registered.
detailsobject or nullWhat was submitted.
details.brandTypeenumSTANDARD for a business with an EIN; SOLE_PROPRIETOR without one (the owner confirms by text; one number). One of STANDARD, SOLE_PROPRIETOR. Default STANDARD.
details.legalNamestringThe legal business name exactly as on the IRS EIN letter (CP 575 / 147C); a sole proprietor's business or full name. Up to 255 characters.
details.businessTypeenumOne of Sole Proprietorship, Partnership, Limited Liability Corporation, Co-operative, Non-profit Corporation, Corporation.
details.industryenumOne of CONSTRUCTION, PROFESSIONAL_SERVICES, REAL_ESTATE, RETAIL, AUTOMOTIVE, ENERGY, HEALTHCARE, TRANSPORTATION. Default CONSTRUCTION.
details.einstringThe business's EIN (US tax id); required for STANDARD, empty for SOLE_PROPRIETOR. Default ``.
details.companyTypeenumOne of private, public, non-profit. Default private.
details.websiteUrlstring (uri)Up to 500 characters.
details.privacyUrlstring (uri)The public privacy policy (must say mobile numbers are not shared for marketing). Up to 2048 characters.
details.termsUrlstring (uri)The public terms with the SMS program details. Up to 2048 characters.
details.streetstringUp to 200 characters.
details.citystringUp to 100 characters.
details.regionstringTwo-letter US state. Up to 2 characters.
details.postalCodestring
details.representativeobject
details.representative.firstNamestringUp to 100 characters.
details.representative.lastNamestringUp to 100 characters.
details.representative.emailstring (email)
details.representative.phonestring
details.representative.titlestringBusiness title, e.g. Owner. Up to 100 characters.
details.representative.jobPositionenumOne of Director, GM, VP, CEO, CFO, General Counsel, Other. Default Director.
details.useCaseenumOne of CUSTOMER_CARE, ACCOUNT_NOTIFICATION, MIXED, MARKETING. Default MIXED.
details.descriptionstringUp to 1024 characters.
details.messageFlowstringUp to 2048 characters.
details.sampleMessagesarray of stringUp to 5 items.
details.hasEmbeddedLinksbooleanDefault true.
details.hasEmbeddedPhonebooleanDefault true.
defaultsobjectSuggestions from the business's profile, website and the signed-in person for the form.
defaults.brandTypeenumOne of STANDARD, SOLE_PROPRIETOR.
defaults.legalNamestring
defaults.businessTypeenumOne of Sole Proprietorship, Partnership, Limited Liability Corporation, Co-operative, Non-profit Corporation, Corporation.
defaults.websiteUrlstring
defaults.privacyUrlstring
defaults.termsUrlstring
defaults.optInUrlstringThe public page with the texting consent checkbox.
defaults.streetstring
defaults.citystring
defaults.regionstring
defaults.postalCodestring
defaults.representativeobject
defaults.representative.firstNamestring
defaults.representative.lastNamestring
defaults.representative.emailstring
defaults.representative.phonestring
defaults.descriptionstring
defaults.messageFlowstring
defaults.sampleMessagesarray of string

Check the A2P status now

POST /organizations/{organizationId}/telephony/a2p/refresh

Asks Twilio for the brand or campaign status now instead of waiting for the worker; once the brand is approved this creates the Messaging Service in the sub-account, adds the texting number and submits the campaign.

Permissionchannels.manage (Owner, Admin)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP tooltelephony_refreshA2p (toolset settings)

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/telephony/a2p/refresh" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
statusenumOne of NOT_STARTED, PROFILE_SUBMITTED, BRAND_PENDING, OTP_PENDING, BRAND_APPROVED, CAMPAIGN_PENDING, APPROVED, FAILED.
brandTypeenumOne of STANDARD, SOLE_PROPRIETOR.
brandStatusstring or null
identityStatusstring or nullTwilio's brand identity check: SELF_DECLARED, UNVERIFIED, VERIFIED, VETTED_VERIFIED.
customerProfileStatusstring or nullTrust Hub customer profile status.
trustProductStatusstring or nullTrust Hub A2P bundle status.
campaignStatusstring or null
messagingServiceSidstring or null
failureReasonstring or null
issuesarray of objectWhy it was refused, per field (empty unless FAILED).
issues[].sourceenumWhich step refused it. One of profile, trust, brand, otp, campaign, submit.
issues[].codeinteger or nullTwilio's error code (twilio.com/docs/api/errors/{code}).
issues[].fieldstring or nullThe registration field to change (e.g. ein, messageFlow, sampleMessages.0).
issues[].messagestringWhat to fix, in plain English.
issues[].detailstring or nullTwilio's own words.
fakeboolean
submittedAtstring (date-time) or null
approvedAtstring (date-time) or null
lastCheckedAtstring (date-time) or null
otpSentAtstring (date-time) or nullSole proprietor: when the confirmation text went to the owner's mobile (reply YES within 24 hours).
textingNumberstring or nullThe SKUFlow texting number being registered.
detailsobject or nullWhat was submitted.
details.brandTypeenumSTANDARD for a business with an EIN; SOLE_PROPRIETOR without one (the owner confirms by text; one number). One of STANDARD, SOLE_PROPRIETOR. Default STANDARD.
details.legalNamestringThe legal business name exactly as on the IRS EIN letter (CP 575 / 147C); a sole proprietor's business or full name. Up to 255 characters.
details.businessTypeenumOne of Sole Proprietorship, Partnership, Limited Liability Corporation, Co-operative, Non-profit Corporation, Corporation.
details.industryenumOne of CONSTRUCTION, PROFESSIONAL_SERVICES, REAL_ESTATE, RETAIL, AUTOMOTIVE, ENERGY, HEALTHCARE, TRANSPORTATION. Default CONSTRUCTION.
details.einstringThe business's EIN (US tax id); required for STANDARD, empty for SOLE_PROPRIETOR. Default ``.
details.companyTypeenumOne of private, public, non-profit. Default private.
details.websiteUrlstring (uri)Up to 500 characters.
details.privacyUrlstring (uri)The public privacy policy (must say mobile numbers are not shared for marketing). Up to 2048 characters.
details.termsUrlstring (uri)The public terms with the SMS program details. Up to 2048 characters.
details.streetstringUp to 200 characters.
details.citystringUp to 100 characters.
details.regionstringTwo-letter US state. Up to 2 characters.
details.postalCodestring
details.representativeobject
details.representative.firstNamestringUp to 100 characters.
details.representative.lastNamestringUp to 100 characters.
details.representative.emailstring (email)
details.representative.phonestring
details.representative.titlestringBusiness title, e.g. Owner. Up to 100 characters.
details.representative.jobPositionenumOne of Director, GM, VP, CEO, CFO, General Counsel, Other. Default Director.
details.useCaseenumOne of CUSTOMER_CARE, ACCOUNT_NOTIFICATION, MIXED, MARKETING. Default MIXED.
details.descriptionstringUp to 1024 characters.
details.messageFlowstringUp to 2048 characters.
details.sampleMessagesarray of stringUp to 5 items.
details.hasEmbeddedLinksbooleanDefault true.
details.hasEmbeddedPhonebooleanDefault true.
defaultsobjectSuggestions from the business's profile, website and the signed-in person for the form.
defaults.brandTypeenumOne of STANDARD, SOLE_PROPRIETOR.
defaults.legalNamestring
defaults.businessTypeenumOne of Sole Proprietorship, Partnership, Limited Liability Corporation, Co-operative, Non-profit Corporation, Corporation.
defaults.websiteUrlstring
defaults.privacyUrlstring
defaults.termsUrlstring
defaults.optInUrlstringThe public page with the texting consent checkbox.
defaults.streetstring
defaults.citystring
defaults.regionstring
defaults.postalCodestring
defaults.representativeobject
defaults.representative.firstNamestring
defaults.representative.lastNamestring
defaults.representative.emailstring
defaults.representative.phonestring
defaults.descriptionstring
defaults.messageFlowstring
defaults.sampleMessagesarray of string

Telephony usage this month

GET /organizations/{organizationId}/telephony/usage

This month's telephony from the business's SKUFlow sub-account per category (voice minutes, numbers, texts, recordings, transcriptions, registration fees, other): counts, what is billed so far and the estimate to date at Twilio's cost × 1.2. Texts are shown but billed by the plan's text allowance. Read-only.

Permissionphone.manage (Owner, Admin)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP tooltelephony_usage (toolset settings)

Example

curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/telephony/usage" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
monthstringFirst day of the month, YYYY-MM-DD (UTC).
markupnumberTwilio's cost × this is the charge (1.2 = cost + 20%).
billedThroughstring or nullLast UTC day billed from Twilio's Usage Records.
availablebooleanFalse until the business has a SKUFlow sub-account.
linesarray of object
lines[].categoryenumOne of voice, numbers, texts, recordings, transcriptions, registration, other.
lines[].countnumber
lines[].usagenumber
lines[].usageUnitstring or null
lines[].billablebooleanFalse for texts: the plan's text allowance and overage bill them.
lines[].billedCentsintegerRecorded for billing (settled days).
lines[].estimatedCentsintegerMonth to date, settled plus not yet settled.
totalCentsinteger
billedCentsinteger

Run telephony jobs now

POST /organizations/{organizationId}/telephony/run

Run this business's telephony jobs now instead of waiting for the worker: reconcile the sub-account with the SKUFlow subscription (suspend, reactivate, close, scheduled number releases), bill settled Twilio usage (each account × day × category once) and check the A2P registration. now is test-only (refused in production).

Permissionphone.manage (Owner, Admin)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP tooltelephony_run (toolset settings)

Request body

FieldTypeRequiredDescription
nowstring (date-time)No

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/telephony/run" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"now":"2026-11-03T15:00:00Z"}'

Response

200: the answer's fields
FieldTypeDescription
lifecycleobject
lifecycle.checkedinteger
lifecycle.suspendedinteger
lifecycle.reactivatedinteger
lifecycle.closedinteger
lifecycle.numbersReleasedinteger
lifecycle.numbersScheduledinteger
usageobject
usage.accountsinteger
usage.daysinteger
usage.rowsinteger
usage.recordedinteger
usage.simulatedinteger
usage.failedinteger
a2pobject
a2p.checkedinteger

On this page