Developers

REST reference

Send your key as a bearer token. Request bodies are JSON. Tender references in a path can be the short form shown on Bekom, such as P173394.

curl https://api.bekom.io/v1 -H "Authorization: Bearer $BEKOM_API_KEY"
# → who the key is, its scopes, and every route it may call

Tenders

GET/v1/tenders

The tender board, filtered

Scope: tenders:read · Query: countryprovincecategorybuyerclosingqsizefrom · Realtime event: listOrgTenders

/v1/tenders?closing=open&province=Gauteng
GET/v1/tenders/fit

Tenders that fit your organisation, with a verdict on each (Qualify plan)

Scope: assessments:read · Query: bucketclosingqsizefrom · Realtime event: listOrgTenders

/v1/tenders/fit?bucket=qualify
GET/v1/tenders/:tenderId

One tender, with its documents

Scope: tenders:read · Realtime event: getTender

/v1/tenders/P173394
GET/v1/tenders/:tenderId/assessment

What Bekom makes of one tender for you (Qualify plan)

Scope: assessments:read · Realtime event: getAssessment

/v1/tenders/P173394/assessment
GET/v1/tenders/:tenderId/documents/:ref

A five-minute download link for one tender document

Scope: tenders:read · Realtime event: getTenderDocument

/v1/tenders/P173394/documents/81386e2e-…
GET/v1/briefings

Compulsory briefings in the next few weeks

Scope: tenders:read · Query: withinDays · Realtime event: listBriefings

/v1/briefings?withinDays=14

Notices

GET/v1/notices

Your organisation's notices

Scope: notices:read · Realtime event: listMyNotices

/v1/notices
GET/v1/notices/:noticeId

One notice

Scope: notices:read · Realtime event: getNotice

/v1/notices/0170771c-…
POST/v1/notices

Draft a notice

Scope: notices:write · Realtime event: createNotice

{ "reference": "RFQ-14", "title": "…", "closingAt": "2026-11-20T09:00:00Z", "eSubmission": "true", "returnables": [{ "label": "Tax clearance", "required": true }] }
PATCH/v1/notices/:noticeId

Change a draft

Scope: notices:write · Realtime event: updateNotice

{ "title": "…" }
POST/v1/notices/:noticeId/publish

Publish a draft (verified buyers)

Scope: notices:write · Realtime event: publishNotice

POST/v1/notices/:noticeId/withdraw

Withdraw a notice, with a reason

Scope: notices:write · Realtime event: withdrawNotice

{ "reason": "…" }

Bids received

GET/v1/notices/:noticeId/bids

Bids on a notice: a sealed count before closing, the bids after

Scope: bids:read · Realtime event: listNoticeSubmissions

/v1/notices/0170771c-…/bids
GET/v1/bids/:submissionId

One opened bid: sections, files, versions, comments, signature

Scope: bids:read · Realtime event: getNoticeSubmission

/v1/bids/a1c01330-…
POST/v1/files/:fileId/review

Accept, reject, or ask for a new version

Scope: bids:review · Realtime event: reviewSubmissionFile

{ "review": "resubmit", "note": "The S3 data sheet, please." }

Files

GET/v1/files/:fileId/link

A five-minute link to one version of a bid file

Scope: bids:readsubmissions:write · Query: version · Realtime event: getSubmissionFileLink

/v1/files/…/link?version=1
POST/v1/files/:fileId/comments

Comment on a bid file

Scope: bids:reviewsubmissions:write · Realtime event: commentOnSubmissionFile

{ "body": "…" }

Your bids

GET/v1/notices/:noticeId/my-bid

Your bid on a notice, by section

Scope: submissions:write · Realtime event: getMySubmission

/v1/notices/0170771c-…/my-bid
POST/v1/notices/:noticeId/uploads

A five-minute upload link for one file

Scope: submissions:write · Realtime event: requestSubmissionUpload

{ "fileName": "tax.pdf", "contentType": "application/pdf", "size": 120332 }
POST/v1/notices/:noticeId/files

Add an uploaded file under a section, with a label and description

Scope: submissions:write · Realtime event: addSubmissionFile

{ "uploadKey": "…", "fileName": "tax.pdf", "contentType": "application/pdf", "section": "tax", "label": "SARS tax compliance status" }
POST/v1/notices/:noticeId/files/:fileId/versions

A new version of a file

Scope: submissions:write · Realtime event: addSubmissionFileVersion

{ "uploadKey": "…", "fileName": "tax-oct.pdf", "contentType": "application/pdf" }
DELETE/v1/notices/:noticeId/files/:fileId

Remove a file before closing (its versions stay in the history)

Scope: submissions:write · Realtime event: removeSubmissionFile

Account

GET/v1/notifications

Your organisation's notifications

Scope: notifications:read · Query: limit · Realtime event: listNotifications

/v1/notifications?limit=20
GET/v1/plan

Your plan, seats, and what it unlocks

Scope: any key · Realtime event: getMyPlan

/v1/plan