Paketler API
Paketler modülünün tüm işlemleri (7) ve veri modelleri (3): adresler, izinler, girdiler, ön koşullar, olaylar ve örnekler.
Hizmet ve dersleri bir araya getiren, seansları sayılan aylık paketler.
Modül kodu packages · 7 işlem · 3 veri modeli · 6 olay. Bir anahtar ya da token, arkasındaki kişinin bu modülde yapabildiğinden fazlasını asla yapamaz; satır düzeyindeki güvenlik uygulamadakiyle birebir aynıdır. Yetki kapsamları: packages (hepsi), packages:read (yalnız okuma) ya da packages:<yetenek>.
Kaynaklar
| Kaynak | Tablo | Listeleme ve okuma | POST | PATCH | DELETE |
|---|---|---|---|---|---|
package_items | package_item | /api/v1/package_items | |||
package_usages | package_usage | /api/v1/package_usages | |||
packages | package | /api/v1/packages | packages.create_package | packages.update_package |
Listeler limit (en çok 200), cursor, order (ör. -created_at), fields ve q alır; diğer her sorgu parametresi bir sütun süzgecidir: ?status=paid, ?total[gte]=100, ?id[in]=a,b, ?x=null.
İşlemler
| İşlem | Gereken izin | Ne yapar |
|---|---|---|
packages.create_package | packages:manage | Paket oluştur |
packages.redeem | packages:write | Paket seansı kullan |
packages.release | packages:write | Seansı geri ver |
packages.retire_package | packages:manage | Satıştan kaldır |
packages.set_items | packages:manage | Kapsamı değiştir |
packages.update_package | packages:manage | Paketi düzenle |
packages.use_on_my_booking | packages:write | Paketimi kullan |
packages.create_package
Paket oluştur — Bir dönem, bir fiyat ve neleri kapsadığı.
Gereken izin packages:manage · veriyi değiştirir
https://app.getera.io/api/v1/packages/actions/create_package- REST kısayolu:
POST /api/v1/packages - Asıl adres:
POST /api/v1/actions/packages.create_package
Girdi
| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
name | string | evet | Ad · en çok 255 |
periodMonths | number | evet | Ay · en az 1 · en çok 120 |
priceAmount | number (money) | evet | Fiyat (küçük birim) · en az 1 |
priceCurrency | string | Para birimi · en çok 3 | |
autoRenew | boolean | Varsayılan olarak yenilenir | |
items | object / array | evet | Neleri kapsar · [{ itemVariantId? | groupClassId?, sessionsPerPeriod? (boş = sınırsız) }] |
Ön koşullar
Koşul tutmazsa işlem 409 ve şu kodlardan biriyle reddedilir:
| Kod | Ne zaman reddedilir |
|---|---|
invalid_items | En az bir öğe; her biri bir hizmet ya da bir ders. |
service_not_found | Her hizmet bulunmalı. |
class_not_found | Her ders bulunmalı ve hâlâ yapılıyor olmalı. |
Yayımladığı olaylar: packages.package_created
Neye yazar: package (insert) — Creates the package; package_item (insert) — Writes what it covers
curl -X POST https://app.getera.io/api/v1/packages/actions/create_package \
-H "Authorization: Bearer $ERA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"name":"Name","periodMonths":1,"priceAmount":1,"items":{}}'{
"ok": true,
"result": "…",
"events": [
"packages.package_created"
]
}import { createEra } from "@getera/sdk"
const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.packages.create({
name: "Name",
periodMonths: 1,
priceAmount: 1,
items: {}
})era packages create --data '{"name":"Name","periodMonths":1,"priceAmount":1,"items":{}}'{
"name": "era__packages__create_package",
"arguments": {
"name": "Name",
"periodMonths": 1,
"priceAmount": 1,
"items": {}
}
}Hatalar: 401 kimlik bilgisi yok ya da süresi dolmuş · 403 kimlik bilgisinde packages:manage izni yok · 404 kayıt ya da modül erişim dışında · 422 geçersiz girdi (problems[]) · 409 invalid_items, service_not_found, class_not_found · 429 çok sık istek
packages.redeem
Paket seansı kullan — Seansı kaldıkça bir randevuyu abonelikten karşılar.
Gereken izin packages:write · veriyi değiştirir
https://app.getera.io/api/v1/package_usages/actions/redeem- Asıl adres:
POST /api/v1/actions/packages.redeem
Girdi
| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
subscriptionId | uuid | evet | Abonelik · kimliği: subscription |
recordType | string (enum) | evet | Randevu türü · İzin verilen değerler: appointment_line, class_joining |
recordId | uuid | evet | Rezervasyon |
Ön koşullar
Koşul tutmazsa işlem 409 ve şu kodlardan biriyle reddedilir:
| Kod | Ne zaman reddedilir |
|---|---|
subscription_not_found | Abonelik bulunmalı. |
subscription_not_active | Abonelik aktif olmalı. |
record_not_found | Randevu bulunmalı ve iptal edilmemiş olmalı. |
customer_mismatch | Randevu abone için olmalı. |
subscription_expired | Randevu aboneliğin dönemi içinde olmalı. |
not_covered | Paket, randevusu alınan hizmeti içermeli. |
already_redeemed | Bir randevu en fazla bir seans kullanır. |
no_sessions_left | Dönemin seanslarının hepsi kullanılmış olmamalı. |
Yayımladığı olaylar: packages.session_used, packages.almost_used_up
Neye yazar: package_usage (insert) — Records the session drawn
curl -X POST https://app.getera.io/api/v1/package_usages/actions/redeem \
-H "Authorization: Bearer $ERA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"subscriptionId":"SUBSCRIPTION_ID","recordType":"appointment_line","recordId":"RECORD_ID"}'{
"ok": true,
"result": "…",
"events": [
"packages.session_used",
"packages.almost_used_up"
]
}import { createEra } from "@getera/sdk"
const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.packageUsages.redeem({
subscriptionId: "SUBSCRIPTION_ID",
recordType: "appointment_line",
recordId: "RECORD_ID"
})era package_usages redeem \
--subscription-id "SUBSCRIPTION_ID" \
--record-type "appointment_line" \
--record-id "RECORD_ID"{
"name": "era__packages__redeem",
"arguments": {
"subscriptionId": "SUBSCRIPTION_ID",
"recordType": "appointment_line",
"recordId": "RECORD_ID"
}
}Hatalar: 401 kimlik bilgisi yok ya da süresi dolmuş · 403 kimlik bilgisinde packages:write izni yok · 404 kayıt ya da modül erişim dışında · 422 geçersiz girdi (problems[]) · 409 subscription_not_found, subscription_not_active, record_not_found, customer_mismatch, subscription_expired, not_covered, already_redeemed, no_sessions_left · 429 çok sık istek
packages.release
Seansı geri ver — Yanlışlıkla düşülen bir seansı geri alır. Randevunun kendisine dokunulmaz.
Gereken izin packages:write · siler ya da geri alınamaz · Era çalıştırırken bir kişiye onaylatır
https://app.getera.io/api/v1/package_usages/{id}/actions/release- Asıl adres:
POST /api/v1/actions/packages.release
Girdi
| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
usageId | uuid | evet | Doldurulduğu yer: adresteki {id} · Oturum · kimliği: package_usage |
Ön koşullar
Koşul tutmazsa işlem 409 ve şu kodlardan biriyle reddedilir:
| Kod | Ne zaman reddedilir |
|---|---|
usage_not_found | Seans bir paketten düşülmüş olmalı. |
Yayımladığı olaylar: packages.session_released
Neye yazar: package_usage (delete) — Removes the usage
curl -X POST https://app.getera.io/api/v1/package_usages/PACKAGE_USAGE_ID/actions/release \
-H "Authorization: Bearer $ERA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{}'{
"ok": true,
"result": "…",
"events": [
"packages.session_released"
]
}import { createEra } from "@getera/sdk"
const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.packageUsages.release("PACKAGE_USAGE_ID")era package_usages release PACKAGE_USAGE_ID{
"name": "era__packages__release",
"arguments": {
"usageId": "PACKAGE_USAGE_ID"
}
}Hatalar: 401 kimlik bilgisi yok ya da süresi dolmuş · 403 kimlik bilgisinde packages:write izni yok · 404 kayıt ya da modül erişim dışında · 422 geçersiz girdi (problems[]) · 409 usage_not_found · 429 çok sık istek
packages.retire_package
Satıştan kaldır — Satışı durdurur. Devam eden abonelikler bitiş tarihlerine kadar sürer.
Gereken izin packages:manage · dışarıya ulaşır (gönderir, yayımlar ya da ücret alır) · Era çalıştırırken bir kişiye onaylatır
https://app.getera.io/api/v1/packages/{id}/actions/retire_package- Asıl adres:
POST /api/v1/actions/packages.retire_package
Girdi
| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
id | uuid | evet | Doldurulduğu yer: adresteki {id} · Paket · kimliği: package |
Ön koşullar
Koşul tutmazsa işlem 409 ve şu kodlardan biriyle reddedilir:
| Kod | Ne zaman reddedilir |
|---|---|
not_found | Paket bulunmalı. |
package_retired | Hâlâ satışta olmalı. |
Yayımladığı olaylar: packages.package_retired
Neye yazar: package (update) — Stamps archived_at
curl -X POST https://app.getera.io/api/v1/packages/PACKAGE_ID/actions/retire_package \
-H "Authorization: Bearer $ERA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{}'{
"ok": true,
"result": "…",
"events": [
"packages.package_retired"
]
}import { createEra } from "@getera/sdk"
const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.packages.retirePackage("PACKAGE_ID")era packages retire_package PACKAGE_ID{
"name": "era__packages__retire_package",
"arguments": {
"id": "PACKAGE_ID"
}
}Hatalar: 401 kimlik bilgisi yok ya da süresi dolmuş · 403 kimlik bilgisinde packages:manage izni yok · 404 kayıt ya da modül erişim dışında · 422 geçersiz girdi (problems[]) · 409 not_found, package_retired · 429 çok sık istek
packages.set_items
Kapsamı değiştir — Paketteki hizmet ve dersler, her birinden kaç seansla.
Gereken izin packages:manage · siler ya da geri alınamaz
https://app.getera.io/api/v1/package_items/actions/set_items- Asıl adres:
POST /api/v1/actions/packages.set_items
Girdi
| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
id | uuid | evet | Paket · kimliği: package |
items | object / array | evet | Neleri kapsar · [{ itemVariantId? | groupClassId?, sessionsPerPeriod? (boş = sınırsız) }] |
Ön koşullar
Koşul tutmazsa işlem 409 ve şu kodlardan biriyle reddedilir:
| Kod | Ne zaman reddedilir |
|---|---|
not_found | Paket bulunmalı. |
package_retired | Satıştan kaldırılmış bir paket düzenlenemez. |
invalid_items | En az bir öğe; her biri bir hizmet ya da bir ders. |
service_not_found | Her hizmet bulunmalı. |
class_not_found | Her ders bulunmalı ve hâlâ yapılıyor olmalı. |
items_in_use | Seans kullanıldıktan sonra içerik değişemez. |
Yayımladığı olaylar: packages.package_updated
Neye yazar: package_item (delete) — Clears the old contents; package_item (insert) — Writes the new contents
curl -X POST https://app.getera.io/api/v1/package_items/actions/set_items \
-H "Authorization: Bearer $ERA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"id":"PACKAGE_ID","items":{}}'{
"ok": true,
"result": "…",
"events": [
"packages.package_updated"
]
}import { createEra } from "@getera/sdk"
const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.packageItems.setItems({
id: "PACKAGE_ID",
items: {}
})era package_items set_items --data '{"id":"PACKAGE_ID","items":{}}'{
"name": "era__packages__set_items",
"arguments": {
"id": "PACKAGE_ID",
"items": {}
}
}Hatalar: 401 kimlik bilgisi yok ya da süresi dolmuş · 403 kimlik bilgisinde packages:manage izni yok · 404 kayıt ya da modül erişim dışında · 422 geçersiz girdi (problems[]) · 409 not_found, package_retired, invalid_items, service_not_found, class_not_found, items_in_use · 429 çok sık istek
packages.update_package
Paketi düzenle — Ad, dönem, fiyat ve varsayılan yenileme — yalnızca yeni satışlar için.
Gereken izin packages:manage · veriyi değiştirir
https://app.getera.io/api/v1/packages/{id}/actions/update_package- REST kısayolu:
PATCH /api/v1/packages/{id} - Asıl adres:
POST /api/v1/actions/packages.update_package
Girdi
| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
id | uuid | evet | Doldurulduğu yer: adresteki {id} · Paket · kimliği: package |
name | string | Ad · en çok 255 | |
periodMonths | number | Ay · en az 1 · en çok 120 | |
priceAmount | number (money) | Fiyat (küçük birim) · en az 1 | |
priceCurrency | string | Para birimi · en çok 3 | |
autoRenew | boolean | Varsayılan olarak yenilenir |
Ön koşullar
Koşul tutmazsa işlem 409 ve şu kodlardan biriyle reddedilir:
| Kod | Ne zaman reddedilir |
|---|---|
not_found | Paket bulunmalı. |
package_retired | Satıştan kaldırılmış bir paket düzenlenemez. |
Yayımladığı olaylar: packages.package_updated
Neye yazar: package (update) — Updates the package
curl -X POST https://app.getera.io/api/v1/packages/PACKAGE_ID/actions/update_package \
-H "Authorization: Bearer $ERA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"name":"Name"}'{
"ok": true,
"result": "…",
"events": [
"packages.package_updated"
]
}import { createEra } from "@getera/sdk"
const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.packages.updatePackage("PACKAGE_ID", {
name: "Name"
})era packages update_package PACKAGE_ID \
--name "Name"{
"name": "era__packages__update_package",
"arguments": {
"id": "PACKAGE_ID",
"name": "Name"
}
}Hatalar: 401 kimlik bilgisi yok ya da süresi dolmuş · 403 kimlik bilgisinde packages:manage izni yok · 404 kayıt ya da modül erişim dışında · 422 geçersiz girdi (problems[]) · 409 not_found, package_retired · 429 çok sık istek
packages.use_on_my_booking
Paketimi kullan — Giriş yapmış müşteri, yeni aldığı randevuyu seansı kalmışsa paketinden karşılar.
Gereken izin packages:write · veriyi değiştirir · Yayındaki bir siteden de çağrılabilir (customer)
/api/site/v1/{siteId}, örneğin @getera/storefront ile). API anahtarı ya da token ile istek reddedilir (403 site_only).https://app.getera.io/api/v1/package_usages/actions/use_on_my_booking- Asıl adres:
POST /api/v1/actions/packages.use_on_my_booking
Girdi
| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
subscriptionId | uuid | evet | Paket · kimliği: subscription |
appointmentId | uuid | evet | Rezervasyon · kimliği: appointment |
Ön koşullar
Koşul tutmazsa işlem 409 ve şu kodlardan biriyle reddedilir:
| Kod | Ne zaman reddedilir |
|---|---|
not_your_booking | Yalnızca müşterinin katılımcısı olduğu bir randevu için yapılabilir. |
no_sessions_left | Dönemin seanslarının hepsi kullanılmış olmamalı. |
Yayımladığı olaylar: packages.session_used, packages.almost_used_up
Neye yazar: package_usage (insert) — Records the session drawn
Hatalar: 401 kimlik bilgisi yok ya da süresi dolmuş · 403 kimlik bilgisinde packages:write izni yok · 404 kayıt ya da modül erişim dışında · 422 geçersiz girdi (problems[]) · 409 not_your_booking, no_sessions_left · 429 çok sık istek
Veri modelleri
PackageItem
Tablo package_item · Kaynak package_items
GET /api/v1/package_itemsGET /api/v1/package_items/{id}
| Sütun | Tür | Boş olabilir | İzin verilen değerler | Bağlı olduğu tablo |
|---|---|---|---|---|
id | string (uuid) · uuid | |||
organization_id | string (uuid) · uuid | organization | ||
workspace_id | string (uuid) · uuid | workspace | ||
package_id | string (uuid) · uuid | package | ||
item_variant_id | string (uuid) · uuid | evet | item_variant | |
group_class_id | string (uuid) · uuid | evet | group_class | |
sessions_per_period | integer · int4 | evet | ||
sort_order | integer · int4 | |||
created_at | string (date-time) · timestamptz |
Birincil anahtar: id
Denetimler:
CHECK ((num_nonnulls(item_variant_id, group_class_id) = 1))CHECK (((sessions_per_period IS NULL) OR (sessions_per_period > 0)))
PackageUsage
Tablo package_usage · Kaynak package_usages
GET /api/v1/package_usagesGET /api/v1/package_usages/{id}
| Sütun | Tür | Boş olabilir | İzin verilen değerler | Bağlı olduğu tablo |
|---|---|---|---|---|
id | string (uuid) · uuid | |||
organization_id | string (uuid) · uuid | organization | ||
workspace_id | string (uuid) · uuid | workspace | ||
subscription_id | string (uuid) · uuid | subscription | ||
package_item_id | string (uuid) · uuid | package_item | ||
record_type | string · text | appointment_line, class_joining | ||
record_id | string (uuid) · uuid | |||
used_on | string (date) · date | |||
created_by | string (uuid) · uuid | evet | app_user | |
created_at | string (date-time) · timestamptz |
Birincil anahtar: id
Tekil: record_type, record_id
Package
Tablo package · Kaynak packages
GET /api/v1/packagesGET /api/v1/packages/{id}POST /api/v1/packages→packages.create_packagePATCH /api/v1/packages/{id}→packages.update_package
| Sütun | Tür | Boş olabilir | İzin verilen değerler | Bağlı olduğu tablo |
|---|---|---|---|---|
id | string (uuid) · uuid | |||
organization_id | string (uuid) · uuid | organization | ||
workspace_id | string (uuid) · uuid | workspace | ||
name | string · text | |||
period_months | integer · int4 | |||
price_amount | string (int64) · int8 | |||
price_currency | string · bpchar | evet | en çok 3 | |
auto_renew | boolean · bool | |||
archived_at | string (date-time) · timestamptz | evet | ||
created_by | string (uuid) · uuid | evet | app_user | |
created_at | string (date-time) · timestamptz | |||
updated_at | string (date-time) · timestamptz | |||
is_public | boolean · bool | evet |
Birincil anahtar: id
Denetimler:
CHECK (((length(btrim(name)) >= 1) AND (length(btrim(name)) <= 255)))CHECK ((period_months > 0))CHECK ((price_amount >= 0))
Olaylar
İş akışları ve webhook'lar bu olaylara tepki verir.
| Olay | Ne olur | Taşıdığı alanlar |
|---|---|---|
packages.almost_used_up | Bir müşterinin paketinde bu dönem iki veya daha az seans kaldı. | id, subscriptionId, packageId, packageName, packageItemId, customerId, remaining, included, endsOn, autoRenew |
packages.package_created | Bir paket satışa çıkarıldı. | id, name, periodMonths, priceAmount |
packages.package_retired | Bir paket satıştan kaldırıldı. | id |
packages.package_updated | Bir paket değişti. | id |
packages.session_released | Bir paket seansı geri verildi. | id, subscriptionId |
packages.session_used | Bir randevu bir paketle karşılandı. | id, subscriptionId, recordType, recordId, customerId, remaining |