# Arabic text to speech in n8n: turn any workflow into a Gulf Arabic voice

> No community node to install and no code step. One HTTP Request node, one credential, and every n8n workflow can speak Arabic — in a Gulf voice, not a newsreader's.

- Source: https://nutq.dev/blog/arabic-text-to-speech-n8n
- Published: 2026-09-27
- Updated: 2026-09-27
- Author: nutq team (https://nutq.dev)

## Short answer

To add Arabic text to speech in n8n, use an HTTP Request node that POSTs JSON — the text and a voice name — to https://nutq.dev/v1/speech with a Header Auth credential, and set the response format to File. The node returns a WAV in a Gulf Arabic voice that later nodes can send to Telegram, WhatsApp, email or storage. Speech costs $0.05 per 1,000 characters.

n8n is where a lot of Gulf businesses glue their tools together: a new order, a form submission, a daily report. Adding a voice to those flows used to mean English-only services or a broadcast-MSA voice nobody in Dubai talks like. This guide shows how to add **Arabic text to speech in n8n** with the built-in HTTP Request node — no community node, no code.

## What will the workflow do?

A typical flow:

1. **Trigger** — a webhook, a schedule, a new row in a sheet.
2. **Text** — build the Arabic sentence, from a template or a language model.
3. **HTTP Request** — send it to nutq, get a WAV back.
4. **Deliver** — post the audio to Telegram, send it by email, or save it to storage.

Step 3 is the only new part.

## How do you set up the credential?

In n8n, create a credential of type **Header Auth**:

| Field | Value |
|---|---|
| Name | `Authorization` |
| Value | `Bearer nutq_…` (your key from the [dashboard](/sign-up)) |

Store it as a credential and select it in the node. Never paste the key inline: exported workflows and screenshots leak inline values.

## How do you configure the HTTP Request node?

| Setting | Value |
|---|---|
| Method | `POST` |
| URL | `https://nutq.dev/v1/speech` |
| Authentication | Generic credential → Header Auth → the credential above |
| Send Body | On, content type JSON |
| Response format | File |

The JSON body:

```json
{
  "text": "{{ $json.message }}",
  "voice": "rashid"
}
```

`voice` is any Arabic voice from `GET /v1/voices`, or one you saved on your account. The node's output is a binary file — a WAV — that the next node can attach or upload. Usage comes back in the response headers (`X-Nutq-Characters`, `X-Nutq-Cost-USD`), so you can log what each run cost.

## Can the workflow use several voices and pauses?

Yes, in the same request. Open a line with a voice name in square brackets and that voice speaks until the next one; `[pause]` adds a gap:

```text
[Rashid] شحالك؟
[Mariam] بخير الحمد لله
أهلا بكم [pause:800] ونبدأ
```

A bare `[pause]` is 500 ms, `[pause:2s]` is two seconds, and silence is not billed. Each line is generated on its own and joined, so it sounds like two people reading lines rather than an unscripted conversation — right for announcements and short dialogues.

## How do you get the pronunciation right?

Arabic is written without short vowels, so an ambiguous word is a guess. If a word comes out wrong, add diacritics to **that word only** — marking every word makes the delivery slow and formal. The details, with examples, are in [Arabic text to speech with voice cloning](/blog/arabic-text-to-speech-voice-cloning).

## How do you handle errors in the workflow?

Turn on the node's *Continue on fail* or add an error branch, and route on the status code. Errors come back as a sentence that names the problem, so you can pass it straight to a Slack or email alert:

| Status | Meaning | What the workflow should do |
|---|---|---|
| 400 | A field is missing or wrong | Fix the body; the message names the field |
| 401 | The key is missing or revoked | Check the credential |
| 402 | The balance is spent | Top up, then retry the same run |
| 413 | Text over 5,000 characters | Split it across two requests |
| 503 | Speech is temporarily unavailable | Retry after a short wait |

None of these is billed: a request that fails costs nothing, so a retry never charges twice.

## Workflow ideas

| Trigger | Voice output |
|---|---|
| New order in the store | A Gulf Arabic confirmation voice note to the customer |
| Daily sales report | A 30-second spoken summary for the team channel |
| New blog post | An audio version of the article |
| Appointment tomorrow | A spoken reminder in the customer's language |

For the reverse direction — voice notes coming *in* — see [transcribing Arabic voice notes](/blog/transcribe-arabic-voice-notes).

## What does it cost?

| | |
|---|---|
| Price | $0.05 per 1,000 characters |
| Per request | Up to 5,000 characters |
| Free credit | $5 at [sign-up](/sign-up), no card |
| Failed requests | Not billed |

A 200-character reminder costs one cent. The full request reference, including other languages and saved voices, is in the [API reference](/docs).

## FAQ

### Is there an n8n node for Arabic text to speech?

You do not need one. The built-in HTTP Request node calls nutq's /v1/speech endpoint directly and returns the audio as a file.

### How do I store the API key safely in n8n?

Create a Header Auth credential with the name Authorization and the value Bearer followed by your key, and select it in the node. Do not paste the key into the node itself.

### Can one request contain two speakers?

Yes. Start a line with a voice name in square brackets, such as [Rashid], and that voice speaks until the next one. [pause] inserts a gap. The result is a single file.

### What does it cost to run in a workflow?

$0.05 per 1,000 characters, up to 5,000 characters per request. Failed requests are not billed, and silence from pauses is not billed.
