---
title: "Put accessories on a rigged 3D model for Directional Sprites: up to 8 items, each at the `placement` fitDirectionalAccessory returned (or, without one, at the automatic fit plus the same size/move/turn adjustments). Returns `model_url`, one GLB of the model holding them all (kept 7 days): pass it as `model` to createDirectionalSprites, createDirectionalStills or previewDirectionalSprites. When `model` is the URL of one of your 3D models (as listGenerations or create3DModel returned it), the items are also saved on that model (`saved: true`; `save_on_model: false` skips it), so the Ludo web app's Directional Sprites shows them on it. Items the model already had saved stay on it and in the GLB (`kept`), except those held by a bone a new item takes; `keep_saved: false` replaces them all. Free (no credits) and synchronous. Requires an API key (user scope)."
method: POST
path: "/assets/sprite/directional-accessories"
tags: ["Spritesheets"]
---

# Put accessories on a rigged 3D model for Directional Sprites: up to 8 items, each at the \`placement\` fitDirectionalAccessory returned (or, without one, at the automatic fit plus the same size/move/turn adjustments). Returns \`model_url\`, one GLB of the model holding them all (kept 7 days): pass it as \`model\` to createDirectionalSprites, createDirectionalStills or previewDirectionalSprites. When \`model\` is the URL of one of your 3D models (as listGenerations or create3DModel returned it), the items are also saved on that model (\`saved: true\`; \`save_on_model: false\` skips it), so the Ludo web app's Directional Sprites shows them on it. Items the model already had saved stay on it and in the GLB (\`kept\`), except those held by a bone a new item takes; \`keep_saved: false\` replaces them all. Free (no credits) and synchronous. Requires an API key (user scope).

`POST /assets/sprite/directional-accessories`

## Request

- Base URL: `https://api.ludo.ai/api`
- URL: `https://api.ludo.ai/api/assets/sprite/directional-accessories`
- Auth: API key in header `Authorization`
- TypeScript: <https://skmtc.dev/ludo/apis/ludo-ai-api/docs/assets/sprite/directional-accessories/post.ts> (a function with typed inputs; its response is checked against the schema)

## Request body

- DirectionalAccessoriesPayload: Payload for putting accessories on a rigged 3D model
  - `model` string, required: The rigged 3D model, as a URL or base64-encoded GLB file. Up to 30MB. The URL of one of your 3D models saves the items on it too.
  - `items` DirectionalAccessoryItem[], required: The items to put on the model, at most one closing each hand (the first one in it). Items the model already has saved stay on it (see keep_saved).
    - `item` string, required: The item, as a URL or base64-encoded GLB file, as sent to fitDirectionalAccessory. Up to 30MB.
    - `name` string: What the item is, in words; its name when saved.
    - `placement` object: The placement fitDirectionalAccessory returned for this item, unchanged. Without it, the item goes at the automatic fit plus kind/point/bone/size/move/turn/flip/grip, as fitDirectionalAccessory would put it.
    - `kind` 'blade' | 'gun' | 'staff' | 'bow' | 'shield' | 'helmet' | 'hat' | 'back' | 'other'
    - `point` 'right_hand' | 'left_hand' | 'head' | 'back' | 'hips'
    - `bone` string
    - `size` number, float
    - `move` DirectionalAccessoryAxes: Along or about the character's own axes: forward (where it faces), up, and out (away from the body's middle for an item in a hand; to the character's left on the head, back or hips).
      - `forward` number, float
      - `up` number, float
      - `out` number, float
    - `turn` DirectionalAccessoryAxes: Along or about the character's own axes: forward (where it faces), up, and out (away from the body's middle for an item in a hand; to the character's left on the head, back or hips).
      - `forward` number, float
      - `up` number, float
      - `out` number, float
    - `flip` boolean
    - `grip` boolean
  - `save_on_model` boolean: Save the items on the model when it is one of your 3D models. False only builds the GLB.
  - `keep_saved` boolean: When the model is one of your 3D models, keep the items it already has saved, except those held by a bone one of these items takes, and put them in the GLB too (listed in `kept`). False replaces them all with these items.

## Response `200`

Success

- DirectionalAccessoriesResult
  - `model_url` string: The model holding every item, as one GLB (kept 7 days). Pass it as `model` to createDirectionalSprites.
  - `saved` boolean: Whether the items were saved on the model (it is one of your 3D models, and save was not false).
  - `items` object[]
    - `name` string
    - `placement` DirectionalAccessoryPlacement: Where an item is held, exactly. Pass it unchanged to attachDirectionalAccessories.
      - `bone` string
      - `point` string
      - `kind` string
      - `flipped` boolean
      - `grip` boolean
      - `base_scale` number, float: The automatic fit's scale (size 100).
      - `position` number[]
      - `quaternion` number[]
      - `scale` number[]
  - `kept` object[]: The items the model already had saved that it keeps (keep_saved), in the GLB too.
    - `name` string
    - `bone` string

## Other responses

- `400`: Error
- `503`: Fitting temporarily busy, retry in a few seconds

## Changes

- **2026-11-04** `7921d7892dbf`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/ludo/apis/ludo-ai-api/changes/assets/sprite/directional-accessories/post.md)

---

[API](https://skmtc.dev/ludo/apis/ludo-ai-api.md) - [All operations](https://skmtc.dev/ludo/apis/ludo-ai-api/llms.txt) - [OpenAPI document](https://skmtc.dev/ludo/apis/ludo-ai-api/revisions/40c5274c882d?raw)
