API reference
Dials
Phone numbers and calls for agents: buy and configure numbers, place and receive calls, and read call records.
- Operations
- 37
- Base path
https://os.one.ml/api/v1/dials- Scopes
dials:readdials:write- API keys
- 1 failed with an API key · 2 not yet tested · 34 tested with an API key
- SDK
genesis.call('dials_listAgents', …)· helpers undergenesis.dials- MCP
- 37 tools
Operations
Agents
List saved agents in the selected scope
GET/v1/dials/agents
Parameters
organizationIdquery · stringrequiredMust match the authenticated organization.
workspaceIdquery · stringrequiredSelected Dials scope.
projectIdquery · stringrequiredSelected Dials scope.
environmentIdquery · stringrequiredSelected Dials scope.
Responses
- 200Success
Response fields
okbooleanrequiredagentsobject[]requiredagents[].[].idstringrequiredagents[].[].scopeobjectrequiredagents[].[].scope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
agents[].[].scope.organizationIdstringrequiredmin length 1
agents[].[].scope.workspaceIdstringrequiredmin length 1
agents[].[].scope.projectIdstringrequiredmin length 1
agents[].[].scope.environmentIdstringrequiredmin length 1
agents[].[].namestringrequiredagents[].[].rolestringrequiredagents[].[].voiceModelIdstringrequiredOpaque model identifier; not a validated voice-profile binding.
agents[].[].mode"autonomous" | "copilot" | "human_handoff"requiredagents[].[].phoneNumberIdstring | nullrequiredagents[].[].systemPromptstringrequiredagents[].[].statusstringrequiredSaved backend status does not establish a running model or voice runtime.
- 401Missing or invalid identity
- 404Resource does not belong to the authenticated organization
- 503Backend or carrier unavailable
- 4xx 5xxThe error envelope.
curl "https://os.one.ml/api/v1/dials/agents?organizationId=$ORGANIZATION_ID&workspaceId=$WORKSPACE_ID&projectId=$PROJECT_ID&environmentId=$ENVIRONMENT_ID" \
-H "Authorization: Bearer $GENESIS_API_KEY"import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_listAgents', {
organizationId: '<organizationId>',
workspaceId: '<workspaceId>',
projectId: '<projectId>',
environmentId: '<environmentId>',
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_listAgents",
"arguments": {
"organizationId": "<organizationId>",
"workspaceId": "<workspaceId>",
"projectId": "<projectId>",
"environmentId": "<environmentId>"
}
}
}Save an unassigned AgentProfile by scoped normalized name
POST/v1/dials/agents
This POST upserts by full scope and trimmed,lowercased name. Omitted optional fields reset. Create unassigned and assign a number separately; never replay creation after an assignment failure. No invitation,model deployment or consent verification is implied.
Request body application/json
scopeobjectrequiredscope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
scope.organizationIdstringrequiredmin length 1
scope.workspaceIdstringrequiredmin length 1
scope.projectIdstringrequiredmin length 1
scope.environmentIdstringrequiredmin length 1
actorIdstringrequiredmin length 1
namestringrequiredmin length 1
rolestringrequiredmin length 1
voiceModelIdstringrequiredModel string; never substitute a governed voice profile ID. min length 1
mode"autonomous" | "copilot" | "human_handoff"requiredsystemPromptstring | null
Responses
- 200Success
Response fields
okbooleanrequiredagentobjectrequiredagent.idstringrequiredagent.scopeobjectrequiredagent.scope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
agent.scope.organizationIdstringrequiredmin length 1
agent.scope.workspaceIdstringrequiredmin length 1
agent.scope.projectIdstringrequiredmin length 1
agent.scope.environmentIdstringrequiredmin length 1
agent.namestringrequiredagent.rolestringrequiredagent.voiceModelIdstringrequiredOpaque model identifier; not a validated voice-profile binding.
agent.mode"autonomous" | "copilot" | "human_handoff"requiredagent.phoneNumberIdstring | nullrequiredagent.systemPromptstringrequiredagent.statusstringrequiredSaved backend status does not establish a running model or voice runtime.
auditIdstringrequiredusageEventIdstringrequirednextstringrequired
- 401Missing or invalid identity
- 404Resource does not belong to the authenticated organization
- 422Invalid profile fields, missing consent/license attestation, or unsupported production model
- 503Backend or carrier unavailable
- 4xx 5xxThe error envelope.
curl -X POST "https://os.one.ml/api/v1/dials/agents" \
-H "Authorization: Bearer $GENESIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"actorId": "string",
"name": "string",
"role": "string",
"voiceModelId": "string",
"mode": "autonomous"
}'import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_createAgent', {
body: {
scope: {
organizationId: 'string',
workspaceId: 'string',
projectId: 'string',
environmentId: 'string',
},
actorId: 'string',
name: 'string',
role: 'string',
voiceModelId: 'string',
mode: 'autonomous',
},
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_createAgent",
"arguments": {
"body": {
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"actorId": "string",
"name": "string",
"role": "string",
"voiceModelId": "string",
"mode": "autonomous"
}
}
}
}Calls
List real call lifecycle and carrier outcomes
GET/v1/dials/calls
Return scoped saved sessions with actual nullable carrier outcomes and separate dispatchState. A queued session with uncertain or recovery_required dispatchState must be reconciled without re-originating the call.
Parameters
organizationIdquery · stringrequiredMust match the authenticated organization.
workspaceIdquery · stringrequiredSelected Dials scope.
projectIdquery · stringrequiredSelected Dials scope.
environmentIdquery · stringrequiredSelected Dials scope.
Responses
- 200Success
Response fields
okbooleanrequiredcallsobject[]requiredcalls[].[].idstringrequiredcalls[].[].scopeobjectrequiredcalls[].[].scope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
calls[].[].scope.organizationIdstringrequiredmin length 1
calls[].[].scope.workspaceIdstringrequiredmin length 1
calls[].[].scope.projectIdstringrequiredmin length 1
calls[].[].scope.environmentIdstringrequiredmin length 1
calls[].[].direction"inbound" | "outbound" | "on_net"requiredcalls[].[].status"created" | "compliance_checked" | "queued" | "dialing" | "ringing" | "answered" | "bridged" | "held" | "completed" | "failed" | "blocked"requiredCall lifecycle only. A queued lifecycle can coexist with uncertain or recovery_required dispatchState; it is not proof that another worker should execute it.
calls[].[].phoneNumberIdstringrequiredcalls[].[].remoteE164stringrequiredcalls[].[].callControlobject | objectCustomer-selected call behavior. Speak plays the provided text and ends the call; stream connects live audio to the customer agent WebSocket. No default behavior is synthesized.
calls[].[].providerCallIdstring | nullrequiredcalls[].[].sipStatusinteger | null (int32)requiredcalls[].[].hangupCausestring | nullrequiredcalls[].[].durationSecondsinteger | null (int32)requiredcalls[].[].billedSecondsinteger | null (int32)requiredcalls[].[].answeredbooleanrequiredWhether the far end was observed to answer; false alone is not a terminal result.
calls[].[].recordingIdstring | nullrequiredcalls[].[].dispatchState"pending" | "claimed" | "dispatched" | "failed" | "uncertain" | "recovery_required" | nullSubmission state separate from the call lifecycle. uncertain means provider acceptance is unknown; recovery_required means a durable receipt needs reconciliation. Neither means successful execution or authorizes retry. Null means no recognized dispatch job is available.
- 401Missing or invalid identity
- 404Resource does not belong to the authenticated organization
- 503Backend or carrier unavailable
- 4xx 5xxThe error envelope.
curl "https://os.one.ml/api/v1/dials/calls?organizationId=$ORGANIZATION_ID&workspaceId=$WORKSPACE_ID&projectId=$PROJECT_ID&environmentId=$ENVIRONMENT_ID" \
-H "Authorization: Bearer $GENESIS_API_KEY"import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_listCalls', {
organizationId: '<organizationId>',
workspaceId: '<workspaceId>',
projectId: '<projectId>',
environmentId: '<environmentId>',
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_listCalls",
"arguments": {
"organizationId": "<organizationId>",
"workspaceId": "<workspaceId>",
"projectId": "<projectId>",
"environmentId": "<environmentId>"
}
}
}Queue an approved outbound call with an idempotency key
POST/v1/dials/calls/outbound
Request body application/json
scopeobjectrequiredscope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
scope.organizationIdstringrequiredmin length 1
scope.workspaceIdstringrequiredmin length 1
scope.projectIdstringrequiredmin length 1
scope.environmentIdstringrequiredmin length 1
actorIdstringrequiredmin length 1
toE164stringrequiredmin length 1
fromNumberIdstringrequiredmin length 1
idempotencyKeystringrequiredmin length 1
complianceApprovedbooleanrequireddisclosureApprovedbooleanrequiredrecordingPolicyApprovedbooleanrequiredemergencyAddressBoundbooleanrequiredcallControlobject | objectrequiredCustomer-selected call behavior. Speak plays the provided text and ends the call; stream connects live audio to the customer agent WebSocket. No default behavior is synthesized.
Responses
- 200Success
Response fields
okbooleanrequiredcallobjectrequiredSaved call session. Admission/recovery receipts return this session without the separate carrier outcome fields in calls.list.
call.idstringrequiredcall.scopeobjectrequiredcall.scope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
call.scope.organizationIdstringrequiredmin length 1
call.scope.workspaceIdstringrequiredmin length 1
call.scope.projectIdstringrequiredmin length 1
call.scope.environmentIdstringrequiredmin length 1
call.direction"inbound" | "outbound" | "on_net"requiredcall.status"created" | "compliance_checked" | "queued" | "dialing" | "ringing" | "answered" | "bridged" | "held" | "completed" | "failed" | "blocked"requiredCall lifecycle only. A queued lifecycle can coexist with uncertain or recovery_required dispatchState; it is not proof that another worker should execute it.
call.phoneNumberIdstringrequiredcall.remoteE164stringrequiredcall.callControlobject | objectCustomer-selected call behavior. Speak plays the provided text and ends the call; stream connects live audio to the customer agent WebSocket. No default behavior is synthesized.
auditIdstringrequireddispatchJobIdstringrequiredusageEventIdstringrequirednextstringrequiredidempotentReplaybooleanrequired
- 401Missing or invalid identity
- 404Resource does not belong to the authenticated organization
- 503Backend or carrier unavailable
- 4xx 5xxThe error envelope.
curl -X POST "https://os.one.ml/api/v1/dials/calls/outbound" \
-H "Authorization: Bearer $GENESIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"actorId": "string",
"toE164": "string",
"fromNumberId": "string",
"idempotencyKey": "string",
"complianceApproved": true,
"disclosureApproved": true,
"recordingPolicyApproved": true,
"emergencyAddressBound": true,
"callControl": {
"type": "speak",
"text": "string"
}
}'import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_createOutboundCall', {
body: {
scope: {
organizationId: 'string',
workspaceId: 'string',
projectId: 'string',
environmentId: 'string',
},
actorId: 'string',
toE164: 'string',
fromNumberId: 'string',
idempotencyKey: 'string',
complianceApproved: true,
disclosureApproved: true,
recordingPolicyApproved: true,
emergencyAddressBound: true,
callControl: {
type: 'speak',
text: 'string',
},
},
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_createOutboundCall",
"arguments": {
"body": {
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"actorId": "string",
"toE164": "string",
"fromNumberId": "string",
"idempotencyKey": "string",
"complianceApproved": true,
"disclosureApproved": true,
"recordingPolicyApproved": true,
"emergencyAddressBound": true,
"callControl": {
"type": "speak",
"text": "string"
}
}
}
}
}Read an existing outbound admission receipt without originating a call
POST/v1/dials/calls/outbound/recover
Submit the identical original OutboundCall body/key through this distinct read-journal-only route. Requires verified org/full selected scope and dials:write. Returns the original stored CreateOutboundCallResponse with idempotentReplay:true; missing 404/mismatched 409 fails closed. No new call, job, audit, usage, provider request or worker action occurs. This is not the normal creation POST and must not bypass an uncertain-call fence. Runtime deployment/acceptance is separate from this schema candidate.
Request body application/json
scopeobjectrequiredscope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
scope.organizationIdstringrequiredmin length 1
scope.workspaceIdstringrequiredmin length 1
scope.projectIdstringrequiredmin length 1
scope.environmentIdstringrequiredmin length 1
actorIdstringrequiredmin length 1
toE164stringrequiredmin length 1
fromNumberIdstringrequiredmin length 1
idempotencyKeystringrequiredmin length 1
complianceApprovedbooleanrequireddisclosureApprovedbooleanrequiredrecordingPolicyApprovedbooleanrequiredemergencyAddressBoundbooleanrequiredcallControlobject | objectrequiredCustomer-selected call behavior. Speak plays the provided text and ends the call; stream connects live audio to the customer agent WebSocket. No default behavior is synthesized.
Responses
- 200Existing saved admission receipt; idempotentReplay:true only. Carrier acceptance/current state is not established.
Response fields
okbooleanrequiredcallobjectrequiredSaved call session. Admission/recovery receipts return this session without the separate carrier outcome fields in calls.list.
call.idstringrequiredcall.scopeobjectrequiredcall.scope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
call.scope.organizationIdstringrequiredmin length 1
call.scope.workspaceIdstringrequiredmin length 1
call.scope.projectIdstringrequiredmin length 1
call.scope.environmentIdstringrequiredmin length 1
call.direction"inbound" | "outbound" | "on_net"requiredcall.status"created" | "compliance_checked" | "queued" | "dialing" | "ringing" | "answered" | "bridged" | "held" | "completed" | "failed" | "blocked"requiredCall lifecycle only. A queued lifecycle can coexist with uncertain or recovery_required dispatchState; it is not proof that another worker should execute it.
call.phoneNumberIdstringrequiredcall.remoteE164stringrequiredcall.callControlobject | objectCustomer-selected call behavior. Speak plays the provided text and ends the call; stream connects live audio to the customer agent WebSocket. No default behavior is synthesized.
auditIdstringrequireddispatchJobIdstringrequiredusageEventIdstringrequirednextstringrequiredidempotentReplaytruerequired
- 400Invalid scope or request.
- 401Missing verified identity.
- 403Scope or Dials write grant not authorized.
- 404No existing journal receipt in the verified full scope; no call is inserted.
- 409Existing idempotency key has a different canonical request body; no mutation.
- 422Malformed outbound control/request.
- 500Journal read failed.
- 503Backend unavailable.
- 4xx 5xxThe error envelope.
curl -X POST "https://os.one.ml/api/v1/dials/calls/outbound/recover" \
-H "Authorization: Bearer $GENESIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"actorId": "string",
"toE164": "string",
"fromNumberId": "string",
"idempotencyKey": "string",
"complianceApproved": true,
"disclosureApproved": true,
"recordingPolicyApproved": true,
"emergencyAddressBound": true,
"callControl": {
"type": "speak",
"text": "string"
}
}'import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_recoverOutboundCall', {
body: {
scope: {
organizationId: 'string',
workspaceId: 'string',
projectId: 'string',
environmentId: 'string',
},
actorId: 'string',
toE164: 'string',
fromNumberId: 'string',
idempotencyKey: 'string',
complianceApproved: true,
disclosureApproved: true,
recordingPolicyApproved: true,
emergencyAddressBound: true,
callControl: {
type: 'speak',
text: 'string',
},
},
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_recoverOutboundCall",
"arguments": {
"body": {
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"actorId": "string",
"toE164": "string",
"fromNumberId": "string",
"idempotencyKey": "string",
"complianceApproved": true,
"disclosureApproved": true,
"recordingPolicyApproved": true,
"emergencyAddressBound": true,
"callControl": {
"type": "speak",
"text": "string"
}
}
}
}
}Validate consent and outbound call prerequisites
POST/v1/dials/calls/outbound/validate
Request body application/json
scopeobjectrequiredscope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
scope.organizationIdstringrequiredmin length 1
scope.workspaceIdstringrequiredmin length 1
scope.projectIdstringrequiredmin length 1
scope.environmentIdstringrequiredmin length 1
actorIdstringrequiredmin length 1
toE164stringrequiredmin length 1
fromNumberIdstringrequiredmin length 1
idempotencyKeystringrequiredmin length 1
complianceApprovedbooleanrequireddisclosureApprovedbooleanrequiredrecordingPolicyApprovedbooleanrequiredemergencyAddressBoundbooleanrequiredcallControlobject | objectrequiredCustomer-selected call behavior. Speak plays the provided text and ends the call; stream connects live audio to the customer agent WebSocket. No default behavior is synthesized.
Responses
- 200Success
Response fields
A JSON object.
- 401Missing or invalid identity
- 404Resource does not belong to the authenticated organization
- 503Backend or carrier unavailable
- 4xx 5xxThe error envelope.
curl -X POST "https://os.one.ml/api/v1/dials/calls/outbound/validate" \
-H "Authorization: Bearer $GENESIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"actorId": "string",
"toE164": "string",
"fromNumberId": "string",
"idempotencyKey": "string",
"complianceApproved": true,
"disclosureApproved": true,
"recordingPolicyApproved": true,
"emergencyAddressBound": true,
"callControl": {
"type": "speak",
"text": "string"
}
}'import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_validateOutboundCall', {
body: {
scope: {
organizationId: 'string',
workspaceId: 'string',
projectId: 'string',
environmentId: 'string',
},
actorId: 'string',
toE164: 'string',
fromNumberId: 'string',
idempotencyKey: 'string',
complianceApproved: true,
disclosureApproved: true,
recordingPolicyApproved: true,
emergencyAddressBound: true,
callControl: {
type: 'speak',
text: 'string',
},
},
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_validateOutboundCall",
"arguments": {
"body": {
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"actorId": "string",
"toE164": "string",
"fromNumberId": "string",
"idempotencyKey": "string",
"complianceApproved": true,
"disclosureApproved": true,
"recordingPolicyApproved": true,
"emergencyAddressBound": true,
"callControl": {
"type": "speak",
"text": "string"
}
}
}
}
}Console
Read the scoped Dials operating surface
GET/v1/dials/console/operating-surface
Parameters
organizationIdquery · stringrequiredMust match the authenticated organization.
workspaceIdquery · stringrequiredSelected Dials scope.
projectIdquery · stringrequiredSelected Dials scope.
environmentIdquery · stringrequiredSelected Dials scope.
Responses
- 200Success
Response fields
okbooleanrequiredscopeobjectrequiredscope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
scope.organizationIdstringrequiredmin length 1
scope.workspaceIdstringrequiredmin length 1
scope.projectIdstringrequiredmin length 1
scope.environmentIdstringrequiredmin length 1
summaryobjectrequiredsummary.okbooleanrequiredsummary.scopeobjectrequiredsummary.scope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
summary.scope.organizationIdstringrequiredmin length 1
summary.scope.workspaceIdstringrequiredmin length 1
summary.scope.projectIdstringrequiredmin length 1
summary.scope.environmentIdstringrequiredmin length 1
summary.callsobjectrequiredsummary.calls.totalintegerrequiredmin 0
summary.calls.queuedintegerrequiredmin 0
summary.calls.activeintegerrequiredmin 0
summary.calls.completedintegerrequiredmin 0
summary.calls.failedintegerrequiredmin 0
summary.dispatchobjectrequiredsummary.dispatch.totalintegerrequiredmin 0
summary.dispatch.pendingintegerrequiredmin 0
summary.dispatch.claimedintegerrequiredmin 0
summary.dispatch.dispatchedintegerrequiredmin 0
summary.dispatch.failedintegerrequiredmin 0
summary.peopleobjectrequiredsummary.people.deployedintegerrequiredmin 0
summary.agentsobjectrequiredsummary.agents.deployedintegerrequiredmin 0
summary.routesobjectrequiredsummary.routes.deployedintegerrequiredmin 0
summary.numbersobjectrequiredsummary.numbers.deployedintegerrequiredmin 0
summary.voiceobjectrequiredsummary.voice.deployedintegerrequiredmin 0
summary.messagesobjectrequiredsummary.messages.totalintegerrequiredmin 0
summary.messages.queuedintegerrequiredmin 0
summary.messages.deliveredintegerrequiredmin 0
summary.messages.failedintegerrequiredmin 0
summary.usageobjectrequiredsummary.usage.totalintegerrequiredmin 0
summary.usage.quantitynumberrequiredsummary.usage.lastMetricstring | nullrequiredsummary.usage.lastResourceIdstring | nullrequiredsurfacesobject[]requiredsurfaces[].[].keystringrequiredsurfaces[].[].titlestringrequiredsurfaces[].[].audiencestringrequiredsurfaces[].[].statusstringrequiredsurfaces[].[].hrefstringrequiredsurfaces[].[].descriptionstringrequiredsurfaces[].[].primaryActionstringrequiredsurfaces[].[].backendResourcestringrequiredsurfaces[].[].countintegerrequiredmin 0
- 401Missing or invalid identity
- 404Resource does not belong to the authenticated organization
- 503Backend or carrier unavailable
- 4xx 5xxThe error envelope.
curl "https://os.one.ml/api/v1/dials/console/operating-surface?organizationId=$ORGANIZATION_ID&workspaceId=$WORKSPACE_ID&projectId=$PROJECT_ID&environmentId=$ENVIRONMENT_ID" \
-H "Authorization: Bearer $GENESIS_API_KEY"import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_getOperatingSurface', {
organizationId: '<organizationId>',
workspaceId: '<workspaceId>',
projectId: '<projectId>',
environmentId: '<environmentId>',
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_getOperatingSurface",
"arguments": {
"organizationId": "<organizationId>",
"workspaceId": "<workspaceId>",
"projectId": "<projectId>",
"environmentId": "<environmentId>"
}
}
}Read authoritative scoped Dials resource counts
GET/v1/dials/console/summary
Parameters
organizationIdquery · stringrequiredMust match the authenticated organization.
workspaceIdquery · stringrequiredSelected Dials scope.
projectIdquery · stringrequiredSelected Dials scope.
environmentIdquery · stringrequiredSelected Dials scope.
Responses
- 200Success
Response fields
okbooleanrequiredscopeobjectrequiredscope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
scope.organizationIdstringrequiredmin length 1
scope.workspaceIdstringrequiredmin length 1
scope.projectIdstringrequiredmin length 1
scope.environmentIdstringrequiredmin length 1
callsobjectrequiredcalls.totalintegerrequiredmin 0
calls.queuedintegerrequiredmin 0
calls.activeintegerrequiredmin 0
calls.completedintegerrequiredmin 0
calls.failedintegerrequiredmin 0
dispatchobjectrequireddispatch.totalintegerrequiredmin 0
dispatch.pendingintegerrequiredmin 0
dispatch.claimedintegerrequiredmin 0
dispatch.dispatchedintegerrequiredmin 0
dispatch.failedintegerrequiredmin 0
peopleobjectrequiredpeople.deployedintegerrequiredmin 0
agentsobjectrequiredagents.deployedintegerrequiredmin 0
routesobjectrequiredroutes.deployedintegerrequiredmin 0
numbersobjectrequirednumbers.deployedintegerrequiredmin 0
voiceobjectrequiredvoice.deployedintegerrequiredmin 0
messagesobjectrequiredmessages.totalintegerrequiredmin 0
messages.queuedintegerrequiredmin 0
messages.deliveredintegerrequiredmin 0
messages.failedintegerrequiredmin 0
usageobjectrequiredusage.totalintegerrequiredmin 0
usage.quantitynumberrequiredusage.lastMetricstring | nullrequiredusage.lastResourceIdstring | nullrequired
- 401Missing or invalid identity
- 404Resource does not belong to the authenticated organization
- 503Backend or carrier unavailable
- 4xx 5xxThe error envelope.
curl "https://os.one.ml/api/v1/dials/console/summary?organizationId=$ORGANIZATION_ID&workspaceId=$WORKSPACE_ID&projectId=$PROJECT_ID&environmentId=$ENVIRONMENT_ID" \
-H "Authorization: Bearer $GENESIS_API_KEY"import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_getConsoleSummary', {
organizationId: '<organizationId>',
workspaceId: '<workspaceId>',
projectId: '<projectId>',
environmentId: '<environmentId>',
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_getConsoleSummary",
"arguments": {
"organizationId": "<organizationId>",
"workspaceId": "<workspaceId>",
"projectId": "<projectId>",
"environmentId": "<environmentId>"
}
}
}Human profiles
List saved humans in the selected scope
GET/v1/dials/human-profiles
Parameters
organizationIdquery · stringrequiredMust match the authenticated organization.
workspaceIdquery · stringrequiredSelected Dials scope.
projectIdquery · stringrequiredSelected Dials scope.
environmentIdquery · stringrequiredSelected Dials scope.
Responses
- 200Success
Response fields
okbooleanrequiredhumansobject[]requiredhumans[].[].idstringrequiredhumans[].[].scopeobjectrequiredhumans[].[].scope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
humans[].[].scope.organizationIdstringrequiredmin length 1
humans[].[].scope.workspaceIdstringrequiredmin length 1
humans[].[].scope.projectIdstringrequiredmin length 1
humans[].[].scope.environmentIdstringrequiredmin length 1
humans[].[].displayNamestringrequiredhumans[].[].rolestringrequiredDescriptive phone role, not a One account authorization grant.
humans[].[].emailstring | nullrequiredhumans[].[].extensionstring | nullrequiredhumans[].[].phoneNumberIdstring | nullrequiredhumans[].[].contactE164string | nullrequiredhumans[].[].presence"available" | "focus" | "after_hours" | "offline"requiredhumans[].[].escalationPriorityintegerrequiredmin 0 · max 1000
humans[].[].statusstringrequired
- 401Missing or invalid identity
- 404Resource does not belong to the authenticated organization
- 503Backend or carrier unavailable
- 4xx 5xxThe error envelope.
curl "https://os.one.ml/api/v1/dials/human-profiles?organizationId=$ORGANIZATION_ID&workspaceId=$WORKSPACE_ID&projectId=$PROJECT_ID&environmentId=$ENVIRONMENT_ID" \
-H "Authorization: Bearer $GENESIS_API_KEY"import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_listHumanProfiles', {
organizationId: '<organizationId>',
workspaceId: '<workspaceId>',
projectId: '<projectId>',
environmentId: '<environmentId>',
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_listHumanProfiles",
"arguments": {
"organizationId": "<organizationId>",
"workspaceId": "<workspaceId>",
"projectId": "<projectId>",
"environmentId": "<environmentId>"
}
}
}Save an unassigned HumanProfile by scoped normalized name
POST/v1/dials/human-profiles
This POST upserts by full scope and trimmed,lowercased name. Omitted optional fields reset. Create unassigned and assign a number separately; never replay creation after an assignment failure. No invitation,model deployment or consent verification is implied.
Request body application/json
scopeobjectrequiredscope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
scope.organizationIdstringrequiredmin length 1
scope.workspaceIdstringrequiredmin length 1
scope.projectIdstringrequiredmin length 1
scope.environmentIdstringrequiredmin length 1
actorIdstringrequiredmin length 1
displayNamestringrequiredmin length 1
rolestringrequiredmin length 1
emailstring | nullmax length 320
extensionstring | nullpattern ^[0-9]{0,8}$
contactE164string | nullActual destination handset; backend accepts international E164 or normalizes US10/11 digits.
presence"available" | "focus" | "after_hours" | "offline" | nullescalationPriorityinteger | nullmin 0 · max 1000
Responses
- 200Success
Response fields
okbooleanrequiredhumanobjectrequiredhuman.idstringrequiredhuman.scopeobjectrequiredhuman.scope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
human.scope.organizationIdstringrequiredmin length 1
human.scope.workspaceIdstringrequiredmin length 1
human.scope.projectIdstringrequiredmin length 1
human.scope.environmentIdstringrequiredmin length 1
human.displayNamestringrequiredhuman.rolestringrequiredDescriptive phone role, not a One account authorization grant.
human.emailstring | nullrequiredhuman.extensionstring | nullrequiredhuman.phoneNumberIdstring | nullrequiredhuman.contactE164string | nullrequiredhuman.presence"available" | "focus" | "after_hours" | "offline"requiredhuman.escalationPriorityintegerrequiredmin 0 · max 1000
human.statusstringrequiredauditIdstringrequiredusageEventIdstringrequirednextstringrequired
- 401Missing or invalid identity
- 404Resource does not belong to the authenticated organization
- 422Invalid profile fields, missing consent/license attestation, or unsupported production model
- 503Backend or carrier unavailable
- 4xx 5xxThe error envelope.
curl -X POST "https://os.one.ml/api/v1/dials/human-profiles" \
-H "Authorization: Bearer $GENESIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"actorId": "string",
"displayName": "string",
"role": "string"
}'import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_createHumanProfile', {
body: {
scope: {
organizationId: 'string',
workspaceId: 'string',
projectId: 'string',
environmentId: 'string',
},
actorId: 'string',
displayName: 'string',
role: 'string',
},
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_createHumanProfile",
"arguments": {
"body": {
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"actorId": "string",
"displayName": "string",
"role": "string"
}
}
}
}Message templates
List scoped saved message templates
GET/v1/dials/message-templates
Parameters
organizationIdquery · stringrequiredMust match the authenticated organization.
workspaceIdquery · stringrequiredSelected Dials scope.
projectIdquery · stringrequiredSelected Dials scope.
environmentIdquery · stringrequiredSelected Dials scope.
platformIdquery · stringSelected data platform. Omitted defaults to dials in the backend; selection does not grant organization authority.
Responses
- 200Actual durable operation result; no carrier delivery or graph execution is inferred.
Response fields
okbooleanrequiredtemplatesobject[]requiredtemplates[].[].idstringrequiredtemplates[].[].scopeobjectrequiredtemplates[].[].scope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
templates[].[].scope.organizationIdstringrequiredmin length 1
templates[].[].scope.workspaceIdstringrequiredmin length 1
templates[].[].scope.projectIdstringrequiredmin length 1
templates[].[].scope.environmentIdstringrequiredmin length 1
templates[].[].namestringrequiredtemplates[].[].channelstringrequiredtemplates[].[].categorystringrequiredtemplates[].[].bodystringrequiredtemplates[].[].statusstringrequiredapproved is locally saved template state, not carrier/compliance approval.
- 400Invalid selected scope or request shape.
- 401Missing or invalid verified identity.
- 403Selected scope is not authorized by signed identity or lacks the required Dials grant.
- 500Durable store failed.
- 503Backend is not ready.
- 4xx 5xxThe error envelope.
curl "https://os.one.ml/api/v1/dials/message-templates?organizationId=$ORGANIZATION_ID&workspaceId=$WORKSPACE_ID&projectId=$PROJECT_ID&environmentId=$ENVIRONMENT_ID" \
-H "Authorization: Bearer $GENESIS_API_KEY"import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_listMessageTemplates', {
organizationId: '<organizationId>',
workspaceId: '<workspaceId>',
projectId: '<projectId>',
environmentId: '<environmentId>',
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_listMessageTemplates",
"arguments": {
"organizationId": "<organizationId>",
"workspaceId": "<workspaceId>",
"projectId": "<projectId>",
"environmentId": "<environmentId>"
}
}
}Save a scoped message template by normalized name
POST/v1/dials/message-templates
Request body application/json
scopeobjectrequiredscope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
scope.organizationIdstringrequiredmin length 1
scope.workspaceIdstringrequiredmin length 1
scope.projectIdstringrequiredmin length 1
scope.environmentIdstringrequiredmin length 1
actorIdstringrequiredmin length 1
namestringrequiredmin length 1
channel"sms" | "mms"requiredBackend trims and lowercases sms/mms. This request has no media attachment field; mms does not imply attachment support.
categorystringrequiredmin length 1
bodystringrequiredNonblank body; the backend limits trimmed UTF-8 bytes to 5000, not only Unicode characters. min length 1 · max length 5000
Responses
- 200Actual durable operation result; no carrier delivery or graph execution is inferred.
Response fields
okbooleanrequiredtemplateobjectrequiredtemplate.idstringrequiredtemplate.scopeobjectrequiredtemplate.scope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
template.scope.organizationIdstringrequiredmin length 1
template.scope.workspaceIdstringrequiredmin length 1
template.scope.projectIdstringrequiredmin length 1
template.scope.environmentIdstringrequiredmin length 1
template.namestringrequiredtemplate.channelstringrequiredtemplate.categorystringrequiredtemplate.bodystringrequiredtemplate.statusstringrequiredapproved is locally saved template state, not carrier/compliance approval.
auditIdstringrequiredusageEventIdstringrequirednextstringrequired
- 400Invalid selected scope or request shape.
- 401Missing or invalid verified identity.
- 403Selected scope is not authorized by signed identity or lacks the required Dials grant.
- 422Validation or approval requirement refused.
- 500Durable store failed.
- 503Backend is not ready.
- 4xx 5xxThe error envelope.
curl -X POST "https://os.one.ml/api/v1/dials/message-templates" \
-H "Authorization: Bearer $GENESIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"actorId": "string",
"name": "string",
"channel": "sms",
"category": "string",
"body": "string"
}'import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_createMessageTemplate', {
body: {
scope: {
organizationId: 'string',
workspaceId: 'string',
projectId: 'string',
environmentId: 'string',
},
actorId: 'string',
name: 'string',
channel: 'sms',
category: 'string',
body: 'string',
},
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_createMessageTemplate",
"arguments": {
"body": {
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"actorId": "string",
"name": "string",
"channel": "sms",
"category": "string",
"body": "string"
}
}
}
}Messages
List scoped saved messages and actual delivery state
GET/v1/dials/messages
Parameters
organizationIdquery · stringrequiredMust match the authenticated organization.
workspaceIdquery · stringrequiredSelected Dials scope.
projectIdquery · stringrequiredSelected Dials scope.
environmentIdquery · stringrequiredSelected Dials scope.
platformIdquery · stringSelected data platform. Omitted defaults to dials in the backend; selection does not grant organization authority.
Responses
- 200Actual durable operation result; no carrier delivery or graph execution is inferred.
Response fields
okbooleanrequiredmessagesobject[]requiredmessages[].[].idstringrequiredmessages[].[].scopeobjectrequiredmessages[].[].scope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
messages[].[].scope.organizationIdstringrequiredmin length 1
messages[].[].scope.workspaceIdstringrequiredmin length 1
messages[].[].scope.projectIdstringrequiredmin length 1
messages[].[].scope.environmentIdstringrequiredmin length 1
messages[].[].direction"inbound" | "outbound"requiredmessages[].[].channelstringrequiredmessages[].[].status"queued" | "sending" | "sent" | "delivered" | "undelivered" | "failed" | "received"requiredqueued is durable admission, sending is adapter claim, sent is carrier acceptance, delivered is reported delivery; these are distinct. Never infer receipt from queueing.
messages[].[].fromNumberIdstringrequiredThe Dials-owned number in either direction; for inbound, this is the receiving number.
messages[].[].toE164stringrequiredLiteral destination; for inbound this can be the owned number.
messages[].[].remoteE164stringrequiredCounterparty for inbound and outbound.
messages[].[].bodystringrequiredmessages[].[].templateIdstring | nullrequiredmessages[].[].providerstringrequiredmessages[].[].providerMessageIdstring | nullrequiredmessages[].[].providerStatusstring | nullrequiredmessages[].[].segmentsinteger | null (int32)requiredCan be a local estimate at queue time, replaced by a carrier-reported count. It is not a price or proof of billing.
messages[].[].errorstring | nullrequiredmessages[].[].errorCodestring | nullrequired
- 400Invalid selected scope or request shape.
- 401Missing or invalid verified identity.
- 403Selected scope is not authorized by signed identity or lacks the required Dials grant.
- 500Durable store failed.
- 503Backend is not ready.
- 4xx 5xxThe error envelope.
curl "https://os.one.ml/api/v1/dials/messages?organizationId=$ORGANIZATION_ID&workspaceId=$WORKSPACE_ID&projectId=$PROJECT_ID&environmentId=$ENVIRONMENT_ID" \
-H "Authorization: Bearer $GENESIS_API_KEY"import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_listMessages', {
organizationId: '<organizationId>',
workspaceId: '<workspaceId>',
projectId: '<projectId>',
environmentId: '<environmentId>',
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_listMessages",
"arguments": {
"organizationId": "<organizationId>",
"workspaceId": "<workspaceId>",
"projectId": "<projectId>",
"environmentId": "<environmentId>"
}
}
}Queue an explicitly approved outbound message
POST/v1/dials/messages/outbound
Persist one scoped message, dispatch job, audit and usage in a transaction. Returns queued, not delivered. No automatic retry, approval default or provider registration is supplied.
Request body application/json
scopeobjectrequiredscope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
scope.organizationIdstringrequiredmin length 1
scope.workspaceIdstringrequiredmin length 1
scope.projectIdstringrequiredmin length 1
scope.environmentIdstringrequiredmin length 1
actorIdstringrequiredmin length 1
fromNumberIdstringrequiredmin length 1
toE164stringrequiredpattern ^\+[0-9]{8,15}$
channel"sms" | "mms"requiredBackend trims and lowercases sms/mms. This request has no media attachment field; mms does not imply attachment support.
bodystringrequiredNonblank body; the backend limits trimmed UTF-8 bytes to 5000, not only Unicode characters. min length 1 · max length 5000
templateIdstring | nullidempotencyKeystringrequiredmin length 1
registrationApprovedbooleanrequiredconsentApprovedbooleanrequiredoptOutPolicyApprovedbooleanrequired
Responses
- 200Actual durable operation result; no carrier delivery or graph execution is inferred.
Response fields
okbooleanrequiredmessageobjectrequiredmessage.idstringrequiredmessage.scopeobjectrequiredmessage.scope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
message.scope.organizationIdstringrequiredmin length 1
message.scope.workspaceIdstringrequiredmin length 1
message.scope.projectIdstringrequiredmin length 1
message.scope.environmentIdstringrequiredmin length 1
message.direction"inbound" | "outbound"requiredmessage.channelstringrequiredmessage.status"queued" | "sending" | "sent" | "delivered" | "undelivered" | "failed" | "received"requiredqueued is durable admission, sending is adapter claim, sent is carrier acceptance, delivered is reported delivery; these are distinct. Never infer receipt from queueing.
message.fromNumberIdstringrequiredThe Dials-owned number in either direction; for inbound, this is the receiving number.
message.toE164stringrequiredLiteral destination; for inbound this can be the owned number.
message.remoteE164stringrequiredCounterparty for inbound and outbound.
message.bodystringrequiredmessage.templateIdstring | nullrequiredmessage.providerstringrequiredmessage.providerMessageIdstring | nullrequiredmessage.providerStatusstring | nullrequiredmessage.segmentsinteger | null (int32)requiredCan be a local estimate at queue time, replaced by a carrier-reported count. It is not a price or proof of billing.
message.errorstring | nullrequiredmessage.errorCodestring | nullrequiredauditIdstringrequiredusageEventIdstringrequirednextstringrequiredidempotentReplaybooleanrequired
- 400Invalid selected scope or request shape.
- 401Missing or invalid verified identity.
- 403Selected scope is not authorized by signed identity or lacks the required Dials grant.
- 404Referenced resource is absent from the verified organization and selected scope.
- 409Existing scoped resource/assignment or idempotency conflict.
- 422Validation or approval requirement refused.
- 500Durable store failed.
- 503Backend is not ready.
- 4xx 5xxThe error envelope.
curl -X POST "https://os.one.ml/api/v1/dials/messages/outbound" \
-H "Authorization: Bearer $GENESIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"actorId": "string",
"fromNumberId": "string",
"toE164": "string",
"channel": "sms",
"body": "string",
"idempotencyKey": "string",
"registrationApproved": true,
"consentApproved": true,
"optOutPolicyApproved": true
}'import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_createOutboundMessage', {
body: {
scope: {
organizationId: 'string',
workspaceId: 'string',
projectId: 'string',
environmentId: 'string',
},
actorId: 'string',
fromNumberId: 'string',
toE164: 'string',
channel: 'sms',
body: 'string',
idempotencyKey: 'string',
registrationApproved: true,
consentApproved: true,
optOutPolicyApproved: true,
},
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_createOutboundMessage",
"arguments": {
"body": {
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"actorId": "string",
"fromNumberId": "string",
"toE164": "string",
"channel": "sms",
"body": "string",
"idempotencyKey": "string",
"registrationApproved": true,
"consentApproved": true,
"optOutPolicyApproved": true
}
}
}
}Messaging
List scoped messaging brand configuration
GET/v1/dials/messaging/brands
Parameters
organizationIdquery · stringrequiredMust match the authenticated organization.
workspaceIdquery · stringrequiredSelected Dials scope.
projectIdquery · stringrequiredSelected Dials scope.
environmentIdquery · stringrequiredSelected Dials scope.
platformIdquery · stringSelected data platform. Omitted defaults to dials in the backend; selection does not grant organization authority.
Responses
- 200Actual durable operation result; no carrier delivery or graph execution is inferred.
Response fields
okbooleanrequiredbrandsobject[]requiredbrands[].[].idstringrequiredbrands[].[].scopeobjectrequiredbrands[].[].scope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
brands[].[].scope.organizationIdstringrequiredmin length 1
brands[].[].scope.workspaceIdstringrequiredmin length 1
brands[].[].scope.projectIdstringrequiredmin length 1
brands[].[].scope.environmentIdstringrequiredmin length 1
brands[].[].legalNamestringrequiredbrands[].[].displayNamestringrequiredbrands[].[].entityType"private_profit" | "public_profit" | "non_profit" | "government" | "sole_proprietor"requiredbrands[].[].taxIdstring | nullrequiredRequired by backend for all entity types except sole_proprietor.
brands[].[].taxIdCountrystringrequiredbrands[].[].verticalstringrequiredbrands[].[].emailstringrequiredBackend requires an @ character; no email delivery occurs.
brands[].[].contactPhoneE164stringrequiredActual contact number; backend normalizes dialable input.
brands[].[].postalAddressstringrequiredbrands[].[].websitestringrequiredbrands[].[].statusstringrequiredbrands[].[].providerstringrequiredbrands[].[].providerBrandIdstring | nullrequiredbrands[].[].errorstring | nullrequired
- 400Invalid selected scope or request shape.
- 401Missing or invalid verified identity.
- 403Selected scope is not authorized by signed identity or lacks the required Dials grant.
- 500Durable store failed.
- 503Backend is not ready.
- 4xx 5xxThe error envelope.
curl "https://os.one.ml/api/v1/dials/messaging/brands?organizationId=$ORGANIZATION_ID&workspaceId=$WORKSPACE_ID&projectId=$PROJECT_ID&environmentId=$ENVIRONMENT_ID" \
-H "Authorization: Bearer $GENESIS_API_KEY"import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_listMessagingBrands', {
organizationId: '<organizationId>',
workspaceId: '<workspaceId>',
projectId: '<projectId>',
environmentId: '<environmentId>',
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_listMessagingBrands",
"arguments": {
"organizationId": "<organizationId>",
"workspaceId": "<workspaceId>",
"projectId": "<projectId>",
"environmentId": "<environmentId>"
}
}
}Save pending messaging brand configuration
POST/v1/dials/messaging/brands
Local pending record only. No provider submission or verified registration is performed by this route.
Request body application/json
scopeobjectrequiredscope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
scope.organizationIdstringrequiredmin length 1
scope.workspaceIdstringrequiredmin length 1
scope.projectIdstringrequiredmin length 1
scope.environmentIdstringrequiredmin length 1
actorIdstringrequiredmin length 1
legalNamestringrequiredmin length 1
displayNamestringrequiredmin length 1
entityType"private_profit" | "public_profit" | "non_profit" | "government" | "sole_proprietor"requiredtaxIdstring | nullRequired by backend for all entity types except sole_proprietor.
taxIdCountrystringrequiredmin length 2 · max length 2
verticalstringrequiredmin length 1
emailstringrequiredBackend requires an @ character; no email delivery occurs. min length 1
contactPhoneE164stringrequiredActual contact number; backend normalizes dialable input. min length 1
postalAddressstringrequiredmin length 1
websitestringrequiredmin length 1 · pattern ^https?://
Responses
- 200Actual durable operation result; no carrier delivery or graph execution is inferred.
Response fields
okbooleanrequiredbrandobjectrequiredbrand.idstringrequiredbrand.scopeobjectrequiredbrand.scope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
brand.scope.organizationIdstringrequiredmin length 1
brand.scope.workspaceIdstringrequiredmin length 1
brand.scope.projectIdstringrequiredmin length 1
brand.scope.environmentIdstringrequiredmin length 1
brand.legalNamestringrequiredbrand.displayNamestringrequiredbrand.entityType"private_profit" | "public_profit" | "non_profit" | "government" | "sole_proprietor"requiredbrand.taxIdstring | nullrequiredRequired by backend for all entity types except sole_proprietor.
brand.taxIdCountrystringrequiredbrand.verticalstringrequiredbrand.emailstringrequiredBackend requires an @ character; no email delivery occurs.
brand.contactPhoneE164stringrequiredActual contact number; backend normalizes dialable input.
brand.postalAddressstringrequiredbrand.websitestringrequiredbrand.statusstringrequiredbrand.providerstringrequiredbrand.providerBrandIdstring | nullrequiredbrand.errorstring | nullrequiredauditIdstringrequirednextstringrequired
- 400Invalid selected scope or request shape.
- 401Missing or invalid verified identity.
- 403Selected scope is not authorized by signed identity or lacks the required Dials grant.
- 409Existing scoped resource/assignment or idempotency conflict.
- 422Validation or approval requirement refused.
- 500Durable store failed.
- 503Backend is not ready.
- 4xx 5xxThe error envelope.
curl -X POST "https://os.one.ml/api/v1/dials/messaging/brands" \
-H "Authorization: Bearer $GENESIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"actorId": "string",
"legalName": "string",
"displayName": "string",
"entityType": "private_profit",
"taxIdCountry": "string",
"vertical": "string",
"email": "string",
"contactPhoneE164": "string",
"postalAddress": "string",
"website": "string"
}'import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_createMessagingBrand', {
body: {
scope: {
organizationId: 'string',
workspaceId: 'string',
projectId: 'string',
environmentId: 'string',
},
actorId: 'string',
legalName: 'string',
displayName: 'string',
entityType: 'private_profit',
taxIdCountry: 'string',
vertical: 'string',
email: 'string',
contactPhoneE164: 'string',
postalAddress: 'string',
website: 'string',
},
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_createMessagingBrand",
"arguments": {
"body": {
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"actorId": "string",
"legalName": "string",
"displayName": "string",
"entityType": "private_profit",
"taxIdCountry": "string",
"vertical": "string",
"email": "string",
"contactPhoneE164": "string",
"postalAddress": "string",
"website": "string"
}
}
}
}List scoped messaging campaign configuration
GET/v1/dials/messaging/campaigns
Parameters
organizationIdquery · stringrequiredMust match the authenticated organization.
workspaceIdquery · stringrequiredSelected Dials scope.
projectIdquery · stringrequiredSelected Dials scope.
environmentIdquery · stringrequiredSelected Dials scope.
platformIdquery · stringSelected data platform. Omitted defaults to dials in the backend; selection does not grant organization authority.
Responses
- 200Actual durable operation result; no carrier delivery or graph execution is inferred.
Response fields
okbooleanrequiredcampaignsobject[]requiredcampaigns[].[].idstringrequiredcampaigns[].[].scopeobjectrequiredcampaigns[].[].scope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
campaigns[].[].scope.organizationIdstringrequiredmin length 1
campaigns[].[].scope.workspaceIdstringrequiredmin length 1
campaigns[].[].scope.projectIdstringrequiredmin length 1
campaigns[].[].scope.environmentIdstringrequiredmin length 1
campaigns[].[].brandIdstringrequiredcampaigns[].[].namestringrequiredcampaigns[].[].useCase"2fa" | "account_notification" | "customer_care" | "delivery_notification" | "fraud_alert" | "higher_education" | "marketing" | "polling_voting" | "public_service_announcement" | "security_alert" | "mixed"requiredcampaigns[].[].descriptionstringrequiredcampaigns[].[].sampleMessagesstring[]requiredcampaigns[].[].optInProcessstringrequiredcampaigns[].[].helpMessagestringrequiredcampaigns[].[].optOutMessagestringrequiredcampaigns[].[].directLendingbooleanrequiredcampaigns[].[].embeddedLinkbooleanrequiredcampaigns[].[].embeddedPhonebooleanrequiredcampaigns[].[].ageGatedContentbooleanrequiredcampaigns[].[].leadGenerationbooleanrequiredcampaigns[].[].numberPoolingRequiredbooleanrequiredcampaigns[].[].termsAcceptedbooleanrequiredExplicit true required; no default acceptance.
campaigns[].[].statusstringrequiredcampaigns[].[].providerstringrequiredcampaigns[].[].providerCampaignIdstring | nullrequiredcampaigns[].[].errorstring | nullrequired
- 400Invalid selected scope or request shape.
- 401Missing or invalid verified identity.
- 403Selected scope is not authorized by signed identity or lacks the required Dials grant.
- 500Durable store failed.
- 503Backend is not ready.
- 4xx 5xxThe error envelope.
curl "https://os.one.ml/api/v1/dials/messaging/campaigns?organizationId=$ORGANIZATION_ID&workspaceId=$WORKSPACE_ID&projectId=$PROJECT_ID&environmentId=$ENVIRONMENT_ID" \
-H "Authorization: Bearer $GENESIS_API_KEY"import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_listMessagingCampaigns', {
organizationId: '<organizationId>',
workspaceId: '<workspaceId>',
projectId: '<projectId>',
environmentId: '<environmentId>',
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_listMessagingCampaigns",
"arguments": {
"organizationId": "<organizationId>",
"workspaceId": "<workspaceId>",
"projectId": "<projectId>",
"environmentId": "<environmentId>"
}
}
}Save a pending campaign for a verified owned brand
POST/v1/dials/messaging/campaigns
Request body application/json
scopeobjectrequiredscope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
scope.organizationIdstringrequiredmin length 1
scope.workspaceIdstringrequiredmin length 1
scope.projectIdstringrequiredmin length 1
scope.environmentIdstringrequiredmin length 1
actorIdstringrequiredmin length 1
brandIdstringrequiredmin length 1
namestringrequiredmin length 1
useCase"2fa" | "account_notification" | "customer_care" | "delivery_notification" | "fraud_alert" | "higher_education" | "marketing" | "polling_voting" | "public_service_announcement" | "security_alert" | "mixed"requireddescriptionstringrequiredBackend requires at least 40 trimmed UTF-8 bytes. min length 1
sampleMessagesstring[]requiredBackend trims and drops blank samples, then requires 2–5.
optInProcessstringrequiredBackend requires at least 40 trimmed UTF-8 bytes. min length 1
helpMessagestringrequiredMust contain HELP or INFO, case-insensitive. min length 1
optOutMessagestringrequiredMust contain STOP, case-insensitive. min length 1
directLendingbooleandefault false
embeddedLinkbooleandefault false
embeddedPhonebooleandefault false
ageGatedContentbooleandefault false
leadGenerationbooleandefault false
numberPoolingRequiredbooleandefault false
termsAcceptedbooleanrequiredExplicit true required; no default acceptance.
Responses
- 200Actual durable operation result; no carrier delivery or graph execution is inferred.
Response fields
okbooleanrequiredcampaignobjectrequiredcampaign.idstringrequiredcampaign.scopeobjectrequiredcampaign.scope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
campaign.scope.organizationIdstringrequiredmin length 1
campaign.scope.workspaceIdstringrequiredmin length 1
campaign.scope.projectIdstringrequiredmin length 1
campaign.scope.environmentIdstringrequiredmin length 1
campaign.brandIdstringrequiredcampaign.namestringrequiredcampaign.useCase"2fa" | "account_notification" | "customer_care" | "delivery_notification" | "fraud_alert" | "higher_education" | "marketing" | "polling_voting" | "public_service_announcement" | "security_alert" | "mixed"requiredcampaign.descriptionstringrequiredcampaign.sampleMessagesstring[]requiredcampaign.optInProcessstringrequiredcampaign.helpMessagestringrequiredcampaign.optOutMessagestringrequiredcampaign.directLendingbooleanrequiredcampaign.embeddedLinkbooleanrequiredcampaign.embeddedPhonebooleanrequiredcampaign.ageGatedContentbooleanrequiredcampaign.leadGenerationbooleanrequiredcampaign.numberPoolingRequiredbooleanrequiredcampaign.termsAcceptedbooleanrequiredExplicit true required; no default acceptance.
campaign.statusstringrequiredcampaign.providerstringrequiredcampaign.providerCampaignIdstring | nullrequiredcampaign.errorstring | nullrequiredauditIdstringrequirednextstringrequired
- 400Invalid selected scope or request shape.
- 401Missing or invalid verified identity.
- 403Selected scope is not authorized by signed identity or lacks the required Dials grant.
- 404Referenced resource is absent from the verified organization and selected scope.
- 409Existing scoped resource/assignment or idempotency conflict.
- 422Validation or approval requirement refused.
- 500Durable store failed.
- 503Backend is not ready.
- 4xx 5xxThe error envelope.
curl -X POST "https://os.one.ml/api/v1/dials/messaging/campaigns" \
-H "Authorization: Bearer $GENESIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"actorId": "string",
"brandId": "string",
"name": "string",
"useCase": "2fa",
"description": "string",
"sampleMessages": [
"string"
],
"optInProcess": "string",
"helpMessage": "string",
"optOutMessage": "string",
"termsAccepted": true
}'import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_createMessagingCampaign', {
body: {
scope: {
organizationId: 'string',
workspaceId: 'string',
projectId: 'string',
environmentId: 'string',
},
actorId: 'string',
brandId: 'string',
name: 'string',
useCase: '2fa',
description: 'string',
sampleMessages: [
'string',
],
optInProcess: 'string',
helpMessage: 'string',
optOutMessage: 'string',
termsAccepted: true,
},
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_createMessagingCampaign",
"arguments": {
"body": {
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"actorId": "string",
"brandId": "string",
"name": "string",
"useCase": "2fa",
"description": "string",
"sampleMessages": [
"string"
],
"optInProcess": "string",
"helpMessage": "string",
"optOutMessage": "string",
"termsAccepted": true
}
}
}
}Save pending association of an owned number with an owned campaign
POST/v1/dials/messaging/campaigns/{campaign_id}/numbers
Parameters
campaign_idpath · stringrequired
Request body application/json
scopeobjectrequiredscope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
scope.organizationIdstringrequiredmin length 1
scope.workspaceIdstringrequiredmin length 1
scope.projectIdstringrequiredmin length 1
scope.environmentIdstringrequiredmin length 1
actorIdstringrequiredmin length 1
phoneNumberIdstringrequiredmin length 1
Responses
- 200Actual durable operation result; no carrier delivery or graph execution is inferred.
Response fields
okbooleanrequiredcampaignIdstringrequiredphoneNumberIdstringrequiredauditIdstringrequirednextstringrequired
- 400Invalid selected scope or request shape.
- 401Missing or invalid verified identity.
- 403Selected scope is not authorized by signed identity or lacks the required Dials grant.
- 404Referenced resource is absent from the verified organization and selected scope.
- 409Existing scoped resource/assignment or idempotency conflict.
- 500Durable store failed.
- 503Backend is not ready.
- 4xx 5xxThe error envelope.
curl -X POST "https://os.one.ml/api/v1/dials/messaging/campaigns/$CAMPAIGN_ID/numbers" \
-H "Authorization: Bearer $GENESIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"actorId": "string",
"phoneNumberId": "string"
}'import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_assignCampaignNumber', {
campaign_id: '<campaign_id>',
body: {
scope: {
organizationId: 'string',
workspaceId: 'string',
projectId: 'string',
environmentId: 'string',
},
actorId: 'string',
phoneNumberId: 'string',
},
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_assignCampaignNumber",
"arguments": {
"campaign_id": "<campaign_id>",
"body": {
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"actorId": "string",
"phoneNumberId": "string"
}
}
}
}Numbers
List numbers in the authorized scope
GET/v1/dials/numbers
Parameters
organizationIdquery · stringrequiredMust match the authenticated organization.
workspaceIdquery · stringrequiredSelected Dials scope.
projectIdquery · stringrequiredSelected Dials scope.
environmentIdquery · stringrequiredSelected Dials scope.
Responses
- 200Success
Response fields
okbooleanrequirednumbersobject[]requirednumbers[].[].idstringrequirednumbers[].[].e164stringrequirednumbers[].[].statusstringrequirednumbers[].[].providerstringrequirednumbers[].[].cnamStatusstringnumbers[].[].e911Statusstringnumbers[].[].releaseStatestringnumbers[].[].scopeobjectnumbers[].[].scope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
numbers[].[].scope.organizationIdstringrequiredmin length 1
numbers[].[].scope.workspaceIdstringrequiredmin length 1
numbers[].[].scope.projectIdstringrequiredmin length 1
numbers[].[].scope.environmentIdstringrequiredmin length 1
numbers[].[].assignedResourceIdstring | nullnumbers[].[].assignedResourceKindstring | nullnumbers[].[].providerNumberIdstring | nullnumbers[].[].callerIdNamestring | null
- 401Missing or invalid identity
- 404Resource does not belong to the authenticated organization
- 503Backend or carrier unavailable
- 4xx 5xxThe error envelope.
curl "https://os.one.ml/api/v1/dials/numbers?organizationId=$ORGANIZATION_ID&workspaceId=$WORKSPACE_ID&projectId=$PROJECT_ID&environmentId=$ENVIRONMENT_ID" \
-H "Authorization: Bearer $GENESIS_API_KEY"import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_listNumbers', {
organizationId: '<organizationId>',
workspaceId: '<workspaceId>',
projectId: '<projectId>',
environmentId: '<environmentId>',
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_listNumbers",
"arguments": {
"organizationId": "<organizationId>",
"workspaceId": "<workspaceId>",
"projectId": "<projectId>",
"environmentId": "<environmentId>"
}
}
}Release an owned number at its carrier through DELETE
DELETE/v1/dials/numbers/{number_id}
Path number_id plus selected scope, actorId and optional reason in query. Uses the existing release implementation: carrier success/absence is checked before local release. A non-carrier-backed deployment can report unsupported release; inspect the returned number rather than infer carrier cancellation. Preserve uncertain replies and reconcile before retry.
Parameters
number_idpath · stringrequiredorganizationIdquery · stringrequiredMust match the authenticated organization.
workspaceIdquery · stringrequiredSelected Dials scope.
projectIdquery · stringrequiredSelected Dials scope.
environmentIdquery · stringrequiredSelected Dials scope.
actorIdquery · stringrequiredreasonquery · stringplatformIdquery · stringSelected data platform. Omitted defaults to dials in the backend; selection does not grant organization authority.
Responses
- 200Actual durable operation result; no carrier delivery or graph execution is inferred.
Response fields
okbooleanrequirednumberobjectrequirednumber.idstringrequirednumber.e164stringrequirednumber.statusstringrequirednumber.providerstringrequirednumber.cnamStatusstringnumber.e911Statusstringnumber.releaseStatestringnumber.scopeobjectnumber.scope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
number.scope.organizationIdstringrequiredmin length 1
number.scope.workspaceIdstringrequiredmin length 1
number.scope.projectIdstringrequiredmin length 1
number.scope.environmentIdstringrequiredmin length 1
number.assignedResourceIdstring | nullnumber.assignedResourceKindstring | nullnumber.providerNumberIdstring | nullnumber.callerIdNamestring | nullauditIdstringrequiredusageEventIdstringrequirednextstringrequired
- 400Invalid selected scope or request shape.
- 401Missing or invalid verified identity.
- 403Selected scope is not authorized by signed identity or lacks the required Dials grant.
- 404Referenced resource is absent from the verified organization and selected scope.
- 409Existing scoped resource/assignment or idempotency conflict.
- 422Validation or approval requirement refused.
- 500Durable store failed.
- 501Carrier release unsupported or unconfigured.
- 502Carrier release unavailable or unconfirmed.
- 503Backend is not ready.
- 4xx 5xxThe error envelope.
curl -X DELETE "https://os.one.ml/api/v1/dials/numbers/$NUMBER_ID?organizationId=$ORGANIZATION_ID&workspaceId=$WORKSPACE_ID&projectId=$PROJECT_ID&environmentId=$ENVIRONMENT_ID&actorId=$ACTOR_ID" \
-H "Authorization: Bearer $GENESIS_API_KEY"import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_deleteNumber', {
number_id: '<number_id>',
organizationId: '<organizationId>',
workspaceId: '<workspaceId>',
projectId: '<projectId>',
environmentId: '<environmentId>',
actorId: '<actorId>',
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_deleteNumber",
"arguments": {
"number_id": "<number_id>",
"organizationId": "<organizationId>",
"workspaceId": "<workspaceId>",
"projectId": "<projectId>",
"environmentId": "<environmentId>",
"actorId": "<actorId>"
}
}
}Assign an owned number
POST/v1/dials/numbers/assign
Request body application/json
scopeobjectrequiredscope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
scope.organizationIdstringrequiredmin length 1
scope.workspaceIdstringrequiredmin length 1
scope.projectIdstringrequiredmin length 1
scope.environmentIdstringrequiredmin length 1
actorIdstringrequiredmin length 1
numberIdstringrequiredmin length 1
resourceKind"agent_profile" | "human_profile" | nullOnly scoped human/agent targets are exposed. Omit or null both target fields to unassign.
resourceIdstring | null
Responses
- 200Success
Response fields
A JSON object.
- 401Missing or invalid identity
- 404Resource does not belong to the authenticated organization
- 503Backend or carrier unavailable
- 4xx 5xxThe error envelope.
curl -X POST "https://os.one.ml/api/v1/dials/numbers/assign" \
-H "Authorization: Bearer $GENESIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"actorId": "string",
"numberId": "string"
}'import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_assignNumber', {
body: {
scope: {
organizationId: 'string',
workspaceId: 'string',
projectId: 'string',
environmentId: 'string',
},
actorId: 'string',
numberId: 'string',
},
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_assignNumber",
"arguments": {
"body": {
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"actorId": "string",
"numberId": "string"
}
}
}
}Update the caller name of an owned number
PUT/v1/dials/numbers/cnam
Request body application/json
scopeobjectrequiredscope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
scope.organizationIdstringrequiredmin length 1
scope.workspaceIdstringrequiredmin length 1
scope.projectIdstringrequiredmin length 1
scope.environmentIdstringrequiredmin length 1
actorIdstringrequirednumberIdstringrequiredcallerIdNamestringrequiredmin length 1 · max length 15 · pattern ^[A-Za-z0-9 \-&.]+$
Responses
- 200Success
Response fields
okbooleanrequirednumberobjectrequirednumber.idstringrequirednumber.e164stringrequirednumber.statusstringrequirednumber.providerstringrequirednumber.cnamStatusstringnumber.e911Statusstringnumber.releaseStatestringnumber.scopeobjectnumber.scope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
number.scope.organizationIdstringrequiredmin length 1
number.scope.workspaceIdstringrequiredmin length 1
number.scope.projectIdstringrequiredmin length 1
number.scope.environmentIdstringrequiredmin length 1
number.assignedResourceIdstring | nullnumber.assignedResourceKindstring | nullnumber.providerNumberIdstring | nullnumber.callerIdNamestring | nullauditIdstringrequirednextstringrequired
- 401Missing or invalid identity
- 404Resource does not belong to the authenticated organization
- 503Backend or carrier unavailable
- 4xx 5xxThe error envelope.
curl -X PUT "https://os.one.ml/api/v1/dials/numbers/cnam" \
-H "Authorization: Bearer $GENESIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"actorId": "string",
"numberId": "string",
"callerIdName": "string"
}'import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_updateNumberCallerName', {
body: {
scope: {
organizationId: 'string',
workspaceId: 'string',
projectId: 'string',
environmentId: 'string',
},
actorId: 'string',
numberId: 'string',
callerIdName: 'string',
},
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_updateNumberCallerName",
"arguments": {
"body": {
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"actorId": "string",
"numberId": "string",
"callerIdName": "string"
}
}
}
}List scoped inventory drift
GET/v1/dials/numbers/drift
Parameters
organizationIdquery · stringrequiredMust match the authenticated organization.
workspaceIdquery · stringrequiredSelected Dials scope.
projectIdquery · stringrequiredSelected Dials scope.
environmentIdquery · stringrequiredSelected Dials scope.
Responses
- 200Success
Response fields
okbooleanrequireddriftobject[]requireddrift[].[].idstringrequireddrift[].[].scopeobjectrequireddrift[].[].scope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
drift[].[].scope.organizationIdstringrequiredmin length 1
drift[].[].scope.workspaceIdstringrequiredmin length 1
drift[].[].scope.projectIdstringrequiredmin length 1
drift[].[].scope.environmentIdstringrequiredmin length 1
drift[].[].reconciliationIdstringrequireddrift[].[].kindstringrequireddrift[].[].phoneNumberIdstring | nullrequireddrift[].[].e164Numberstringrequireddrift[].[].providerstringrequireddrift[].[].expectedstring | nullrequireddrift[].[].observedstring | nullrequireddrift[].[].resolvedbooleanrequired
- 401Missing or invalid identity
- 404Resource does not belong to the authenticated organization
- 503Backend or carrier unavailable
- 4xx 5xxThe error envelope.
curl "https://os.one.ml/api/v1/dials/numbers/drift?organizationId=$ORGANIZATION_ID&workspaceId=$WORKSPACE_ID&projectId=$PROJECT_ID&environmentId=$ENVIRONMENT_ID" \
-H "Authorization: Bearer $GENESIS_API_KEY"import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_listNumberDrift', {
organizationId: '<organizationId>',
workspaceId: '<workspaceId>',
projectId: '<projectId>',
environmentId: '<environmentId>',
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_listNumberDrift",
"arguments": {
"organizationId": "<organizationId>",
"workspaceId": "<workspaceId>",
"projectId": "<projectId>",
"environmentId": "<environmentId>"
}
}
}Register and bind the dispatchable emergency address for an owned number
POST/v1/dials/numbers/e911
Register the operator-provided dispatchable address, or set statusOnly:true to check an existing saved binding with the identical address. A refresh performs carrier GETs only, persists the returned state locally, and requires dials:write. Pending, unsupported or uncertain status never permits a call; do not automatically correct the address or repeat provider writes.
Request body application/json
scopeobjectrequiredscope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
scope.organizationIdstringrequiredmin length 1
scope.workspaceIdstringrequiredmin length 1
scope.projectIdstringrequiredmin length 1
scope.environmentIdstringrequiredmin length 1
actorIdstringrequiredmin length 1
numberIdstringrequiredmin length 1
callerNamestringrequiredmin length 1
streetNumberstringrequiredmin length 1
streetNamestringrequiredmin length 1
citystringrequiredmin length 1
regionstringrequiredmin length 1
postalCodestringrequiredmin length 1
addressLine2string | nullcountrystring | nullTwo-letter country code; omitted or null defaults to US. min length 2 · max length 2 · pattern ^[A-Za-z]{2}$
statusOnlybooleanRefresh only an already saved exact-address provider binding for the owned number in the selected scope. The carrier is read with GET only; no address creation, assignment or reassignment occurs. Local status/address/audit persistence still occurs and dials:write is required. Missing binding, changed address or unavailable/mismatched carrier binding fails closed. Omitted or false retains registration behavior. default false
Responses
- 200Carrier registration result; unsupported status is not an active binding
Response fields
okbooleanrequirednumberobjectrequirednumber.idstringrequirednumber.e164stringrequirednumber.statusstringrequirednumber.providerstringrequirednumber.cnamStatusstringnumber.e911Statusstringnumber.releaseStatestringnumber.scopeobjectnumber.scope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
number.scope.organizationIdstringrequiredmin length 1
number.scope.workspaceIdstringrequiredmin length 1
number.scope.projectIdstringrequiredmin length 1
number.scope.environmentIdstringrequiredmin length 1
number.assignedResourceIdstring | nullnumber.assignedResourceKindstring | nullnumber.providerNumberIdstring | nullnumber.callerIdNamestring | nulladdressobjectrequiredaddress.scopeobjectrequiredaddress.scope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
address.scope.organizationIdstringrequiredmin length 1
address.scope.workspaceIdstringrequiredmin length 1
address.scope.projectIdstringrequiredmin length 1
address.scope.environmentIdstringrequiredmin length 1
address.idstringrequiredaddress.phoneNumberIdstringrequiredaddress.callerNamestringrequiredaddress.streetNumberstringrequiredaddress.streetNamestringrequiredaddress.citystringrequiredaddress.regionstringrequiredaddress.postalCodestringrequiredaddress.countrystringrequiredaddress.providerstringrequiredaddress.statusstringrequiredaddress.addressLine2string | nulladdress.providerAddressIdstring | nulladdress.validationStatusstring | nulladdress.errorstring | nullauditIdstringrequirednextstringrequired
- 401Missing or invalid identity
- 404Number does not belong to the authenticated organization and selected scope
- 422Carrier validation refusal. Suggestions are advisory: preserve the original address; explicitly edit and confirm before a new request. Never apply or submit candidates automatically. statusOnly additionally requires an exact saved binding; otherwise422 existing_emergency_binding_required. This mode never creates or assigns a carrier address.
- 501Carrier does not support emergency address registration
- 502Carrier registration failed
- 503Backend unavailable
- 4xx 5xxThe error envelope.
curl -X POST "https://os.one.ml/api/v1/dials/numbers/e911" \
-H "Authorization: Bearer $GENESIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"actorId": "string",
"numberId": "string",
"callerName": "string",
"streetNumber": "string",
"streetName": "string",
"city": "string",
"region": "string",
"postalCode": "string"
}'import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_registerEmergencyAddress', {
body: {
scope: {
organizationId: 'string',
workspaceId: 'string',
projectId: 'string',
environmentId: 'string',
},
actorId: 'string',
numberId: 'string',
callerName: 'string',
streetNumber: 'string',
streetName: 'string',
city: 'string',
region: 'string',
postalCode: 'string',
},
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_registerEmergencyAddress",
"arguments": {
"body": {
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"actorId": "string",
"numberId": "string",
"callerName": "string",
"streetNumber": "string",
"streetName": "string",
"city": "string",
"region": "string",
"postalCode": "string"
}
}
}
}Provision a carrier number with an idempotency key
POST/v1/dials/numbers/provision
Request body application/json
scopeobjectrequiredscope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
scope.organizationIdstringrequiredmin length 1
scope.workspaceIdstringrequiredmin length 1
scope.projectIdstringrequiredmin length 1
scope.environmentIdstringrequiredmin length 1
actorIdstringrequiredmin length 1
e164stringrequiredmin length 1
idempotencyKeystringrequiredmin length 1
Responses
- 200Success
Response fields
A JSON object.
- 401Missing or invalid identity
- 404Resource does not belong to the authenticated organization
- 503Backend or carrier unavailable
- 4xx 5xxThe error envelope.
curl -X POST "https://os.one.ml/api/v1/dials/numbers/provision" \
-H "Authorization: Bearer $GENESIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"actorId": "string",
"e164": "string",
"idempotencyKey": "string"
}'import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_provisionNumber', {
body: {
scope: {
organizationId: 'string',
workspaceId: 'string',
projectId: 'string',
environmentId: 'string',
},
actorId: 'string',
e164: 'string',
idempotencyKey: 'string',
},
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_provisionNumber",
"arguments": {
"body": {
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"actorId": "string",
"e164": "string",
"idempotencyKey": "string"
}
}
}
}Reconcile owned inventory against configured carriers
POST/v1/dials/numbers/reconcile
Request body application/json
scopeobjectrequiredscope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
scope.organizationIdstringrequiredmin length 1
scope.workspaceIdstringrequiredmin length 1
scope.projectIdstringrequiredmin length 1
scope.environmentIdstringrequiredmin length 1
actorIdstringrequired
Responses
- 200Success
Response fields
okbooleanrequiredreconciliationsobject[]requiredreconciliations[].[].idstringrequiredreconciliations[].[].scopeobjectrequiredreconciliations[].[].scope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
reconciliations[].[].scope.organizationIdstringrequiredmin length 1
reconciliations[].[].scope.workspaceIdstringrequiredmin length 1
reconciliations[].[].scope.projectIdstringrequiredmin length 1
reconciliations[].[].scope.environmentIdstringrequiredmin length 1
reconciliations[].[].providerstringrequiredreconciliations[].[].statusstringrequiredreconciliations[].[].carrierNumberCountintegerrequiredmin 0
reconciliations[].[].localNumberCountintegerrequiredmin 0
reconciliations[].[].driftCountintegerrequiredmin 0
reconciliations[].[].errorstring | nullrequireddriftobject[]requireddrift[].[].idstringrequireddrift[].[].scopeobjectrequireddrift[].[].scope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
drift[].[].scope.organizationIdstringrequiredmin length 1
drift[].[].scope.workspaceIdstringrequiredmin length 1
drift[].[].scope.projectIdstringrequiredmin length 1
drift[].[].scope.environmentIdstringrequiredmin length 1
drift[].[].reconciliationIdstringrequireddrift[].[].kindstringrequireddrift[].[].phoneNumberIdstring | nullrequireddrift[].[].e164Numberstringrequireddrift[].[].providerstringrequireddrift[].[].expectedstring | nullrequireddrift[].[].observedstring | nullrequireddrift[].[].resolvedbooleanrequiredorphanCountintegerrequiredmin 0
auditIdstringrequirednextstringrequired
- 401Missing or invalid identity
- 404Resource does not belong to the authenticated organization
- 503Backend or carrier unavailable
- 4xx 5xxThe error envelope.
curl -X POST "https://os.one.ml/api/v1/dials/numbers/reconcile" \
-H "Authorization: Bearer $GENESIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"actorId": "string"
}'import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_reconcileNumberInventory', {
body: {
scope: {
organizationId: 'string',
workspaceId: 'string',
projectId: 'string',
environmentId: 'string',
},
actorId: 'string',
},
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_reconcileNumberInventory",
"arguments": {
"body": {
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"actorId": "string"
}
}
}
}List scoped carrier reconciliation receipts
GET/v1/dials/numbers/reconciliations
Parameters
organizationIdquery · stringrequiredMust match the authenticated organization.
workspaceIdquery · stringrequiredSelected Dials scope.
projectIdquery · stringrequiredSelected Dials scope.
environmentIdquery · stringrequiredSelected Dials scope.
Responses
- 200Success
Response fields
okbooleanrequiredreconciliationsobject[]requiredreconciliations[].[].idstringrequiredreconciliations[].[].scopeobjectrequiredreconciliations[].[].scope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
reconciliations[].[].scope.organizationIdstringrequiredmin length 1
reconciliations[].[].scope.workspaceIdstringrequiredmin length 1
reconciliations[].[].scope.projectIdstringrequiredmin length 1
reconciliations[].[].scope.environmentIdstringrequiredmin length 1
reconciliations[].[].providerstringrequiredreconciliations[].[].statusstringrequiredreconciliations[].[].carrierNumberCountintegerrequiredmin 0
reconciliations[].[].localNumberCountintegerrequiredmin 0
reconciliations[].[].driftCountintegerrequiredmin 0
reconciliations[].[].errorstring | nullrequired
- 401Missing or invalid identity
- 404Resource does not belong to the authenticated organization
- 503Backend or carrier unavailable
- 4xx 5xxThe error envelope.
curl "https://os.one.ml/api/v1/dials/numbers/reconciliations?organizationId=$ORGANIZATION_ID&workspaceId=$WORKSPACE_ID&projectId=$PROJECT_ID&environmentId=$ENVIRONMENT_ID" \
-H "Authorization: Bearer $GENESIS_API_KEY"import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_listNumberReconciliations', {
organizationId: '<organizationId>',
workspaceId: '<workspaceId>',
projectId: '<projectId>',
environmentId: '<environmentId>',
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_listNumberReconciliations",
"arguments": {
"organizationId": "<organizationId>",
"workspaceId": "<workspaceId>",
"projectId": "<projectId>",
"environmentId": "<environmentId>"
}
}
}Release an owned number
POST/v1/dials/numbers/release
Request body application/json
scopeobjectrequiredscope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
scope.organizationIdstringrequiredmin length 1
scope.workspaceIdstringrequiredmin length 1
scope.projectIdstringrequiredmin length 1
scope.environmentIdstringrequiredmin length 1
actorIdstringrequiredmin length 1
numberIdstringrequiredmin length 1
reasonstring
Responses
- 200Success
Response fields
A JSON object.
- 401Missing or invalid identity
- 404Resource does not belong to the authenticated organization
- 503Backend or carrier unavailable
- 4xx 5xxThe error envelope.
curl -X POST "https://os.one.ml/api/v1/dials/numbers/release" \
-H "Authorization: Bearer $GENESIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"actorId": "string",
"numberId": "string"
}'import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_releaseNumber', {
body: {
scope: {
organizationId: 'string',
workspaceId: 'string',
projectId: 'string',
environmentId: 'string',
},
actorId: 'string',
numberId: 'string',
},
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_releaseNumber",
"arguments": {
"body": {
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"actorId": "string",
"numberId": "string"
}
}
}
}Search real carrier number inventory
GET/v1/dials/numbers/search
Pass at least one search filter, such as areaCode; a search with none answers 400 invalid_number_search.
Parameters
organizationIdquery · stringrequiredMust match the authenticated organization.
workspaceIdquery · stringrequiredSelected Dials scope.
projectIdquery · stringrequiredSelected Dials scope.
environmentIdquery · stringrequiredSelected Dials scope.
areaCodequery · stringexchangeCodequery · stringstartsWithquery · stringAt least three national digits; SignalWire receives at most seven and the full requested prefix is checked locally.
endsWithquery · stringcontainsquery · stringrepeatingDigitquery · stringrepeatingDigitCountquery · integernumberTypequery · "local" | "toll-free"distancequery · integerlimitquery · integerlocalCallingAreaquery · booleanexcludeAddressRequiredquery · booleanexcludeLocalAddressRequiredquery · booleanexcludeForeignAddressRequiredquery · booleanbetaquery · booleanvoicequery · booleansmsquery · booleanmmsquery · booleanfaxquery · booleanregionquery · stringlocalityquery · stringpostalCodequery · stringrateCenterquery · stringlataquery · stringnearNumberquery · stringnearLatLongquery · string
Responses
- 200Success
Response fields
okbooleanrequirednumbersobject[]requirednumbers[].[].regionstring | nullrequirednumbers[].[].rateCenterstring | nullrequirednumbers[].[].localitystring | nullrequirednumbers[].[].postalCodestring | nullrequirednumbers[].[].latastring | nullrequirednumbers[].[].numberTypestring | nullrequirednumbers[].[].addressRequirementsstring | nullrequirednumbers[].[].providerReferencestring | nullrequirednumbers[].[].latitudenumber | nullrequirednumbers[].[].longitudenumber | nullrequirednumbers[].[].betaboolean | nullrequirednumbers[].[].monthlyCostCentsintegerrequiredmin 0
numbers[].[].inboundPerMinuteMicrosintegerrequiredmin 0
numbers[].[].outboundPerMinuteMicrosintegerrequiredmin 0
numbers[].[].e911MonthlyCostCentsinteger | nullrequiredmin 0
numbers[].[].e164stringrequirednumbers[].[].countryCodestringrequirednumbers[].[].providerstringrequirednumbers[].[].capabilitiesobjectrequirednumbers[].[].capabilities.voicebooleanrequirednumbers[].[].capabilities.smsbooleanrequirednumbers[].[].capabilities.mmsbooleanrequirednumbers[].[].capabilities.faxbooleanrequired
- 401Missing or invalid identity
- 404Resource does not belong to the authenticated organization
- 503Backend or carrier unavailable
- 4xx 5xxThe error envelope.
curl "https://os.one.ml/api/v1/dials/numbers/search?organizationId=$ORGANIZATION_ID&workspaceId=$WORKSPACE_ID&projectId=$PROJECT_ID&environmentId=$ENVIRONMENT_ID&areaCode=415" \
-H "Authorization: Bearer $GENESIS_API_KEY"import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_searchNumbers', {
organizationId: '<organizationId>',
workspaceId: '<workspaceId>',
projectId: '<projectId>',
environmentId: '<environmentId>',
areaCode: '415',
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_searchNumbers",
"arguments": {
"organizationId": "<organizationId>",
"workspaceId": "<workspaceId>",
"projectId": "<projectId>",
"environmentId": "<environmentId>",
"areaCode": "415"
}
}
}Routing
List managed inbound policies in the verified scope
GET/v1/dials/routing/rules
Includes enabled and disabled managed policies; workflow descriptors are separate. Reads do not reconcile an unconfirmed original creation request.
Parameters
organizationIdquery · stringrequiredMust match the authenticated organization.
workspaceIdquery · stringrequiredSelected Dials scope.
projectIdquery · stringrequiredSelected Dials scope.
environmentIdquery · stringrequiredSelected Dials scope.
platformIdquery · stringSelected data platform. Omitted defaults to dials in the backend; selection does not grant organization authority.
Responses
- 200Authenticated scoped result; not proof of an inbound call
Response fields
oktruerequiredscopeobjectrequiredscope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
scope.organizationIdstringrequiredmin length 1
scope.workspaceIdstringrequiredmin length 1
scope.projectIdstringrequiredmin length 1
scope.environmentIdstringrequiredmin length 1
rulesobject[]requiredrules[].[].idstringrequiredmin length 1 · max length 128
rules[].[].scopeobjectrequiredrules[].[].scope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
rules[].[].scope.organizationIdstringrequiredmin length 1
rules[].[].scope.workspaceIdstringrequiredmin length 1
rules[].[].scope.projectIdstringrequiredmin length 1
rules[].[].scope.environmentIdstringrequiredmin length 1
rules[].[].namestringrequiredmin length 1 · max length 128
rules[].[].phoneNumberIdstringrequiredmin length 1 · max length 128
rules[].[].didstringrequiredpattern ^\+[1-9]\d{7,14}$
rules[].[].priorityintegerrequiredmin 0 · max 10000
rules[].[].enabledbooleanrequiredrules[].[].actionobject | object | object | objectrequired
- 400Invalid scope or request shape
- 401Missing or invalid verified identity
- 404Number or managed rule not found in the authorized scope
- 409Original UUID conflicts with stored request, rule name exists, or stored record is invalid
- 422Invalid action, destination, priority or creation UUID
- 500Routing store failed; preserve the original request
- 503Backend unavailable
- 4xx 5xxThe error envelope.
curl "https://os.one.ml/api/v1/dials/routing/rules?organizationId=$ORGANIZATION_ID&workspaceId=$WORKSPACE_ID&projectId=$PROJECT_ID&environmentId=$ENVIRONMENT_ID" \
-H "Authorization: Bearer $GENESIS_API_KEY"import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_listRoutingRules', {
organizationId: '<organizationId>',
workspaceId: '<workspaceId>',
projectId: '<projectId>',
environmentId: '<environmentId>',
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_listRoutingRules",
"arguments": {
"organizationId": "<organizationId>",
"workspaceId": "<workspaceId>",
"projectId": "<projectId>",
"environmentId": "<environmentId>"
}
}
}Create an enabled owned-number inbound policy with durable UUID idempotency
POST/v1/dials/routing/rules
Uses an active owned number. Bridge connects to an explicit E.164 other than the source. Answer parks a channel; echo is diagnostic; neither runs an agent. Highest priority wins. A UUID is bound to the complete normalized body and verified actor. A replay returns the immutable original creation snapshot, even if the rule was subsequently disabled or the number released; it does not reactivate or assert current state. Lost acknowledgements must preserve the exact original body and UUID; there is no automatic retry.
Request body application/json
scopeobjectrequiredscope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
scope.organizationIdstringrequiredmin length 1
scope.workspaceIdstringrequiredmin length 1
scope.projectIdstringrequiredmin length 1
scope.environmentIdstringrequiredmin length 1
actorIdstringOptional compatibility field; the backend derives the actual actor from the verified method-bound gateway identity and never trusts this value.
namestringrequiredmin length 1 · max length 128
phoneNumberIdstringrequiredmin length 1 · max length 128
priorityintegerrequiredmin 0 · max 10000
idempotencyKeystring (uuid)requiredCanonical UUID, persisted with the complete original body before the first POST. Reuse only for the exact same original request.
actionobject | object | object | objectrequired
Responses
- 200Authenticated scoped result; not proof of an inbound call
Response fields
oktruerequiredruleobjectrequiredrule.idstringrequiredmin length 1 · max length 128
rule.scopeobjectrequiredrule.scope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
rule.scope.organizationIdstringrequiredmin length 1
rule.scope.workspaceIdstringrequiredmin length 1
rule.scope.projectIdstringrequiredmin length 1
rule.scope.environmentIdstringrequiredmin length 1
rule.namestringrequiredmin length 1 · max length 128
rule.phoneNumberIdstringrequiredmin length 1 · max length 128
rule.didstringrequiredpattern ^\+[1-9]\d{7,14}$
rule.priorityintegerrequiredmin 0 · max 10000
rule.enabledbooleanrequiredrule.actionobject | object | object | objectrequiredauditIdstringrequiredmin length 1 · max length 128
idempotentReplaybooleanrequired
- 400Invalid scope or request shape
- 401Missing or invalid verified identity
- 404Number or managed rule not found in the authorized scope
- 409Original UUID conflicts with stored request, rule name exists, or stored record is invalid
- 422Invalid action, destination, priority or creation UUID
- 500Routing store failed; preserve the original request
- 503Backend unavailable
- 4xx 5xxThe error envelope.
curl -X POST "https://os.one.ml/api/v1/dials/routing/rules" \
-H "Authorization: Bearer $GENESIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"name": "string",
"phoneNumberId": "string",
"priority": 0,
"idempotencyKey": "00000000-0000-4000-8000-000000000000",
"action": {
"type": "bridge",
"targetE164": "string"
}
}'import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_createRoutingRule', {
body: {
scope: {
organizationId: 'string',
workspaceId: 'string',
projectId: 'string',
environmentId: 'string',
},
name: 'string',
phoneNumberId: 'string',
priority: 0,
idempotencyKey: '00000000-0000-4000-8000-000000000000',
action: {
type: 'bridge',
targetE164: 'string',
},
},
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_createRoutingRule",
"arguments": {
"body": {
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"name": "string",
"phoneNumberId": "string",
"priority": 0,
"idempotencyKey": "00000000-0000-4000-8000-000000000000",
"action": {
"type": "bridge",
"targetE164": "string"
}
}
}
}
}Disable an owned managed inbound policy while retaining its record
DELETE/v1/dials/routing/rules/{rule_id}
Soft-disables only the managed rule in the verified org/workspace/project/environment. Repeating the exact DELETE is idempotent; returns the retained disabled rule and audit receipt. Workflow descriptors and foreign rules are not modified. Scope is required in the JSON body, not query parameters.
Parameters
rule_idpath · stringrequired
Request body application/json
scopeobjectrequiredscope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
scope.organizationIdstringrequiredmin length 1
scope.workspaceIdstringrequiredmin length 1
scope.projectIdstringrequiredmin length 1
scope.environmentIdstringrequiredmin length 1
actorIdstring | nullOptional compatibility field; actual actor comes from the verified gateway identity.
Responses
- 200Authenticated scoped result; not proof of an inbound call
Response fields
oktruerequiredruleobjectrequiredrule.idstringrequiredmin length 1 · max length 128
rule.scopeobjectrequiredrule.scope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
rule.scope.organizationIdstringrequiredmin length 1
rule.scope.workspaceIdstringrequiredmin length 1
rule.scope.projectIdstringrequiredmin length 1
rule.scope.environmentIdstringrequiredmin length 1
rule.namestringrequiredmin length 1 · max length 128
rule.phoneNumberIdstringrequiredmin length 1 · max length 128
rule.didstringrequiredpattern ^\+[1-9]\d{7,14}$
rule.priorityintegerrequiredmin 0 · max 10000
rule.enabledbooleanrequiredrule.actionobject | object | object | objectrequiredauditIdstring | nullrequiredRecorded disable audit ID, or null for an already-disabled imported record with no recorded disable audit.
idempotentReplaybooleanrequired
- 400Invalid scope or request shape
- 401Missing or invalid verified identity
- 404Number or managed rule not found in the authorized scope
- 409Original UUID conflicts with stored request, rule name exists, or stored record is invalid
- 422Invalid action, destination, priority or creation UUID
- 500Routing store failed; preserve the original request
- 503Backend unavailable
- 4xx 5xxThe error envelope.
curl -X DELETE "https://os.one.ml/api/v1/dials/routing/rules/$RULE_ID" \
-H "Authorization: Bearer $GENESIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
}
}'import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_disableRoutingRule', {
rule_id: '<rule_id>',
body: {
scope: {
organizationId: 'string',
workspaceId: 'string',
projectId: 'string',
environmentId: 'string',
},
},
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_disableRoutingRule",
"arguments": {
"rule_id": "<rule_id>",
"body": {
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
}
}
}
}
}Voice profiles
List saved voiceProfiles in the selected scope
GET/v1/dials/voice-profiles
Parameters
organizationIdquery · stringrequiredMust match the authenticated organization.
workspaceIdquery · stringrequiredSelected Dials scope.
projectIdquery · stringrequiredSelected Dials scope.
environmentIdquery · stringrequiredSelected Dials scope.
Responses
- 200Success
Response fields
okbooleanrequiredvoiceProfilesobject[]requiredvoiceProfiles[].[].idstringrequiredvoiceProfiles[].[].scopeobjectrequiredvoiceProfiles[].[].scope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
voiceProfiles[].[].scope.organizationIdstringrequiredmin length 1
voiceProfiles[].[].scope.workspaceIdstringrequiredmin length 1
voiceProfiles[].[].scope.projectIdstringrequiredmin length 1
voiceProfiles[].[].scope.environmentIdstringrequiredmin length 1
voiceProfiles[].[].namestringrequiredvoiceProfiles[].[].modelIdstringrequiredvoiceProfiles[].[].profileKind"synthetic" | "cloned" | "bring_your_own"requiredvoiceProfiles[].[].languagestringrequiredvoiceProfiles[].[].latencyBudgetMsintegerrequiredvoiceProfiles[].[].consentRecordIdstring | nullrequiredvoiceProfiles[].[].watermarkRequiredbooleanrequiredvoiceProfiles[].[].commercialLicenseAttestedbooleanrequiredvoiceProfiles[].[].deploymentTier"production" | "benchmark" | "edge"requiredvoiceProfiles[].[].statusstringrequired
- 401Missing or invalid identity
- 404Resource does not belong to the authenticated organization
- 503Backend or carrier unavailable
- 4xx 5xxThe error envelope.
curl "https://os.one.ml/api/v1/dials/voice-profiles?organizationId=$ORGANIZATION_ID&workspaceId=$WORKSPACE_ID&projectId=$PROJECT_ID&environmentId=$ENVIRONMENT_ID" \
-H "Authorization: Bearer $GENESIS_API_KEY"import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_listVoiceProfiles', {
organizationId: '<organizationId>',
workspaceId: '<workspaceId>',
projectId: '<projectId>',
environmentId: '<environmentId>',
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_listVoiceProfiles",
"arguments": {
"organizationId": "<organizationId>",
"workspaceId": "<workspaceId>",
"projectId": "<projectId>",
"environmentId": "<environmentId>"
}
}
}Save an unassigned VoiceProfile by scoped normalized name
POST/v1/dials/voice-profiles
This POST upserts by full scope and trimmed,lowercased name. Omitted optional fields reset. Create unassigned and assign a number separately; never replay creation after an assignment failure. No invitation,model deployment or consent verification is implied.
Request body application/json
scopeobjectrequiredscope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
scope.organizationIdstringrequiredmin length 1
scope.workspaceIdstringrequiredmin length 1
scope.projectIdstringrequiredmin length 1
scope.environmentIdstringrequiredmin length 1
actorIdstringrequiredmin length 1
namestringrequiredmin length 1
modelId"chatterbox-turbo" | "cosyvoice-2-05b" | "fish-audio-s2" | "kokoro-82m" | "dials-blockwise-mimi"requiredprofileKind"synthetic" | "cloned" | "bring_your_own" | nulllanguagestring | nullmin length 2 · max length 16 · pattern ^(?=.*[A-Za-z])[A-Za-z0-9-]+$
latencyBudgetMsinteger | nullmin 50 · max 1000
consentRecordIdstring | nullReal reference required for cloned/BYO. Backend validates presence, not registry ownership.
watermarkRequiredboolean | nullDefaults true and must be true for cloned/BYO.
commercialLicenseAttestedboolean | nullDefaults false. Explicit attestation required for production Fish Audio.
deploymentTier"production" | "benchmark" | "edge" | null
Responses
- 200Success
Response fields
okbooleanrequiredvoiceProfileobjectrequiredvoiceProfile.idstringrequiredvoiceProfile.scopeobjectrequiredvoiceProfile.scope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
voiceProfile.scope.organizationIdstringrequiredmin length 1
voiceProfile.scope.workspaceIdstringrequiredmin length 1
voiceProfile.scope.projectIdstringrequiredmin length 1
voiceProfile.scope.environmentIdstringrequiredmin length 1
voiceProfile.namestringrequiredvoiceProfile.modelIdstringrequiredvoiceProfile.profileKind"synthetic" | "cloned" | "bring_your_own"requiredvoiceProfile.languagestringrequiredvoiceProfile.latencyBudgetMsintegerrequiredvoiceProfile.consentRecordIdstring | nullrequiredvoiceProfile.watermarkRequiredbooleanrequiredvoiceProfile.commercialLicenseAttestedbooleanrequiredvoiceProfile.deploymentTier"production" | "benchmark" | "edge"requiredvoiceProfile.statusstringrequiredauditIdstringrequiredusageEventIdstringrequirednextstringrequired
- 401Missing or invalid identity
- 404Resource does not belong to the authenticated organization
- 422Invalid profile fields, missing consent/license attestation, or unsupported production model
- 503Backend or carrier unavailable
- 4xx 5xxThe error envelope.
curl -X POST "https://os.one.ml/api/v1/dials/voice-profiles" \
-H "Authorization: Bearer $GENESIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"actorId": "string",
"name": "string",
"modelId": "chatterbox-turbo"
}'import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_createVoiceProfile', {
body: {
scope: {
organizationId: 'string',
workspaceId: 'string',
projectId: 'string',
environmentId: 'string',
},
actorId: 'string',
name: 'string',
modelId: 'chatterbox-turbo',
},
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_createVoiceProfile",
"arguments": {
"body": {
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"actorId": "string",
"name": "string",
"modelId": "chatterbox-turbo"
}
}
}
}Workflows
List scoped saved workflow routing descriptors
GET/v1/dials/workflows
Parameters
organizationIdquery · stringrequiredMust match the authenticated organization.
workspaceIdquery · stringrequiredSelected Dials scope.
projectIdquery · stringrequiredSelected Dials scope.
environmentIdquery · stringrequiredSelected Dials scope.
platformIdquery · stringSelected data platform. Omitted defaults to dials in the backend; selection does not grant organization authority.
Responses
- 200Actual durable operation result; no carrier delivery or graph execution is inferred.
Response fields
okbooleanrequiredworkflowsobject[]requiredworkflows[].[].idstringrequiredmin length 1
workflows[].[].namestringrequiredmin length 1
workflows[].[].descriptionstringrequiredworkflows[].[].nodesobject[]requiredworkflows[].[].nodes[].[].idstringrequiredmin length 1
workflows[].[].nodes[].[].labelstringrequiredmin length 1
workflows[].[].nodes[].[].kindstringrequiredStored node descriptor; this API does not validate a supported execution engine kind. min length 1
workflows[].[].nodes[].[].descriptionstringrequiredworkflows[].[].nodes[].[].statusstringrequiredworkflows[].[].nodes[].[].xinteger (int32)requiredworkflows[].[].nodes[].[].yinteger (int32)requiredworkflows[].[].edgesobject[]requiredworkflows[].[].edges[].[].idstringrequiredmin length 1
workflows[].[].edges[].[].sourcestringrequiredmin length 1
workflows[].[].edges[].[].targetstringrequiredmin length 1
workflows[].[].edges[].[].labelstringrequiredworkflows[].[].statusstringdefault "draft"
workflows[].[].routeIdstring | null
- 400Invalid selected scope or request shape.
- 401Missing or invalid verified identity.
- 403Selected scope is not authorized by signed identity or lacks the required Dials grant.
- 500Durable store failed.
- 503Backend is not ready.
- 4xx 5xxThe error envelope.
curl "https://os.one.ml/api/v1/dials/workflows?organizationId=$ORGANIZATION_ID&workspaceId=$WORKSPACE_ID&projectId=$PROJECT_ID&environmentId=$ENVIRONMENT_ID" \
-H "Authorization: Bearer $GENESIS_API_KEY"import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_listWorkflows', {
organizationId: '<organizationId>',
workspaceId: '<workspaceId>',
projectId: '<projectId>',
environmentId: '<environmentId>',
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_listWorkflows",
"arguments": {
"organizationId": "<organizationId>",
"workspaceId": "<workspaceId>",
"projectId": "<projectId>",
"environmentId": "<environmentId>"
}
}
}Save a normalized workflow and enabled routing descriptor
POST/v1/dials/workflows/deploy
Upsert by selected scope/workflow ID. A deployed descriptor is not proof of arbitrary graph or media execution.
Request body application/json
scopeobjectrequiredscope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
scope.organizationIdstringrequiredmin length 1
scope.workspaceIdstringrequiredmin length 1
scope.projectIdstringrequiredmin length 1
scope.environmentIdstringrequiredmin length 1
actorIdstringrequiredmin length 1
workflowobjectrequiredGraph configuration. Backend normalizes labels, requires nonempty nodes and checks edge endpoints. It saves an enabled routing-rule descriptor; status deployed does not establish that arbitrary node logic executed.
workflow.idstringrequiredmin length 1
workflow.namestringrequiredmin length 1
workflow.descriptionstringrequiredworkflow.nodesobject[]requiredworkflow.nodes[].[].idstringrequiredmin length 1
workflow.nodes[].[].labelstringrequiredmin length 1
workflow.nodes[].[].kindstringrequiredStored node descriptor; this API does not validate a supported execution engine kind. min length 1
workflow.nodes[].[].descriptionstringrequiredworkflow.nodes[].[].statusstringrequiredworkflow.nodes[].[].xinteger (int32)requiredworkflow.nodes[].[].yinteger (int32)requiredworkflow.edgesobject[]requiredworkflow.edges[].[].idstringrequiredmin length 1
workflow.edges[].[].sourcestringrequiredmin length 1
workflow.edges[].[].targetstringrequiredmin length 1
workflow.edges[].[].labelstringrequiredworkflow.statusstringdefault "draft"
workflow.routeIdstring | null
Responses
- 200Actual durable operation result; no carrier delivery or graph execution is inferred.
Response fields
okbooleanrequiredworkflowobjectrequiredGraph configuration. Backend normalizes labels, requires nonempty nodes and checks edge endpoints. It saves an enabled routing-rule descriptor; status deployed does not establish that arbitrary node logic executed.
workflow.idstringrequiredmin length 1
workflow.namestringrequiredmin length 1
workflow.descriptionstringrequiredworkflow.nodesobject[]requiredworkflow.nodes[].[].idstringrequiredmin length 1
workflow.nodes[].[].labelstringrequiredmin length 1
workflow.nodes[].[].kindstringrequiredStored node descriptor; this API does not validate a supported execution engine kind. min length 1
workflow.nodes[].[].descriptionstringrequiredworkflow.nodes[].[].statusstringrequiredworkflow.nodes[].[].xinteger (int32)requiredworkflow.nodes[].[].yinteger (int32)requiredworkflow.edgesobject[]requiredworkflow.edges[].[].idstringrequiredmin length 1
workflow.edges[].[].sourcestringrequiredmin length 1
workflow.edges[].[].targetstringrequiredmin length 1
workflow.edges[].[].labelstringrequiredworkflow.statusstringdefault "draft"
workflow.routeIdstring | nullauditIdstringrequiredusageEventIdstringrequirednextstringrequiredrouteobjectrequiredroute.idstringrequiredmin length 1 · max length 128
route.scopeobjectrequiredroute.scope.platformId"dials"Dials platform identifier; defaults to dials when omitted.
route.scope.organizationIdstringrequiredmin length 1
route.scope.workspaceIdstringrequiredmin length 1
route.scope.projectIdstringrequiredmin length 1
route.scope.environmentIdstringrequiredmin length 1
route.namestringrequiredmin length 1 · max length 128
route.phoneNumberIdstringrequiredmin length 1 · max length 128
route.didstringrequiredpattern ^\+[1-9]\d{7,14}$
route.priorityintegerrequiredmin 0 · max 10000
route.enabledbooleanrequiredroute.actionobject | object | object | objectrequired
- 400Invalid selected scope or request shape.
- 401Missing or invalid verified identity.
- 403Selected scope is not authorized by signed identity or lacks the required Dials grant.
- 422Validation or approval requirement refused.
- 500Durable store failed.
- 503Backend is not ready.
- 4xx 5xxThe error envelope.
curl -X POST "https://os.one.ml/api/v1/dials/workflows/deploy" \
-H "Authorization: Bearer $GENESIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"actorId": "string",
"workflow": {
"id": "string",
"name": "string",
"description": "string",
"nodes": [
{
"id": "string",
"label": "string",
"kind": "string",
"description": "string",
"status": "string",
"x": 1,
"y": 1
}
],
"edges": []
}
}'import { Genesis } from '@lifesi/genesis'
const genesis = new Genesis({ apiKey: process.env.GENESIS_API_KEY })
const result = await genesis.call('dials_deployWorkflow', {
body: {
scope: {
organizationId: 'string',
workspaceId: 'string',
projectId: 'string',
environmentId: 'string',
},
actorId: 'string',
workflow: {
id: 'string',
name: 'string',
description: 'string',
nodes: [
{
id: 'string',
label: 'string',
kind: 'string',
description: 'string',
status: 'string',
x: 1,
y: 1,
},
],
edges: [],
},
},
}){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dials_deployWorkflow",
"arguments": {
"body": {
"scope": {
"organizationId": "string",
"workspaceId": "string",
"projectId": "string",
"environmentId": "string"
},
"actorId": "string",
"workflow": {
"id": "string",
"name": "string",
"description": "string",
"nodes": [
{
"id": "string",
"label": "string",
"kind": "string",
"description": "string",
"status": "string",
"x": 1,
"y": 1
}
],
"edges": []
}
}
}
}
}One Superintelligence, Inc. · Built from Genesis 0.1.12 and the live gateway on 2026-10-20. Support