Changelog

Everything that has shipped

Newest first, each dated the day it landed. Changes to the API and to the desktop are in the same list, because they are the same product.

Last shipped
Changes
100
Ship days
19
  1. 2 changesLatest

    1. New

      Passes: one model, without credits, for a day or a week

      A pass gives you unlimited use of one model for a day or a week, one job at a time, without spending credits. You buy it once with a card, and it never renews.

      • In the app, Account → Plan & Billing lists the passes on sale — each with its price for a day or a week, where it works and what it covers — and the passes you hold, with the time they have left.
      • A pass for a catalogue model runs it on any plan, Free included.
      • A pass runs one job at a time. In the app, a second job of the same model waits its turn and then runs; through the API and MCP it is refused with pass_busy, and nothing is charged.
      • Through the API, GET /v1/me lists your passes, GET /v1/jobs/{id} and the queue's answer to a submit say when a pass paid for a job, and the X-Auray-Covered-Only header runs a job only if a pass or a promotion pays for it.
    2. New

      The Terms of 11 October say how a pass works

      The Terms are updated to version 2026-10-11, and the desktop asks you to accept them once, the next time you open it. They add how a pass works, and the Privacy Policy adds what your data download says about your passes. Your choice about training stays as it was.

      • You pay once and a pass never renews; buying it again adds its time after the pass you hold.
      • Each pass lists where it works and what it covers; a job it does not cover is treated as if you held no pass.
      • If we pause the model, the paused time is added back. If we stop offering it, or it cannot be used for seven days, the pass ends and what you paid for the time it had left is refunded.
      • Within 24 hours of paying, a pass you have not used is refunded in full when you ask. Any refund, or a dispute of its payment, ends the pass at once.
      • Your data download lists every pass you bought or were given, and every pass checkout you opened.
  2. 8 changes

    1. Improved

      Community cards are their picture again

      On auray.ai and in the desktop, a Community card is its picture again, whole, with nothing over or under it. Its details come when you ask for them, rather than in a caption under the picture.

      • Point at a card, or reach it with the keyboard, to see its title, who made it, the model, its likes and Report.
      • On a phone or a tablet, tap a card once to see them, and again to open it.
      • A Community project's files, Cinema Studio's grid and My Generations work the same way. The tiles in Library and in each app's library are clean too, and show their details when you point at them or reach them with the keyboard.
      • A work's own page carries its AI-generated label, and a screen reader hears it on every card. Cards, the picture a shared link shows, the sheet you publish from and My works show the model's name instead.
      • The hero at the top of the Community, on auray.ai and in the desktop, and the featured band on /models fill their frame with the picture or the clip, with no dark bands around it. Their words stand beside it on a wide screen and under it on a narrow one, where the frame is wide enough to show a landscape whole.
    2. Improved

      Three apps have new names: Playground, Library and Account

      Explore is now Playground, Finder is now Library, and System Settings is now Account. Nothing moved out of reach: your windows, your Dock, your forms, your files and your keys are where they were.

      • Library opens on everything your account has made, from every device, with the folders on this computer below it; Playground keeps every model, its form and your runs.
      • Account holds Profile & Security, Plan & Billing, Usage and API Keys.
      • Under System, Account also holds Appearance, Wallpaper & Boot Screen, Desktop & Dock, Language & Region, Sound, Accessibility, Privacy and About.
      • Spotlight still finds each app by its old name.
      • The API's messages and reference now say Account → API Keys. No field, value or error code changed.
    3. Improved

      Every plan with Photos, Video, Music or 3D makes all of it

      What a plan sets for each of our photo, video, music and 3D models is now three things: whether it includes the model, how many of its jobs run at once and how many drafts you keep. Every plan that includes one makes all of it, and your credits are the limit. Free, Pro, Max and Ultimate already made all of each; now it is the rule for every plan rather than a setting of each.

      • As shipped, all of it is up to four images a photo job at up to 2048 pixels, a clip of up to 15 seconds, a song of up to 300 seconds with vocals, and all five 3D tiers.
      • GET /v1/plans adds limits.music.enabled and limits.threed.enabled, beside photo's and video's. limits.photo.max_images, limits.photo.max_resolution, the max_duration_seconds of video and music, limits.music.lyrics and limits.threed.tiers stay, deprecated, and each says the model's own ceiling — the same on every plan that includes it.
      • No plan refuses an image count, a size, a length, vocals or a tier the model makes, so images_not_in_plan, resolution_not_in_plan, duration_not_in_plan, lyrics_not_in_plan and tier_not_in_plan are retired. Music or 3D on a plan that does not include it is refused 403 plan_has_no_music or plan_has_no_threed before any charge.
      • /pricing and Settings compare plans by whether each includes a model and how many of its jobs run at once; the rows for length, images, size, vocals and 3D tier are gone.
    4. New

      The Terms of 10 October say how a plan paid by the year works

      The Terms are updated to version 2026-10-10, and the desktop asks you to accept them once, the next time you open it. They add how a plan paid for a year at once works. Some of their words changed after they were first published, and you are not asked to accept them again for that: they and the Privacy Policy now say Account, the new name of System Settings, wherever they send you in the desktop, such as to cancel a plan or make an API key; and a published work's AI-generated label is on its own page, its card showing the model and a report control when you point at it, tap it or reach it with the keyboard. No plan is sold by the year yet; a plan paid by the month works as it did, and the rest of the Privacy Policy and your choice about training stay as they were.

      • A yearly plan is paid once for the year. Its credits arrive once for each month of it, from the day of the payment, at the plan's monthly credits as they stand when that month begins.
      • An upgrade during the year adds the difference for the rest of the current month.
      • Cancelling stops the next yearly renewal: the credits keep arriving each month to the end of the year already paid for, and no part of that year is refunded, as with every payment under the Terms.
      • If you answered about training when you signed up and first open the desktop after the change, the sheet asks only for the Terms and keeps your answer.
    5. New

      The desktop can greet you with a gift or an offer meant for you

      When a gift of credits or an offer is meant for your account, the desktop opens it for you after you open the app, on a computer or a phone, and lists it in the Notification Centre with your notifications, at the time it began, where it opens again. A gift says how many of its credits you still have, when to use them by and whether more arrive each month; an offer says what it makes unlimited, and on which plan. Closing one marks it seen on every device you use.

      • One opens by itself each time you open the app — the newest you have not closed. The rest wait in the Notification Centre, counted with your notifications in the menu bar and, on a phone, on More and its Alerts row. Clear All closes every one, as closing it does, and takes them off the list until you next open the app.
      • A gift's Try it now opens the app or model it is for, while your plan runs it, and its API button opens that model's API page in Explore, or your API keys, while your keys may generate.
      • An offer on a paid plan carries Take the offer, which opens Plan & Billing with that plan ringed and a line over it saying the offer is below, and starts no payment. An offer on Free is taken by using what it names, with Try it now.
    6. Fixed

      Publishing a Cinema Studio project works under the Terms you accepted

      Publishing a project to the Community could be refused under Terms you had already accepted, with nothing in the Publish dialog to press. A project is now published under the Terms you accepted, from those of 6 October on, the first that state what publishing a project grants and shows. When yours are older, the dialog shows the current Terms to read and accept in place, and Publish waits for them.

      • On the API, POST /v1/studio/projects/{project}/publication takes terms_version, as a Community publish does: the version you accepted, or the current one when you leave it out, where the field was refused. A version older than 2026-10-06 is refused 428 terms_required, naming the current version, before anything is published.
    7. New

      GET /v1/plans says what a plan would cost by the year

      Each plan on GET /v1/plans now carries yearly_discount_pct — what paying for a year at once would save on twelve months, in percent — and yearly: the year's price in US cents, a twelfth of it a month, the same discount and buyable, or null where a plan has no yearly price. A yearly plan's credits would arrive every month, credits_per_month twelve times. No year can be bought yet: yearly.buyable is false on every plan, and paid plans are sold by the month.

    8. Fixed

      The docs say whether your plan's keys may generate as GET /v1/plans does

      The guides for Cursor and for OpenAI's clients, the errors page and the API's OpenAPI description said a key on Free cannot generate or complete a chat, while Free's keys may: 5 a minute as shipped, as GET /v1/plans and /pricing say. They now name the rule rather than a plan: 403 plan_has_no_api_generate answers a key whose plan has limits.api.may_generate false, or a burst of 0 in the bucket the call spends — generate for a render, interactive for a chat turn or a completion.

  3. 9 changes

    1. Fixed

      The hold for an uploaded clip or video takes effect

      The hold announced on 9 October for an uploaded motion clip or source video did not take effect at first: every such upload was still held at the most a file could be — a 6-second clip on Kling 2.6 Pro at 410 credits — and charged what the job cost. From 16:40 UTC on 9 October it is held for what it is: that clip at 141 credits. An upload of yours that cannot be read at the moment you send it is now refused 503 service_busy before any charge — send the request again — where it was held at the most.

      • An upload that is no longer there — past its three days, or deleted — is refused input_unfetchable, naming the field, before any charge: upload the file again, since sending the same request will not bring it back.
      • A job waiting for a free slot whose upload is gone by the time it starts fails input_unfetchable, and nothing is charged.
      • In the desktop, the figure beside Generate for an uploaded clip or video is the hold the request takes, or the press is refused before any charge.
    2. Improved

      Pictures and clips are drawn whole, with their words under them

      In the desktop and on auray.ai, the pictures and clips below are no longer covered by words or a shade: what is said about each — its title, the AI-generated label, the model, the author — sits in a caption under it, or beside it on a wide screen, as the Community's cards began doing earlier on 9 October.

      • In the desktop: Cinema Studio's grid and its home, My Generations, a library's tiles, Explore's worked examples, the Community's front page, the empty Elements page, and the strip of pictures at sign-in, which names the one under the pointer in the line beneath it.
      • On auray.ai: the Community's hero and the featured band on /models, the front page's moving band and its idea cards, the docs' home, a model's page in the API reference — which now opens on what the model made — the MCP page and a Community project's files.
    3. New

      Cinema Studio makes a project's clips one film

      Every Cinema Studio project now has a Film page beside its canvases. Put the project's clips in order, keep the part of each you want, join each to the one before with a cut or a fade, keep or mute the clips' own sound, and lay one of the project's sounds under the whole film as music at the level you choose — and play the film on the page as you go. Export makes it one video, free: an MP4 at 1920x1080 across or 1080x1920 up, 24 frames a second, each clip fitted into the frame and never stretched, filed with a poster in the project's Film folder, ready to play, download and publish. Use as the project's film makes it the project's cover, to play at the top of the project's page on the Community.

      • A film holds up to 60 clips and runs up to 10 minutes, and a project keeps up to 20 films. Each clip keeps at least half a second of itself — the clip in the project is never cut — and a fade lasts 0.2 to 3 seconds, at most half the shorter clip it joins. The music fades out at the film's end when it runs longer than the film.
      • Ask the AI Director for a film and it lays the shots of its plan out in order as a cut, each with the clip made for it, names every shot that has no clip yet, and exports the cut; it says the film is ready only once the export is done. Laying out and exporting spend no credits; the Director's own rounds are charged as before.
      • The exported video carries the AI-generated label when any clip in it does, and is one of the project's items: an export is refused 409 studio_limit_reached when the project already holds as many as its owner's plan allows.
      • If a clip a film was made of is withheld after a report, the film's video is withheld with it, and so is its publication; a film is not exported while a clip in it is withheld, or held while a report about it is looked at.
      • On a phone, a film's clips are moved and taken out with the buttons under the list, and trims are set on a computer.
      • The API: GET and POST /v1/studio/projects/{project}/films list and start films; GET, POST and DELETE on /films/{film} under it read, change and delete one, the videos it made staying in the project; POST on /films/{film}/exports exports it, and GET on /exports/{export} under that reads the export until it is done. studio:read reads, studio:write changes and exports. A refusal says why: 400 film_invalid names each problem, 409 film_export_running names the export under way, and 503 video_paused while video is paused.
      • Your account's Download a copy now includes your films, their exports and what each was made of.
    4. Improved

      A clip or video you upload is held for what it is

      For Kling 2.6 and 3.0's Copy motion, and for a source video sent to Veo 3.1 or Veo 3.1 Fast, a file you upload — through POST /v1/uploads or in the desktop — is now held for what it is, where every file was held at the most a file could be: an MP4 or MOV motion clip for its own length, rounded up to the next whole second — a clip of exactly 6 seconds is held for 7 — and an MP4 or MOV source of H.264 or HEVC video at most 1920x1080, either way up, at its own size. As shipped, a clip of a little over 6 seconds on Kling 2.6 Pro is held at 141 credits where it was held at 410. Any other file — a WebM, one whose length or size cannot be read, or one sent by any other link, a result of yours among them — is held at the most, as before; credits_quoted says which hold was taken, and the charge is still what the job cost.

      • The price rule of each of the six models says so, and x-auray-price lists it under each input it holds as uploaded: the formats a hold follows, mp4 and mov, and for a size the codecs too, h264 and hevc.
      • A source is held at the size its video decodes at, never at a smaller size its headers state.
      • In the desktop, the composer's quote and the line under Generate match what will be held for an uploaded clip or video, and say when a file is held at the most.
      • A job waiting for a free slot keeps the hold it was quoted when its file cannot be read again for a moment: it waits for the next try rather than failing with price_changed.
    5. Improved

      A catalogue clip or sound says how long it runs

      A clip a catalogue model makes now carries its width, its height, its length in seconds and whether it has sound, has_audio, in the job's assets on GET /v1/jobs/{id}, and a sound its length — read from the file, in every job settled from now on. A field the file does not state reads null, as these do for a job settled before. In Cinema Studio, an item made from a catalogue clip or sound keeps its length, so its trim has a bound, and its card draws the clip at its own shape with its running time.

      • A catalogue clip or sound you publish to the Community carries its length, as one of ours does.
      • Kling Avatar 2.0 Standard and Pro answer expected_seconds 245, and Kling O1, O1 Standard and 3.0 Omni Standard, Pro and 4K answer 195 for a clip, 178 for a video to edit and 218 for reference pictures with no frame pinned, where each answered 150.
    6. Fixed

      A catalogue clip made from your files and a prompt alone can be added to a project

      A clip or picture a catalogue model made from your files, links and a prompt alone — Kling 2.6 and 3.0's Copy motion, for one — has no settings to keep, and that is what refused it: adding it to a Cinema Studio project, POST /v1/studio/projects/{project}/items with its job_id, answered 503 studio_unavailable and asked you to try again, every time, and publishing it to the Community with its prompt shown was refused 400 media_invalid. Both now work as they do for any other result, with no settings shown, and one started inside a project is filed into it.

      • When the Studio cannot keep a change because of a fault on our side that sending it again will not fix, it now answers 500 studio_fault with retry never, where it answered 503 studio_unavailable and asked you to try again in a few seconds.
    7. Fixed

      A MiniMax H3 clip says its size, and its download counts it

      A MiniMax H3 clip finished from this day on carries its size in bytes in the job's assets: GET /v1/jobs/{id} now prints bytes after key for each clip, where it printed none, and GET /v1/jobs/{id}/assets answers the size where it answered null — as a picture, a 3D model and a catalogue model's file already did. So asking for a clip's download links now counts the clip's own size, in whole megabytes, against your plan's daily egress allowance, where every clip counted as one megabyte: a clip of 4,567,459 bytes counts as 5. megabytes_charged in the answer says what was counted, and asking still costs no credits.

      • A clip finished before this day and still kept was given its size later the same day, and its download is counted at that size from then on.
    8. Improved

      A Community card shows its picture whole, with its words under it

      Every Community card, on auray.ai and in the desktop, now draws its picture clean, with its title, the AI-generated label and the model, and its author in a caption under it, at every width; a row of cards starts at the left. On a phone, auray.ai's rows of tabs — the clients and the model kinds on the front page, the agents on the MCP page — scroll inside their bar with the chosen tab in view, and the docs' menu scrolls.

    9. Fixed

      Cinema Studio's Create room gives the keyboard back, and its @ and # list fits

      Closing Cinema Studio's Create room — Escape, Close, a click outside, or Back on a phone — now puts the keyboard focus back on the Create row that opened it, where it could fall out of the window. In the composer, the @ and # suggestion list opens on the side where it fits and scrolls inside itself when space is short, so it is no longer cut off on a phone or under the on-screen keyboard, and the arrow keys keep the highlighted option in view.

  4. 10 changes

    1. Fixed

      GET /v1/jobs/{id} names a catalogue job's model as its submit did

      For a catalogue model's job, GET /v1/jobs/{id} now answers model with the model's address — auray-serverless/klingai/kling-video-2-6-pro, for example — where it answered the model's catalogue id, auray-serverless-klingai-kling-video-2-6-pro; and engine with that catalogue id, the model's id on GET /v1/models, where it answered null. Both now read as the submit answers them, for every catalogue job, those made before the change included. A job of our own models reads as it did.

      • If your code compared a catalogue job's model with the catalogue id, compare engine instead, or compare model with the address you called.
      • The result of a catalogue request on queue.auray.run no longer carries model, which held the catalogue id there.
      • A picture a catalogue model makes now carries its width and height in the job's assets — a PNG, JPEG or WebP, in a job settled from this day on — where both read null.
    2. New

      Kling 2.6 and 3.0 copy a clip's motion

      Kling 2.6 Standard and Pro and Kling 3.0 Standard and Pro now take a picture of a character and a clip, and make your character move as the person in the clip does. In Video and Cinema Studio it is Copy motion, with Character and Motion clip as its two cards; on the API it is inputs.referenceImages with inputs.referenceVideos and providerSettings.klingai.characterOrientation, where a request that sent a clip was refused band_not_priced before any charge. Your character faces as in the clip, from a clip of up to 30 seconds, or as in the picture, from one of up to 10; the prompt is optional, and the clip's own sound can be kept.

      • A request with a clip holds credits for the longest clip Kling takes, 30 seconds, and is charged what the job cost once it settles: on Kling 2.6 Pro a clip of a little over 6 seconds was held at 410 credits and charged 44.
      • Its submit answers expected_seconds 238, about four minutes, where it answered 150.
      • In the desktop, the setting says how long a clip each way of facing takes, and a press whose clip runs longer is held back before any charge.
    3. New

      The JavaScript and Python clients 0.3.0 reach the Community

      @auray/client 0.3.0 on npm and auray-client 0.3.0 on PyPI add platform.community, every operation of /v1/community. Reading a feed, a search, a work with its comments and remixes, a profile with its works, followers and collections, or a collection needs no key; with a key that holds community:write, a client publishes a result of yours, edits or unpublishes it, likes, comments, follows, claims and edits a profile, and keeps collections. A poster, an avatar or a banner is handed over as bytes. Nothing here spends credits, and nothing 0.2 did has moved.

      • Recording a view and reporting a work need no key, and send yours when the client holds one.
      • In Python the methods are on Client and AsyncClient alike, named in Python's way: set_avatar, clear_banner and the rest.
    4. Improved

      A price that is a hold says so, in the desktop and on the API

      Most catalogue models — every one priced by a band or by the token — are charged what the job cost, never more than the quote, and the rest comes back on its own. They now say so: Generate reads up to beside the figure, the line under it says Holds up to so many credits — charges what it costs, and a running job shows what it holds and, once it settles, what it cost. On the API, every address's x-auray-price answers metered — true where the quote is a hold, false where the quote is the charge, as on our own models — and the MCP server's get_pricing and auray.ai/docs/credits say the same.

      • Cinema Studio's AI Director card, its canvas and its run sheet, and Explore, say a hold in the same words.
    5. Improved

      A paused model says why in words you can act on

      A paused model's reason — the message of the 503 model_disabled a submit answers, its reason on GET /v1/models and the line in the desktop's composer — now says that the model is paused, why from your side and to try another model, where most read as notes of ours; nearly every one also says that nothing is charged. A model paused because its price follows the length of the clip or sound you send, for example, now says just that.

      • On a desktop set to Indonesian, a paused model's line reads in Indonesian.
    6. Fixed

      Veo 3.1 is offered as Extend

      Wherever the desktop offers Veo 3.1, it now offers Extend where it offered Edit. Given a clip and a prompt, it plays your clip as it was and continues it with new seconds the prompt steers — which is what it did when asked to edit one — as Veo 3.1 Fast's Extend does.

    7. Improved

      Cinema Studio's home opens its composer in a room of its own

      Cinema Studio's home no longer draws its composer on the page: Create opens it in a room of its own — a line under the hero on the desktop, a bar at the foot on a phone, where My projects now starts on the first screen. A shot's Director's notes and an item's prompt read in plain words wherever you or the AI Director read them, never the field names and tags they are sent with, while Edit, Copy and Recreate keep the exact text the model was sent.

      • A project you can only read draws its composer's options locked and refuses a file dropped on it.
    8. Improved

      New opens the draft you already have, and the Dock keeps Community and Cinema Studio at hand

      New photo, New song, New model and Video's New project open the blank draft already in the list rather than making a second one. A picker for one file opens a room for one, and a room for several keeps what you uploaded there when you switch tabs or open it again. Community and Cinema Studio now stand with Explore and Finder at the Dock's left end.

      • Settings' cards that sit side by side stand one height, and the list a select opens reads in the dark theme.
    9. New

      Cinema Studio is on every plan, with room that grows with the plan

      Every plan includes Cinema Studio and publishing projects to the Community; what grows with the plan is room. As shipped, Free holds 1 project of up to 10 items, 5 elements and 5 canvases, for you alone; Pro 5 projects of 500 items, 250 elements, 15 canvases and 3 people; Max 15, 1,500, 750, 45 and 10; Ultimate 50, 5,000, 2,000, 100 and 30. Calls come with the paid plans, and the AI Director's Auto mode may spend up to 50 credits a run on Free and 20,000 on a paid plan. GET /v1/plans lists every plan's figures as limits.studio and limits.director.

      • GET /v1/studio/plan answers what your plan gives you in Cinema Studio, how much of it you hold and your three fullest projects; it takes studio:read.
      • A plan change never deletes anything: past a lower figure, what you have stays and only new additions wait, and a plan without Cinema Studio leaves your projects readable, downloadable and yours to delete.
      • In a shared project the owner's plan sets the room. A refusal says whose plan decides: 403 studio_not_in_plan with feature — studio, calls or publish — and whose, and 409 studio_limit_reached with limit, max and whose.
      • auray.ai/pricing and Compare plans have a Cinema Studio section, and Settings → Plan & Billing shows your Cinema Studio usage.
      • A locked feature names only a plan above yours as the one that opens it.
    10. Improved

      auray.ai/status shows thirty days of uptime

      Every part of the platform on auray.ai/status now shows its uptime over the last thirty days and a square for each day — point at one, or tap it on a phone, for that day's figure — beside its state now and the incidents open, planned and resolved. GET /v1/status carries the same: uptime_days, and on each component uptime with its percent and one entry per day. A day's figure is lowered by the time the part did not answer, or by the time an incident we posted marked it degraded or down, whichever is longer.

      • measured_by on each component is now always null and is deprecated; it will be removed in a later release.
  5. 3 changes

    1. Improved

      The desktop's apps share one layout, one viewer and one library

      Photos, Video, Music and 3D are now product windows — their places on the left, your library in the centre, the composer on the right — and Music keeps a mini player docked at the foot. One viewer opens every picture, clip, song and 3D model, in the apps, Finder, the Community and Cinema Studio: Space opens it from Finder, the arrows step, Esc closes. Finder can choose several items, drag results into a composer or Cinema Studio, and has a Gallery view. Deleting gives you six seconds to Undo.

      • When a job finishes while you are elsewhere, a quiet notification says so, kept under Made in the Notification Centre.
      • In Messages, an answer that holds a prompt offers Make this in Photos, Video or Music, which hands the words to that app's composer on the model you chose.
      • A catalogue model's job that failed or was stopped offers Try again and Edit prompt where it stood.
      • The menu bar carries each app's commands and their keyboard shortcuts.
      • A credit pack says what its credits make — so many pictures with Krea 2 Turbo or clips with MiniMax H3, at today's prices.
    2. New

      Settings → Usage lists your history, a page at a time

      Settings → Usage now lists your account's history for the period you choose — this month, last month, the last 90 days or the last 12 months — newest first and a page at a time: a job as one row, net of anything returned for it, filtered by product and by what a row was.

    3. Improved

      auray.ai and the docs speak Indonesian

      The site's front page, pricing and menus are available in Indonesian at auray.ai/id, and the docs' menus, search and buttons speak Indonesian too; the guides and the reference stay in English.

  6. 3 changes

    1. Improved

      One composer for every generator, on the desktop and the phone

      Photos, Video, Music, 3D, Explore and Cinema Studio now make things with the same composer. Choose a model family, then its version and a mode — Text → Video, First frame, First + last frame, References, Edit or Extend, where the model offers them — and the composer shows the inputs that mode takes as cards named for what they are. Common settings sit in chips and every other field under More, the price on Generate is the price for what you have set, and ⌘ or Ctrl+Enter generates.

      • A finished result offers its next steps: a clip's last frame as the next clip's first, Extend, Edit or Upscale; a picture to edit, expand, upscale or turn into video; a song to cover or extend.
      • Try again sends the same request as a new job.
      • Where a model can, as Kling 3.0 does, a clip can be written as several shots.
    2. Improved

      A catalogue job you start in the desktop waits for a free slot, and the AI Director keeps your model

      A job you start on a catalogue model in the desktop, or through the AI Director, while every slot is busy now waits in line — uncharged, with how many are ahead, and cancellable — and starts by itself at the price it was quoted; if that price rose meanwhile it ends uncharged with price_changed, and one that waits too long ends uncharged too. Requests through an API key still answer 429 lane_busy when the lane is full, as before.

      • The AI Director never moves a shot to another model on its own — not for a full slot, a refusal or a price — never starts a second card for a shot already queued, running or made, and asks before making a lookalike of one.
      • A Director turn reads in the order it happened, after a reload too.
      • GET /v1/plans lists each plan's AI Director figures as limits.director: whether it is on, its longest reply, the highest Auto cap you may set and how many turns Auto carries on by itself.
    3. Improved

      GET /v1/plans lists a new account's warm-up and the Community's rates

      A new account's warm-up — for how many hours its rate limits run below full strength, and at what share of it — and the Community's rates for comments, reports and publishing are now plan figures, listed in GET /v1/plans as limits.api.warmup, with hours and percent, and limits.community, with comments_per_minute, reports_per_hour and publishes_per_hour.

      • Cinema Studio's batch follows your plan's images per job, limits.photo.max_images.
  7. 5 changes

    1. New

      Cinema Studio: plan and make a film in one project

      Cinema Studio is a new app for making a film in one place. A project holds folders of pictures and clips, a Trash and a written brief; elements keep a character, a place or a prop you can call into any prompt with @, and saved palettes and lighting come back with one press. Its composer sets a shot up as a film is set up — the camera and its move, a palette and the lighting — and writes them into the prompt as notes you can read and change. My generations gathers everything you made. A project and everything in it is kept until you delete it, not for three days.

      • MiniMax H3 can now start a clip from a picture — first_frame_path, at no extra cost — or hold a subject from up to nine reference pictures in reference_image_paths, charged the reference multiplier GET /v1/plans lists in price_keys as video.reference_multiplier_pct. A first frame and references are not taken together: start_frame_with_references.
      • A finished H3 clip reports the seed it rendered with; sending it back with the same prompt and settings renders the same clip.
      • The API: /v1/studio — projects, folders, items, Trash, briefs, elements, presets and uploads — with the new studio:read and studio:write scopes, which Settings offers unticked. Send studio, with a project_id and a folder_id, beside any model's input, and the result is filed into that project when it succeeds.
      • The Terms and the Privacy Policy, version 2026-10-05, say that a project and its elements are kept until you delete them.
    2. New

      The AI Director plans a film with you and makes its shots on the models you choose

      Every Cinema Studio project now has an AI Director at its side. Ask it to write the brief, plan the shots, make elements, or start pictures and clips: it reads the project, finds any model by the name the app shows, and every generation it proposes is a card with its price that starts only when you approve it — or by itself in Auto mode, up to a cap you set for the whole run. It works on the canvas you have open, reads a picture before making a card from it, says why a generation failed and what happened to its credits, and is where you left it after a reload.

      • Its rounds are charged in credits as a chat turn is and listed as AI Director in Usage; what it generates is charged at each model's own price. GET /v1/usage lists it as director.
    3. New

      Work on a Cinema Studio project together, lay it out on canvases, and publish it

      Invite people to a project by email or link, give each a role, take requests to join and hand the project to another member. Members see who is there, chat as a team, comment on a picture or a moment in a clip, mark items as reviewed, and start a voice or video call inside the project; each pays for their own generations. Canvases lay a film out as nodes — a prompt, an image, video or voice and music generator, an upload, an upscale or an edit — joined by links, and running a node or the whole board shows its price and asks first. A whole project can be published to the Community as one work, at auray.ai/@handle/projects/{slug}, and withdrawn at any time.

      • The API: members, invites, access requests, ownership, comments, reviews, team chat, calls, canvases, usage and publication under /v1/studio/projects/{project}, with /v1/studio/invites, /v1/studio/access-requests and /v1/studio/notifications.
      • A project's usage can be read by member, model and day.
      • Before you delete your account, the deletion sheet opens each shared project you own so you can hand it to another member.
    4. New

      Credits can be bought in packs, without changing plan

      A paid plan can now buy credit packs in Settings → Plan & Billing: 250 credits for $10, 750 for $27 and 2,000 for $70. Bought credits join your balance, are spent after your plan's credits and any promotional credits, never expire and stay yours after a subscription ends; if a purchase is refunded or disputed, only the credits bought with it that are still unspent are taken back.

      • When a composer runs out of credits, it offers Buy credits wherever Settings will sell you a pack, and Compare plans everywhere else.
    5. Fixed

      Model lists show only models that run

      Catalogue addresses that no service could run are no longer listed — in GET /v1/models, /openai/v1/models, the MCP server, auray.ai/models and every model picker in the desktop — and GET /v1/catalogue no longer names them. Called directly, one still answers 501 model_not_connected, and nothing is charged. Models that could not be priced before they run, or answered no request, are paused: they answer 503 model_disabled before any charge. GET /v1/catalogue goes on listing, each with its status, the paused addresses and those no published document describes.

  8. 2 changes

    1. New

      The Community: publish what you make, follow the people who make things, and remix their work

      A new Community app on the desktop, and a Community tab in Photos, Video, Music and 3D, show what people have published: images, clips, songs and 3D models. Publish one of your results from where you made it, with a title, a description and, if you choose, its prompt; it is on your profile and at its own link at once, and in the public feeds once our team approves it. Every published work shows the model that made it and an AI-generated label. Recreate, Animate, Upscale or Edit a work to make your own from it — you pay for that generation at the model's own price, and the original is credited. Published works are kept until you unpublish them, not for the three days ordinary results are kept.

      • Public pages on auray.ai: the Community at auray.ai/community, each work at auray.ai/s/{id} and each profile at auray.ai/@handle, in English and Indonesian.
      • Claim a handle for a public profile with a name, bio, avatar and banner; follow people, like and comment, save works to collections, and pin up to three of your works to your profile.
      • Report a work, a profile or a comment wherever it is shown, with or without an account.
      • The API reads feeds, search, works, profiles, comments and collections with no key: GET /v1/community/feed takes sort — trending, new, top over a window, or following — kind and model, or featured for the works our team features. Publishing, liking, following, commenting and collections take a key with the new community:write scope, which Settings offers unticked.
      • POST /v1/community/publications takes licence: true and the Terms version you accepted, which grant the display and remix licences the Terms state for that work; words the automatic check refuses answer 422 text_refused, and nothing is published.
      • The MCP server's new search_community tool finds published works and public profiles.
      • An unpublished work leaves its link, your profile and the Community within a few minutes. The Terms and the Privacy Policy, version 2026-10-04, say what publishing grants.
    2. Improved

      The desktop has a new look

      The desktop now wears the site's look — a black ground with lime as the accent, set in Space Grotesk and IBM Plex Mono — its icons move when you point at them, and the app tiles in the Dock are new.

  9. 1 change

    1. Improved

      The docs are part of auray.ai, and every request in them is printed in up to eleven languages

      auray.ai/docs now wears the site's look, with tabs for the guides, the API reference, models, the clients, MCP and the desktop, and a page for every model address that names its maker and what it makes, with the address to copy. Every request is printed in up to eleven languages — cURL, Python, JavaScript, Go, PHP, Ruby, Java and C#, and, wherever one covers it, both official clients and the MCP call an agent sends — and the language you pick is remembered from page to page.

  10. 5 changes

    1. Fixed

      A request our service never received is refunded at once

      A submit our image, music, video or 3D service never received is now refunded at once and answers 502 dispatch_lost with Retry-After, where the credits could be held for up to twenty minutes.

      • An image a catalogue language model could not download is refused input_unfetchable, naming the part of your request it came from — 400 on /openai/v1, with param set, and 422 on queue.auray.run and auray.run — where it answered 502 upstream_refused.
    2. Improved

      auray.ai/status now covers chat, Code, the model catalogue and the OpenAI-compatible API

      Chat, Code, the model catalogue and the OpenAI-compatible API, which read “Not monitored”, now show their state like every other part, on auray.ai/status and in GET /v1/status.

      • Since 30 September, the queue reads as down only when nothing in it is moving, not while a normal backlog waits.
      • Since 1 October, a visit to the page no longer shows a board kept from an earlier visit, which after a quiet spell could be more than half an hour old.
    3. Improved

      @auray/client 0.2.2 loads with require()

      @auray/client 0.2.2 on npm carries a CommonJS build beside the ES modules, so require() of @auray/client works on every Node and TypeScript finds its types under CommonJS settings. When run() gives up, the error's cause is the server's own 504 run_timed_out.

    4. Improved

      A video's progress rises as it renders, and a failed one names its cause

      A clip's progress now rises with its render, where it could read the same figure for minutes, and a failed video names its cause in error_code — generation_timeout or empty_result, for example — where it read unknown_failure.

    5. Improved

      The sign-in screen comes with the first paint, and the model picker works from the keyboard

      The desktop's sign-in screen now arrives in the page itself rather than after the app has loaded, so it shows with the first paint. In the model picker, the makers are one Tab stop whose arrows choose a maker, and the down arrow in its search steps into the models.

      • A draft whose save your plan refused says why on its row.
  11. 10 changes

    1. New

      The OpenAI-compatible API answers the Responses API and legacy completions

      POST /openai/v1/responses and POST /openai/v1/completions now answer OpenAI's Responses API and its legacy completions. Each request becomes one chat completion — admitted, priced, run and charged exactly as /openai/v1/chat/completions is — and is answered as a response object or its streamed events, or a text_completion or its chunks. The AI SDK's @ai-sdk/openai at its defaults, the OpenAI Agents SDK, openai-python's responses and completions, LlamaIndex's OpenAILike and LangChain's structured output run against https://api.auray.ai/openai/v1 unchanged.

      • What needs a stored response — previous_response_id, conversation, a stored prompt, background — and what changes a completion's meaning — suffix, echo, best_of, logprobs, more than one prompt — is refused 400 before anything is priced.
      • A turn on our chat slots may now run up to 800 seconds, on /v1/chat and /openai/v1 alike, and /openai/v1/models prints each slot's output ceiling.
      • On our chat slots, a tool_choice of required or one named tool is enforced, and a turn that ends without the call answers 422 tool_choice_unmet; response_format json_object and json_schema come back as parseable JSON or 422 response_format_unmet; and a format sent beside tools is refused 400 before any charge.
    2. Improved

      Every catalogue model publishes the rules between its fields, and GET /v1/catalogue says which addresses run

      A catalogue model's contract now carries the rules that hold between its fields — one of two is required, one only with another — as JSON Schema in x-auray-rules, and in words on its reference page and in llms.txt. They are checked before anything is charged: for now a request that breaks one is still served, with a Deprecation header, and once enforcement starts it will be refused before any charge. GET /v1/catalogue, which takes no key, now lists every address with its status — connected, described, undescribed, paused or retired — so a page or an agent can tell what runs before submitting.

      • Limits on a file a model takes — a resolution, a length, mono audio — are published in x-auray-media and in the field's note.
      • When you name no size, the API now sends the documented size a model needs, as the desktop's form always did.
      • An address no published document describes answers 404 model_not_described before anything else, where it answered 501 model_not_connected.
      • Every published address answers on queue.auray.run and auray.run whatever its first segment, where some answered 404 path_not_found.
      • A data: URI where a file is expected is refused by name, with where a local file goes instead.
    3. Improved

      Every catalogue model publishes the rule it is priced by

      Every catalogue model now publishes, in credits, the rule its price follows — by the seconds, megapixels, characters or steps a request asks for — on its reference page and as x-auray-price.rule in its contract, so a price can be worked out before you submit.

      • A request beyond every size or length the rule prices is refused 422 band_not_priced before anything is charged.
      • Since 2 October, a catalogue language model publishes its rule too: credits per million tokens of the prompt and of the answer.
    4. Improved

      A textured 3D model costs 13 credits, and a rigged one 17

      A textured 3D model now costs 13 credits, where it cost 22, and a rigged one 17, where it cost 26. Geometry alone (5) and the two controlled tiers (32 and 36) are unchanged. GET /v1/plans lists the prices in price_keys as threed.textured and threed.rigged.

    5. Improved

      The MCP server answers before an agent's client gives up

      run_model and chat now answer within forty seconds — fifty at the most — with the result, or with the job or the turn to follow under an idempotency key the answer names, where they could hold the connection until an agent's client gave up on a job it had paid for. A new tool, read_chat, reads a turn or a whole conversation back, and the model tools give addresses the other tools accept.

    6. Fixed

      A replay is answered while your lane is full, and a long song prompt is refused before the charge

      Resending the idempotency key of a job that already exists is answered with that job even while your plan's lane is full, where it answered 429 lane_busy or too_many_jobs; a job still waiting in the queue is answered with replayed: true and its queue_position, and nothing is charged. A song whose prompt and lyrics come to more than 5,000 tokens is refused prompt_and_lyrics_too_long, with tokens and max_tokens, before the price or the charge.

      • A catalogue completion that outlives the 300-second /openai/v1 connection answers 504 run_timed_out with x-should-retry: true and Retry-After: 1; sending it again is handed the same running job, charged once.
      • Continuing a chat thread after its three days answers history_scrubbed: true, and a scrubbed message is left out of the thread rather than read as empty.
      • A cancel sent while a job is still being sent to its model is honoured, and a cancel on queue.auray.run that loses the race to a finishing job answers already_completed.
      • On /openai/v1/embeddings, an automatic retry under the same Idempotency-Key is neither charged twice nor refused for good.
      • A file a catalogue model could not fetch — from a host that refuses it, sends nothing or answers with a page — answers 422 input_unfetchable on queue.auray.run and auray.run, naming the field, and the charge is refunded, where the job waited until it failed as stalled.
      • An instrumental now lasts at least nine tenths of the length you ask for.
      • GET /v1/usage answers a period too large to read with 413 usage_window_too_large, and Settings → Usage asks for a shorter one, where it answered 503 usage_unavailable and said to try again.
      • When GET /v1/plans answers on a fallback because part of it could not be read live, X-Auray-Fallback says which part.
    7. Fixed

      A webhook endpoint paused after repeated failures keeps its events

      An endpoint that ten failures in a row have paused no longer loses the events sent while it is off. They wait, and once the endpoint is active again they are delivered oldest first, a few seconds apart; an event older than three days is dropped rather than delivered late.

    8. Fixed

      The clients 0.2.1 follow a long job to its end

      queue.streamStatus — stream_status in Python — now reopens the status stream the server closes after about five minutes, until a frame says COMPLETED, so a loop over a long render no longer ends while the job still runs. run() follows a 504 run_timed_out whose job is still waiting uncharged in the queue, instead of leaving it to be charged when it starts.

      • In @auray/client, platform.chat.turn and platform.jobs.assets take a signal, so a caller that hangs up can end a turn.
    9. Fixed

      A Code turn runs to its end even if you close the tab

      A Code agent turn now runs to its own end whoever is watching: a reload, a closed or backgrounded tab or a dropped connection no longer stops it, and the panel follows the running turn until it settles. Stop is honoured at any moment of a turn, even before it has started.

      • Since 30 September, Code starts a sandbox by itself only in Auto mode and only after a turn that finished — not in Ask first or Plan, and not after a failed or stopped turn.
      • Code's connectors offer only the services that can actually sign in.
    10. Fixed

      Log Out signs out this browser only, and catalogue audio and video keep playing past their link

      Log Out now signs out this browser only; Sign out everywhere, in Settings, ends every session. The desktop now signs a catalogue model's audio or video again before a play, a seek or a download, so a result stays playable and downloadable past its fifteen-minute link.

      • On the phone, Back and Done close the top sheet or picker rather than the pane beneath it.
      • A locked account's sign-in screen says that it is locked, with our team's note.
      • Every picture of a Finder photo card downloads, not only the first.
      • A storyboard whose style is long can make its character sheet again — the style is shortened to fit — and pressing again does not charge the sheet twice; a storyboard re-render that fails or is stopped keeps the film it was replacing.
  12. 5 changes

    1. Fixed

      Embeddings decode in every OpenAI client, and a chat turn is charged for what reached you

      /openai/v1/embeddings now answers encoding_format base64 as the little-endian float32 bytes the OpenAI clients decode — openai-node and LangChain JS read the earlier answer as vectors of zeros — honours dimensions by cutting and renormalising, and streams a large batch instead of failing after it was charged. A chat turn whose connection closes is stopped and charged for what reached you, and a turn that produced nothing at all is refunded whole.

      • POST /v1/chat honours the Idempotency-Key header, as the other chat doors do; where a body key is sent too, the body's wins.
      • A retry on /openai/v1 sent without an Idempotency-Key is handed the same job for ten minutes instead of starting another.
      • A long conversation with our chat slots keeps its newest messages — the newest 400 as context and 500 on screen — instead of its oldest. One long paste or answer is shortened rather than erasing every turn before it, and an answer that was cut short goes back as context marked as cut, so asking for the rest works.
    2. Fixed

      Webhooks arrive when the job finishes, and an unfinished result says so

      The webhook for a catalogue job, a run on auray.run, a cancel or an /openai/v1 request is now sent as the job settles, where it could wait up to five minutes, and your endpoint has the ten seconds the docs state to answer before a delivery counts as failed. Reading the result of a job that has not finished answers 400 request_in_progress with its status, Retry-After and the job's three URLs, where it answered 200.

      • A webhook URL naming an IPv6 literal is refused at registration with its reason, where registration failed with an empty 500.
      • A 504 on auray.run says whether anything was charged and carries X-Fal-Request-Timeout-Type, so @fal-ai/client no longer resends it and pays again; auray.run refuses a tier that cannot finish inside your wait before anything is charged.
      • Parallel requests inside your plan's own burst are no longer refused 429 rate_limited while RateLimit-Remaining still shows room.
    3. Improved

      A catalogue language model is quoted at what the call can cost

      A call to a catalogue language model now holds what it can cost — its prompt with the tool schemas and documents, and the whole answer you asked for, 8,192 tokens when you name none, at that model's own rates — and is charged what the call actually used. A one-word answer from GPT-5.4 Pro holds 8 credits where it held 698, answers are no longer cut short of what the model allows, and a long conversation is quoted rather than refused: prompt_exceeds_ceiling is gone.

      • A model that spends its whole max_tokens thinking and answers nothing is refunded, as output_limit_reached.
      • A catalogue job that will never finish is closed and refunded at ten times its model's usual time, instead of after two hours.
    4. Fixed

      A seed is checked before the charge, songs appear when they finish, and a 3D job no longer hangs

      Photo, music and 3D refuse a seed they cannot use — negative, fractional, text, or above 2,147,483,647 — with seed_out_of_range before anything is charged, where it was swapped for a random one afterwards. A song is shown as soon as it is done rather than at ninety seconds. A 3D job that stalls is retried and, if it cannot finish, fails and is refunded instead of hanging for an hour.

      • A picture 3D cannot use — empty, not an image, too small, too large or fully transparent — is refused 400 image_unreadable with its reason, before any charge.
      • A failed video says, in our words, that it failed and was refunded.
      • Photo and music no longer refuse everyday prompts such as LED strip, komik strip or sounds like rain as a person's likeness or a copied voice; asking for a named person's likeness or voice is still refused, and lyrics are no longer read as a request to copy anyone's voice.
    5. Fixed

      Docs search answers again

      Searching the documentation answered nothing from 18 September; it answers again, on the site and through the MCP server's search_docs.

  13. 3 changes

    1. Fixed

      Code's agent keeps working past a minute

      A Code turn no longer ends after 43 to 59 seconds with “BodyStreamBuffer was aborted”: the agent runs for as long as its turn needs, and a Stop button ends it when you want. A turn that was cut short says so and offers Continue, and the next turn is told where it stopped.

      • The file tree follows the agent's writes as they happen and opens each file it changes, and a turn that built something without leaving it running runs the project as Run does.
    2. New

      auray.ai is rebuilt, and every model has its card at auray.ai/models

      The site's front page, pricing, help, status, blog and changelog are redrawn in one look. auray.ai/models shows every model as a card you can filter by kind and maker or search, with what each is for and a link to its page in the API reference, and auray.ai/mcp shows how to connect an agent.

    3. Improved

      GET /v1/plans says whether a plan includes Photos, Chat and Code

      Each plan now says whether it includes Photos, Chat and Code, as it already said for Video: GET /v1/plans lists them as limits.photo.enabled, limits.chat.enabled and limits.code.enabled, and a photo submit on a plan without Photos is refused 403 plan_has_no_photo before anything is charged.

      • Compare plans now leads with every model and what each plan runs.
  14. 6 changes

    1. New

      The MCP server has its own address: mcp.auray.ai/mcp

      Point an agent at https://mcp.auray.ai/mcp with your API key; api.auray.ai/v1/mcp keeps answering exactly as before, so nothing already set up has to change. Three tools join the ones it had: chat, one turn with a chat slot or a catalogue language model; embed; and get_account, your plan, balance and key, and your usage on request. search_models filters by kind, so the chat slots and the embedding model can be found, and submit_job takes priority, max_queue_length and request_timeout_seconds.

      • It speaks protocol revision 2026-07-28 beside the 2025 revisions.
      • Every tool error carries retry and charged, as the API's errors do, and a malformed idempotency_key, input or webhook_url is refused as invalid_arguments before anything is sent.
      • In the desktop, each model's Usage tab shows the same call four ways: cURL, Python, JavaScript and MCP.
      • A request carrying an Origin header — one sent from a browser page — is refused 403 browser_origin_refused, with a key or without, and a client speaking the 2025-03-26 revision may send a batch of up to 20 messages.
    2. New

      Two-step verification, and API keys with an expiry and a monthly cap

      In Settings, Sign-In & Security turns on two-step verification with an authenticator app; from then on, signing in asks for its code as well. The same card lists where you are signed in and ends any of those sessions, and Sign out everywhere can revoke your API keys too. A new API key can be given the day it expires and a monthly spending cap that follows your plan or is a figure of its own, which you can change later; each scope and webhook option now says what it does.

      • Google and GitHub sign-in can be linked to, or unlinked from, an account whose address is confirmed, and Connected services disconnects a service you signed in to.
      • Plan & Billing is now four sections — Your plan, Credits, Change plan and a comparison — and a refusal is shown under the control that met it.
      • Settings has a search that finds a row by its name.
      • A cap our team set on a key is shown as ours: you can lower it, and raise it again as far as that figure.
    3. New

      The JavaScript and Python clients 0.2.0 follow each refusal's advice

      @auray/client 0.2.0 on npm and auray-client 0.2.0 on PyPI resend a refusal only when its own advice says so — retry same_key or after_retry_after, with no charge standing — where 0.1 resent every 429 and 503. A wait is sized by the server's give_up_after_seconds rather than a fixed twenty minutes, so a long render is no longer reported as timed out while it runs on charged. AurayError carries retry, charged and errorType (error_type in Python).

      • storage.upload names the address a file is for and answers send_as; embeddings.create calls the OpenAI-compatible embeddings; platform.chat starts a thread and reads threads back; and platform.plans(), catalogue(), status() and changelog() need no key.
      • jobs.list filters by product, model, settled and status, and a submit can send a maximum queue length and a request timeout.
      • 0.1.1 on npm is deprecated: it could not be imported. Use 0.2.0 or later.
    4. Improved

      Free credits go to a confirmed email address

      Signing up with an email address and a password now sends a link to confirm it, and the account's Free credits, and credits from any campaign, wait until the address is confirmed — once for each inbox. Sign-ups from disposable email domains may be refused.

      • If someone registered your address without confirming it, signing in with Google or GitHub on that address takes the account back: every other way in is removed, its API keys are revoked, its webhooks are turned off and its two-step sign-in is removed.
      • A credit campaign can give credits once or every month; your plan card and GET /v1/me say what a campaign gave and when those credits expire.
      • Announcements appear in the site's top strip and in the desktop's Notification Centre, in English and Indonesian.
    5. Improved

      Every app agrees about your plan and says in one line why Generate waits

      The desktop and the phone now agree about your balance, your plan and what it opens, in every app. Every composer says in one line why Generate will not run, and a locked option names the plan that opens it; on the phone, a product your plan does not include wears a lock and opens the plans.

      • Deleting works the same way in every app: a job still running asks you to stop it first, and a finished result's files, and the uploads only it used, are normally deleted within minutes rather than at the end of its three days.
      • The Library opens a result where it is — a clip or a song in the player, a 3D model in the viewer — with Open in its app and Reuse settings.
      • A new 3D draft starts on the cheapest tier your plan allows.
      • Menus and pop-overs work from the keyboard and with a screen reader.
    6. Improved

      Explore's forms follow your account

      What you type into a model's form in Explore is now saved to your account rather than to one browser, so it is there when you sign in on another device. If two devices changed the same form, you are asked which version to keep. Explore is called Explore everywhere in the desktop.

      • How many forms an account keeps is a plan figure, limits.external.max_drafts in GET /v1/plans.
  15. 8 changes

    1. Improved

      A plan's credits arrive with the payment for each billing period

      A paid plan's credits are now granted once for each billing period, when that period's payment goes through. An upgrade is charged at once and adds the difference in credits for the part of the period that is left; a downgrade or a cancellation takes effect at the end of the period you have paid for.

      • If a renewal payment fails, you keep your plan for three days while the card is retried, with no new credits until the renewal is paid; if it stays unpaid, the plan ends at our first daily check a day or more after that.
      • A fully refunded subscription payment takes back the credits that remain from its period, and ends the plan if it paid for the current one; a partial refund takes back the same share. Credits already used are never charged back, and credits bought separately are never taken.
      • While a dispute of a payment is open, the credits that remain from its period are held; a dispute that ends with the money returned to you takes them back and ends the plan, and one decided in our favour gives them back.
      • Checkout no longer takes promotion codes: an offer applies by itself to an eligible paid invoice, and each person holds one place in an offer.
      • Your data export, in Settings → Account → Your data, lists your billing periods and any credits taken back after a refund or a dispute.
    2. Improved

      Your account keeps its language, and the Terms and the Privacy Policy read in Indonesian too

      Your account now remembers whether it reads English or Indonesian: the desktop takes the account's language at every sign-in, on any device, and saves every change you make in Settings. The Terms and the Privacy Policy are published in both languages as one version, 2026-09-27, and the version you accept is recorded with your acceptance.

      • Every error in the apps now says in one sentence what happened to your credits: returned after a failure, nothing charged for a refusal before the charge, or held until a job we could not confirm answers.
      • Figures, prices and durations in the desktop are written the way your language writes them.
    3. Improved

      What our services keep about a job now ends after three days

      The services that make your images, songs, videos and 3D models now keep a job's record, and the short excerpt of a prompt they refused, for at most three days, and a link they sign lasts a day. Deleting a photo now erases its images where they were made, not only from your Library.

      • When you delete a Code project, or it is archived after a while unused, its files — source, environment files and build output — are deleted once nothing is running in it.
      • Closed support conversations, and mail that reached no conversation, are deleted on the windows the Privacy Policy states.
      • A 3D draft keeps the picture it was made from for as long as the draft uses it, and a draft whose picture has gone says Image expired — attach it again, instead of failing.
    4. New

      GET /v1/changelog answers this changelog as data

      GET /v1/changelog answers the entries on auray.ai/changelog — each with its date, kind, title, summary and points, newest first — with no key and no charge. A read that fails answers an empty list with degraded_source: true rather than an error.

      • A withdrawn entry is never listed, and an entry is frozen when it is published: a figure it quotes is what was true that day.
    5. Improved

      Every refusal says whether to retry and whether you paid, and a key's scope says what it may make

      Every error body on /v1, queue.auray.run, auray.run and /openai/v1 now carries error_type, retry and charged beside the code, and x-should-retry: false wherever sending the same request again cannot help or may pay twice. A key's write scope now names what it may make, wherever it is made: image:write, video:write, audio:write, 3d:write and text:write each reach every address of their kind, whoever publishes it, and Settings mints these from now on.

      • Every older scope keeps reaching exactly what it reached. A key that held video:write without external:write — our video address alone — now shows auray-ai-video:write, which reaches that one address, so it did not gain the catalogue's video models when video:write became the video kind. insufficient_scope lists accepted, every scope that would have done.
      • POST /v1/uploads takes the address the file is for and answers send_as, the field to send it in. Naming a product still works and answers a Deprecation header, and a key minted with the kinds uses product external too, for the kinds of file some address of its kinds takes — a mesh needs 3d:write — so a 0.1.1 client, which can name only the product, still uploads with a key minted today. Product video, which no published address reads, answers only the keys that used it — auray-ai-video:write, or video:write beside external:write — and not the video kind alone. Reading an upload back still asks for a scope that may upload it, never assets:read alone: through the address on the read link, any scope that may upload for that address, for a file of a kind that address takes, which is often more than the kind it makes — a language model takes images, video, audio and documents; through product, the scopes that upload took; naming neither address nor product, only the buckets whose own scope your key holds — the catalogue models' with external:write and, new, 3D's with 3d:write or threed:write — so a key minted with a kind alone keeps the query the read link carries.
      • Our own four addresses check a body against their published inputs. A field they do not publish, or a value outside its range, is still served for now, with a Deprecation header linking to the error it will become; once enforcement starts — no sooner than a month after those warnings began — it is refused 422 unknown_field or bad_value before anything is charged. num_outputs on auray-ai/minimax-h3 is one of them.
      • credits_charged is what the ledger says a job cost after any refund, everywhere it is printed, beside credits_reserved; a job carries job_id on every host, and model is the address you submitted to.
      • credits_charged and credits_remaining on a chat turn, and credits_charged on a cancel, are null beside settled_unknown: true when the ledger or the wallet could not be read, where they were 0 — the turn or the cancel still happened, and GET /v1/jobs/{id} answers the figure once the ledger does. A client typed from the earlier reference, which gave them as integers, should accept null there and not send the request again.
      • A webhook event is sent for every job but a chat turn, whoever stopped it: a catalogue model's job, a job that timed out, one our team closed, a waiting job you cancelled. Every event carries error_code, credits_charged and credits_reserved.
      • /openai/v1/chat/completions takes Idempotency-Key, so a resend is never a second charge, and /openai/v1/embeddings is documented. A chat thread can be read back at GET /v1/chat/conversations with a key minted with chat:read, a new scope Settings offers unticked; text:write and the older chat:write submit turns and start threads and do not read one back. GET /v1/usage answers the same usage document Settings shows, by window and as CSV.
      • A submit answers give_up_after_seconds, the longest its job may wait and run, and every read of an open job repeats it.
    6. Improved

      Every model says how its jobs live, what it makes and where it may run

      GET /v1/models gives each address a lifecycle — whether a full platform queues it, what a stop does, whether and how long you may wait on it, how often to poll, when a silent job is reaped and how long one usually takes — beside modality, what it makes, licence, the territories it may not be served in when it has one, and presentation. The figures are each model's own where we set them, so a quick image model and an hour-long video model no longer share one profile.

      • A queue option — max_queue_length or X-Auray-Priority — sent to a model that does not queue is refused 422 queue_not_offered before anything is charged, where it used to be ignored; X-Auray-Request-Timeout is accepted there and has nothing to bound, because such a model starts at once or refuses at once. Every catalogue model refuses when full today; lifecycle.queue says which.
      • lifecycle.cancel says what a stop does: nothing for a model that cannot be stopped (none), a full refund on a photo (full), or the part already rendered kept and the rest refunded on a song, a film or a 3D model (keeps_progress).
      • Music jobs report poll_seconds of 5, where they were polled every 20.
      • Our three chat slots answer to an address as well, auray-ai/<slot>, on POST /v1/chat and /openai/v1, beside the name GET /v1/models?kind=chat lists them by.
      • A new scope, text:write, runs every model that answers in text — the chat slots and the catalogue's text models — and nothing else. A key minted before it keeps what chat:write and external:write reached.
    7. Improved

      Plans open catalogue models by what they make

      A plan's catalogue rights are now what it may run by output, and the most one catalogue job may cost on it: GET /v1/plans lists both as limits.external.modalities and limits.external.max_job_credits. Free runs the catalogue's image and text models; its catalogue video, audio and 3D are shut, as ours are. Every paid plan keeps everything it had.

      • A model the plan leaves out is refused 403 model_not_in_plan, naming the model and the plan, and a job over the plan's ceiling 403 job_over_plan_ceiling with both figures. Nothing is charged for either.
      • The catalogue's MiniMax H3 (and its LoRA trainers), MiniMax Music, Krea 2 and Hunyuan 3D follow the same plan rules as Video, Music, Photos and 3D.
      • Every Hunyuan 3D model carries the Hunyuan licence: 428 region_required until the account declares its country, 451 region_blocked where the licence excludes it.
    8. Fixed

      A catalogue job's safety controls and delivery stay ours

      A catalogue model's own safety controls are sent no looser than that model's default: a content check you switch off is sent on, a permissiveness above the model's default is sent at its default, and a filter level word looser than the default, or one whose order is not published, is sent as the default. A permissiveness at or below the default, and a stricter documented word, such as safety.mode full, are sent as asked. A field you leave out keeps the model's own default. Each model's reference says the floor beside every field where it can move a value.

      • A field that would send the result somewhere else — webhook_url, callback_url, notifications.webhookUrl, a Cloud Storage folder, an S3 destination — is refused 422 bad_value: your result reaches you through GET /v1/jobs/{id} or your webhook. The fields are gone from the published references.
  16. 3 changes

    1. Improved

      GET /v1/plans lists every limit a plan sells, and chat has a rate bucket of its own

      Each plan's limits now carry every figure we enforce on it, typed in the API reference: images and resolution per photo job, jobs at once per product, drafts, chat and agent ceilings, Code machines, API keys and webhook endpoints, and every rate bucket an API key and the desktop session are paced by. They are the figures in force, so a change we make to a plan shows here within a minute.

      • Chat turns and language-model calls spend a new interactive bucket — /v1/chat, /openai/v1/chat/completions and /openai/v1/embeddings — instead of generate, with the same numbers generate has on every plan, so a chat client no longer slows your renders. RateLimit headers and GET /v1/usage report it. On Free it is empty, as generate is: 403 plan_has_no_api_generate, with bucket interactive.
      • GET /v1/usage reports each bucket at the strength your account is admitted at today — a fifth for its first day — and says when that first day ends in warmup_ends_at.
      • limits.video.upscale_2k is gone with the 2K pass, which is retired, and upscale_2k is no longer a documented parameter of auray-ai/minimax-h3. A video submit that still sends upscale_2k: true is refused 403 upscale_not_in_plan on every plan before anything is charged, as it already was; upscale_2k: false changes nothing.
      • limits.video.enabled says whether a plan renders video at all; limits.video.tiers stays, derived from it.
      • Catalogue models run one job at a time on Free, where they ran two; every paid plan keeps two.
    2. Improved

      A paused model says so before you submit, and why when you do

      GET /v1/models answers paused for a model a submit would refuse — its product is paused or it is paused itself — with the code a submit would answer and, as reason, the sentence we wrote for it when we wrote one; and retired, with the successor, for an address that answers 410. A submit to a model paused on its own answers 503 model_disabled with our sentence and the address you called, and nothing is charged.

      • model_disabled and vendor_disabled send x-should-retry: false on every door, /v1/chat included: retrying will not help until the model is resumed, so the official clients stop at once.
      • The chat slots (kind: chat) and the embedding model (kind: embedding) are listed too when you ask for them: ?kind= takes one kind or a comma-separated list, as in ?kind=chat,embedding. Left out, the listing is the addresses, exactly as before. An unknown kind answers 400 invalid_kind.
      • A chat slot or the embedding model we retire answers 410 model_deprecated, naming the one to use instead; one we pause answers 503 model_disabled.
      • A paused product's 503 carries the sentence we wrote for it when we wrote one, on the API and in the desktop app alike.
      • Every price on these pages, in each model's OpenAPI document and in the desktop's API tab is in credits: a catalogue model is quoted in credits when you submit it, and the submit's answer carries credits_charged.
    3. Fixed

      Closing the developer API no longer signs the desktop out of its own models

      While the developer API is switched off, a key the desktop app mints for its own session still runs the desktop's models; every developer key answers 503 api_disabled as before, with our sentence when we wrote one.

  17. 10 changes

    1. Fixed

      A rate-limited submit no longer says service_busy while its charge stands

      When the service behind a model rate-limits the dispatch itself, the submit now answers dispatch_unresolved — the charge stands and the job may start, so poll it before sending anything again. It answered 429 service_busy, whose meaning is that nothing was charged, and a client that believed it resubmitted and paid twice. On queue.auray.run it is the same 202 status document as any unresolved dispatch.

      • service_busy now has one status, 503, and means one thing: there is no room and nothing moved.
      • A model with no queue that is full for your kind of traffic answers 429 lane_busy with limit, plan and tier. It answered lane_busy as a bare word with no entry on the errors page, or 429 service_busy.
    2. Fixed

      A cancelled job reads as cancelled, and a failure always has a code

      Reading the result of a job you cancelled now answers 409 CancellationError with error cancelled, whatever the job's own record says. A cancelled video, and any failed job whose record held no reason, answered 500 ExecutionError with an empty error — which fal's clients retry. A failure with no recorded reason is unknown_failure now, on every host and in error_code on /v1/jobs/{id}.

    3. Improved

      Every failure our own services report is on the errors page

      The words our image, music, video and 3D services, our chat models and the platforms behind catalogue models use for a failure were reaching you with no entry on the errors page, which lists every one of them now. A few were misleading as well as missing, and those changed.

      • When one of our own services refuses the credential we send it, the answer is 500 service_auth_failed and the charge is refunded; the body's refunded field says whether the refund went through. It was invalid_api_key at 401, which said your key was wrong when it was not, and a refusal with no code of its own at 401 or 403 was rejected, which blamed your prompt. 500 rather than 503, so a client that resends every 503 does not charge and refund the same request four times.
      • Our music and 3D services' own words are translated, and answered at our status rather than the service's: invalid_request, payload_too_large and image_too_large are invalid_generation_input at 400; not_found, conflict, error, a codeless 404 or 409, and any word nobody documented are upstream_refused at 502, where they reached you as the service's word at its own status or as rejected; a codeless 400 or 422 is rejected at 400. The 3D service's own statuses, 409, 413 and 422 among them, are no longer passed through.
      • A catalogue model whose platform refused a request with no code we could read now answers upstream_refused rather than rejected, still at 502, and the platform's own diagnostics — no job id handed back, a reply about another task, a status we could not read — are upstream_refused or model_failed rather than words no page explained.
      • A chat model that does not answer is model_busy (429), model_unavailable (502) or model_timeout (504), and chat_upstream when it refused the request; these replace upstream, unreachable, upstream_timeout and empty. model_busy and chat_upstream are answered only when nothing was charged; a model that answered 408 is model_timeout, whose reserve is held until the turn is certainly dead. A chat slot with no endpoint answers not_configured at 503, not 502.
      • Cancelling a job whose model runs at a platform with no cancel answers 409 cancel_not_offered — the job keeps running and keeps being charged. cancel_unsupported is 400 and means the product has no cancel at all.
      • A stored webhook endpoint whose URL stopped being one we will send to answers 409 webhook_url_refused; invalid_url is the 400 at registration, and now carries reason. A malformed survey link answers 404 support_link_invalid, like every other link.
    4. Fixed

      run() collects a charged timeout instead of losing it

      When a request on auray.run outlives its connection, the answer is 504 run_timed_out with the job in queue_request_id and the trace of the call in request_id. The JavaScript and Python clients read request_id as the job, asked for a job that does not exist, and reported a failure while the real job ran on and stayed charged. Version 0.1.1 of both follows queue_request_id, and so does the MCP server's run_model.

      • On 0.1.0, catch run_timed_out and read queue_request_id yourself, or resend with the same idempotency_key — you are handed the same job, not a second one.
      • run() takes a wait (waitSeconds, wait_seconds in Python) that auray.run holds the connection for, and a deadline (timeoutMs, timeout) for the whole call. Running out raises subscribe_timed_out carrying charged, queue_request_id and the job's three URLs; it used to put the job in request_id, where a failure body carries its trace.
      • The MCP server's run_model asks for a wait it can outlive and answers a job still running when it has to reply as that job — request_id, status_url, charged — to follow with check_job. It used to follow for up to twenty minutes inside a five-minute function, which was killed with the agent told nothing about the job it had paid for.
    5. Fixed

      A spent API key is a quota error on the OpenAI-compatible API

      A key a request would take past its monthly credit ceiling now answers 429 insufficient_quota on /openai/v1, like an empty wallet, with x-should-retry: false. It answered 403, which the official SDKs raise as a permission error. The code is still key_credit_ceiling.

    6. Improved

      A path on the wrong host says where the right one is

      A path a host does not serve now answers 404 path_not_found — the code the rest of the API already used for it — in the same envelope as every other refusal, with a docs link, and names the absolute base that does serve it. It answered not_found, the code for a missing job. GET /v1 and GET /openai/v1 now answer an index of where everything is.

    7. Fixed

      Listing jobs pages all the way back

      GET /v1/jobs stopped after one page when it listed a single product, and settled=true could return a short or empty page while older matches existed. Every page is now full until the last, next_before is present exactly when there is more, status filters by status, and an unreadable settled or status value is refused rather than ignored.

      • When one product's jobs cannot be read, the list answers 500 job_read_failed naming that product. It used to answer 200 with that product's jobs silently missing.
    8. Fixed

      A balance that could not be read is not called a busy platform

      When your credit balance cannot be read, a submit to a model address, /v1/chat and both /openai/v1 endpoints now answer 503 wallet_read_failed. They answered service_busy, which means the platform is busy, so a failed lookup read as load. Nothing is charged either way, and a retry is still the right response.

    9. Improved

      A running catalogue job says to poll every five seconds

      While a job on a catalogue model is running, poll_after_seconds is 5 — polling faster returns nothing newer. It said 2.

    10. Fixed

      Uploads state the size storage enforces, and 3D takes the upload's path

      POST /v1/uploads answered max_bytes of 8 MB for 3D and video while storage accepted 20 MB and 25 MB; it now answers what storage enforces. The 3D address's image_path is documented as the path an upload answered, which is all it has ever accepted, rather than as a URL.

  18. 4 changes

    1. New

      Documentation, and a copy of every page for your model

      The whole API is written up at auray.ai/docs — authentication and its scopes, the URL scheme, the job lifecycle, idempotency, webhook verification, and every error code with what to do about each one.

      • The errors page is generated from the same catalogue the API answers with, so a code cannot exist without an explanation here.
      • Every page has a Copy page button and an Open in ChatGPT or Claude link, and each serves the page's own Markdown rather than its HTML.
      • Search is over the whole set, on Ctrl/Cmd+K.
    2. Fixed

      An idempotency key belongs to the key that first used it

      Replaying an Idempotency-Key returns the same job, as before. What changed is what happens when a different API key sends one that is already in use: it is now refused with 409 instead of quietly collecting somebody else's job.

      • Same API key, same idempotency key: the original job, at whatever status it has now. No second charge.
      • Different API key: 409 idempotency_key_owned.
      • There is no third outcome, which is the point — two services that happen to generate the same identifier now find out.
    3. New

      A model address can be asked what it accepts

      GET /v1/models answers questions now instead of returning the whole catalogue every time. Filter by namespace or capability, page through it, and ask a single address for its full parameter list — types, defaults and bounds — so you can validate a request before spending anything on it.

    4. New

      auray.ai is its own page

      The apex used to serve a third copy of the desktop. It is now a page about the product, with pricing at auray.ai/pricing. The desktop keeps app.auray.ai and nothing about it changed.

  19. 3 changes

    1. New

      A withdrawn address tells you what replaced it

      An address that has been retired answers 410 Gone with a successor field naming the one to use instead, rather than disappearing or quietly returning different output from a model that changed underneath it.

    2. New

      Every address publishes its own contract

      Each model address now carries a machine-readable description of what it takes and what it returns, so a client can be generated from it and a request can be checked before it is sent.

    3. Fixed

      A paused webhook endpoint stops accruing failures

      An endpoint you have paused no longer counts each skipped delivery as an attempt against it, so it does not disable itself while it is switched off and does not need to be re-enabled twice.

Build on what shipped

Open the app to use what shipped, or read the API reference and call it from your own code — one key, one balance of credits.