---
title: Getting started
description: Get your virtual key and send your first masked request with the OpenAI SDK in minutes.
sidebar:
  icon: rocket
---

Two addresses and one virtual key are all you need for your first request.
There is nothing to install; if you use the OpenAI SDK, you only change the
`base_url` value and the key, and the rest of your code stays the same.

## Your access details

| Use                                 | Address                          |
| ----------------------------------- | -------------------------------- |
| API base (OpenAI SDK `base_url`)    | `https://gw-tr.gurubase.io/v1`   |
| Management panel                    | `https://gateway-tr.gurubase.io` |

## Generate your virtual key

Sign in to the [panel](https://gateway-tr.gurubase.io) and generate a virtual
key; you send your requests with this key. The language model provider's real
key stays inside the Gateway, so you never keep it in your application. See
[Panel](/en/panel) for the steps.

## First request

All three examples below send the same request to the Responses API. The text
contains a name and a Turkish national ID number (TCKN); both are masked
before they reach the model.

<CodeGroup>

```bash title="curl"
curl https://gw-tr.gurubase.io/v1/responses \
  -H "Authorization: Bearer $SANAL_ANAHTAR" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-4o-mini",
    "input": "Ayşe Demir, TCKN 10000000214, başvuru durumunu soruyor."
  }'
```

```python title="Python"
from openai import OpenAI

client = OpenAI(
    base_url="https://gw-tr.gurubase.io/v1",
    api_key="SANAL_ANAHTAR",
)

resp = client.responses.create(
    model="gpt-4o-mini",
    input="Ayşe Demir, TCKN 10000000214, başvuru durumunu soruyor.",
)
print(resp.output_text)
```

```ts title="TypeScript"
import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://gw-tr.gurubase.io/v1",
  apiKey: process.env.SANAL_ANAHTAR,
});

const resp = await client.responses.create({
  model: "gpt-4o-mini",
  input: "Ayşe Demir, TCKN 10000000214, başvuru durumunu soruyor.",
});
console.log(resp.output_text);
```

</CodeGroup>

## What happened?

The name and the TCKN in your input were replaced with placeholders in the
copy sent to the model:

```text
Input   : "Ayşe Demir, TCKN 10000000214, başvuru durumunu soruyor."
To model: "<PERSON_1>, TCKN <TCKN_1>, başvuru durumunu soruyor."
```

The model works with the masked text, and the same placeholders are preserved
in the response. Placeholders in the API output are in English; the
[Concepts](/en/concepts) page covers the placeholder format and how it
differs from what the panel displays.

## Next steps

<CardGroup>
  <Card title="Concepts" href="/en/concepts">
    Placeholder format, fail-closed behavior, and data sovereignty.
  </Card>
  <Card title="Gateway integration" href="/en/guides/gateway-integration">
    Streaming, Chat Completions, and mask-only usage.
  </Card>
  <Card title="Categories" href="/en/categories">
    The full list of 26 personal data categories that get masked.
  </Card>
  <Card title="Panel" href="/en/panel">
    Virtual key generation and usage tracking.
  </Card>
</CardGroup>
