# Permintaan Situs

<Badge type="warning" text="Belum dirilis" />

Memungkinkan tugas latar belakang memanggil API sebuah situs web dengan login dari tab Cowork di situs itu. Jika belum ada tab yang terbuka di sana, Cowork membukanya di latar belakang. Cowork mengirim permintaan dari tab tersebut; tidak ada cookie, token, atau header yang pernah sampai ke Extension. Hanya situs, method, dan path yang tercantum di `dozin.sites` yang diizinkan.

## dozin.sites

| Field | Tipe | Wajib | Deskripsi |
|---|---|---|---|
| `host` | `string` | Ya | Nama host huruf kecil, tanpa skema, port, atau path |
| `methods` | `string[]` | Ya | Satu atau lebih dari `GET`, `POST`, `PUT`, `PATCH`, `DELETE` |
| `pathPrefixes` | `string[]` | Ya | 1–16 path yang harus menjadi awal permintaan |
| `minIntervalMs` | `number` | Tidak | Jeda minimum antara dua permintaan ke host ini; default 1000, paling banyak 60000 |

## ctx.site.request(request) <Badge type="warning" text="Belum dirilis" />

| Nama | Tipe | Wajib | Deskripsi |
|---|---|---|---|
| `request.host` | `string` | Ya | Sebuah `host` dari `dozin.sites` |
| `request.method` | `string` | Tidak | Default `GET` |
| `request.path` | `string` | Ya | Diawali `/` dan salah satu `pathPrefixes`; tanpa `?`, `#`, `..` |
| `request.query` | `Record<string, string \| number \| boolean>` | Tidak | Satu nilai per key |
| `request.body` | `unknown` | Tidak | Body JSON; tidak diizinkan dengan `GET` |

### Nilai kembalian

`Promise<{ status: number, contentType: string | null, body: unknown }>`. `body` berupa JSON hasil parse jika responsnya JSON.

### Error

Promise di-reject dengan error yang `code`-nya:

| `code` | Arti |
|---|---|
| `NEED_LOGIN` | Cowork tidak bisa membuka tab di situs itu, atau situs menjawab bahwa pengguna belum login |
| `SITE_NOT_ALLOWED` | Host, method, atau path tidak ada di `dozin.sites` |
| `RATE_LIMITED` | Situs menjawab 429 |
| `NETWORK_ERROR` | Permintaan tidak sampai ke situs |
| `BAD_REQUEST` | Query atau body tidak valid, body dengan `GET`, atau argumen yang tidak bisa dikirim ke Cowork |
| `RUN_ENDED` | Run yang melakukan panggilan sudah berakhir |

## ctx.site.session(host) <Badge type="warning" text="Belum dirilis" />

Memberi tahu apakah pengguna tampaknya sudah login di situs itu.

| Nama | Tipe | Wajib | Deskripsi |
|---|---|---|---|
| `host` | `string` | Ya | Sebuah `host` dari `dozin.sites` |

Mengembalikan `Promise<{ loggedIn: boolean | null }>`: hasil permintaan terakhir ke situs itu jika ada; jika tidak, `null` saat ada tab terbuka di situs itu (Cowork belum bisa memastikannya) dan `false` saat tidak ada.

## Contoh

```js
const { loggedIn } = await ctx.site.session('welladjustedhk.janeapp.com');
if (loggedIn === false) return ctx.status('Please log in to Jane', 'warn');
try {
  const res = await ctx.site.request({ host: 'welladjustedhk.janeapp.com', path: '/admin/api/v2/locations' });
  ctx.status(`OK · HTTP ${res.status}`);
} catch (error) {
  ctx.status(error.code === 'NEED_LOGIN' ? 'Please log in to Jane' : `Error: ${error.code}`, 'error');
}
```

## Terkait

- [Tugas Latar Belakang](https://docs.micromeet.ai/id/extension-sdk/service.md): Asal `ctx.site`
- [Ikhtisar](https://docs.micromeet.ai/id/extension-sdk/overview.md): Field `package.json`
