# mv.testHelpersInboundCalls

> The testHelpersInboundCalls methods of @morevoice/sdk: Simulate calls and events in test mode.

Simulate calls and events in test mode. These methods are on `mv.testHelpersInboundCalls`, where `mv` is your client (see [the Node.js SDK](https://docs.morevoice.ai/sdk/node/#connect)). Each one returns the response object and throws when the API answers with an error.

## `create()`

**Simulate an inbound call.** Test mode only. A simulated caller dials one of your sandbox numbers: the call is routed like a real one (the number's assistant, flow or inbound route), runs on the virtual carrier with simulated speech and AI, and sends every call event to your test-mode webhook endpoints. Returns the call (status `ringing`); it is answered within a second.

```ts
mv.testHelpersInboundCalls.create(body: TestHelpersInboundCallsCreateData["body"], options?: RequestOptions): Promise<TestHelpersInboundCallsCreateResponse>
```

`POST /test_helpers/inbound_calls` · [API reference](https://docs.morevoice.ai/api/operations/test_helpers_inbound_calls_create/)

### Parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `body.to` | `string` | yes | A sandbox number of yours (POST /v1/phone_numbers with a test key). |
| `body.from` | `string` | no | The simulated caller's number (default +972521234567). |
| `body.script` | `string` | no | What the simulated caller does: `answer` (default) talks for a few turns and hangs up; `silent` says nothing (and hangs up after 30 s); `dtmf:123` presses the keys after the greeting, then talks. |
| `options.headers["MoreVoice-Version"]` | `string` | no | The API version to use for this request. Defaults to the version the API key is pinned to. |
| `options.headers["Idempotency-Key"]` | `string` | no | A unique key (for example a UUID) that makes this request safe to retry: for 24 hours, a retry with the same key and parameters returns the first response instead of acting twice. |
| `options` | `RequestOptions` | no | `idempotencyKey`, extra `headers` and an abort `signal`: see [retries and idempotency](https://docs.morevoice.ai/sdk/typescript/retries/). |

### Returns

`Call`:

| Field | Type | Description |
| --- | --- | --- |
| `id` | `string` | A call ID (prefix `call_`). |
| `object` | `"call"` | Always `call`. |
| `type` | `CallType` | Who handles the call: an AI assistant, a human agent, an IVR flow, a conference room, or a voicemail box. |
| `direction` | `CallDirection \| null` | — |
| `transport` | `"sip" \| "webrtc"` | `sip` for phone calls, `webrtc` for browser calls and conference rooms. |
| `status` | `CallStatus` | `queued` (placed, not ringing yet), `ringing`, `in_progress` (answered, or an inbound call being handled) or `ended`. |
| `from` | `string \| null` | The calling number (E.164 when it is a phone number) or name. |
| `to` | `string \| null` | The called number (E.164 when it is a phone number) or destination. |
| `assistant_id` | `string \| null` | `asst_…` ID. |
| `flow_id` | `string \| null` | `flow_…` ID. |
| `flow_version` | `integer \| null` | The flow version that ran (0: an unpublished draft). |
| `queue_id` | `string \| null` | `q_…` ID. |
| `agent_id` | `string \| null` | The human agent who handled the call (`usr_…`). |
| `campaign_id` | `string \| null` | `cmp_…` ID. |
| `contact_id` | `string \| null` | `ctc_…` ID. |
| `connection_id` | `string \| null` | `conn_…` ID. |
| `api_key_id` | `string \| null` | The API key that created the call (`key_…`). |
| `purpose` | `CallPurpose \| null` | — |
| `started_at` | `string` | When the call started: dialled out, or rang in. |
| `answered_at` | `string \| null` | — |
| `ended_at` | `string \| null` | — |
| `duration_ms` | `integer \| null` | — |
| `end_reason` | `string \| null` | Why the call ended, e.g. `customer-ended-call`, `assistant-ended-call`, `customer-busy`, `customer-did-not-answer`. |
| `answered_by` | `CallAnsweredBy \| null` | — |
| `disposition` | `string \| null` | The business outcome recorded on the call (set_outcome tool, or the summary). |
| `has_recording` | `boolean` | — |
| `ai_generated` | `boolean` | Machine-readable marking (EU AI Act Art. 50(2)): true when the call contains speech generated by AI — an AI voice agent, or synthetic-voice IVR prompts. Recordings of such calls carry the same tag in their file metadata. |
| `ai_segments` | `CallAiSegment[]` | When AI-generated speech was played, in ms from the start of the call (empty when `ai_generated` is false). |
| `summary` | `CallSummary \| null` | — |
| `cost` | `CallCost \| null` | Set once the call has ended (never null then); null while it is in progress. |
| `variables` | `Record<string, string>` | The variables the call was created with. |
| `metadata` | `Metadata` | Up to 50 key/value pairs (keys up to 40 characters, values up to 500) you attach to an object. Returned as sent. |
| `livemode` | `boolean` | `true` in live mode, `false` in test mode. |
| `assistant` | `CallAssistant` | The assistant of the call (expand[]=assistant). |

### Example

```ts
import MoreVoice from "@morevoice/sdk";

const mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment

const call = await mv.testHelpersInboundCalls.create({
	from: "+972521234567",
	script: "dtmf:1",
	to: "+972509991234",
});
console.log(call);
```
