# Resources Source: `src/domains/ResourcesDomain.ts`. Row operations on a resource as the signed-in player through `/sdk/v1/resources/{slug}`. `client.resources(slug)` returns a `ResourceHandle`; it performs no request by itself. ```ts const items = client.resources('items'); items.list(): Promise // GET /{slug} → { items?: ResourceRow[], total?: number } items.get(id): Promise // GET /{slug}/{id} items.create({ id?, data? }): Promise // POST /{slug} items.update(id, { data?, version? }): Promise // PATCH /{slug}/{id} items.delete(id): Promise // DELETE /{slug}/{id} ``` `ResourceRow` is `{ id, playerId, data, version, rank, createdAt, updatedAt }` (all optional in the generated type). Pass `version` on `update` for optimistic concurrency. ```ts const row = await client.resources('items').create({ data: { name: 'Sword' } }); await client.resources('items').update(row.id!, { data: { name: 'Axe' }, version: row.version }); ``` What a player may read or write is decided by the resource's access rules on the server; a denied operation rejects with `RudderHttpError` `code` `forbidden`. Deleting a row that other rows still reference rejects with status 409 and `code` `row_referenced`. Resources are not observable domains: call `list()` again when you need fresh rows.