Work with this as data
Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/chatrail-dev:chatrail-dev-schedules-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
OpenAPI Specification
openapi: 3.2.0
info:
title: ChatRail Schedules API
version: 1.0.0
description: 'Send, schedule and receive WhatsApp messages through a linked-device session.
**Two things the API is careful about, which shape every endpoint below.**
*Accepted is not delivered.* A 202 means the message is durably stored and queued. Only the `status` field ever claims WhatsApp delivered anything, and `queued`, `submitted`, `sent`, `delivered` and `read` are deliberately distinct.
*A retry must not send twice.* Send `Idempotency-Key` on every send. A replay returns the original response; a concurrent duplicate is told to retry rather than allowed to race.'
contact:
name: ChatRail
url: https://www.chatrail.dev
servers:
- url: https://www.chatrail.dev
security:
- apiKey: []
tags:
- name: Schedules
description: Recurring sends.
paths:
/v1/schedules:
post:
summary: Create a recurring schedule
description: Daily, weekly or monthly, resolved in the given IANA timezone. A schedule that fell behind fires once and drops the backlog rather than delivering days of stale messages.
tags:
- Schedules
operationId: post_v1_schedules
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
minLength: 1
maxLength: 80
timezone:
type: string
minLength: 1
maxLength: 64
recurrence:
oneOf:
- type: object
properties:
type:
type: string
const: daily
hour:
type: integer
minimum: 0
maximum: 23
minute:
type: integer
minimum: 0
maximum: 59
required:
- type
- hour
- minute
- type: object
properties:
type:
type: string
const: weekly
hour:
type: integer
minimum: 0
maximum: 23
minute:
type: integer
minimum: 0
maximum: 59
days_of_week:
minItems: 1
maxItems: 7
type: array
items:
type: integer
minimum: 0
maximum: 6
required:
- type
- hour
- minute
- days_of_week
- type: object
properties:
type:
type: string
const: monthly
hour:
type: integer
minimum: 0
maximum: 23
minute:
type: integer
minimum: 0
maximum: 59
day_of_month:
anyOf:
- type: integer
minimum: 1
maximum: 31
- type: number
const: -1
required:
- type
- hour
- minute
- day_of_month
message:
type: object
properties: {}
additionalProperties: {}
starts_at:
type: string
format: date-time
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
ends_at:
type: string
format: date-time
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
max_occurrences:
type: integer
minimum: 1
maximum: 10000
required:
- name
- timezone
- recurrence
- message
additionalProperties: false
example:
name: Friday digest
timezone: Europe/London
recurrence:
type: weekly
hour: 9
minute: 0
days_of_week:
- 5
message:
connection: main
to: '+15551234567'
body: Your weekly digest is ready.
responses:
'201':
description: Created, with the resolved `next_run_at`.
'400':
description: Unknown timezone, or a recurrence that would never fire.
'402':
description: The plan does not include scheduling.
security:
- apiKey:
- schedules:write
x-scopes:
- schedules:write
get:
summary: List schedules
tags:
- Schedules
operationId: get_v1_schedules
parameters:
- name: status
in: query
required: false
schema:
type: string
enum:
- active
- paused
- completed
- canceled
responses:
'200':
description: Every schedule in the workspace.
security:
- apiKey:
- schedules:read
x-scopes:
- schedules:read
/v1/schedules/{id}:
get:
summary: Get a schedule
tags:
- Schedules
operationId: get_v1_schedules__id_
parameters:
- name: id
in: path
required: true
schema:
type: string
description: Schedule id.
responses:
'200':
description: The schedule.
'404':
description: No such schedule.
security:
- apiKey:
- schedules:read
x-scopes:
- schedules:read
/v1/schedules/{id}/pause:
post:
summary: Pause a schedule
description: Keeps the schedule and stops it firing.
tags:
- Schedules
operationId: post_v1_schedules__id__pause
parameters:
- name: id
in: path
required: true
schema:
type: string
description: Schedule id.
responses:
'200':
description: The updated schedule.
'409':
description: Not in a state that allows it.
security:
- apiKey:
- schedules:write
x-scopes:
- schedules:write
/v1/schedules/{id}/resume:
post:
summary: Resume a schedule
description: The next run is computed from now. A schedule paused for a month does not fire the month it missed.
tags:
- Schedules
operationId: post_v1_schedules__id__resume
parameters:
- name: id
in: path
required: true
schema:
type: string
description: Schedule id.
responses:
'200':
description: The updated schedule.
'409':
description: Not in a state that allows it.
security:
- apiKey:
- schedules:write
x-scopes:
- schedules:write
/v1/schedules/{id}/cancel:
post:
summary: Cancel a schedule
description: Permanent. A cancelled schedule cannot be restarted.
tags:
- Schedules
operationId: post_v1_schedules__id__cancel
parameters:
- name: id
in: path
required: true
schema:
type: string
description: Schedule id.
responses:
'200':
description: The updated schedule.
'409':
description: Not in a state that allows it.
security:
- apiKey:
- schedules:write
x-scopes:
- schedules:write
components:
securitySchemes:
apiKey:
type: http
scheme: bearer
description: 'A workspace API key, `cr_live_…`. Server-side only: it carries workspace authority and must never reach a browser.'
session:
type: apiKey
in: cookie
name: chatrail_session
description: Dashboard session cookie. Set by `/v1/auth/verify`.