REST API
Base URL, authentication, and the full list of endpoints.
The REST API reads and writes the same data the FalconryScale app shows you, over plain HTTP. It's meant for scripts and server-to-server calls, not for a browser fetch() from a third-party page, no CORS headers are served.
Base URL
https://app.falconryscale.com/api/v1Authentication
Every request needs a bearer credential carrying falconry:read and, for a write endpoint, falconry:write scope too:
Authorization: Bearer <api key or OAuth access token>Session cookies aren't accepted here. See API keys for the simplest way to get a credential, or OAuth for how an AI assistant connects without one.
Endpoints
Every id (raptorId, a weight's id, and so on) is an opaque string, copy it from a previous response rather than constructing one yourself.
Reads use GET (inputs in the query string). Writes use POST to create or act, PATCH to change part of a record, and DELETE to remove one, all with a JSON body. A PATCH only changes the fields you send: leave a field out to keep it, send null to clear it. Every operation also exists as an MCP tool with the same name.
Profile, today and preferences
| Operation | Request | Access |
|---|---|---|
| Get your profile | GET /profile | Read |
| Get today's roster checklist | GET /today | Read |
| Get notification preferences | GET /notification-preferences | Read |
| Update your profile | PATCH /profile | Write |
| Update notification preferences | PATCH /notification-preferences | Write |
get_today_summary is one call for "how many raptors, which are already weighed today, which still need weighing, and my unread alert count", instead of three separate calls. update_profile covers your name, bio, location, display preferences and falconry experience; your email, plan and photos can't be changed through the API.
Raptors
| Operation | Request | Access |
|---|---|---|
| List your raptors | GET /raptors | Read |
| Get one raptor | GET /raptors/{raptorId} | Read |
| Search species | GET /species | Read |
| List a raptor's past moults | GET /raptors/{raptorId}/moult-history | Read |
| Get weight-alert thresholds | GET /raptors/{raptorId}/weight-alert-settings | Read |
| Add a raptor | POST /raptors | Write |
| Update a raptor's details | PATCH /raptors/{raptorId} | Write |
| Star or unstar a raptor | POST /raptors/{raptorId}/favorite | Write |
| Change a raptor's status | POST /raptors/{raptorId}/status | Write |
| Set a raptor's ready weight | POST /raptors/{raptorId}/ready-weight | Write |
| Put a raptor into moult | POST /raptors/{raptorId}/moult/start | Write |
| End a raptor's moult | POST /raptors/{raptorId}/moult/end | Write |
| Share with the team, or make private | POST /raptors/{raptorId}/team-sharing | Write |
| Update weight-alert thresholds | PATCH /raptors/{raptorId}/weight-alert-settings | Write |
list_raptors takes an optional scope query parameter: all (own and team-shared birds, the default), mine (own only), or team (every bird your team shares with you). create_raptor needs a speciesId from search_species, and a free account is capped at 3 active raptors. There's no delete: archive a bird with set_raptor_status instead, which you can undo.
Weights
| Operation | Request | Access |
|---|---|---|
| Get a raptor's weigh-in history | GET /raptors/{raptorId}/weights | Read |
| Get the latest weigh-in per raptor | GET /weights/latest | Read |
| Get one weigh-in | GET /weights/{weightId} | Read |
| Log a weigh-in | POST /raptors/{raptorId}/weights | Write |
| Correct a weigh-in | PATCH /weights/{weightId} | Write |
| Delete a weigh-in | DELETE /weights/{weightId} | Write |
get_weight_history takes optional since (an ISO 8601 datetime) and limit to bound the results, limit defaults to, and caps at, 500. get_latest_weights takes an optional raptorIds list (at most 200 ids), pass a comma-separated list of ids to scope it, or omit it to check your whole roster at once, the "who still needs weighing" read. log_weight needs weightGrams; measuredAt, stomachState (empty or fed), and prey details are optional.
Activities
| Operation | Request | Access |
|---|---|---|
| List a raptor's activities | GET /raptors/{raptorId}/activities | Read |
| Get one activity | GET /activities/{activityId} | Read |
| Log a feeding | POST /raptors/{raptorId}/feedings | Write |
| Log a training, flight, or hunting activity | POST /raptors/{raptorId}/activities | Write |
| Correct an activity | PATCH /activities/{activityId} | Write |
| Delete an activity | DELETE /activities/{activityId} | Write |
list_activities takes optional activityType, and a from/to date range (ISO 8601 dates). Feeding is logged separately from training, flight exercise and hunting, use log_feeding for the former and log_activity for the latter. log_activity also takes training details (creance length and recall distance, in metres) and, for a hunt, the outcome, prey count and a slip assessment.
Food and feeding plans
| Operation | Request | Access |
|---|---|---|
| List food items | GET /food-items | Read |
| List a raptor's feeding schedules | GET /raptors/{raptorId}/feeding-schedules | Read |
| Get the active bring-down plan | GET /raptors/{raptorId}/bring-down-plan | Read |
| Add a custom food item | POST /food-items | Write |
| Edit a custom food item | PATCH /food-items/{foodItemId} | Write |
| Star or unstar a food item | POST /food-items/{foodItemId}/favorite | Write |
| Start a bring-down plan | POST /raptors/{raptorId}/bring-down-plan | Write |
| Stop the active bring-down plan | POST /raptors/{raptorId}/bring-down-plan/stop | Write |
A food item's id is the preyTypeId a fed weigh-in takes. start_bring_down_plan defaults to the raptor's latest weigh-in and ready weight, over the same safe minimum number of days the app uses (never more than 1.5% a day).
Health
| Operation | Request | Access |
|---|---|---|
| List a raptor's health records | GET /raptors/{raptorId}/health-records | Read |
| Get one health record | GET /health-records/{healthRecordId} | Read |
| List a raptor's medication courses | GET /raptors/{raptorId}/medications | Read |
| Get one medication course | GET /medications/{medicationId} | Read |
| Add a health record | POST /raptors/{raptorId}/health-records | Write |
| Update a health record | PATCH /health-records/{healthRecordId} | Write |
| Delete a health record | DELETE /health-records/{healthRecordId} | Write |
| Start a medication course | POST /raptors/{raptorId}/medications | Write |
| Update a medication course | PATCH /medications/{medicationId} | Write |
| Delete a medication course | DELETE /medications/{medicationId} | Write |
| Log a medication dose | POST /medications/{medicationId}/doses | Write |
Both lists take an optional limit, defaulting to, and capped at, 200. A health record's attachments come back as metadata only (file name, type and size), not a download link, and attachments can only be added in the app. Deleting a health record also deletes its attached files.
Documents
| Operation | Request | Access |
|---|---|---|
| List documents | GET /documents | Read |
| Get one document's details | GET /documents/{documentId} | Read |
| Update a document's details | PATCH /documents/{documentId} | Write |
Documents are metadata only: title, type, issue and expiry dates, issuing authority, tags, and file name and size, never the file or a link to it. Pass expiringWithinDays to list_documents for the renewals view, soonest expiry first. Uploading and deleting documents stay in the app.
Team
| Operation | Request | Access |
|---|---|---|
| Get your team | GET /team | Read |
| Invite someone to the team | POST /team/invites | Write |
| Revoke a pending invite | DELETE /team/invites/{inviteId} | Write |
Members are listed by display name and role only, never by email, and a pending invite shows a masked address. Inviting and revoking need the owner or admin role. invite_team_member sends the invite email (the only endpoint that emails anyone), accepts the member and viewer roles only, and never returns the join code: the invitee joins from the email.
Alerts and achievements
| Operation | Request | Access |
|---|---|---|
| List your alerts | GET /alerts | Read |
| List your achievements | GET /achievements | Read |
| Mark an alert read | POST /alerts/{alertId}/read | Write |
| Mark every alert read | POST /alerts/read-all | Write |
list_alerts is cursor-paginated: pass the previous response's nextCursor to get the next page, and stop once hasMore is false. list_achievements returns your total XP, what you've unlocked, and your progress toward the rest.
Not available through the API
Account deletion, subscriptions and payments, the marketplace, file uploads, and public share links stay in the app.
Data notes
- Weights are always grams. Whatever unit a person's own display preference uses, every weight this API returns or accepts is in grams.
- Dates and datetimes are ISO 8601. A date-only field (like an activity's
activityDate) isyyyy-mm-dd; a full timestamp (like a weigh-in'smeasuredAt) includes the time. - Team birds follow the caller's role. A raptor shared with your team carries
isOwnandmyRole(selffor your own birds, otherwise your team role on that bird), andlist_raptors'sscopeparameter controls whose birds come back.
For the exact request and response shape of every field, see the generated API reference. For status codes and the error format, see Errors and rate limits.
OAuth (sign in with FalconryScale)
How an AI assistant connects to your account by signing in, what you approve, and how to disconnect it.
MCP server (AI assistants)
What the FalconryScale MCP server does and how to connect it to Claude, ChatGPT, Cursor, VS Code and Claude Code, with sign-in first and an API key as the backup.