Postures
2 Postures routes on the FLAM API: The posture library, the control axes, and this house's preferences; Star, default, add to Explore, and save her own.
Base URL https://api.flam.fashion. Send Authorization: Bearer flam_sk_… on every call; a handful of routes are session-only and say so. How keys and roles work.
GET /api/toolkit/postures
The posture library, the control axes, and this house's preferences
A variation stops being an adjective and becomes a NAMED posture. Returns FLAM's own entries (the seeded twelve) plus anything this house minted, the control axes with their named stops, and the house's favourites, defaults, Explore adds and saved variations — one call, because a card cannot be drawn without all three.
EVERY ENTRY IS CASTABLE WITH NOTHING TOUCHED: controls.defaults already names a stop on every axis the entry pre-sets. The axes are there for a director who wants them; there is no state in which she must use them.
THE GEOMETRY PHRASES ARE NOT IN THIS RESPONSE, by design. The prompt fragments each posture and each stop compiles to are house IP and are attached server-side by the composer. What a screen needs is names and definitions, and that is what it gets.
Responses
| Status | Meaning |
|---|---|
200 | The library, the axes and the house's preferences |
401 | No valid session |
200 returns:
{
"library": [
{
"id": "string",
"tier": 0,
"name": "string",
"provenance": "string",
"definition": "string",
"whenUsed": "string",
"register": "editorial",
"crop": "packshot",
"motion": "held",
"family": "string",
"frameAssetIds": [
"string"
],
"controls": {
"defaults": {},
"only": {}
},
"house": true
}
],
"axes": [
{
"id": "string",
"name": "string",
"kind": "slider",
"stops": [
{
"id": null,
"name": null
}
]
}
],
"registerConstraints": {},
"prefs": {
"favorites": [
"string"
],
"defaults": [
"string"
],
"exploreAdded": [
"string"
],
"custom": [
{
"id": null,
"name": null,
"baseId": null,
"deltas": null,
"controlPresets": null,
"frameAssetId": null,
"savedAt": null
}
]
}
}Call it
curl -X GET "https://api.flam.fashion/api/toolkit/postures" \
-H "Authorization: Bearer $FLAM_API_KEY"PUT /api/toolkit/postures/prefs
Star, default, add to Explore, and save her own variations
A PARTIAL merge — an absent key keeps what is stored, so starring one card never wipes her saved variations. defaults is what the automatic lookbook casts when nobody chooses, exactly where variationKey reads today.
A saved variation is BASE + DELTAS, never a copy: correct a house entry and her variation inherits the correction, and deleting hers never touches the house set. Her sentences are ADDED to the base's geometry and never rewrite it.
An id she cannot cast is DROPPED rather than rejected — a star on a retired entry must not lose the eleven that are still good.
A viewer is refused: a read-only seat may read the house's record and does not set what its automatic lookbook casts.
Request body — application/json (required)
| Field | Type | Required | Notes |
|---|---|---|---|
favorites | string[] | no | — |
defaults | string[] | no | — |
exploreAdded | string[] | no | — |
custom | CustomPosture[] | no | — |
{
"favorites": [
"string"
],
"defaults": [
"string"
],
"exploreAdded": [
"string"
],
"custom": [
{
"id": "string",
"name": "string",
"baseId": "string",
"deltas": [
"string"
],
"controlPresets": {},
"frameAssetId": "string",
"savedAt": "2026-07-27T09:00:00.000Z"
}
]
}Responses
| Status | Meaning |
|---|---|
200 | The stored preferences |
400 | BAD_BODY / BAD_IDS / BAD_CUSTOM |
401 | No valid session |
403 | role_cannot_edit_postures |
200 returns:
{
"favorites": [
"string"
],
"defaults": [
"string"
],
"exploreAdded": [
"string"
],
"custom": [
{
"id": "string",
"name": "string",
"baseId": "string",
"deltas": [
null
],
"controlPresets": {},
"frameAssetId": "string",
"savedAt": "2026-07-27T09:00:00.000Z"
}
]
}Call it
curl -X PUT "https://api.flam.fashion/api/toolkit/postures/prefs" \
-H "Authorization: Bearer $FLAM_API_KEY" \
-H "Content-Type: application/json" \
-d '{"favorites":["string"],"defaults":["string"],"exploreAdded":["string"],"custom":[{"id":"string","name":"string","baseId":"string","deltas":["string"],"controlPresets":{},"frameAssetId":"string","savedAt":"2026-07-27T09:00:00.000Z"}]}'