# Hubzone API documentation

> Tek bir API anahtarıyla kendi sistemlerinizi Hubzone'a bağlayın: kişi, şirket, fırsat, talep, ürün ve siparişleri okuyup yazın, telefon görüşmelerini kaydedin, uygulamanızın olaylarını gönderin ve yapay zekâ asistanlarının kayıtlarınızla çalışmasını sağlayın.

Base URL: https://hubzone.app/api
OpenAPI: https://hubzone.app/openapi.json

Tek bir API anahtarıyla kendi sistemlerinizi Hubzone'a bağlayın: kişi, şirket, fırsat, talep, ürün ve siparişleri okuyup yazın, telefon görüşmelerini kaydedin, uygulamanızın olaylarını gönderin ve yapay zekâ asistanlarının kayıtlarınızla çalışmasını sağlayın.

Base URL: `https://hubzone.app/api`

- **Kayıtlar**: Yedi türde kaydı listeleyin, arayın, okuyun, oluşturun ve değiştirin.
- **Telefon görüşmeleri**: Telefon ve santral görüşmelerini kaydedin; kişinin zaman çizelgesine düşer.
- **Özel etkinlikler**: Uygulamanızdan kayıt, satın alma ve girişleri gönderin, kişi bazında görün.
- **Kapsamlı anahtarlar**: Her anahtarın yalnızca verdiğiniz izinleri, isteğe bağlı son kullanma ve IP listesi ile bir çağrı günlüğü vardır.
- **MCP ve yapay zekâ**: Claude ve diğer asistanları bağlayın; tüm dokümanı Markdown olarak indirin.
- **Tasarımdan güvenli**: Anahtarlar kendi çalışma alanlarında, onları oluşturan kişi olarak işlem yapar; sınırlar sizi döngülerden korur.


# Başlangıç

İlk isteğinize üç adım.

### 1. API anahtarı oluşturun

Giriş yapın, Ayarlar > Geliştiriciler sayfasını açın ve bir anahtar oluşturun. Yalnızca gereken izinleri seçin (örneğin contacts.read). Anahtar bir kez gösterilir; güvenli bir yerde saklayın. Anahtar kendi çalışma alanında, onu oluşturan kişi olarak işlem yapar; o kişinin yapabileceğinden fazlasını asla yapamaz.

### 2. İlk isteğinizi gönderin

Anahtarı Authorization başlığına Bearer belirteci olarak koyun:

```bash
curl https://hubzone.app/api/open/v1/me \
  -H "Authorization: Bearer hzk_your_key_here"
```

### 3. Yanıtı okuyun

Her yanıt JSON'dur. Bu yanıt anahtarın neler yapabildiğini ve sınırlarını söyler:

```json
{
  "keyId": "3f0c8f0e-2b1a-4c55-9a38-0d6c1c9d7e11",
  "scopes": ["contacts.read", "contacts.write"],
  "limits": { "get": { "label": "Read one record", "perMinute": 600 } },
  "allScopes": 14
}
```

### Sonra: kayıt listeleyin ve oluşturun

```bash
# the properties (fields) of contacts, with their names and types
curl https://hubzone.app/api/open/v1/properties/contacts -H "Authorization: Bearer $HUBZONE_KEY"

# create a contact
curl -X POST https://hubzone.app/api/open/v1/objects/contacts \
  -H "Authorization: Bearer $HUBZONE_KEY" -H "content-type: application/json" \
  -d '{"properties":{"first_name":"Ada","last_name":"Lovelace","email":"ada@example.com"}}'

# the first 25 contacts that mention "ada"
curl "https://hubzone.app/api/open/v1/objects/contacts?limit=25&q=ada" -H "Authorization: Bearer $HUBZONE_KEY"
```

> Kayıt türleri: contacts, companies, deals, tickets, products, orders ve calls. Özellikler her zaman özellik adlarıyla gönderilir ve döner ("Özellik listesi" bölümüne bakın).

# Kimlik doğrulama

Anahtarlar, izinler (scope) ve anahtarı güvende tutmak.

Her çağrı Authorization başlığında bir API anahtarı taşır. Anahtar gövdede ya da sorgu dizisinde gönderilemez.

```http
Authorization: Bearer hzk_your_key_here
```

### İzinler (scope)

Her anahtara yalnızca ihtiyacı olanı verin. İzin, bir kayıt türü ve bir kiptir: <tür>.read ya da <tür>.write. Doğru izni olmayan çağrı 403 döner.

| İzin | İzin verdiği |
| --- | --- |
| contacts.read | contacts okuma: listeleme, arama, tek kayıt, özellik listesi |
| contacts.write | contacts oluşturma ve değiştirme |
| companies.read | companies okuma: listeleme, arama, tek kayıt, özellik listesi |
| companies.write | companies oluşturma ve değiştirme |
| deals.read | deals okuma: listeleme, arama, tek kayıt, özellik listesi |
| deals.write | deals oluşturma ve değiştirme |
| tickets.read | tickets okuma: listeleme, arama, tek kayıt, özellik listesi |
| tickets.write | tickets oluşturma ve değiştirme |
| products.read | products okuma: listeleme, arama, tek kayıt, özellik listesi |
| products.write | products oluşturma ve değiştirme |
| orders.read | orders okuma: listeleme, arama, tek kayıt, özellik listesi |
| orders.write | orders oluşturma ve değiştirme |
| calls.read | calls okuma: listeleme, arama, tek kayıt, özellik listesi |
| calls.write | calls oluşturma ve değiştirme |

### İyi uygulamalar

- Anahtarları sunucunuzda tutun. Bir web sayfasına, mobil uygulamaya ya da herkese açık depoya asla koymayın.
- Her sistem için ayrı bir anahtar oluşturun, en az izinle. Salt okumayla başlayın.
- Bir anahtarı Ayarlar > Geliştiriciler altında istediğiniz an iptal edin; her anahtarın son çağrıları orada listelenir.
- Bir anahtarın son kullanma tarihi ve izinli IP adresi listesi olabilir.
- Yanlış anahtarlar adres başına sınırlanır; tahmin etmek işe yaramaz.

### Kimlik doğrulama hataları

```json
// 401: no key, a wrong key, or a revoked or expired key
{ "statusCode": 401, "message": "..." }

// 403: the key is valid but lacks the permission (or the address is not allowed)
{ "statusCode": 403, "message": "..." }
```

# Hız limitleri

Bir anahtarın kaç çağrı yapabileceği ve nerede olduğunuzu nasıl okuyacağınız.

Çağrılar anahtar ve çağrı türü başına, dakikalık sayılır; anahtar başına bir genel sınır da vardır. Her yanıt nerede olduğunuzu söyler.

| Çağrı türü | Ad | Dakikada |
| --- | --- | --- |
| Tek kayıt okuma | get | 600 |
| Kayıt listeleme | list | 240 |
| Kayıt değiştirme | update | 240 |
| Kayıt arama | search | 120 |
| Kayıt oluşturma | create | 120 |
| Anahtar bilgisi | me | 60 |
| Özellik listesi | properties | 60 |

### Başlıklar

```http
X-RateLimit-Limit: 240
X-RateLimit-Remaining: 238
X-RateLimit-Reset: 1794313700
```

| Başlık | Anlamı |
| --- | --- |
| X-RateLimit-Limit | Bu çağrı türü için pencerede izin verilen çağrı sayısı. |
| X-RateLimit-Remaining | Penceredeki kalan çağrı (türün ve anahtarın genel sınırının küçüğü). |
| X-RateLimit-Reset | Pencerenin sıfırlanacağı an, saniye. |
| Retry-After | 429'da: tekrar denemeden önce beklenecek saniye. |

### Sınır aşılınca

```http
HTTP/1.1 429 Too Many Requests
Retry-After: 20

{ "statusCode": 429, "message": "Too many requests: slow down" }
```

Retry-After kadar bekleyip tekrar deneyin. Her başarısız denemede daha uzun bekleyin. Kayıtlar üzerinde döngü yapan bir program, 429'a çarpmadan önce X-RateLimit-Remaining'i okuyup kendini yavaşlatmalıdır.

# Hatalar

Standart HTTP durum kodları ve neyin ters gittiğini söyleyen bir JSON gövdesi.

```json
{
  "statusCode": 400,
  "message": "properties.email: must be a valid e-mail address",
  "error": "Bad Request"
}
```

| Kod | Anlamı |
| --- | --- |
| 200 | Başarılı. |
| 201 | Oluşturuldu. |
| 400 | İstek geçersiz. Mesaj nedenini söyler (olmayan bir özellik adı, yanlış tür, aralık dışı değer). |
| 401 | Anahtar yok, yanlış, iptal edilmiş ya da süresi dolmuş. |
| 403 | Anahtarın izni yok ya da adres izinli değil. |
| 404 | Bulunamadı ya da başka bir çalışma alanına ait. |
| 409 | Mevcut durumla çakışma. |
| 429 | Çok fazla çağrı. Retry-After'ı bekleyin. |
| 500 | Bizim tarafımızda beklenmeyen bir durum. Tekrar deneyin. |

> Başka çalışma alanlarının kayıtları asla görünmez: göremeyeceğiniz bir kayıt, yokmuş gibi 404 döner.

# Özel etkinlikler

Kendi uygulamanızda olanları (kayıt, satın alma, giriş) gönderin ve Hubzone'da görün.

Veri yönetimi > Etkinlik yönetimi altında bir etkinlik tanımlayın: bir ad ve türlü özellikler (metin, sayı, evet/hayır, tarih). Her etkinliğin kendi anahtarı vardır ve bir kez gösterilir. Sisteminiz her oluşumu, kişinin e-posta adresiyle birlikte bu anahtara gönderir. Oluşum o adresteki kişiye bağlanır ve Oluşumlar ile Analiz sekmelerinde görünür.

```bash
curl -X POST https://hubzone.app/api/public/events/hze_your_event_key \
  -H "content-type: application/json" \
  -d '{"email":"person@example.com","properties":{"plan":"pro","seats":5},"occurredAt":"2026-11-10T09:30:00Z"}'
```

```json
{ "id": "1b7e0c52-6f0e-4c7a-9a43-2d5e9d1f0a77", "linkedToContact": true }
```

| Alan | Anlamı |
| --- | --- |
| email | Zorunlu. Kişi; bu adresteki kişiye eşlenir (büyük/küçük harf fark etmez). |
| properties | İsteğe bağlı. Yalnızca tanımladığınız özellikler, her biri kendi türünde. |
| occurredAt | İsteğe bağlı. Ne zaman olduğu, son 90 gün içinde; varsayılan şimdi. |

- Tek kimlik bilgisi anahtardır: sunucunuzda tutun. İstediğiniz an yeni anahtar üretebilirsiniz (eskisi hemen çalışmayı bırakır).
- Kişisi olmayan bir adres de saklanır (linkedToContact: false).
- Adres başına dakikada 600 çağrıya kadar.

# MCP sunucusu ve yapay zekâ

Claude ve diğer asistanları kayıtlarınıza bağlayın, bu dokümanı bir yapay zekâya verin.

### Bir asistan bağlayın (MCP)

Model Context Protocol konuşan asistanlar, aynı anahtar ve izinlerle kayıtlarınızı okuyup değiştirebilir. Gördüğü araçlar yalnızca izinlerinin izin verdikleridir.

```text
https://hubzone.app/api/mcp
```

Anahtarı Bearer belirteci olarak gönderin. Sunucu POST (JSON-RPC 2.0) yanıtlar; tarayıcı kaynaklı istekler reddedilir, bu yüzden bir sunucudan ya da asistan uygulamasından çağırın.

| Araç | Ne yapar |
| --- | --- |
| whoami | Bu anahtarın izinleri ve sınırları. |
| list_properties | Bir kayıt türünün özellikleri. Oluşturmadan ya da değiştirmeden önce kullanın. |
| search_records | Kayıtları metin ve süzgeçlerle bul, sayfa sayfa. |
| get_record | Bir kaydı id ile oku. |
| create_record | Kayıt oluştur. |
| update_record | Bir kaydın özelliklerini değiştir. |

- Asistan için ayrı bir anahtar üretin ve salt okumayla başlayın.
- İnsanların kayıtlara yazdığı metin veridir: asistana onu talimat değil veri olarak ele alması söylenir. Yine de bir şeyi değiştirmeden önce önerdiğini kontrol edin.

### Bu dokümanı bir yapay zekâya verin

Her sayfada Markdown olarak kopyala ve .md indir düğmeleri vardır. Tüm site için üç adres var:

| Adres | Ne olduğu |
| --- | --- |
| /llms.txt | Dokümanın dil modelleri için kısa dizini (llmstxt.org biçimi). |
| /llms-full.txt | Tüm doküman tek bir Markdown dosyasında: bir asistana yapıştırın ya da bilgisine ekleyin. |
| /openapi.json | API'nin OpenAPI 3.1 tanımı; kod üreticileri ve API araçları için. |

# API referansı

Base URL: `https://hubzone.app/api`

## Anahtar

### Anahtar bilgisi

`GET /open/v1/me`

Anahtarın neler yapabildiğini ve çağrı türü başına sınırları gösterir.

İzin: `any key`

**Örnek**

```bash
curl "https://hubzone.app/api/open/v1/me" \
  -H "Authorization: Bearer $HUBZONE_KEY"
```

**Yanıtlar**

- 200: Anahtar.
- 401: Anahtar yok, yanlış, iptal edilmiş ya da süresi dolmuş.
- 429: Çok fazla çağrı: Retry-After'ı bekleyin.

```json
{
  "keyId": "3f0c8f0e-2b1a-4c55-9a38-0d6c1c9d7e11",
  "scopes": [
    "contacts.read",
    "contacts.write"
  ],
  "limits": {
    "get": {
      "label": "Read one record",
      "perMinute": 600
    }
  },
  "allScopes": 14
}
```

## Özellikler

### Özellikleri listele

`GET /open/v1/properties/{type}`

Bir kayıt türünün özellikleri (alanları): adları, türleri ve seçim listeleri için seçenekleri. Oluşturma, değiştirme ve arama çağrılarında bu adları kullanın.

İzin: `{type}.read`

**Parametreler**

- `type` (path, required, string): Kayıt türü. contacts, companies, deals, tickets, products, orders, calls.

**Örnek**

```bash
curl "https://hubzone.app/api/open/v1/properties/contacts" \
  -H "Authorization: Bearer $HUBZONE_KEY"
```

**Yanıtlar**

- 200: Özellikler.
- 401: Anahtar yok, yanlış, iptal edilmiş ya da süresi dolmuş.
- 403: Anahtarın bu çağrı için izni yok.
- 404: Bulunamadı (ya da başka bir çalışma alanına ait).
- 429: Çok fazla çağrı: Retry-After'ı bekleyin.

```json
{
  "properties": [
    {
      "key": "email",
      "type": "text",
      "label_i18n": {
        "en": "Email",
        "tr": "E-posta"
      },
      "options": null
    },
    {
      "key": "lifecycle_stage",
      "type": "enum",
      "label_i18n": {
        "en": "Lifecycle stage",
        "tr": "Yaşam döngüsü aşaması"
      },
      "options": [
        {
          "value": "lead",
          "label_i18n": {
            "en": "Lead"
          }
        }
      ]
    }
  ]
}
```

## Kayıtlar

### Kayıtları listele ya da bul

`GET /open/v1/objects/{type}`

Bir türün kayıtları, en yeni etkinlik önce, sayfa sayfa. "q", metin özellikleri bu metni içeren kayıtları bulur. Sonraki sayfa için cevaptaki "after" değerini gönderin.

İzin: `{type}.read`

**Parametreler**

- `type` (path, required, string): Kayıt türü. contacts, companies, deals, tickets, products, orders, calls.
- `limit` (query, integer 1-100): Sayfa başına kayıt (varsayılan 25).
- `after` (query, string): Sonraki sayfanın imleci, önceki cevaptan.
- `q` (query, string): Aranacak metin.

**Örnek**

```bash
curl "https://hubzone.app/api/open/v1/objects/contacts?limit=25&q=ada" \
  -H "Authorization: Bearer $HUBZONE_KEY"
```

**Yanıtlar**

- 200: Bir sayfa kayıt. Son sayfada "paging.next.after" null'dır.
- 400: İstek geçersiz; mesaj nedenini söyler.
- 401: Anahtar yok, yanlış, iptal edilmiş ya da süresi dolmuş.
- 403: Anahtarın bu çağrı için izni yok.
- 429: Çok fazla çağrı: Retry-After'ı bekleyin.

```json
{
  "results": [
    {
      "id": "8a3b2f64-1c9d-4e05-b7a1-3f2c9d0e4a12",
      "objectType": "contacts",
      "properties": {
        "first_name": "Ada",
        "last_name": "Lovelace",
        "email": "ada@example.com"
      },
      "ownerId": "5d1f0f3e-7e0a-4b8e-9a50-aa14d3c9b2f1",
      "isPrivate": false,
      "createdAt": "2026-11-10T09:30:00.000Z",
      "updatedAt": "2026-11-10T09:30:00.000Z",
      "pipelineId": null,
      "stageId": null,
      "stageChangedAt": null,
      "lastActivityAt": null
    }
  ],
  "paging": {
    "next": {
      "after": "eyJ2IjoxfQ"
    }
  },
  "total": {
    "value": 1,
    "capped": false
  }
}
```

### Kayıt ara

`POST /open/v1/objects/{type}/search`

Süzgeç, sıralama ve metin sorgusuyla ara. Bir kayıt, "filters" içindeki her süzgeci sağlıyorsa eşleşir. İşleçler: eq, neq, gt, gte, lt, lte, contains, starts_with, in, exists, not_exists.

İzin: `{type}.read`

**Parametreler**

- `type` (path, required, string): Kayıt türü. contacts, companies, deals, tickets, products, orders, calls.

**İstek gövdesi** (JSON): Tüm alanlar isteğe bağlıdır.

```json
{
  "query": "renewal",
  "filters": [
    {
      "property": "amount",
      "op": "gte",
      "value": 1000
    }
  ],
  "sort": {
    "property": "amount",
    "direction": "desc"
  },
  "limit": 25
}
```

**Örnek**

```bash
curl -X POST "https://hubzone.app/api/open/v1/objects/contacts/search" \
  -H "Authorization: Bearer $HUBZONE_KEY" \
  -H "content-type: application/json" \
  -d '{"query":"renewal","filters":[{"property":"amount","op":"gte","value":1000}],"sort":{"property":"amount","direction":"desc"},"limit":25}'
```

**Yanıtlar**

- 200: Liste çağrısındaki gibi bir sayfa kayıt.
- 400: İstek geçersiz; mesaj nedenini söyler.
- 401: Anahtar yok, yanlış, iptal edilmiş ya da süresi dolmuş.
- 403: Anahtarın bu çağrı için izni yok.
- 429: Çok fazla çağrı: Retry-After'ı bekleyin.

```json
{
  "results": [
    {
      "id": "8a3b2f64-1c9d-4e05-b7a1-3f2c9d0e4a12",
      "objectType": "contacts",
      "properties": {
        "first_name": "Ada",
        "last_name": "Lovelace",
        "email": "ada@example.com"
      },
      "ownerId": "5d1f0f3e-7e0a-4b8e-9a50-aa14d3c9b2f1",
      "isPrivate": false,
      "createdAt": "2026-11-10T09:30:00.000Z",
      "updatedAt": "2026-11-10T09:30:00.000Z",
      "pipelineId": null,
      "stageId": null,
      "stageChangedAt": null,
      "lastActivityAt": null
    }
  ],
  "paging": null,
  "total": {
    "value": 1,
    "capped": false
  }
}
```

### Tek kaydı oku

`GET /open/v1/objects/{type}/{id}`

Tüm özellikleriyle bir kayıt.

İzin: `{type}.read`

**Parametreler**

- `type` (path, required, string): Kayıt türü. contacts, companies, deals, tickets, products, orders, calls.
- `id` (path, required, string (uuid)): Kaydın kimliği.

**Örnek**

```bash
curl "https://hubzone.app/api/open/v1/objects/contacts/8a3b2f64-1c9d-4e05-b7a1-3f2c9d0e4a12" \
  -H "Authorization: Bearer $HUBZONE_KEY"
```

**Yanıtlar**

- 200: Kayıt.
- 401: Anahtar yok, yanlış, iptal edilmiş ya da süresi dolmuş.
- 403: Anahtarın bu çağrı için izni yok.
- 404: Bulunamadı (ya da başka bir çalışma alanına ait).
- 429: Çok fazla çağrı: Retry-After'ı bekleyin.

```json
{
  "id": "8a3b2f64-1c9d-4e05-b7a1-3f2c9d0e4a12",
  "objectType": "contacts",
  "properties": {
    "first_name": "Ada",
    "last_name": "Lovelace",
    "email": "ada@example.com"
  },
  "ownerId": "5d1f0f3e-7e0a-4b8e-9a50-aa14d3c9b2f1",
  "isPrivate": false,
  "createdAt": "2026-11-10T09:30:00.000Z",
  "updatedAt": "2026-11-10T09:30:00.000Z",
  "pipelineId": null,
  "stageId": null,
  "stageChangedAt": null,
  "lastActivityAt": null
}
```

### Kayıt oluştur

`POST /open/v1/objects/{type}`

Bir kayıt oluşturur. Özellikleri "Özellikleri listele" çıktısındaki adlarla gönderin. Yalnızca properties, ownerId, stageId ve pipelineId kabul edilir. ownerId aksini söylemedikçe kaydın sahibi anahtarın kişisidir. Telefon görüşmesi kaydetmek için bunun yerine calls uç noktasını kullanın.

İzin: `{type}.write`

**Parametreler**

- `type` (path, required, string): Kayıt türü. contacts, companies, deals, tickets, products, orders, calls.

**İstek gövdesi** (JSON): "properties" zorunludur.

```json
{
  "properties": {
    "first_name": "Ada",
    "last_name": "Lovelace",
    "email": "ada@example.com"
  }
}
```

**Örnek**

```bash
curl -X POST "https://hubzone.app/api/open/v1/objects/contacts" \
  -H "Authorization: Bearer $HUBZONE_KEY" \
  -H "content-type: application/json" \
  -d '{"properties":{"first_name":"Ada","last_name":"Lovelace","email":"ada@example.com"}}'
```

**Yanıtlar**

- 201: Yeni kayıt.
- 400: İstek geçersiz; mesaj nedenini söyler.
- 401: Anahtar yok, yanlış, iptal edilmiş ya da süresi dolmuş.
- 403: Anahtarın bu çağrı için izni yok.
- 429: Çok fazla çağrı: Retry-After'ı bekleyin.

```json
{
  "id": "8a3b2f64-1c9d-4e05-b7a1-3f2c9d0e4a12",
  "objectType": "contacts",
  "properties": {
    "first_name": "Ada",
    "last_name": "Lovelace",
    "email": "ada@example.com"
  },
  "ownerId": "5d1f0f3e-7e0a-4b8e-9a50-aa14d3c9b2f1",
  "isPrivate": false,
  "createdAt": "2026-11-10T09:30:00.000Z",
  "updatedAt": "2026-11-10T09:30:00.000Z",
  "pipelineId": null,
  "stageId": null,
  "stageChangedAt": null,
  "lastActivityAt": null
}
```

### Kaydı değiştir

`PATCH /open/v1/objects/{type}/{id}`

Gönderdiğiniz özellikleri değiştirir; diğerleri olduğu gibi kalır. Bir özelliği temizlemek için null gönderin. Bir fırsat ya da talep stageId ile başka bir aşamaya taşınır.

İzin: `{type}.write`

**Parametreler**

- `type` (path, required, string): Kayıt türü. contacts, companies, deals, tickets, products, orders, calls.
- `id` (path, required, string (uuid)): Kaydın kimliği.

**İstek gövdesi** (JSON): Yalnızca değişeni gönderin.

```json
{
  "properties": {
    "job_title": "Mathematician"
  }
}
```

**Örnek**

```bash
curl -X PATCH "https://hubzone.app/api/open/v1/objects/contacts/8a3b2f64-1c9d-4e05-b7a1-3f2c9d0e4a12" \
  -H "Authorization: Bearer $HUBZONE_KEY" \
  -H "content-type: application/json" \
  -d '{"properties":{"job_title":"Mathematician"}}'
```

**Yanıtlar**

- 200: Değişen kayıt.
- 400: İstek geçersiz; mesaj nedenini söyler.
- 401: Anahtar yok, yanlış, iptal edilmiş ya da süresi dolmuş.
- 403: Anahtarın bu çağrı için izni yok.
- 404: Bulunamadı (ya da başka bir çalışma alanına ait).
- 429: Çok fazla çağrı: Retry-After'ı bekleyin.

```json
{
  "id": "8a3b2f64-1c9d-4e05-b7a1-3f2c9d0e4a12",
  "objectType": "contacts",
  "properties": {
    "first_name": "Ada",
    "last_name": "Lovelace",
    "email": "ada@example.com",
    "job_title": "Mathematician"
  },
  "ownerId": "5d1f0f3e-7e0a-4b8e-9a50-aa14d3c9b2f1",
  "isPrivate": false,
  "createdAt": "2026-11-10T09:30:00.000Z",
  "updatedAt": "2026-11-10T09:30:00.000Z",
  "pipelineId": null,
  "stageId": null,
  "stageChangedAt": null,
  "lastActivityAt": null
}
```

## Aramalar

### Telefon görüşmesi kaydet

`POST /open/v1/calls`

Telefonlar ve santraller için: görüşme o telefon numarasındaki kişiye bağlanır ve zaman çizelgesinde görünür. Ses asla gönderilmez. externalId ile iki kez gönderdiğiniz görüşme bir kez saklanır.

İzin: `calls.write`

**İstek gövdesi** (JSON): phoneNumber zorunludur. direction: inbound ya da outbound. outcome: busy, connected, left_live_message, left_voicemail, meeting_booked, no_answer ya da wrong_number.

```json
{
  "phoneNumber": "+90 532 000 00 00",
  "direction": "outbound",
  "startedAt": "2026-11-10T09:30:00Z",
  "durationSeconds": 184,
  "outcome": "connected",
  "note": "Asked for a quote",
  "externalId": "pbx-7781"
}
```

**Örnek**

```bash
curl -X POST "https://hubzone.app/api/open/v1/calls" \
  -H "Authorization: Bearer $HUBZONE_KEY" \
  -H "content-type: application/json" \
  -d '{"phoneNumber":"+90 532 000 00 00","direction":"outbound","startedAt":"2026-11-10T09:30:00Z","durationSeconds":184,"outcome":"connected","note":"Asked for a quote","externalId":"pbx-7781"}'
```

**Yanıtlar**

- 201: Görüşme ve bağlandığı kişi (o numarada kişi yoksa linked false olur).
- 400: İstek geçersiz; mesaj nedenini söyler.
- 401: Anahtar yok, yanlış, iptal edilmiş ya da süresi dolmuş.
- 403: Anahtarın bu çağrı için izni yok.
- 429: Çok fazla çağrı: Retry-After'ı bekleyin.

```json
{
  "id": "c1d2e3f4-0000-4000-8000-000000000001",
  "activityId": "a1b2c3d4-0000-4000-8000-000000000002",
  "contactId": "8a3b2f64-1c9d-4e05-b7a1-3f2c9d0e4a12",
  "linked": true,
  "duplicate": false
}
```

## Etkinlikler

### Özel etkinlik gönder

`POST /public/events/{eventKey}`

Tanımladığınız bir özel etkinliğin bir oluşumunu kaydeder. Authorization başlığı yok: adresteki etkinlik anahtarı kimlik bilgisidir. Özel etkinlikler rehberine bakın.

İzin: `event key` (Authorization başlığı yok)

**Parametreler**

- `eventKey` (path, required, string): Etkinliğin anahtarı (hze_ ile başlar), etkinliği oluştururken bir kez gösterilir.

**İstek gövdesi** (JSON): email zorunludur.

```json
{
  "email": "person@example.com",
  "properties": {
    "plan": "pro",
    "seats": 5
  },
  "occurredAt": "2026-11-10T09:30:00Z"
}
```

**Örnek**

```bash
curl -X POST "https://hubzone.app/api/public/events/hze_your_event_key" \
  -H "content-type: application/json" \
  -d '{"email":"person@example.com","properties":{"plan":"pro","seats":5},"occurredAt":"2026-11-10T09:30:00Z"}'
```

**Yanıtlar**

- 201: Saklandı. linkedToContact, o e-posta adresinde bir kişi olup olmadığını söyler.
- 400: İstek geçersiz; mesaj nedenini söyler.
- 404: Bilinmeyen etkinlik anahtarı.
- 429: Çok fazla çağrı: Retry-After'ı bekleyin.

```json
{
  "id": "1b7e0c52-6f0e-4c7a-9a43-2d5e9d1f0a77",
  "linkedToContact": true
}
```

# Changelog

## v1.0.0 (2026-11-10): Hubzone API yayında

Kişi, şirket, fırsat, talep, ürün ve sipariş kayıtları kapsamlı anahtarlarla listelenebilir, aranabilir, okunabilir, oluşturulabilir ve değiştirilebilir. Telefon görüşmeleri kaydedilebilir. Özel etkinlikler etkinlik anahtarıyla gönderilebilir. MCP sunucusu Claude gibi asistanların aynı anahtarları kullanmasını sağlar. Sınırlar anahtar ve çağrı türü başınadır, X-RateLimit başlıklarıyla.
