API Documentation

Integrate with our platform using the REST API

Authentication

All API requests require a Bearer token. Generate an API key from Settings > Integrations.

curl -H "Authorization: Bearer sk_live_YOUR_API_KEY" \ https://your-domain.com/api/v1/tenders

Rate Limiting

API calls are limited based on your subscription plan. Pro: 1,000/day, Enterprise: Unlimited.

Pagination

All list endpoints return paginated responses with the following structure:

{ "data": [...], "total": 150, "page": 1, "page_size": 20, "total_pages": 8 }

Endpoints

GET/api/v1/tenders

List tenders with pagination and filtering

Required scope: tenders.read
ParameterTypeRequiredDescription
pagenumberNoPage number (default: 1)
page_sizenumberNoItems per page (max: 100)
sourcestringNoFilter by source (etimad, nupco)
agencystringNoFilter by agency name
GET/api/v1/tenders/:id

Get tender details with line items

Required scope: tenders.read
ParameterTypeRequiredDescription
idnumberYesTender ID
GET/api/v1/search

Search tenders by keyword (including item names)

Required scope: search
ParameterTypeRequiredDescription
qstringNoSearch query
sourcestringNoFilter by source
agencystringNoFilter by agency
typestringNoFilter by tender type
date_fromstringNoStart date (ISO)
date_tostringNoEnd date (ISO)
pagenumberNoPage number
page_sizenumberNoItems per page
GET/api/v1/bids

List your organization's bids

Required scope: bids.read
ParameterTypeRequiredDescription
statusstringNoFilter by status
pagenumberNoPage number
page_sizenumberNoItems per page
GET/api/v1/favorites

List your organization's favorite tenders

Required scope: favorites.read
ParameterTypeRequiredDescription
pagenumberNoPage number
page_sizenumberNoItems per page

Webhooks

Receive real-time notifications when events occur. Configure webhooks from Settings > Integrations.

Available Events

Signature Verification

All webhook payloads are signed with HMAC-SHA256. Verify the X-Webhook-Signature header:

// Verify webhook signature const crypto = require('crypto'); const signature = req.headers['x-webhook-signature']; const expected = 'sha256=' + crypto .createHmac('sha256', webhookSecret) .update(JSON.stringify(req.body)) .digest('hex'); if (signature === expected) { // Valid webhook }