---
title: "Developers — Salah Flow"
description: "Salah Flow for developers and AI agents: the newsletter API, the MCP servers, Markdown for every page and the machine-readable catalogs. No authentication."
canonical: "https://salahflow.com/developers"
last-updated: "2026-10-29"
language: "en-GB"
---

# Salah Flow for developers and AI agents

> Salah Flow is a free, ad-free prayer tracker for iPhone and iPad. Everything the app does happens in the app; this page lists everything the website offers to code and to AI agents, and is plain about what it doesn’t.

## What salahflow.com offers

The website is the app’s documentation and its download link, plus one newsletter endpoint, two MCP servers and an NLWeb question endpoint. Every page also comes as Markdown, and a set of machine-readable documents describes the whole site in a single fetch.

- [`https://salahflow.com/api/subscribe`](https://salahflow.com/api/subscribe): The newsletter API: one endpoint, POST only.
- [`https://salahflow.com/mcp`](https://salahflow.com/mcp): Salah Flow product server.
- [`https://salahflow.com/docs/mcp`](https://salahflow.com/docs/mcp): Salah Flow documentation server.
- [`https://salahflow.com/ask`](https://salahflow.com/ask): Ask a question in natural language (NLWeb); answered from the site’s own pages.
- [`https://apps.apple.com/app/id6758021191`](https://apps.apple.com/app/id6758021191): Salah Flow on the App Store.

## Authentication

None. Nothing on salahflow.com needs credentials: there are no API keys, no OAuth and no accounts, so there is nothing to sign up for or obtain before you call anything here. The newsletter endpoint is open and rate limited per IP.

## The Salah Flow newsletter API

`POST https://salahflow.com/api/subscribe` with a JSON body holding one field, `email`. Adds an email address to the Salah Flow mailing list. Rate limited per IP. Requires no authentication. It is the only write operation the website offers (the in-page WebMCP subscribe_to_newsletter tool goes through this same endpoint; the MCP servers are read-only); everything else the product does happens in the iOS app.

**Request**

```sh
curl -X POST https://salahflow.com/api/subscribe \
  -H "Content-Type: application/json" \
  -d '{"email": "you@example.com"}'
```

**Response: 200**

```json
{"ok":true,"status":"subscribed"}
```

**Response: 422**

```json
{"ok":false,"code":"invalid_email","message":"That doesn't look like a valid email address."}
```

Every error has the same shape: `ok` is false, `code` is a stable machine-readable string and `message` is a sentence you can show a person. The statuses:

- `200`: { ok: true, status: 'subscribed' | 'pending' | 'duplicate' }
- `400`: bad_request — the body was not readable JSON
- `415`: bad_request — the request was not sent as Content-Type: application/json
- `422`: invalid_email — the address was not a valid email address
- `429`: rate_limited — too many attempts from this IP
- `502`: provider_error — the newsletter provider rejected the request
- `503`: not_configured — no newsletter provider is configured yet

Rate limiting is per IP. Every response carries the IETF `RateLimit-Policy` and `RateLimit` headers, so you can see your quota and what is left of it, and a 429 adds `Retry-After` with the seconds to wait. Any other method gets a JSON 405 with an `Allow: POST` header, and any other path under `/api` gets a JSON 404 naming this endpoint.

- [`/openapi.json`](https://salahflow.com/openapi.json): The OpenAPI description of this endpoint.
- [`/.well-known/api-catalog`](https://salahflow.com/.well-known/api-catalog): The RFC 9727 API catalog that points to it.

## Salah Flow MCP servers

Two MCP servers speak Streamable HTTP and need no authentication. Add either URL to any MCP client as a remote server.

- [`https://salahflow.com/mcp`](https://salahflow.com/mcp): Salah Flow product server. The core facts about Salah Flow, whole or by topic (get_salah_flow_facts, drawn as a Salah Flow card in hosts with MCP Apps), answers from the published FAQ (answer_salah_flow_question), and search and read for its guides (search_salah_flow_docs, read_salah_flow_page). Read-only.
- [`https://salahflow.com/docs/mcp`](https://salahflow.com/docs/mcp): Salah Flow documentation server. List (all, or just pages or just posts), search and read every page on this site and every blog post (list_salah_flow_pages, search_salah_flow_docs, read_salah_flow_page). Read-only.

Each server describes itself in a server card at its own URL plus `/server-card`, and both are listed in the AI catalog. The product server’s card is also at `/.well-known/mcp/server-card.json`, where registries look for a domain’s server.

The product server is listed in the official MCP Registry as `com.salahflow/mcp`, and its skills, MCP configuration and Agent Plugins manifest are public on GitHub: `npx skills add MsTiik/salah-flow-agent`.

- [`MCP Registry: com.salahflow/mcp`](https://registry.modelcontextprotocol.io/v0/servers?search=com.salahflow/mcp): The registry entry.
- [`github.com/MsTiik/salah-flow-agent`](https://github.com/MsTiik/salah-flow-agent): Skills, MCP config and plugin manifest.

- [`/mcp/server-card`](https://salahflow.com/mcp/server-card): The product server’s card.
- [`/docs/mcp/server-card`](https://salahflow.com/docs/mcp/server-card): The documentation server’s card.
- [`/.well-known/ai-catalog.json`](https://salahflow.com/.well-known/ai-catalog.json): The catalog of both servers.

## Ask Salah Flow a question (NLWeb)

`POST https://salahflow.com/ask` takes a question in natural language and answers with the matching FAQ answers and pages, as schema.org-typed results (NLWeb 0.55). It searches; it never generates: every result is the site’s own published text with its canonical URL. No authentication.

**Request**

```sh
curl -X POST https://salahflow.com/ask \
  -H "Content-Type: application/json" \
  -d '{"query": {"text": "is Salah Flow free?"}}'
```

Add `"prefer": {"streaming": true}` (or send `Accept: text/event-stream`) for Server-Sent Events: `start`, one `result` per item, then `complete`. `GET /ask?query=…` works too. The response formats are `conversational_search` (the default) and `chatgpt_app`; the only mode is `list`. A question nothing matches gets a `NO_RESULTS` failure.

## Markdown and machine-readable documents

Every page has a Markdown version at the same URL: send `Accept: text/markdown`, or fetch its `.md` twin (`/about.md`, and `/blog/<slug>.md` for a blog post). The Markdown carries the page’s title, description, canonical URL and last-updated date as YAML frontmatter. Alongside the pages:

- [`/llms.txt`](https://salahflow.com/llms.txt): A guide to the whole site for AI agents (llmstxt.org).
- [`/blog/llms.txt`](https://salahflow.com/blog/llms.txt): The same, for the blog alone.
- [`/skills/llms.txt`](https://salahflow.com/skills/llms.txt): The same, for the Agent Skills this site publishes.
- [`/?mode=agent`](https://salahflow.com/?mode=agent): The whole site as one JSON document.
- [`/.well-known/ard.json`](https://salahflow.com/.well-known/ard.json): An Agentic Resource Discovery catalog of everything here.
- [`/.well-known/agent-skills/index.json`](https://salahflow.com/.well-known/agent-skills/index.json): The published Agent Skills, each served at `/skills/<name>/SKILL.md`.
- [`/schemamap.xml`](https://salahflow.com/schemamap.xml): The NLWeb schema map.
- [`/feeds/schema.jsonl`](https://salahflow.com/feeds/schema.jsonl): The site’s whole JSON-LD graph in one fetch.
- [`/sitemap.xml`](https://salahflow.com/sitemap.xml): Every page and blog post.

Every page’s response also carries RFC 8288 Link headers pointing to its canonical URL, its Markdown twin, the sitemap and these catalogs.

## WebMCP tools in the page

In a browser with WebMCP (today, Chrome’s origin trial), every page registers three tools that an agent working in the page can call instead of reading it:

- `subscribe_to_newsletter`: Sign an email address up for occasional email updates from Salah Flow (the same mailing list as the sign-up form in the site footer).
- `get_salah_flow_facts`: Get the core facts about Salah Flow: what it costs, which devices it runs on, where to download it, its accessibility and privacy stance, and how to contact the team.
- `answer_salah_flow_question`: Look a question up in the Salah Flow FAQ and return the closest published question-and-answer pairs, verbatim.

## What you can’t do through salahflow.com

- **Prayer data**: There is no product API: prayer logs, prayer times and settings live in the app and can’t be read or written from here.
- **Accounts**: The website has no accounts, so there is nothing to create, sign in to or manage.
- **OAuth**: There is no authorisation server and no delegated access. Nothing here acts on a user’s behalf beyond the newsletter sign-up.

## Questions

Building something with Salah Flow, or found something on this page that isn’t true? Email contact@salahflow.com.

## More from Salah Flow

- [Home](https://salahflow.com/index.md): What Salah Flow is, its features, how it works, pricing and the full FAQ.
- [About](https://salahflow.com/about.md): Who makes Salah Flow: Rene and Nieves, a husband-and-wife team of reverts, why they built it and what it stands for.
- [Contact](https://salahflow.com/contact.md): How to reach Salah Flow for support, feedback, feature ideas and privacy requests.
- [Privacy Policy](https://salahflow.com/privacy.md): What data Salah Flow collects, how it is used and protected, and your rights.
- [Terms & Conditions](https://salahflow.com/terms.md): The terms for using Salah Flow: cost and donations, prayer-time accuracy and governing law.
- [Blog](https://salahflow.com/blog.md): Guidance for building a salah habit: starting to pray, the five daily prayers, making up missed prayers and more.
- [llms.txt](https://salahflow.com/llms.txt): A guide to this site for AI agents

_This is the Markdown version of https://salahflow.com/developers._
