مرجع الواجهة البرمجية
طلبات عروض الأسعار
طلبات عروض أسعار إلى المورّدين، تُؤكَّد إلى أوامر شراء.
الأوصاف التقنية أدناه بالإنجليزية كما يولّدها خادم الواجهة، وهي اللغة التي تُكتب بها رسائل الأخطاء أيضًا. العناوين والجداول بالعربية.
- POSTإنشاء طلب عرض سعر
- GETعرض القائمة
- PUTتعديل طلب عرض سعر
- GETقراءة مستند
- POSTالتأكيد إلى أمر شراء
- POSTإلغاء طلب عرض سعر
- GETطباعة
إنشاء طلب عرض سعر
POST/rfqs
أرسل ترويسة Idempotency-Key.
A draft RFQ. Lines name a product by productId or productCode. Requires Idempotency-Key.
المعاملات
| الحقل | النوع | الوصف |
|---|---|---|
Idempotency-Keyالترويسةإلزامي | string | 1 to 100 visible ASCII characters, such as a UUID, unique to this request. Sent again with the same request, the first answer is replayed (Idempotent-Replayed: true); with another request, 422 IDEMPOTENCY_KEY_REUSED. |
جسم الطلب
20 حقلًا
| الحقل | النوع | الوصف |
|---|---|---|
lines | object[] | |
lines[].unitPrice | number | |
lines[].quantity | number | |
lines[].taxRate | number | VAT percent: 5 or 0. |
lines[].description | string | |
lines[].productId | string | |
lines[].productCode | string | A product's SKU, then its barcode. |
lines[].uom | string | |
lines[].discount | number | |
lines[].kind | PRODUCT | SECTION | NOTE | |
vendorId | string | The vendor contact; needed to confirm. |
issueDate | date | |
dueDate | date | |
vendorRef | string | The vendor's own reference. |
notes | string | |
orderDeadline | date | |
expectedArrival | date | |
buyerId | string | |
paymentTermId | string | |
externalId | string | Your system's id for it, kept for good. Create only. |
أمثلة برمجية
curl -sS -X POST "https://app.kwn.tax/api/v1/rfqs" \
-H "X-Api-Key: $KWN_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"vendorId": "ven_7xp3k8d2",
"issueDate": "2026-10-15",
"vendorRef": "Q-2026-118",
"externalId": "PO-5521",
"lines": [
{
"description": "A4 copier paper, box of 5 reams",
"quantity": 20,
"unitPrice": 95,
"taxRate": 5,
"productCode": "PAP-A4-5"
}
]
}'الاستجابات
201Created
الحقل النوع الوصف idstringtypeRFQ | ORDER | BILL | REFUND | DEBIT_NOTEnumberstringstatusDRAFT | SENT | CONFIRMED | RECEIVED | POSTED | PAID | CANCELLEDissueDatedatedueDatedatevendorobjectvendorRefstringbuyerIdstringpaymentTermIdstringnotesstringorderDeadlinedateexpectedArrivaldatelinesobject[]subtotalnumberdiscountTotalnumbertaxTotalnumbertotalnumberpaidTotalnumbercreditedTotalnumberoriginMANUAL | API | EINVOICEsourceobjectderivedobject[]externalIdstringcreatedAtdateupdatedAtdate400Refused: the request or a business rule. The code says which (REQUEST_INVALID, RULE_REFUSED, …).
{ "error": "Lines: at least one line is required.", "code": "REQUEST_INVALID" }401No key, a key that is not ours, or one revoked (API_KEY_INVALID); a merchant not active (MERCHANT_INACTIVE).
{ "error": "That API key is not valid, or it was revoked.", "code": "API_KEY_INVALID" }403The key's scopes do not carry the capability (APP_NOT_GRANTED, ROLE_TOO_LOW), or the plan lacks the app (APP_LOCKED).
{ "error": "This key's scopes do not include sales.approve.", "code": "ROLE_TOO_LOW" }404Not found: another type under this route, or another company's (NOT_FOUND).
{ "error": "Not found.", "code": "NOT_FOUND" }409A conflict: an externalId taken, or a change that could not be saved (EXTERNAL_ID_TAKEN, CONFLICT).
{ "error": "That externalId is already used by another record of this company.", "code": "EXTERNAL_ID_TAKEN" }422That Idempotency-Key was used for a different request (IDEMPOTENCY_KEY_REUSED).
{ "error": "That Idempotency-Key was used for a different request.", "code": "IDEMPOTENCY_KEY_REUSED" }429Too many requests: wait retryAfter seconds (RATE_LIMITED).
{ "error": "Too many requests. Wait a little and try again.", "code": "RATE_LIMITED" }
عرض القائمة
GET/rfqs
Newest first, a page at a time. Filter by status, partnerId (the vendor), issueFrom/issueTo, number, externalId, createdFrom/createdTo, or updatedSince.
المعاملات
| الحقل | النوع | الوصف |
|---|---|---|
statusالاستعلام | string | A status, by name. |
partnerIdالاستعلام | string | The customer (sales) or the vendor (purchases). |
issueFromالاستعلام | date | Issued on or after this day. |
issueToالاستعلام | date | Issued on or before this day. |
numberالاستعلام | string | |
limitالاستعلام | integer | 1 to 200; 50 by default. |
cursorالاستعلام | string | The previous page's next. |
updatedSinceالاستعلام | date | Only rows changed at or after this instant. |
createdFromالاستعلام | date | |
createdToالاستعلام | date | |
externalIdالاستعلام | string | Only the row your system gave this id. |
أمثلة برمجية
curl -sS -X GET "https://app.kwn.tax/api/v1/rfqs" \
-H "X-Api-Key: $KWN_API_KEY"الاستجابات
200OK
الحقل النوع الوصف dataobject[]The rows of this page. nextstringThe cursor of the next page, to send as ?cursor=; null on the last page. 400Refused: the request or a business rule. The code says which (REQUEST_INVALID, RULE_REFUSED, …).
{ "error": "Lines: at least one line is required.", "code": "REQUEST_INVALID" }401No key, a key that is not ours, or one revoked (API_KEY_INVALID); a merchant not active (MERCHANT_INACTIVE).
{ "error": "That API key is not valid, or it was revoked.", "code": "API_KEY_INVALID" }403The key's scopes do not carry the capability (APP_NOT_GRANTED, ROLE_TOO_LOW), or the plan lacks the app (APP_LOCKED).
{ "error": "This key's scopes do not include sales.approve.", "code": "ROLE_TOO_LOW" }404Not found: another type under this route, or another company's (NOT_FOUND).
{ "error": "Not found.", "code": "NOT_FOUND" }409A conflict: an externalId taken, or a change that could not be saved (EXTERNAL_ID_TAKEN, CONFLICT).
{ "error": "That externalId is already used by another record of this company.", "code": "EXTERNAL_ID_TAKEN" }429Too many requests: wait retryAfter seconds (RATE_LIMITED).
{ "error": "Too many requests. Wait a little and try again.", "code": "RATE_LIMITED" }
تعديل طلب عرض سعر
PUT/rfqs/{id}
Replaces the header and the lines of an open RFQ.
المعاملات
| الحقل | النوع | الوصف |
|---|---|---|
idالمسارإلزامي | string |
جسم الطلب
20 حقلًا
| الحقل | النوع | الوصف |
|---|---|---|
lines | object[] | |
lines[].unitPrice | number | |
lines[].quantity | number | |
lines[].taxRate | number | VAT percent: 5 or 0. |
lines[].description | string | |
lines[].productId | string | |
lines[].productCode | string | A product's SKU, then its barcode. |
lines[].uom | string | |
lines[].discount | number | |
lines[].kind | PRODUCT | SECTION | NOTE | |
vendorId | string | The vendor contact; needed to confirm. |
issueDate | date | |
dueDate | date | |
vendorRef | string | The vendor's own reference. |
notes | string | |
orderDeadline | date | |
expectedArrival | date | |
buyerId | string | |
paymentTermId | string | |
externalId | string | Your system's id for it, kept for good. Create only. |
أمثلة برمجية
curl -sS -X PUT "https://app.kwn.tax/api/v1/rfqs/<id>" \
-H "X-Api-Key: $KWN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"vendorId": "ven_7xp3k8d2",
"issueDate": "2026-10-15",
"vendorRef": "Q-2026-118",
"externalId": "PO-5521",
"lines": [
{
"description": "A4 copier paper, box of 5 reams",
"quantity": 20,
"unitPrice": 95,
"taxRate": 5,
"productCode": "PAP-A4-5"
}
]
}'الاستجابات
200OK
الحقل النوع الوصف idstringtypeRFQ | ORDER | BILL | REFUND | DEBIT_NOTEnumberstringstatusDRAFT | SENT | CONFIRMED | RECEIVED | POSTED | PAID | CANCELLEDissueDatedatedueDatedatevendorobjectvendorRefstringbuyerIdstringpaymentTermIdstringnotesstringorderDeadlinedateexpectedArrivaldatelinesobject[]subtotalnumberdiscountTotalnumbertaxTotalnumbertotalnumberpaidTotalnumbercreditedTotalnumberoriginMANUAL | API | EINVOICEsourceobjectderivedobject[]externalIdstringcreatedAtdateupdatedAtdate400Refused: the request or a business rule. The code says which (REQUEST_INVALID, RULE_REFUSED, …).
{ "error": "Lines: at least one line is required.", "code": "REQUEST_INVALID" }401No key, a key that is not ours, or one revoked (API_KEY_INVALID); a merchant not active (MERCHANT_INACTIVE).
{ "error": "That API key is not valid, or it was revoked.", "code": "API_KEY_INVALID" }403The key's scopes do not carry the capability (APP_NOT_GRANTED, ROLE_TOO_LOW), or the plan lacks the app (APP_LOCKED).
{ "error": "This key's scopes do not include sales.approve.", "code": "ROLE_TOO_LOW" }404Not found: another type under this route, or another company's (NOT_FOUND).
{ "error": "Not found.", "code": "NOT_FOUND" }409A conflict: an externalId taken, or a change that could not be saved (EXTERNAL_ID_TAKEN, CONFLICT).
{ "error": "That externalId is already used by another record of this company.", "code": "EXTERNAL_ID_TAKEN" }429Too many requests: wait retryAfter seconds (RATE_LIMITED).
{ "error": "Too many requests. Wait a little and try again.", "code": "RATE_LIMITED" }
قراءة مستند
GET/rfqs/{id}
The document with its lines and what it came from and led to. A document of another type under this route is NOT_FOUND.
المعاملات
| الحقل | النوع | الوصف |
|---|---|---|
idالمسارإلزامي | string |
أمثلة برمجية
curl -sS -X GET "https://app.kwn.tax/api/v1/rfqs/<id>" \
-H "X-Api-Key: $KWN_API_KEY"الاستجابات
200OK
الحقل النوع الوصف idstringtypeRFQ | ORDER | BILL | REFUND | DEBIT_NOTEnumberstringstatusDRAFT | SENT | CONFIRMED | RECEIVED | POSTED | PAID | CANCELLEDissueDatedatedueDatedatevendorobjectvendorRefstringbuyerIdstringpaymentTermIdstringnotesstringorderDeadlinedateexpectedArrivaldatelinesobject[]subtotalnumberdiscountTotalnumbertaxTotalnumbertotalnumberpaidTotalnumbercreditedTotalnumberoriginMANUAL | API | EINVOICEsourceobjectderivedobject[]externalIdstringcreatedAtdateupdatedAtdate400Refused: the request or a business rule. The code says which (REQUEST_INVALID, RULE_REFUSED, …).
{ "error": "Lines: at least one line is required.", "code": "REQUEST_INVALID" }401No key, a key that is not ours, or one revoked (API_KEY_INVALID); a merchant not active (MERCHANT_INACTIVE).
{ "error": "That API key is not valid, or it was revoked.", "code": "API_KEY_INVALID" }403The key's scopes do not carry the capability (APP_NOT_GRANTED, ROLE_TOO_LOW), or the plan lacks the app (APP_LOCKED).
{ "error": "This key's scopes do not include sales.approve.", "code": "ROLE_TOO_LOW" }404Not found: another type under this route, or another company's (NOT_FOUND).
{ "error": "Not found.", "code": "NOT_FOUND" }409A conflict: an externalId taken, or a change that could not be saved (EXTERNAL_ID_TAKEN, CONFLICT).
{ "error": "That externalId is already used by another record of this company.", "code": "EXTERNAL_ID_TAKEN" }429Too many requests: wait retryAfter seconds (RATE_LIMITED).
{ "error": "Too many requests. Wait a little and try again.", "code": "RATE_LIMITED" }
التأكيد إلى أمر شراء
POST/rfqs/{id}/confirm
Confirms the RFQ into its purchase order and answers the order. Confirmed already: alreadyDone with that order.
المعاملات
| الحقل | النوع | الوصف |
|---|---|---|
idالمسارإلزامي | string |
أمثلة برمجية
curl -sS -X POST "https://app.kwn.tax/api/v1/rfqs/<id>/confirm" \
-H "X-Api-Key: $KWN_API_KEY"الاستجابات
200OK
الحقل النوع الوصف alreadyDonebooleanTrue when the document was already where the action takes it; nothing changed. documentobject400Refused: the request or a business rule. The code says which (REQUEST_INVALID, RULE_REFUSED, …).
{ "error": "Lines: at least one line is required.", "code": "REQUEST_INVALID" }401No key, a key that is not ours, or one revoked (API_KEY_INVALID); a merchant not active (MERCHANT_INACTIVE).
{ "error": "That API key is not valid, or it was revoked.", "code": "API_KEY_INVALID" }403The key's scopes do not carry the capability (APP_NOT_GRANTED, ROLE_TOO_LOW), or the plan lacks the app (APP_LOCKED).
{ "error": "This key's scopes do not include sales.approve.", "code": "ROLE_TOO_LOW" }404Not found: another type under this route, or another company's (NOT_FOUND).
{ "error": "Not found.", "code": "NOT_FOUND" }409A conflict: an externalId taken, or a change that could not be saved (EXTERNAL_ID_TAKEN, CONFLICT).
{ "error": "That externalId is already used by another record of this company.", "code": "EXTERNAL_ID_TAKEN" }429Too many requests: wait retryAfter seconds (RATE_LIMITED).
{ "error": "Too many requests. Wait a little and try again.", "code": "RATE_LIMITED" }
إلغاء طلب عرض سعر
POST/rfqs/{id}/cancel
Cancelled already: alreadyDone.
المعاملات
| الحقل | النوع | الوصف |
|---|---|---|
idالمسارإلزامي | string |
أمثلة برمجية
curl -sS -X POST "https://app.kwn.tax/api/v1/rfqs/<id>/cancel" \
-H "X-Api-Key: $KWN_API_KEY"الاستجابات
200OK
الحقل النوع الوصف alreadyDonebooleanTrue when the document was already where the action takes it; nothing changed. documentobject400Refused: the request or a business rule. The code says which (REQUEST_INVALID, RULE_REFUSED, …).
{ "error": "Lines: at least one line is required.", "code": "REQUEST_INVALID" }401No key, a key that is not ours, or one revoked (API_KEY_INVALID); a merchant not active (MERCHANT_INACTIVE).
{ "error": "That API key is not valid, or it was revoked.", "code": "API_KEY_INVALID" }403The key's scopes do not carry the capability (APP_NOT_GRANTED, ROLE_TOO_LOW), or the plan lacks the app (APP_LOCKED).
{ "error": "This key's scopes do not include sales.approve.", "code": "ROLE_TOO_LOW" }404Not found: another type under this route, or another company's (NOT_FOUND).
{ "error": "Not found.", "code": "NOT_FOUND" }409A conflict: an externalId taken, or a change that could not be saved (EXTERNAL_ID_TAKEN, CONFLICT).
{ "error": "That externalId is already used by another record of this company.", "code": "EXTERNAL_ID_TAKEN" }429Too many requests: wait retryAfter seconds (RATE_LIMITED).
{ "error": "Too many requests. Wait a little and try again.", "code": "RATE_LIMITED" }
طباعة
GET/rfqs/{id}/pdf
The printed document as the app prints it, in English or Arabic (?lang=ar). Counted against the apikey-heavy budget.
المعاملات
| الحقل | النوع | الوصف |
|---|---|---|
idالمسارإلزامي | string | |
langالاستعلام | string |
أمثلة برمجية
curl -sS -X GET "https://app.kwn.tax/api/v1/rfqs/<id>/pdf" \
-H "X-Api-Key: $KWN_API_KEY"الاستجابات
200OK
400Refused: the request or a business rule. The code says which (REQUEST_INVALID, RULE_REFUSED, …).
{ "error": "Lines: at least one line is required.", "code": "REQUEST_INVALID" }401No key, a key that is not ours, or one revoked (API_KEY_INVALID); a merchant not active (MERCHANT_INACTIVE).
{ "error": "That API key is not valid, or it was revoked.", "code": "API_KEY_INVALID" }403The key's scopes do not carry the capability (APP_NOT_GRANTED, ROLE_TOO_LOW), or the plan lacks the app (APP_LOCKED).
{ "error": "This key's scopes do not include sales.approve.", "code": "ROLE_TOO_LOW" }404Not found: another type under this route, or another company's (NOT_FOUND).
{ "error": "Not found.", "code": "NOT_FOUND" }409A conflict: an externalId taken, or a change that could not be saved (EXTERNAL_ID_TAKEN, CONFLICT).
{ "error": "That externalId is already used by another record of this company.", "code": "EXTERNAL_ID_TAKEN" }429Too many requests: wait retryAfter seconds (RATE_LIMITED).
{ "error": "Too many requests. Wait a little and try again.", "code": "RATE_LIMITED" }