Sends an announcement (title + body) as a push and/or in-app notification, and records it in the "Messages" tab of the school's app. The endpoint validates and resolves external references, then dispatches asynchronously — a 200 confirms dispatch, not delivery.
Inline links: when delivery is push_and_inbox the body may contain inline Markdown links — [text](https://url), e.g. Retrouvez tous les détails ici : [Voir le blog](https://edusign.com/blog). The in-app inbox renders them as tappable hyperlinks; the push shows the link text only (a lock-screen notification cannot render links). URLs must be absolute http(s). Inline links are rejected when delivery is push_only (there is no inbox record to render them in).
Scheduling: provide an optional sendAt (ISO 8601 with a timezone — a trailing Z or a numeric offset, must be in the future) to schedule the announcement instead of sending it now. A scheduled announcement returns 202 with the sendAt echoed; it is delivered by the scheduler at that instant (to a granularity of a few minutes). Omit sendAt to send immediately (200). Scheduling is atomic: if the scheduling service is unavailable the request fails with 502 and no message is created, so it is safe to retry.
Availability: this endpoint is only available to schools with a white-label app; it has no effect for schools without one.
Audience note: recipients.type "targeted_users" targets any user stored in the school's users table by their id or external reference — not only students. Some schools register non-student roles there so those users can access the white-label app, so the audience is not limited to actual students.
Public audiences: recipients.type "all" and "unauthenticated" reach anonymous, non-enrolled devices, so they require an active public white-label app. Without it the request is rejected with 403; the other audiences ("authenticated", "targeted_users", "targeted_groups") are unaffected.
| Time | Status | User Agent | |
|---|---|---|---|
Retrieving recent requests… | |||

