Giriş
READERP API'si, ERP'nizdeki veriyi kendi sistemlerinize okutmanızı sağlar: e-ticaret sitesi, CRM, mobil uygulama, kendi paneliniz. Yalnız okur. Yazma ucu yoktur ve eklenmeyecektir.
Çalışma biçimi diğer API'lerden bir yerde ayrılıyor ve entegrasyonu yazmadan önce bilinmesi gereken tek şey bu: sorgular sizin sunucunuzda koşar. Çağrınız işi kuyruğa alır, şirketinizdeki ajan işi alıp kendi veritabanınızda çalıştırır, sonuç panele döner. Bu yüzden akış eşzamansızdır ve iki uç vardır.
Üç cümlede
- Taban adres
https://panel.readerp.com/api/v1— yalnız HTTPS. - Kimlik iki başlıkla:
X-Readerp-Api-KeyveX-Readerp-Api-Secret. - Sonuç ömrü varsayılan 60 saniye. Aldığınız sonucu kendi tarafınıza yazın.
Akış
POST /run— raporu kuyruğa alır,job_iddöner.GET /job/{id}— durumu ve bittiğinde sonucu verir.- Hazır istemcilerdeki
runAndWaitikisini sizin için yapar.
İstek
GET /api/v1/ping HTTP/1.1 Host: panel.readerp.com X-Readerp-Api-Key: ANAHTAR X-Readerp-Api-Secret: GIZLI Accept: application/json
curl "https://panel.readerp.com/api/v1/ping" \ -H "X-Readerp-Api-Key: $KEY" \ -H "X-Readerp-Api-Secret: $SECRET"
<?php
require 'readerp-client.php';
$api = new ReaderpClient(getenv('READERP_KEY'), getenv('READERP_SECRET'));
$stok = $api->runAndWait('H1', 'SIRKET');
foreach ($stok['rows'] as $r) {
echo $r['stock_code'], ' ', $r['quantity'], PHP_EOL;
}
import { ReaderpClient } from './readerp-client.js';
const api = new ReaderpClient(process.env.READERP_KEY,
process.env.READERP_SECRET);
const stok = await api.runAndWait('H1', 'SIRKET');
for (const r of stok.rows) {
console.log(r.stock_code, r.quantity);
}
import os, requests
BASE = 'https://panel.readerp.com/api/v1'
H = {'X-Readerp-Api-Key': os.environ['READERP_KEY'],
'X-Readerp-Api-Secret': os.environ['READERP_SECRET']}
r = requests.post(BASE + '/run', headers=H,
json={'id': 'H1', 'entity': 'SIRKET'})
job = r.json()['job_id']
using var http = new HttpClient { BaseAddress = new Uri("https://panel.readerp.com/api/v1/") };
http.DefaultRequestHeaders.Add("X-Readerp-Api-Key", key);
http.DefaultRequestHeaders.Add("X-Readerp-Api-Secret", secret);
var res = await http.PostAsJsonAsync("run",
new { id = "H1", entity = "SIRKET" });
Yanıt
{
"pong": true,
"tenant": "sirketiniz"
}
{
"error": "Geçersiz API anahtarı"
}
Hızlı başlangıç
Dört adım, yarım saat. Sonunda mağazanız canlı stok okuyor olur.
1. Anahtarı alın
Panelde Ayarlar → API anahtarları. Anahtara ad verin, hangi şirkette hangi raporları çalıştırabileceğini işaretleyin. Gizli değer yalnız o an bir kez gösterilir; bizde yalnız özeti durur.
2. Bağlantıyı sınayın
/ping 200 dönüyorsa anahtar ve ağ tamam. 401 alıyorsanız
başlıklar eksiktir ya da gizli değer yanlıştır.
3. Neyi çalıştırabildiğinizi görün
/catalog yalnız bu anahtarın çalıştırabileceği raporları döner;
her rapor kendi şirket listesini ve parametrelerini taşır. Kataloğu uygulamanızın
açılışında bir kez okuyup önbelleğe alın.
4. İlk raporu çalıştırın
Hazır istemcilerde tek satır. Elle yazıyorsanız /run ile başlatıp
/job/{id} yoklayın: bir saniyeyle başlayıp beş saniyeye çıkan
aralıklarla, sonsuza kadar değil.
İstek
POST /api/v1/run HTTP/1.1
Host: panel.readerp.com
X-Readerp-Api-Key: ANAHTAR
X-Readerp-Api-Secret: GIZLI
Content-Type: application/json
{
"id": "H1",
"entity": "SIRKET"
}
export KEY="ak_..." export SECRET="..." curl "https://panel.readerp.com/api/v1/ping" \ -H "X-Readerp-Api-Key: $KEY" \ -H "X-Readerp-Api-Secret: $SECRET" curl "https://panel.readerp.com/api/v1/catalog" \ -H "X-Readerp-Api-Key: $KEY" \ -H "X-Readerp-Api-Secret: $SECRET"
<?php
require 'readerp-client.php';
$api = new ReaderpClient(getenv('READERP_KEY'), getenv('READERP_SECRET'));
// 1 · bağlantı
$api->ping();
// 2 · ne çalıştırabiliyorum
foreach ($api->catalog()['reports'] as $r) {
echo $r['id'], ' ', $r['name'], PHP_EOL;
}
// 3 · çalıştır ve bekle
$sonuc = $api->runAndWait('H1', 'SIRKET');
echo $sonuc['row_count'], ' satır';
import { ReaderpClient } from './readerp-client.js';
const api = new ReaderpClient(process.env.READERP_KEY,
process.env.READERP_SECRET);
await api.ping();
const { reports } = await api.catalog();
reports.forEach((r) => console.log(r.id, r.name));
const sonuc = await api.runAndWait('H1', 'SIRKET');
console.log(sonuc.row_count, 'satır');
import os, requests
BASE = 'https://panel.readerp.com/api/v1'
H = {'X-Readerp-Api-Key': os.environ['READERP_KEY'],
'X-Readerp-Api-Secret': os.environ['READERP_SECRET']}
import time
requests.get(BASE + '/ping', headers=H).raise_for_status()
job = requests.post(BASE + '/run', headers=H,
json={'id': 'H1', 'entity': 'SIRKET'}).json()['job_id']
bekle = 1
while True:
j = requests.get(f'{BASE}/job/{job}', headers=H).json()
if j['status'] in ('done', 'failed'):
break
time.sleep(bekle)
bekle = min(5, bekle + 1)
print(j['row_count'], 'satır')
Yanıt
{
"reports": [
{
"id": "H1",
"name": "Stok mevcudu",
"entities": ["SIRKET", "SIRKET2"],
"parameters": [],
"columns": ["stock_code", "stock_name", "depot", "quantity"]
}
]
}
Kimlik doğrulama
Her istek iki başlık taşır. Üçüncü bir yöntem yok: OAuth akışı, imzalı istek ya da çerez oturumu aramayın.
| Başlık | Değer |
|---|---|
| X-Readerp-Api-Key | Anahtarın kimliği. Günlüğe yazılabilir; gizli değildir. |
| X-Readerp-Api-Secret | Gizli değer. Yalnız oluşturulduğu anda bir kez gösterilir; bizde özeti durur. |
Anahtarı kaybederseniz
Geri getirilemez, yenilenir. Yenilendiği an eskisi geçersiz olur — entegrasyonu durdurmadan anahtar döndürmek için bunu bakım penceresinde yapın.
Nerede saklanmalı
- Sunucunuzun ortam değişkeninde ya da gizli anahtar deposunda.
- Depoda değil. Bir kez commit edilen anahtar, geçmişte kalır.
- İstemcide değil. Tarayıcı ve mobil paket herkese açıktır.
403 alır. Sunucunuzun çıkış IP'si değişiyorsa
(bulut, NAT havuzu) blok olarak yazın.İstek
GET /api/v1/ping HTTP/1.1 Host: panel.readerp.com X-Readerp-Api-Key: ANAHTAR X-Readerp-Api-Secret: GIZLI Accept: application/json
curl "https://panel.readerp.com/api/v1/ping" \ -H "X-Readerp-Api-Key: $KEY" \ -H "X-Readerp-Api-Secret: $SECRET"
<?php
require 'readerp-client.php';
$api = new ReaderpClient(getenv('READERP_KEY'), getenv('READERP_SECRET'));
// Anahtar ortamdan; kaynak dosyada durmaz.
$api = new ReaderpClient(
getenv('READERP_KEY'),
getenv('READERP_SECRET')
);
import { ReaderpClient } from './readerp-client.js';
const api = new ReaderpClient(process.env.READERP_KEY,
process.env.READERP_SECRET);
// Node tarafında. Tarayıcıya koymayın.
const api = new ReaderpClient(
process.env.READERP_KEY,
process.env.READERP_SECRET,
);
import os, requests
BASE = 'https://panel.readerp.com/api/v1'
H = {'X-Readerp-Api-Key': os.environ['READERP_KEY'],
'X-Readerp-Api-Secret': os.environ['READERP_SECRET']}
H = {
'X-Readerp-Api-Key': os.environ['READERP_KEY'],
'X-Readerp-Api-Secret': os.environ['READERP_SECRET'],
}
using var http = new HttpClient { BaseAddress = new Uri("https://panel.readerp.com/api/v1/") };
http.DefaultRequestHeaders.Add("X-Readerp-Api-Key", key);
http.DefaultRequestHeaders.Add("X-Readerp-Api-Secret", secret);
// appsettings degil, kullanici gizli anahtarlari ya da ortam.
Yanıt
{
"pong": true,
"tenant": "sirketiniz"
}
{
"error": "API kimlik başlıkları eksik"
}
{
"error": "Bu adresten bu anahtarla erişime izin yok"
}
Veri tipleri
Her parametrenin bir tipi var ve doğrulama tam olarak aşağıdaki kurallarla
yapılıyor. Kurala uymayan değer sorguya hiç girmez, 400 ile döner.
Beyaz liste yöntemi: tırnak, noktalı virgül, boşluk ve yorum işaretleri
süzülmüyor — en baştan kabul edilmiyor.
| Tip | Kural | Örnek | Bilmeniz gereken |
|---|---|---|---|
code | Harf, rakam ve . _ / - € ₺ $ £ · 1–40 karakter | URN0035 | Para birimi işareti kasıtlı: Netsis dövizli cari kodlarına ekliyor, 120340068€ gerçek bir koddur. |
docno | Harf, rakam ve . / _ - · 1–20 karakter | FTR2026000000123 | Belge numarası LIKE ile eşleşir. ASCII dışı her karakter tek karakterlik joker _ olur — veritabanları Latin1 olduğu için Ş harfini birebir aramak hiçbir zaman tutmaz. |
date | YYYY-MM-DD | 2026-01-31 | Saat yok, saat dilimi yok. Gün bazında karşılaştırılır. |
int | İsteğe bağlı eksi, en çok 9 basamak | 90 | Raporun kendi üst sınırı ayrıca geçerlidir; H8'de limit en fazla 1000. |
taxno | 10 hane (VKN) ya da 11 hane (TCKN) | 1234567890 | Kullanım kaydına maskelenerek yazılır; sorguya olduğu gibi gider. |
name | Harf, rakam, boşluk ve . , & ' / - · 3–60 karakter | örnek metal | Ünvan araması (H4). Kelimeler ayrı ayrı aranır ve hepsi geçmelidir; en çok üç kelime. ASCII dışı karakterler tek karakterlik jokere çevrilir, bu yüzden Türkçe karakter ve büyük/küçük farkı aramayı bozmaz. |
email | Standart e-posta biçimi, yerel kısım ≤64 karakter | alici@ornek.com | Küçük harfe çevrilerek karşılaştırılır. |
Boş değer ne demek
Zorunlu olmayan parametreyi göndermeyebilirsiniz ya da boş string geçebilirsiniz; ikisi de "bu alanda filtre yok" demektir ve raporun kendi varsayılanı devreye girer. Katalogda tanımlı olmayan bir alan gönderirseniz istek reddedilir — sessizce yok sayılmaz.
Dönen değerlerin tipleri
- Sayılar JSON sayısıdır, binlik ayracı yoktur. Kuruş duyarlılığı gereken
yerde metne çevirip
decimalokuyun; kayan noktada toplamayın. - Tarihler
YYYY-MM-DDbiçiminde metindir. - Boş alan
nulldöner; boş string ile karıştırmayın. - Eksi stok eksi döner, kırpılmaz — kırpmak veri sorununu gizlemek olurdu.
İstek
{
"id": "H8",
"entity": "SIRKET",
"arguments": {
"stock_code": "URN0035", // code · zorunlu
"date_from": "2026-01-01", // date · istege bagli
"date_to": "2026-09-27", // date · istege bagli
"limit": 200 // int · ust sinir 1000
}
}
curl -X POST "https://panel.readerp.com/api/v1/run" \
-H "X-Readerp-Api-Key: $KEY" \
-H "X-Readerp-Api-Secret: $SECRET" \
-H "Content-Type: application/json" \
-d '{"id":"H8","entity":"SIRKET","arguments":{"stock_code":"URN0035","date_from":"2026-01-01","limit":200}}'
<?php
require 'readerp-client.php';
$api = new ReaderpClient(getenv('READERP_KEY'), getenv('READERP_SECRET'));
$sonuc = $api->runAndWait('H8', 'SIRKET', [
'stock_code' => 'URN0035',
'date_from' => '2026-01-01',
'limit' => 200,
]);
import { ReaderpClient } from './readerp-client.js';
const api = new ReaderpClient(process.env.READERP_KEY,
process.env.READERP_SECRET);
const sonuc = await api.runAndWait('H8', 'SIRKET', {
stock_code: 'URN0035',
date_from: '2026-01-01',
limit: 200,
});
import os, requests
BASE = 'https://panel.readerp.com/api/v1'
H = {'X-Readerp-Api-Key': os.environ['READERP_KEY'],
'X-Readerp-Api-Secret': os.environ['READERP_SECRET']}
govde = {'id': 'H8', 'entity': 'SIRKET',
'arguments': {'stock_code': 'URN0035',
'date_from': '2026-01-01',
'limit': 200}}
r = requests.post(BASE + '/run', headers=H, json=govde)
Yanıt
{
"error": "Geçersiz parametre: doc_no"
}
{
"error": "Eksik parametre: stock_code"
}
İstek ve yanıt sözleşmesi
Sonuç iki parçadır: kolon listesi ve satırlar. Kolon sırası kataloğdaki sırayla aynıdır ve raporun sürümü değişmeden değişmez; yeni kolon sona eklenir, var olanın adı değişmez. Buna güvenerek kolon adıyla okuyun, sırayla değil.
| Alan | Tip | Açıklama |
|---|---|---|
| job_id | integer | Çalıştırmanın numarası. Kendi kaydınıza yazın; destek istediğinizde aradığımız şey budur. |
| status | string | queued · running · done · failed · cancelled |
| row_count | integer | Dönen satır sayısı. result silinmiş olsa bile kalır. |
| duration_ms | integer | Sorgunun sizin sunucunuzda geçirdiği süre. |
| truncated | boolean | true ise raporun üst sınırına dayanıldı ve satırlar kesildi. |
| result.columns | string[] | Kolon adları, sırasıyla. |
| result.rows | object[] | Her satır bir nesne: kolon adı → değer. |
| error | string | Yalnız hata gövdelerinde. Başarılı yanıtta bu alan yoktur. |
Bir satır her zaman bir belge değildir
Belge raporları satır bazlıdır: bir faturanın üç kalemi üç satırdır ve başlık alanları üçünde de tekrarlanır. Belge sayısı isteyen, belge numarasına göre teklileştirmelidir.
Ortak kurallar
- Saat dilimi Europe/Istanbul · kodlama UTF-8.
- Sıkıştırma gzip destekleniyor; büyük sonuçlarda
Accept-Encoding: gzipgönderin. - Sürümleme yol içinde:
/api/v1. Yeni uç eklenebilir, var olanın davranışı değişmez.
Yanıt
{
"job_id": 2871,
"status": "done",
"duration_ms": 413,
"row_count": 303,
"truncated": false,
"result": {
"columns": ["stock_code", "stock_name", "depot", "quantity"],
"rows": [
{"stock_code": "URN0035", "stock_name": "…", "depot": 1, "quantity": 128.0},
{"stock_code": "URN0036", "stock_name": "…", "depot": 1, "quantity": 0.0}
]
}
}
{
"job_id": 2871,
"status": "queued"
}
{
"error": "Sonuç saklama süresi dolmuş olabilir"
}
Bağlantı ve anahtar kontrolü
/pingAnahtar geçerli mi, hangi kiracıya ait. Entegrasyonu kurarken ilk çağrılacak
uç; izleme betiğinizde de bunu kullanın. Ajanın canlı olup olmadığını söylemez —
onu /run söyler.
İstek
GET /api/v1/ping HTTP/1.1 Host: panel.readerp.com X-Readerp-Api-Key: ANAHTAR X-Readerp-Api-Secret: GIZLI Accept: application/json
curl "https://panel.readerp.com/api/v1/ping" \ -H "X-Readerp-Api-Key: $READERP_KEY" \ -H "X-Readerp-Api-Secret: $READERP_SECRET"
<?php
require 'readerp-client.php';
$api = new ReaderpClient(getenv('READERP_KEY'), getenv('READERP_SECRET'));
$durum = $api->ping();
echo $durum['tenant'];
import { ReaderpClient } from './readerp-client.js';
const api = new ReaderpClient(process.env.READERP_KEY,
process.env.READERP_SECRET);
const durum = await api.ping();
console.log(durum.tenant);
import os, requests
BASE = 'https://panel.readerp.com/api/v1'
H = {
'X-Readerp-Api-Key': os.environ['READERP_KEY'],
'X-Readerp-Api-Secret': os.environ['READERP_SECRET'],
}
r = requests.get(BASE + '/ping', headers=H, timeout=30)
r.raise_for_status()
veri = r.json()
using System.Net.Http.Json;
var http = new HttpClient { BaseAddress = new Uri("https://panel.readerp.com/api/v1/") };
http.DefaultRequestHeaders.Add("X-Readerp-Api-Key",
Environment.GetEnvironmentVariable("READERP_KEY"));
http.DefaultRequestHeaders.Add("X-Readerp-Api-Secret",
Environment.GetEnvironmentVariable("READERP_SECRET"));
var veri = await http.GetFromJsonAsync<JsonElement>("ping");
Yanıt
{
"pong": true,
"tenant": "sirketiniz"
}
{
"error": "Geçersiz API anahtarı"
}
Çalıştırabileceğiniz raporlar
/catalogBu anahtarın çalıştırabileceği raporlar. Her rapor kendi şirket listesini, parametrelerini ve döndürdüğü kolonları taşır.
404, yetkisiz rapor 403 döner.Kataloğu uygulamanızın açılışında bir kez okuyup önbelleğe alın; her çağrıdan önce sormanız gerekmez.
İstek
GET /api/v1/catalog HTTP/1.1 Host: panel.readerp.com X-Readerp-Api-Key: ANAHTAR X-Readerp-Api-Secret: GIZLI Accept: application/json
curl "https://panel.readerp.com/api/v1/catalog" \ -H "X-Readerp-Api-Key: $READERP_KEY" \ -H "X-Readerp-Api-Secret: $READERP_SECRET"
<?php
require 'readerp-client.php';
$api = new ReaderpClient(getenv('READERP_KEY'), getenv('READERP_SECRET'));
foreach ($api->catalog()['reports'] as $r) {
echo $r['id'], ' - ', $r['name'], PHP_EOL;
}
import { ReaderpClient } from './readerp-client.js';
const api = new ReaderpClient(process.env.READERP_KEY,
process.env.READERP_SECRET);
const { reports } = await api.catalog();
reports.forEach((r) => console.log(r.id, r.name));
import os, requests
BASE = 'https://panel.readerp.com/api/v1'
H = {
'X-Readerp-Api-Key': os.environ['READERP_KEY'],
'X-Readerp-Api-Secret': os.environ['READERP_SECRET'],
}
r = requests.get(BASE + '/catalog', headers=H, timeout=30)
r.raise_for_status()
veri = r.json()
using System.Net.Http.Json;
var http = new HttpClient { BaseAddress = new Uri("https://panel.readerp.com/api/v1/") };
http.DefaultRequestHeaders.Add("X-Readerp-Api-Key",
Environment.GetEnvironmentVariable("READERP_KEY"));
http.DefaultRequestHeaders.Add("X-Readerp-Api-Secret",
Environment.GetEnvironmentVariable("READERP_SECRET"));
var veri = await http.GetFromJsonAsync<JsonElement>("catalog");
Yanıt
{
"reports": [
{
"id": "H1",
"name": "Stok mevcudu",
"entities": ["SIRKET", "SIRKET2"],
"parameters": [],
"columns": ["stock_code", "stock_name", "depot", "quantity", "is_service"]
},
{
"id": "H8",
"name": "Stok kodu satış satırları",
"entities": ["SIRKET"],
"parameters": [
{"name": "stock_code", "required": true, "type": "code"},
{"name": "limit", "required": false, "type": "int", "default": 200}
],
"columns": ["doc_date", "doc_no", "cari_name", "quantity", "unit_price_tl"]
}
]
}
Raporu kuyruğa al
/runRaporu kuyruğa alır ve hemen döner — sonucu beklemez. Sorgu sizin sunucunuzda koşacağı için tipik bekleme bir ile beş saniyedir.
| Alan | Tip | Açıklama |
|---|---|---|
| id zorunlu | string | Rapor kodu, kataloğdaki hâliyle: H1, H8. |
| entity isteğe bağlı | string | Şirket kodu. Verilmezse kiracının varsayılan şirketi kullanılır. |
| arguments isteğe bağlı | object | Raporun kendi parametreleri. Katalogdaki adlar ve tipler geçerlidir; bilinmeyen alan reddedilir. |
entity alanını her
çağrıda yazın. Verilmezse istek varsayılan şirkete gider: yetkiniz yoksa
403, varsa yanlış şirketin verisi. İkincisi daha pahalıdır,
çünkü hata vermez.İstek
POST /api/v1/run HTTP/1.1
Host: panel.readerp.com
X-Readerp-Api-Key: ANAHTAR
X-Readerp-Api-Secret: GIZLI
Content-Type: application/json
{
"id": "H2",
"entity": "SIRKET",
"arguments": {
"doc_no": "FTR2026000000123"
}
}
curl -X POST "https://panel.readerp.com/api/v1/run" \
-H "X-Readerp-Api-Key: $READERP_KEY" \
-H "X-Readerp-Api-Secret: $READERP_SECRET" \
-H "Content-Type: application/json" \
-d '{"id":"H2","entity":"SIRKET","arguments":{"doc_no":"FTR2026000000123"}}'
<?php
require 'readerp-client.php';
$api = new ReaderpClient(getenv('READERP_KEY'), getenv('READERP_SECRET'));
$is = $api->run('H2', 'SIRKET', ['doc_no' => 'FTR2026000000123']);
$jobId = $is['job_id'];
import { ReaderpClient } from './readerp-client.js';
const api = new ReaderpClient(process.env.READERP_KEY,
process.env.READERP_SECRET);
const { job_id } = await api.run('H2', 'SIRKET', {
doc_no: 'FTR2026000000123',
});
import os, requests
BASE = 'https://panel.readerp.com/api/v1'
H = {
'X-Readerp-Api-Key': os.environ['READERP_KEY'],
'X-Readerp-Api-Secret': os.environ['READERP_SECRET'],
}
govde = {
'id': 'H2',
'entity': 'SIRKET',
'arguments': {
'doc_no': 'FTR2026000000123',
},
}
r = requests.post(BASE + '/run', headers=H, json=govde, timeout=30)
r.raise_for_status()
veri = r.json()
using System.Net.Http.Json;
var http = new HttpClient { BaseAddress = new Uri("https://panel.readerp.com/api/v1/") };
http.DefaultRequestHeaders.Add("X-Readerp-Api-Key",
Environment.GetEnvironmentVariable("READERP_KEY"));
http.DefaultRequestHeaders.Add("X-Readerp-Api-Secret",
Environment.GetEnvironmentVariable("READERP_SECRET"));
var istek = new {
id = "H2",
entity = "SIRKET",
arguments = new {
doc_no = "FTR2026000000123",
},
};
var yanit = await http.PostAsJsonAsync("run", istek);
yanit.EnsureSuccessStatusCode();
var veri = await yanit.Content.ReadFromJsonAsync<JsonElement>();
Yanıt
{
"job_id": 2871,
"status": "queued"
}
{
"error": "Bilinmeyen tüzel kişi: XYZ"
}
{
"error": "Bu anahtarın SIRKET2 şirketinde H2 yetkisi yok"
}
Durum ve sonuç
/job/{job_id}Çalıştırmanın durumu; bittiyse sonucu da içinde.
| Durum | Anlamı |
|---|---|
queued | Kuyrukta, ajan henüz almadı. |
running | Ajan aldı, sizin veritabanınızda çalışıyor. |
done | Bitti. result içinde satırlar var — ömrü dolmadıysa. |
failed | Sorgu hata verdi ya da süre aşımına uğradı. |
cancelled | İptal edildi. |
Yoklama aralığı
Bir saniyeyle başlayıp beş saniyeye çıkın ve bir üst sınır koyun. Sabit yüz milisaniyelik yoklama ne sonucu hızlandırır ne de kimseye fayda sağlar; ajanı meşgul eder.
result yoksa saklama
süresi dolmuştur. Raporu yeniden çalıştırın ve sonucu hemen kendi
tarafınıza yazın.İstek
GET /api/v1/job/2871 HTTP/1.1 Host: panel.readerp.com X-Readerp-Api-Key: ANAHTAR X-Readerp-Api-Secret: GIZLI Accept: application/json
curl "https://panel.readerp.com/api/v1/job/2871" \ -H "X-Readerp-Api-Key: $READERP_KEY" \ -H "X-Readerp-Api-Secret: $READERP_SECRET"
<?php
require 'readerp-client.php';
$api = new ReaderpClient(getenv('READERP_KEY'), getenv('READERP_SECRET'));
// Elle yoklamak yerine tek satır:
$sonuc = $api->runAndWait('H2', 'SIRKET',
['doc_no' => 'FTR2026000000123']);
// ya da adım adım:
$durum = $api->job(2871);
import { ReaderpClient } from './readerp-client.js';
const api = new ReaderpClient(process.env.READERP_KEY,
process.env.READERP_SECRET);
// Tek satır:
const sonuc = await api.runAndWait('H2', 'SIRKET', {
doc_no: 'FTR2026000000123',
});
// ya da adım adım:
const durum = await api.job(2871);
import os, requests
BASE = 'https://panel.readerp.com/api/v1'
H = {
'X-Readerp-Api-Key': os.environ['READERP_KEY'],
'X-Readerp-Api-Secret': os.environ['READERP_SECRET'],
}
r = requests.get(BASE + '/job/2871', headers=H, timeout=30)
r.raise_for_status()
veri = r.json()
using System.Net.Http.Json;
var http = new HttpClient { BaseAddress = new Uri("https://panel.readerp.com/api/v1/") };
http.DefaultRequestHeaders.Add("X-Readerp-Api-Key",
Environment.GetEnvironmentVariable("READERP_KEY"));
http.DefaultRequestHeaders.Add("X-Readerp-Api-Secret",
Environment.GetEnvironmentVariable("READERP_SECRET"));
var veri = await http.GetFromJsonAsync<JsonElement>("job/2871");
Yanıt
{
"job_id": 2871,
"status": "done",
"duration_ms": 413,
"row_count": 303,
"truncated": false,
"result": {
"columns": ["doc_no", "doc_date", "total_tl"],
"rows": [
{"doc_no": "FTR2026000000123", "doc_date": "2026-09-14", "total_tl": 18450.0}
]
}
}
{
"job_id": 2871,
"status": "running"
}
{
"error": "Çalıştırma bulunamadı"
}
Son tamamlanmış sonuç
/report/{id}/latestBu rapor için tamamlanmış son çalıştırmanın sonucu — panelin ya da zamanlı görevin çalıştırdığı bir iş de olabilir. Yeni bir çalıştırma başlatmaz, bu yüzden hızlıdır.
| Parametre | Yer | Açıklama |
|---|---|---|
| id zorunlu | yol | Rapor kodu. |
| entity isteğe bağlı | sorgu | Şirket kodu. |
404 döner. Kesin sonuç isteyen /run +
/job kullanır.İstek
GET /api/v1/report/H1/latest?entity=SIRKET HTTP/1.1 Host: panel.readerp.com X-Readerp-Api-Key: ANAHTAR X-Readerp-Api-Secret: GIZLI Accept: application/json
curl "https://panel.readerp.com/api/v1/report/H1/latest?entity=SIRKET" \ -H "X-Readerp-Api-Key: $READERP_KEY" \ -H "X-Readerp-Api-Secret: $READERP_SECRET"
<?php
require 'readerp-client.php';
$api = new ReaderpClient(getenv('READERP_KEY'), getenv('READERP_SECRET'));
$son = $api->latest('H1', 'SIRKET');
import { ReaderpClient } from './readerp-client.js';
const api = new ReaderpClient(process.env.READERP_KEY,
process.env.READERP_SECRET);
const son = await api.latest('H1', 'SIRKET');
import os, requests
BASE = 'https://panel.readerp.com/api/v1'
H = {
'X-Readerp-Api-Key': os.environ['READERP_KEY'],
'X-Readerp-Api-Secret': os.environ['READERP_SECRET'],
}
r = requests.get(BASE + '/report/H1/latest?entity=SIRKET', headers=H, timeout=30)
r.raise_for_status()
veri = r.json()
using System.Net.Http.Json;
var http = new HttpClient { BaseAddress = new Uri("https://panel.readerp.com/api/v1/") };
http.DefaultRequestHeaders.Add("X-Readerp-Api-Key",
Environment.GetEnvironmentVariable("READERP_KEY"));
http.DefaultRequestHeaders.Add("X-Readerp-Api-Secret",
Environment.GetEnvironmentVariable("READERP_SECRET"));
var veri = await http.GetFromJsonAsync<JsonElement>("report/H1/latest?entity=SIRKET");
Yanıt
{
"report": "H1",
"entity": "SIRKET",
"finished_at": "2026-09-27T09:00:12+03:00",
"row_count": 303,
"result": { "columns": ["…"], "rows": [] }
}
{
"error": "Bu rapor için tamamlanmış çalıştırma yok"
}
Pano özeti
/dashboardPanonun özet rakamları — kendi iç ekranınıza taşımak için.
dashboard:read
işaretli olmalı; rapor yetkisi bunu kendiliğinden vermez.İstek
GET /api/v1/dashboard HTTP/1.1 Host: panel.readerp.com X-Readerp-Api-Key: ANAHTAR X-Readerp-Api-Secret: GIZLI Accept: application/json
curl "https://panel.readerp.com/api/v1/dashboard" \ -H "X-Readerp-Api-Key: $READERP_KEY" \ -H "X-Readerp-Api-Secret: $READERP_SECRET"
<?php
require 'readerp-client.php';
$api = new ReaderpClient(getenv('READERP_KEY'), getenv('READERP_SECRET'));
$pano = $api->dashboard();
import { ReaderpClient } from './readerp-client.js';
const api = new ReaderpClient(process.env.READERP_KEY,
process.env.READERP_SECRET);
const pano = await api.dashboard();
import os, requests
BASE = 'https://panel.readerp.com/api/v1'
H = {
'X-Readerp-Api-Key': os.environ['READERP_KEY'],
'X-Readerp-Api-Secret': os.environ['READERP_SECRET'],
}
r = requests.get(BASE + '/dashboard', headers=H, timeout=30)
r.raise_for_status()
veri = r.json()
using System.Net.Http.Json;
var http = new HttpClient { BaseAddress = new Uri("https://panel.readerp.com/api/v1/") };
http.DefaultRequestHeaders.Add("X-Readerp-Api-Key",
Environment.GetEnvironmentVariable("READERP_KEY"));
http.DefaultRequestHeaders.Add("X-Readerp-Api-Secret",
Environment.GetEnvironmentVariable("READERP_SECRET"));
var veri = await http.GetFromJsonAsync<JsonElement>("dashboard");
Yanıt
{
"entity": "SIRKET",
"generated_at": "2026-09-27T09:12:00+03:00",
"metrics": {
"revenue_mtd": 4820150.44,
"receivables_open": 19233410.10,
"dispatch_open": 1384220.00
}
}
{
"error": "Bu anahtarın pano yetkisi yok"
}
Hata kodları
Hata gövdesi her zaman {"error":"..."} biçimindedir ve Türkçe
yazılmıştır — çünkü onu okuyan çoğu zaman bir geliştirici değil, entegrasyonu
izleyen kişidir.
| Kod | Mesaj | Ne oldu |
|---|---|---|
| 401 | API kimlik başlıkları eksik | Başlıkları göndermediniz. |
| 401 | Geçersiz API anahtarı | Anahtar ya da gizli değer yanlış. |
| 403 | API anahtarı kullanım dışı | Anahtar devre dışı bırakılmış. |
| 403 | API anahtarının süresi dolmuş | Son kullanma tarihi geçmiş. |
| 403 | Bu adresten bu anahtarla erişime izin yok | IP kısıtı. |
| 403 | Bu anahtarın X şirketinde H2 yetkisi yok | Matriste o kutu işaretli değil. |
| 400 | Geçersiz parametre: doc_no | Biçim tutmuyor (tırnak, boşluk, uzunluk). |
| 400 | Eksik parametre: doc_no | Zorunlu parametre yok. |
| 400 | Bilinmeyen tüzel kişi: XYZ | Şirket kodu yanlış. |
| 404 | Bilinmeyen rapor: H9 | Katalogda böyle bir rapor yok. |
| 404 | Çalıştırma bulunamadı | İş numarası size ait değil ya da yok. |
| 404 | Bu rapor için tamamlanmış çalıştırma yok | latest, hiç çalışmamış rapor. |
| 404 | Sonuç saklama süresi dolmuş olabilir | Satırlar silinmiş; yeniden çalıştırın. |
| 500 | Sunucu hatası | Bizde. Ayrıntı günlükte, yanıtta değil. |
Yeniden deneme
- 5xx ve ağ hatası: artan aralıklarla birkaç kez deneyin.
- 4xx: denemeyin. İstek yanlış; tekrarı da yanlış olacak.
- failed olan iş: aynı parametrelerle bir kez deneyin, sonra durun ve bildirin — genelde sorgu süre aşımına uğramıştır, filtreyi daraltmak gerekir.
İstek
# Hata govdesi her zaman ayni bicimde:
{
"error": "Bu anahtarin SIRKET sirketinde H2 yetkisi yok"
}
# Basarili yanitta 'error' alani HIC YOKTUR.
# Varliginı kontrol etmek, durum kodunu kontrol etmekten daha guvenli
# degildir; ikisini birden bakin.
<?php
require 'readerp-client.php';
$api = new ReaderpClient(getenv('READERP_KEY'), getenv('READERP_SECRET'));
try {
$stok = $api->runAndWait('H1', 'SIRKET');
$this->stokYaz($stok['rows']);
} catch (ReaderpError $e) {
if ($e->isNetwork()) {
// Son iyi veriyle devam: bos liste stogu sifirlar.
return;
}
if ($e->isAuth()) {
$this->uyar('READERP anahtarı geçersiz.');
return;
}
throw $e;
}
import { ReaderpClient } from './readerp-client.js';
const api = new ReaderpClient(process.env.READERP_KEY,
process.env.READERP_SECRET);
try {
const stok = await api.runAndWait('H1', 'SIRKET');
await stokYaz(stok.rows);
} catch (e) {
if (e.isNetwork) return; // son iyi veri kalsın
if (e.isAuth) return uyar('Anahtar geçersiz');
throw e;
}
import os, requests
BASE = 'https://panel.readerp.com/api/v1'
H = {'X-Readerp-Api-Key': os.environ['READERP_KEY'],
'X-Readerp-Api-Secret': os.environ['READERP_SECRET']}
try:
r = requests.post(BASE + '/run', headers=H, json=govde, timeout=30)
r.raise_for_status()
except requests.Timeout:
return # son iyi veriyle devam
except requests.HTTPError as e:
if e.response.status_code in (401, 403):
uyar(e.response.json()['error'])
return
raise
Yanıt
{
"error": "Bu anahtarın SIRKET şirketinde H2 yetkisi yok"
}
{
"error": "Geçersiz parametre: doc_no"
}
{
"error": "Sunucu hatası"
}
Güvenlik ve sınırlar
Bir entegrasyon anahtarı er ya da geç bir yere yazılır: bir sunucunun ortam dosyasına, bir dağıtım betiğine, bir geliştiricinin makinesine. Tasarım bu varsayımla yapıldı — anahtar sızarsa kaybın ne olacağı baştan sınırlı.
| Sınır | Nasıl uygulanır | Aşılırsa |
|---|---|---|
| Yöntem | Yalnız GET ve tek bir POST (/run). Yazma ucu yok; ajan tek bir SELECT ya da WITH çalıştırır, INSERT · UPDATE · DELETE · EXEC · MERGE reddedilir. | 405 |
| Rapor | Yalnız kataloğa alınmış, imzalanmış sorgular. Çalışma anında SQL üretilmez; gönderdiğiniz şey bir sorgu değil, bir rapor kodu ve parametrelerdir. | 404 |
| Şirket × rapor | Matristeki kutu işaretli değilse o şirkette o rapor çalışmaz. | 403 |
| IP | Tek adres ya da CIDR bloğu. Liste boşsa kısıt yoktur. | 403 |
| Süre | Son kullanma tarihi olan anahtar o tarihten sonra kendiliğinden durur. | 403 |
| Satır | Her raporun kendi üst sınırı var (200–15.000). | truncated: true |
| Süre aşımı | Rapor başına 60–180 saniye. Uzun sorgu ERP'nizi meşgul etmesin diye kesilir. | iş failed |
| Sonuç ömrü | Varsayılan 60 saniye, kiracıya göre ayarlanır. | 404 |
Eşzamanlılık
Bir anahtar aynı anda birden çok iş kuyruğa alabilir. Ama aynı raporu aynı şirkette saniyede bir defadan sık çalıştırmanın faydası yoktur: veri o hızda değişmiyor ve ajanı meşgul eder. Saat başı tazeleme çoğu mağaza için doğru aralıktır.
Kayıt ve gizlilik
- Yalnız HTTPS. Kimlik başlığı günlüğe yazılabilir, gizli değer yazılmaz.
- Kullanım kaydında vergi numarası ve e-posta maskelenir; belge numarası olduğu gibi kalır — aranan genelde odur.
- Her çağrı kayıtlıdır: hangi anahtar, hangi şirketten, neyi, hangi parametreyle çekti, kaç satır döndü, kaç milisaniye sürdü.
Mobil uygulamalar
API düz HTTP ve JSON; iOS, Android, React Native, Flutter ya da bir PWA fark etmiyor. Mobilde dikkat edilecek üç şey var ve üçü de ağın yavaş olmasından geliyor.
Anahtar sizin sunucunuzda durur
Uygulama paketinden çıkarılan anahtar herkesindir. Mobil uygulama kendi sunucunuza sorar, sunucunuz READERP'e. Böylece anahtarı döndürmek için uygulama güncellemesi de gerekmez.
Eşzamansız akışı sunucunuz yönetsin
Telefon /run ve /job döngüsünü kendisi yürütmesin:
ekran kilitlendiğinde yoklama durur, sonuç ömrü dolar ve kullanıcı boş ekran
görür. Sunucunuz sonucu alıp kendi tarafında saklasın, uygulama oradan okusun.
Çevrimdışıyken son iyi veri
Ağ hatasında boş liste dönmeyin — sahada bu, "stok yok" demektir. Son başarılı sonucu zaman damgasıyla gösterin: "14:20 itibarıyla" yazan bir ekran, boş bir ekrandan her zaman daha kullanışlıdır.
İstek
# Telefon -> sizin sunucunuz -> READERP
# Telefonun gordugu yanit sizin bicimizdir; READERP'in ham yaniti degil.
# Son iyi verinin ne zaman alindigini mutlaka birlikte gonderin:
{
"as_of": "2026-09-27T14:20:11+03:00",
"rows": [
{ "stock_code": "URN0035", "quantity": 128 }
]
}
// Mobil uygulamanın konuştuğu uç SİZİN sunucunuzdur.
app.get('/api/stok', async (req, res) => {
// Sonucu kendi tarafımızda tutuyoruz: telefonun 60 saniyelik
// pencereye yetişmesi gerekmesin.
const taze = await cache.get('stok');
if (taze) return res.json(taze);
const stok = await readerp.runAndWait('H1', 'SIRKET');
await cache.set('stok', stok.rows, 3600);
res.json(stok.rows);
});
<?php
// Kendi ucunuz: mobil buraya sorar, anahtar burada durur.
$taze = $cache->get('stok');
if ($taze === null) {
$sonuc = $api->runAndWait('H1', 'SIRKET');
$taze = $sonuc['rows'];
$cache->set('stok', $taze, 3600);
}
header('Content-Type: application/json');
echo json_encode(['as_of' => $cache->time('stok'), 'rows' => $taze]);
Panelden yönetim
API'yi kuran geliştiricidir, ama yetkiyi veren ve geri alan çoğu zaman o değildir. Bu yüzden anahtarın her ayarı panelde, tıklanır hâlde duruyor.
Anahtar oluşturma — Ayarlar → API anahtarları
- Ad — hangi entegrasyon olduğu ("mağaza", "crm", "bayi portalı").
- Şirket × rapor matrisi — her şirket için her rapor ayrı işaretlenir.
- IP kısıtı — tek adres ya da blok; boş bırakılırsa kısıt yok.
- Son kullanma — o tarihten sonra anahtar kendiliğinden durur.
- Pano yetkisi —
dashboard:read, ayrı bir kutu.
403 döner.Kullanım kaydı — Ayarlar → API kullanımı
Tarih aralığı, anahtar, rapor ve durum koduna göre süzülür; saat saat dağılım, en çok çağrılan raporlar, dönen satır sayısı ve süre aynı ekranda. Canlı izleme açıkken sayfa yenilenmeden yeni satırlar düşer.
Entegrasyonu ilk bağladığınız gün bu ekranı açık tutun: isteğin gelip gelmediği,
gelmiyorsa nerede durduğu orada görünür. İlk gün en çok görülen iki satır
401 (başlık adı yanlış yazılmış) ve 403 (matriste kutu
işaretlenmemiş) olur.
Anahtar döndürme
Yenileme tek tıktır ve eskisini anında geçersiz kılar. Kesintisiz döndürmek için ikinci bir anahtar oluşturun, entegrasyonu ona geçirin, sonra eskisini kapatın — kapatmak silmek değildir, geçmiş kullanım kaydı durur.
İstemciler ve araçlar
Tek dosya, bağımlılık yok. İkisi de eşzamansız akışı, yeniden deneme aralığını ve hata sınıflarını içeriyor.
| Araç | Gereksinim | İndir |
|---|---|---|
| PHP istemcisi | PHP 8.0+, yalnız curl | readerp-client.php |
| JavaScript istemcisi | Node 18+ ya da tarayıcı | readerp-client.js |
| Postman koleksiyonu | Yedi hazır istek, değişkenlerle | readerp.postman_collection.json |
Başka bir dilde çalışıyorsanız yazılacak şey altı istekten ibaret: iki başlık, bir POST, bir yoklama döngüsü. Sağdaki Python ve C# örnekleri kütüphanesiz kullanım için yeterli.
Rapor kataloğu
Katalog kurulumla birlikte gelir ve büyür. Hangi raporun ne döndürdüğünü
/catalog kolon kolon söyler; anlatımlı listesi
rapor kataloğu sayfasında.
Yardım
Entegrasyonu uçtan uca biz de kurabiliyoruz; IMFLEXI üzerinde çalışan mağazalarla birebir uyumlu. İletişim
İstek
<?php
require 'readerp-client.php';
$api = new ReaderpClient(getenv('READERP_KEY'), getenv('READERP_SECRET'));
// Tek dosya, composer gerekmez.
$stok = $api->runAndWait('H1', 'SIRKET');
$belge = $api->runAndWait('H7', 'SIRKET', ['shop_ref' => '10245']);
import { ReaderpClient } from './readerp-client.js';
const api = new ReaderpClient(process.env.READERP_KEY,
process.env.READERP_SECRET);
const stok = await api.runAndWait('H1', 'SIRKET');
const belge = await api.runAndWait('H7', 'SIRKET', { shop_ref: '10245' });
# Koleksiyonu içe aktarın, üç değişkeni doldurun: # base https://panel.readerp.com/api/v1 # key ANAHTAR # secret GIZLI # Sonra istekler hazır: ping, catalog, run, job, latest, dashboard.
Stok listesi
Depo bazında eldeki miktar.Parametresiz çalışır. Sıfır bakiyeli kartlar da döner — tükenen ürün mağazada "tükendi" görünebilsin diye.
is_service = 1) muhasebe bakiyesi taşır, milyonluk "miktar"
görürsünüz; stok olarak yayımlamayın. Satırlar depo bazındadır, tek ürün için
depoları siz toplarsınız. Aynı ürünün iki şirkette de kartı olabilir; iki
şirketin miktarını toplamak aynı malı iki kez saymaktır.Dönen kolonlar
stock_code · stock_name · manufacturer_code · barcode_1..3 · extra_barcodes product_group · unit · is_service · card_locked · sales_locked depot_code · depot_name · quantity · last_movement · movements
Üst sınır: 5000 satır · 180 sn
İstek
POST /api/v1/run HTTP/1.1
Host: panel.readerp.com
X-Readerp-Api-Key: ANAHTAR
X-Readerp-Api-Secret: GIZLI
Content-Type: application/json
{
"id": "H1",
"entity": "SIRKET"
}
curl -X POST "https://panel.readerp.com/api/v1/run" \
-H "X-Readerp-Api-Key: $READERP_KEY" \
-H "X-Readerp-Api-Secret: $READERP_SECRET" \
-H "Content-Type: application/json" \
-d '{"id":"H1","entity":"SIRKET"}'
<?php
require 'readerp-client.php';
$api = new ReaderpClient(getenv('READERP_KEY'), getenv('READERP_SECRET'));
$sonuc = $api->runAndWait('H1', 'SIRKET');
echo $sonuc['row_count'], ' satır';
import { ReaderpClient } from './readerp-client.js';
const api = new ReaderpClient(process.env.READERP_KEY,
process.env.READERP_SECRET);
const sonuc = await api.runAndWait('H1', 'SIRKET');
console.log(sonuc.row_count, 'satır');
import os, requests
BASE = 'https://panel.readerp.com/api/v1'
H = {
'X-Readerp-Api-Key': os.environ['READERP_KEY'],
'X-Readerp-Api-Secret': os.environ['READERP_SECRET'],
}
govde = {
'id': 'H1',
'entity': 'SIRKET',
}
r = requests.post(BASE + '/run', headers=H, json=govde, timeout=30)
r.raise_for_status()
veri = r.json()
using System.Net.Http.Json;
var http = new HttpClient { BaseAddress = new Uri("https://panel.readerp.com/api/v1/") };
http.DefaultRequestHeaders.Add("X-Readerp-Api-Key",
Environment.GetEnvironmentVariable("READERP_KEY"));
http.DefaultRequestHeaders.Add("X-Readerp-Api-Secret",
Environment.GetEnvironmentVariable("READERP_SECRET"));
var istek = new {
id = "H1",
entity = "SIRKET",
};
var yanit = await http.PostAsJsonAsync("run", istek);
yanit.EnsureSuccessStatusCode();
var veri = await yanit.Content.ReadFromJsonAsync<JsonElement>();
Yanıt
{
"job_id": 2871,
"status": "queued"
}
Belge sorgula
İrsaliye, fatura ya da e-belge numarasıyla.Belgenin başlığı ve kalemleri tek çağrıda.
Kodları okumanız gerekmez: doc_type "Satış faturası",
dispatch_state "Açık irsaliye" ya da "Faturalanmış irsaliye",
e_doc_status "Oluşturuldu, gönderilmedi" diye yazar.
| Parametre | Tip | Açıklama |
|---|---|---|
| doc_no zorunlu | docno | Belge ya da e-belge numarası. |
Dönen kolonlar
doc_type_code · doc_type · dispatch_state · e_doc_status · doc_no · e_doc_no doc_date · cari_code · cari_name · gross_tl · vat_tl · total_tl · currency total_fx · payment_date · payment_days · note · extra_1..4 line_no · stock_code · stock_name · manufacturer_code · quantity unit_price_tl · unit_price_fx · line_currency · vat_rate · depot_code linked_doc_no · order_ref
Üst sınır: 2000 satır · 60 sn
İstek
POST /api/v1/run HTTP/1.1
Host: panel.readerp.com
X-Readerp-Api-Key: ANAHTAR
X-Readerp-Api-Secret: GIZLI
Content-Type: application/json
{
"id": "H2",
"entity": "SIRKET",
"arguments": {
"doc_no": "FTR2026000000123"
}
}
curl -X POST "https://panel.readerp.com/api/v1/run" \
-H "X-Readerp-Api-Key: $READERP_KEY" \
-H "X-Readerp-Api-Secret: $READERP_SECRET" \
-H "Content-Type: application/json" \
-d '{"id":"H2","entity":"SIRKET","arguments":{"doc_no":"FTR2026000000123"}}'
<?php
require 'readerp-client.php';
$api = new ReaderpClient(getenv('READERP_KEY'), getenv('READERP_SECRET'));
$sonuc = $api->runAndWait('H2', 'SIRKET', $parametreler);
echo $sonuc['row_count'], ' satır';
import { ReaderpClient } from './readerp-client.js';
const api = new ReaderpClient(process.env.READERP_KEY,
process.env.READERP_SECRET);
const sonuc = await api.runAndWait('H2', 'SIRKET', parametreler);
console.log(sonuc.row_count, 'satır');
import os, requests
BASE = 'https://panel.readerp.com/api/v1'
H = {
'X-Readerp-Api-Key': os.environ['READERP_KEY'],
'X-Readerp-Api-Secret': os.environ['READERP_SECRET'],
}
govde = {
'id': 'H2',
'entity': 'SIRKET',
'arguments': {
'doc_no': 'FTR2026000000123',
},
}
r = requests.post(BASE + '/run', headers=H, json=govde, timeout=30)
r.raise_for_status()
veri = r.json()
using System.Net.Http.Json;
var http = new HttpClient { BaseAddress = new Uri("https://panel.readerp.com/api/v1/") };
http.DefaultRequestHeaders.Add("X-Readerp-Api-Key",
Environment.GetEnvironmentVariable("READERP_KEY"));
http.DefaultRequestHeaders.Add("X-Readerp-Api-Secret",
Environment.GetEnvironmentVariable("READERP_SECRET"));
var istek = new {
id = "H2",
entity = "SIRKET",
arguments = new {
doc_no = "FTR2026000000123",
},
};
var yanit = await http.PostAsJsonAsync("run", istek);
yanit.EnsureSuccessStatusCode();
var veri = await yanit.Content.ReadFromJsonAsync<JsonElement>();
Yanıt
{
"job_id": 2871,
"status": "queued"
}
Stok fiyatları
Alış maliyeti ve satış fiyatı geçmişi.Son alış, 12 aylık ve tüm zamanların ortalaması, son satış, 12 aylık en düşük ve en yüksek satış fiyatı, kaç müşteriye satıldığı. Fiyatlandırma ve marj kontrolü için.
| Parametre | Tip | Açıklama |
|---|---|---|
| stock_code isteğe bağlı | code | Boş bırakılırsa bütün kartlar. |
Dönen kolonlar
stock_code · stock_name · manufacturer_code last_purchase_date · last_purchase_price_tl · last_purchase_price_eur avg_purchase_price_tl_12m · purchase_qty_12m last_sale_date · last_sale_price_tl · avg_sale_price_eur_12m min_sale_price_eur_12m · max_sale_price_eur_12m · customers_12m
Üst sınır: 5000 satır · 120 sn
İstek
POST /api/v1/run HTTP/1.1
Host: panel.readerp.com
X-Readerp-Api-Key: ANAHTAR
X-Readerp-Api-Secret: GIZLI
Content-Type: application/json
{
"id": "H3",
"entity": "SIRKET",
"arguments": {
"stock_code": "URN0035"
}
}
curl -X POST "https://panel.readerp.com/api/v1/run" \
-H "X-Readerp-Api-Key: $READERP_KEY" \
-H "X-Readerp-Api-Secret: $READERP_SECRET" \
-H "Content-Type: application/json" \
-d '{"id":"H3","entity":"SIRKET","arguments":{"stock_code":"URN0035"}}'
<?php
require 'readerp-client.php';
$api = new ReaderpClient(getenv('READERP_KEY'), getenv('READERP_SECRET'));
$sonuc = $api->runAndWait('H3', 'SIRKET', $parametreler);
echo $sonuc['row_count'], ' satır';
import { ReaderpClient } from './readerp-client.js';
const api = new ReaderpClient(process.env.READERP_KEY,
process.env.READERP_SECRET);
const sonuc = await api.runAndWait('H3', 'SIRKET', parametreler);
console.log(sonuc.row_count, 'satır');
import os, requests
BASE = 'https://panel.readerp.com/api/v1'
H = {
'X-Readerp-Api-Key': os.environ['READERP_KEY'],
'X-Readerp-Api-Secret': os.environ['READERP_SECRET'],
}
govde = {
'id': 'H3',
'entity': 'SIRKET',
'arguments': {
'stock_code': 'URN0035',
},
}
r = requests.post(BASE + '/run', headers=H, json=govde, timeout=30)
r.raise_for_status()
veri = r.json()
using System.Net.Http.Json;
var http = new HttpClient { BaseAddress = new Uri("https://panel.readerp.com/api/v1/") };
http.DefaultRequestHeaders.Add("X-Readerp-Api-Key",
Environment.GetEnvironmentVariable("READERP_KEY"));
http.DefaultRequestHeaders.Add("X-Readerp-Api-Secret",
Environment.GetEnvironmentVariable("READERP_SECRET"));
var istek = new {
id = "H3",
entity = "SIRKET",
arguments = new {
stock_code = "URN0035",
},
};
var yanit = await http.PostAsJsonAsync("run", istek);
yanit.EnsureSuccessStatusCode();
var veri = await yanit.Content.ReadFromJsonAsync<JsonElement>();
Yanıt
{
"job_id": 2871,
"status": "queued"
}
Cari bul
Vergi no, TC kimlik, e-posta, cari kodu veya ünvanla.Sipariş sırasında mevcut cariyi bulup yenisini açmamak için. Bakiye ve son hareket de döner.
| Parametre | Tip | Açıklama |
|---|---|---|
| tax_no isteğe bağlı | taxno | VKN (10) ya da TCKN (11). |
| email isteğe bağlı | Küçük harfe çevrilerek aranır. | |
| cari_code isteğe bağlı | code | Cari kodu. |
| name isteğe bağlı | name | Ünvan / isim. En az 3 karakter. Kelimeler ayrı ayrı aranır ve hepsi geçmelidir. |
Hepsi isteğe bağlıdır ama en az biri anlamlı olmalı; hepsi boşsa sonuç boş döner.
tax_no hem name verirseniz ikisinin eşleştiği
kartların tamamı döner (VEYA), "önce şuna bak, bulamazsan buna" değil. Aynı
vergi numarası hem müşteri hem tedarikçi kartında durabiliyor ve mükerrer
cari aramanın amacı zaten hepsini görmek.Ünvan araması
Kelime sırası önemsiz. "selçuk gülben" yazınca "GÜLBEN SELÇUK" de bulunur: insanların yazdığı sıra, kartın yazıldığı sıra değil. En çok üç kelime dikkate alınır; fazlası yok sayılır, yani sonuç kümesi genişler, daralmaz.
Türkçe karakter ve büyük/küçük farkı aramayı bozmaz. Veritabanları Latin1 ve Türkçe metni Windows-1254 baytlarıyla tutuyor; bu yüzden ASCII dışı her karakter tek karakterlik jokere çevriliyor ("GÜLBEN" → "g_lben").
En az üç karakter. Daha kısası 400 ile reddedilir: iki
harf yüz cari döndürür ve o liste cevap değil gürültüdür.
Sıralama: ünvanın başında eşleşenler önce, sonra son hareket tarihi yeniden eskiye.
Dönen kolonlar
cari_code · cari_name · account_class · currency_card · tax_no · national_id tax_office · email · phone · mobile · city · district · currency created · balance_tl · last_movement · movements · total_rows
Üst sınır: 50 satır · 60 sn. total_rows kırpmadan
önceki eşleşme sayısıdır — 50 satır dönüp toplamın 94 olduğunu
söylemeyen bir arama, bulduğu şey hakkında sessizce yanlış konuşur.
Kırpma sorgunun içinde olduğu için yanıttaki truncated alanı
false kalır; bakılacak alan total_rows.
İstek
POST /api/v1/run HTTP/1.1
Host: panel.readerp.com
X-Readerp-Api-Key: ANAHTAR
X-Readerp-Api-Secret: GIZLI
Content-Type: application/json
{
"id": "H4",
"entity": "SIRKET",
"arguments": {
"name": "örnek metal"
}
}
curl -X POST "https://panel.readerp.com/api/v1/run" \
-H "X-Readerp-Api-Key: $READERP_KEY" \
-H "X-Readerp-Api-Secret: $READERP_SECRET" \
-H "Content-Type: application/json" \
-d '{"id":"H4","entity":"SIRKET","arguments":{"name":"örnek metal"}}'
<?php
require 'readerp-client.php';
$api = new ReaderpClient(getenv('READERP_KEY'), getenv('READERP_SECRET'));
$sonuc = $api->runAndWait('H4', 'SIRKET', $parametreler);
echo $sonuc['row_count'], ' satır';
import { ReaderpClient } from './readerp-client.js';
const api = new ReaderpClient(process.env.READERP_KEY,
process.env.READERP_SECRET);
const sonuc = await api.runAndWait('H4', 'SIRKET', parametreler);
console.log(sonuc.row_count, 'satır');
import os, requests
BASE = 'https://panel.readerp.com/api/v1'
H = {
'X-Readerp-Api-Key': os.environ['READERP_KEY'],
'X-Readerp-Api-Secret': os.environ['READERP_SECRET'],
}
govde = {
'id': 'H4',
'entity': 'SIRKET',
'arguments': {
'tax_no': '1234567890',
},
}
r = requests.post(BASE + '/run', headers=H, json=govde, timeout=30)
r.raise_for_status()
veri = r.json()
using System.Net.Http.Json;
var http = new HttpClient { BaseAddress = new Uri("https://panel.readerp.com/api/v1/") };
http.DefaultRequestHeaders.Add("X-Readerp-Api-Key",
Environment.GetEnvironmentVariable("READERP_KEY"));
http.DefaultRequestHeaders.Add("X-Readerp-Api-Secret",
Environment.GetEnvironmentVariable("READERP_SECRET"));
var istek = new {
id = "H4",
entity = "SIRKET",
arguments = new {
tax_no = "1234567890",
},
};
var yanit = await http.PostAsJsonAsync("run", istek);
yanit.EnsureSuccessStatusCode();
var veri = await yanit.Content.ReadFromJsonAsync<JsonElement>();
Yanıt
{
"job_id": 2871,
"status": "queued"
}
Sipariş durumu
Sevk edildi mi, faturalandı mı.Kalem kalem sipariş edilen, sevk edilen ve faturalanan miktar; bağlı irsaliye ve fatura numaralarıyla.
| Parametre | Tip | Açıklama |
|---|---|---|
| order_no zorunlu | docno | Netsis sipariş numarası. |
Dönen kolonlar
order_no · order_date · cari_code · cari_name · order_total_tl · currency order_total_fx · note · line_no · stock_code · stock_name ordered_qty · dispatched_qty · invoiced_qty · unit_price_tl · unit_price_fx line_status · dispatch_doc_nos · invoice_doc_nos
Üst sınır: 2000 satır · 60 sn
İstek
POST /api/v1/run HTTP/1.1
Host: panel.readerp.com
X-Readerp-Api-Key: ANAHTAR
X-Readerp-Api-Secret: GIZLI
Content-Type: application/json
{
"id": "H5",
"entity": "SIRKET",
"arguments": {
"order_no": "SIP2026000000045"
}
}
curl -X POST "https://panel.readerp.com/api/v1/run" \
-H "X-Readerp-Api-Key: $READERP_KEY" \
-H "X-Readerp-Api-Secret: $READERP_SECRET" \
-H "Content-Type: application/json" \
-d '{"id":"H5","entity":"SIRKET","arguments":{"order_no":"SIP2026000000045"}}'
<?php
require 'readerp-client.php';
$api = new ReaderpClient(getenv('READERP_KEY'), getenv('READERP_SECRET'));
$sonuc = $api->runAndWait('H5', 'SIRKET', $parametreler);
echo $sonuc['row_count'], ' satır';
import { ReaderpClient } from './readerp-client.js';
const api = new ReaderpClient(process.env.READERP_KEY,
process.env.READERP_SECRET);
const sonuc = await api.runAndWait('H5', 'SIRKET', parametreler);
console.log(sonuc.row_count, 'satır');
import os, requests
BASE = 'https://panel.readerp.com/api/v1'
H = {
'X-Readerp-Api-Key': os.environ['READERP_KEY'],
'X-Readerp-Api-Secret': os.environ['READERP_SECRET'],
}
govde = {
'id': 'H5',
'entity': 'SIRKET',
'arguments': {
'order_no': 'SIP2026000000045',
},
}
r = requests.post(BASE + '/run', headers=H, json=govde, timeout=30)
r.raise_for_status()
veri = r.json()
using System.Net.Http.Json;
var http = new HttpClient { BaseAddress = new Uri("https://panel.readerp.com/api/v1/") };
http.DefaultRequestHeaders.Add("X-Readerp-Api-Key",
Environment.GetEnvironmentVariable("READERP_KEY"));
http.DefaultRequestHeaders.Add("X-Readerp-Api-Secret",
Environment.GetEnvironmentVariable("READERP_SECRET"));
var istek = new {
id = "H5",
entity = "SIRKET",
arguments = new {
order_no = "SIP2026000000045",
},
};
var yanit = await http.PostAsJsonAsync("run", istek);
yanit.EnsureSuccessStatusCode();
var veri = await yanit.Content.ReadFromJsonAsync<JsonElement>();
Yanıt
{
"job_id": 2871,
"status": "queued"
}
Cari belgeleri
Sipariş, irsaliye, fatura ve iade.Bir müşterinin son N gündeki belgeleri — bayi paneli ya da müşteri ekranı
için. uninvoiced ve uninvoiced_days faturalanmamış
sevkiyatı işaret eder.
| Parametre | Tip | Açıklama |
|---|---|---|
| cari_code zorunlu | code | Cari kodu. |
| days isteğe bağlı | int | Kaç gün geriye. Boş: 90. |
Dönen kolonlar
doc_type_code · doc_type · dispatch_state · e_doc_status · doc_no · e_doc_no doc_date · total_tl · currency · total_fx · payment_date · note line_count · quantity · extra_1 · linked_doc_no · linked_docs order_ref · uninvoiced · uninvoiced_days
Üst sınır: 2000 satır · 60 sn
İstek
POST /api/v1/run HTTP/1.1
Host: panel.readerp.com
X-Readerp-Api-Key: ANAHTAR
X-Readerp-Api-Secret: GIZLI
Content-Type: application/json
{
"id": "H6",
"entity": "SIRKET",
"arguments": {
"cari_code": "120.01.0001",
"days": 90
}
}
curl -X POST "https://panel.readerp.com/api/v1/run" \
-H "X-Readerp-Api-Key: $READERP_KEY" \
-H "X-Readerp-Api-Secret: $READERP_SECRET" \
-H "Content-Type: application/json" \
-d '{"id":"H6","entity":"SIRKET","arguments":{"cari_code":"120.01.0001","days":90}}'
<?php
require 'readerp-client.php';
$api = new ReaderpClient(getenv('READERP_KEY'), getenv('READERP_SECRET'));
$sonuc = $api->runAndWait('H6', 'SIRKET', $parametreler);
echo $sonuc['row_count'], ' satır';
import { ReaderpClient } from './readerp-client.js';
const api = new ReaderpClient(process.env.READERP_KEY,
process.env.READERP_SECRET);
const sonuc = await api.runAndWait('H6', 'SIRKET', parametreler);
console.log(sonuc.row_count, 'satır');
import os, requests
BASE = 'https://panel.readerp.com/api/v1'
H = {
'X-Readerp-Api-Key': os.environ['READERP_KEY'],
'X-Readerp-Api-Secret': os.environ['READERP_SECRET'],
}
govde = {
'id': 'H6',
'entity': 'SIRKET',
'arguments': {
'cari_code': '120.01.0001',
'days': 90,
},
}
r = requests.post(BASE + '/run', headers=H, json=govde, timeout=30)
r.raise_for_status()
veri = r.json()
using System.Net.Http.Json;
var http = new HttpClient { BaseAddress = new Uri("https://panel.readerp.com/api/v1/") };
http.DefaultRequestHeaders.Add("X-Readerp-Api-Key",
Environment.GetEnvironmentVariable("READERP_KEY"));
http.DefaultRequestHeaders.Add("X-Readerp-Api-Secret",
Environment.GetEnvironmentVariable("READERP_SECRET"));
var istek = new {
id = "H6",
entity = "SIRKET",
arguments = new {
cari_code = "120.01.0001",
days = 90,
},
};
var yanit = await http.PostAsJsonAsync("run", istek);
yanit.EnsureSuccessStatusCode();
var veri = await yanit.Content.ReadFromJsonAsync<JsonElement>();
Yanıt
{
"job_id": 2871,
"status": "queued"
}
E-ticaret siparişinin belgeleri
Ek sahadaki sipariş numarasıyla.Kendi sipariş numaranızla sorgular — belgeyi Netsis'te oluştururken numarayı ek sahaya yazdığınız için. Siparişin faturası kesildi mi, e-belge GİB'e gitti mi, hepsi tek çağrıda.
| Parametre | Tip | Açıklama |
|---|---|---|
| shop_ref zorunlu | docno | Sizin sipariş numaranız; en az 4 karakter. |
matched_in numaranın hangi alanda
bulunduğunu, exact_match ise tam eşleşme mi yoksa içinde geçme mi
olduğunu söyler. Sipariş numaranız kısa ve başka numaraların içinde geçebilecek
türdense exact_match alanına bakın.Dönen kolonlar
doc_type_code · doc_type · dispatch_state · e_doc_status · doc_no · e_doc_no doc_date · cari_code · cari_name · total_tl · currency · total_fx · note extra_1 · matched_in · exact_match · line_count · quantity linked_doc_no · order_ref · created_at · changed_at
Üst sınır: 200 satır · 60 sn
İstek
POST /api/v1/run HTTP/1.1
Host: panel.readerp.com
X-Readerp-Api-Key: ANAHTAR
X-Readerp-Api-Secret: GIZLI
Content-Type: application/json
{
"id": "H7",
"entity": "SIRKET",
"arguments": {
"shop_ref": "10245"
}
}
curl -X POST "https://panel.readerp.com/api/v1/run" \
-H "X-Readerp-Api-Key: $READERP_KEY" \
-H "X-Readerp-Api-Secret: $READERP_SECRET" \
-H "Content-Type: application/json" \
-d '{"id":"H7","entity":"SIRKET","arguments":{"shop_ref":"10245"}}'
<?php
require 'readerp-client.php';
$api = new ReaderpClient(getenv('READERP_KEY'), getenv('READERP_SECRET'));
$sonuc = $api->runAndWait('H7', 'SIRKET', $parametreler);
echo $sonuc['row_count'], ' satır';
import { ReaderpClient } from './readerp-client.js';
const api = new ReaderpClient(process.env.READERP_KEY,
process.env.READERP_SECRET);
const sonuc = await api.runAndWait('H7', 'SIRKET', parametreler);
console.log(sonuc.row_count, 'satır');
import os, requests
BASE = 'https://panel.readerp.com/api/v1'
H = {
'X-Readerp-Api-Key': os.environ['READERP_KEY'],
'X-Readerp-Api-Secret': os.environ['READERP_SECRET'],
}
govde = {
'id': 'H7',
'entity': 'SIRKET',
'arguments': {
'shop_ref': '10245',
},
}
r = requests.post(BASE + '/run', headers=H, json=govde, timeout=30)
r.raise_for_status()
veri = r.json()
using System.Net.Http.Json;
var http = new HttpClient { BaseAddress = new Uri("https://panel.readerp.com/api/v1/") };
http.DefaultRequestHeaders.Add("X-Readerp-Api-Key",
Environment.GetEnvironmentVariable("READERP_KEY"));
http.DefaultRequestHeaders.Add("X-Readerp-Api-Secret",
Environment.GetEnvironmentVariable("READERP_SECRET"));
var istek = new {
id = "H7",
entity = "SIRKET",
arguments = new {
shop_ref = "10245",
},
};
var yanit = await http.PostAsJsonAsync("run", istek);
yanit.EnsureSuccessStatusCode();
var veri = await yanit.Content.ReadFromJsonAsync<JsonElement>();
Yanıt
{
"job_id": 2871,
"status": "queued"
}
Stok satış satırları
Hangi tarihte, kime, kaça satıldı.Ürün sayfasında fiyat geçmişi ya da kendi panelinizde satış eğrisi için.
| Parametre | Tip | Açıklama |
|---|---|---|
| stock_code zorunlu | code | Stok kodu. |
| date_from isteğe bağlı | date | Boş: 24 ay önce. |
| date_to isteğe bağlı | date | Boş: bugün. |
| limit isteğe bağlı | int | Boş: 200 · üst sınır 1000. |
total_rows filtreye uyan gerçek
satır sayısıdır — limit yüzünden kesilmiş olsa bile.
exchange_rate satır bazında ima edilen kurdur; toplamı toplama
bölerek kur hesaplamayın, ortanca alın.Dönen kolonlar
doc_date · doc_type · doc_no · e_doc_no · cari_code · cari_name · line_no quantity · unit · unit_price_tl · unit_price_fx · currency · exchange_rate line_total_tl · line_total_fx · vat_rate · extra_1 · total_rows
Üst sınır: 1000 satır · 60 sn
İstek
POST /api/v1/run HTTP/1.1
Host: panel.readerp.com
X-Readerp-Api-Key: ANAHTAR
X-Readerp-Api-Secret: GIZLI
Content-Type: application/json
{
"id": "H8",
"entity": "SIRKET",
"arguments": {
"stock_code": "URN0035",
"date_from": "2026-01-01",
"limit": 200
}
}
curl -X POST "https://panel.readerp.com/api/v1/run" \
-H "X-Readerp-Api-Key: $READERP_KEY" \
-H "X-Readerp-Api-Secret: $READERP_SECRET" \
-H "Content-Type: application/json" \
-d '{"id":"H8","entity":"SIRKET","arguments":{"stock_code":"URN0035","date_from":"2026-01-01","limit":200}}'
<?php
require 'readerp-client.php';
$api = new ReaderpClient(getenv('READERP_KEY'), getenv('READERP_SECRET'));
$sonuc = $api->runAndWait('H8', 'SIRKET', $parametreler);
echo $sonuc['row_count'], ' satır';
import { ReaderpClient } from './readerp-client.js';
const api = new ReaderpClient(process.env.READERP_KEY,
process.env.READERP_SECRET);
const sonuc = await api.runAndWait('H8', 'SIRKET', parametreler);
console.log(sonuc.row_count, 'satır');
import os, requests
BASE = 'https://panel.readerp.com/api/v1'
H = {
'X-Readerp-Api-Key': os.environ['READERP_KEY'],
'X-Readerp-Api-Secret': os.environ['READERP_SECRET'],
}
govde = {
'id': 'H8',
'entity': 'SIRKET',
'arguments': {
'stock_code': 'URN0035',
'date_from': '2026-01-01',
'limit': 200,
},
}
r = requests.post(BASE + '/run', headers=H, json=govde, timeout=30)
r.raise_for_status()
veri = r.json()
using System.Net.Http.Json;
var http = new HttpClient { BaseAddress = new Uri("https://panel.readerp.com/api/v1/") };
http.DefaultRequestHeaders.Add("X-Readerp-Api-Key",
Environment.GetEnvironmentVariable("READERP_KEY"));
http.DefaultRequestHeaders.Add("X-Readerp-Api-Secret",
Environment.GetEnvironmentVariable("READERP_SECRET"));
var istek = new {
id = "H8",
entity = "SIRKET",
arguments = new {
stock_code = "URN0035",
date_from = "2026-01-01",
limit = 200,
},
};
var yanit = await http.PostAsJsonAsync("run", istek);
yanit.EnsureSuccessStatusCode();
var veri = await yanit.Content.ReadFromJsonAsync<JsonElement>();
Yanıt
{
"job_id": 2871,
"status": "queued"
}
Açık irsaliyeler
Mal çıktı, fatura yok.Parametresiz. Yaş aralığı ve satır tutarıyla birlikte döner; kendi uyarı ekranınıza taşıyabilirsiniz.
Dönen kolonlar
dispatch_no · dispatch_date · cari_code · customer_name · customer_label stock_code · stock_name · kind · depot · quantity · unit_price · line_value days_open · age_bucket · reason · evidence
Üst sınır: 15000 satır · 180 sn
İstek
POST /api/v1/run HTTP/1.1
Host: panel.readerp.com
X-Readerp-Api-Key: ANAHTAR
X-Readerp-Api-Secret: GIZLI
Content-Type: application/json
{
"id": "A4",
"entity": "SIRKET"
}
curl -X POST "https://panel.readerp.com/api/v1/run" \
-H "X-Readerp-Api-Key: $READERP_KEY" \
-H "X-Readerp-Api-Secret: $READERP_SECRET" \
-H "Content-Type: application/json" \
-d '{"id":"A4","entity":"SIRKET"}'
<?php
require 'readerp-client.php';
$api = new ReaderpClient(getenv('READERP_KEY'), getenv('READERP_SECRET'));
$sonuc = $api->runAndWait('A4', 'SIRKET');
echo $sonuc['row_count'], ' satır';
import { ReaderpClient } from './readerp-client.js';
const api = new ReaderpClient(process.env.READERP_KEY,
process.env.READERP_SECRET);
const sonuc = await api.runAndWait('A4', 'SIRKET');
console.log(sonuc.row_count, 'satır');
import os, requests
BASE = 'https://panel.readerp.com/api/v1'
H = {
'X-Readerp-Api-Key': os.environ['READERP_KEY'],
'X-Readerp-Api-Secret': os.environ['READERP_SECRET'],
}
govde = {
'id': 'A4',
'entity': 'SIRKET',
}
r = requests.post(BASE + '/run', headers=H, json=govde, timeout=30)
r.raise_for_status()
veri = r.json()
using System.Net.Http.Json;
var http = new HttpClient { BaseAddress = new Uri("https://panel.readerp.com/api/v1/") };
http.DefaultRequestHeaders.Add("X-Readerp-Api-Key",
Environment.GetEnvironmentVariable("READERP_KEY"));
http.DefaultRequestHeaders.Add("X-Readerp-Api-Secret",
Environment.GetEnvironmentVariable("READERP_SECRET"));
var istek = new {
id = "A4",
entity = "SIRKET",
};
var yanit = await http.PostAsJsonAsync("run", istek);
yanit.EnsureSuccessStatusCode();
var veri = await yanit.Content.ReadFromJsonAsync<JsonElement>();
Yanıt
{
"job_id": 2871,
"status": "queued"
}