# Integration — External Services

> SendPulse, Anthropic, enrichment providers, mail/SMS, and other third parties.

_Verified against `config/{sendpulse,services,ai,mail,sms}.php` and related services on 2026-07-23._

---

## SendPulse (WhatsApp + OTP)
- `config/sendpulse.php` — OAuth client-credentials (`SENDPULSE_CLIENT_ID/SECRET`), single `bot_id`, OTP template, HTTP timeout/retries, template cache TTL.
- Delivery webhook: `POST /api/webhooks/sendpulse/whatsapp` (optional shared secret).
- Toggles: `SENDPULSE_ENABLED`, `SENDPULSE_DRY_RUN`. Part of the notification-channel layer; status surfaces in `NotificationLog`.

## Anthropic (Claude API)
- `config/services.php` → `anthropic.*` (`ANTHROPIC_API_KEY`, base URL, version, default model). Called over raw HTTPS (no SDK).
- **Two consumers:** `NameTransliterator` (`app/Services/Transliteration/`, Arabic↔English names, backed by `transliteration_cache`); and the **agent runtime** via `AnthropicModelProvider` (reuses `services.anthropic.*` + `config/agent_runtime.php`).
- Model IDs are **as configured**; that they resolve to deployed models is **Unknown - requires confirmation**.

## AI enrichment providers
`app/Services/Ai/Enrichment/*`, keyed in `config/ai.php`:
- **Proxycurl** (LinkedIn), **Hunter.io** (email finding), **WebFetch** (generic HTTP behind `UrlGuard`), **Gravatar**.
- Guards: `BudgetEnforcer` (monthly USD ceiling), `UrlGuard` (SSRF/HTTPS), `ImageValidator` (size/dimension caps). Response cache TTL to avoid re-billing.

## Mail & SMS
- **Mail:** `config/mail.php` — SMTP (Office365) via Laravel Mail + PHPMailer.
- **SMS:** `config/sms.php` — used for OTP/notifications. **Provider: Unknown - requires confirmation.**

## Slack
- `services.slack` is present in `config/services.php`. **Usage status: Unknown - requires confirmation.**

## Make.com
- Referenced as the external orchestration + AI reasoning layer, but **no Make service class or `config/make.php` was found in-repo**. `MAKE_API_TOKEN` appears only as a placeholder in a plan doc. Concrete wiring: **Unknown - requires confirmation.** (Execution ownership is locked to Numu — see [`../01-architecture/ai-architecture.md`](../01-architecture/ai-architecture.md).)
