# getByteBudgetTransformUrl

```ts
function getByteBudgetTransformUrl(asset, opts): string | null;
```

Defined in: packages/asset-client/src/transform.ts:513

⭐ **La ÚNICA puerta por la que se puede pinnear un `quality` numérico** —
y está construida para que no se pueda usar mal.

## El problema que resuelve

`getTransformUrl` recibe un `Pick<AssetDTO, "sha">`: **un sha y nada más.**
Con eso, un `quality: 75` en el call site es CIEGO — la misma línea es un
ajuste honesto del encoder sobre un asset sin escalera, y una segunda
compresión silenciosa sobre uno con escalera. Nada en el tipo, en el nombre
ni en el editor distinguía los dos casos. Un aviso avisa; esto impide.

## Las dos barreras

1. **En COMPILACIÓN**: el parámetro exige `presets: string`. Un
   `{ sha }` pelado —la llamada ciega— ya no compila. Para pasar por acá hay
   que tener el DTO en la mano, y tener el DTO es saber la respuesta.
2. **En EJECUCIÓN**: si el asset tiene cualquier preset de tamaño, **tira**.
   Si `presets` no vino, **tira** — «no sé» nunca se resuelve como «dale».

## Cuándo es legítimo, con el número

Un presupuesto de bytes que alguien MIDIÓ, sobre un asset subido con
`presets: ["original"]`. Ahí no hay a qué saltar y el pin hace lo que su
nombre dice. Medido 2026-08-31 contra producción, ancho 1 920, las seis
respuestas `x-transform-source: original`:

| quality | bytes | vs auto | PSNR |
|---|---|---|---|
| 40 | 82 112 | **−33,6 %** | 35,32 dB |
| 60 | 106 892 | −13,5 % | 36,85 dB |
| *(auto)* | 123 614 | — | 37,65 dB |
| 90 | 269 026 | +117,6 % | 41,46 dB |

Monótona y sin sorpresas: −33,6 % de peso por −2,32 dB. **Eso sí es un
intercambio**, y es la razón por la que el parámetro no se borró del todo.

## Parameters

| Parameter | Type |
| ------ | ------ |
| `asset` | [`Pick`](/api/nitida/sdk/react/-internal-/type-aliases/pick/)\<[`AssetDTO`](/api/nitida/asset-client/type-aliases/assetdto/), `"sha"`\> & \{ `presets`: `string`; \} & [`VisibilityHint`](/api/nitida/asset-client/type-aliases/visibilityhint/) |
| `opts` | [`WithPinnedQuality`](/api/nitida/asset-client/-internal-/type-aliases/withpinnedquality/)\<[`TransformOptions`](/api/nitida/asset-client/type-aliases/transformoptions/)\> |

## Returns

`string` \| `null`

## Throws

si el asset tiene escalera, si no se sabe si la tiene, o si
  `quality` no está en 1..100.