TenderCheck AI exposes four tender endpoints, all mounted underDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/elecodes/TenderCheck-AI/llms.txt
Use this file to discover all available pages before exploring further.
/api/tenders. Every endpoint requires a valid JWT — supplied either as the token HttpOnly cookie or an Authorization: Bearer <token> header. File uploads use multipart/form-data; the server accepts only PDF documents up to 50 MB.
POST /api/tenders/analyze
Uploads a public tender document (pliego de condiciones) and runs AI analysis to extract all requirements. Returns aTenderAnalysis object with a populated requirements array.
Auth required: YesContent-Type:
multipart/form-data
Request fields
The tender PDF. Maximum size: 50 MB. Only
application/pdf MIME type is accepted.Optional industry hint to guide AI extraction (e.g.
"digital_services", "construction", "healthcare"). When omitted, the model infers context from the document.curl example
Success response — 201 Created
documentUrl is always an empty string in the current release. The uploaded PDF is parsed in-memory and not persisted to storage — only the extracted analysis metadata, requirements, and validation results are saved to the database.Error responses
| Status | Reason |
|---|---|
400 | No file attached, non-PDF file type, or file exceeds 50 MB |
401 | Missing or invalid authentication token |
POST /api/tenders/:id/validate-proposal
Uploads a vendor proposal PDF and validates it against the requirements extracted from a previously analyzed tender. Returns aValidationResult for each requirement.
Auth required: YesContent-Type:
multipart/form-data
Path parameters
The UUID of the tender to validate against. Obtained from a prior
/analyze response.Request fields
The vendor proposal PDF to validate. Same constraints apply: PDF only, maximum 50 MB.
curl example
Success response — 200 OK
ValidationStatus values
Each result’sstatus field is one of four values:
| Value | Meaning |
|---|---|
MET | The proposal clearly satisfies the requirement |
NOT_MET | The proposal does not address the requirement |
PARTIALLY_MET | The proposal partially addresses the requirement but gaps remain |
AMBIGUOUS | The proposal contains conflicting or insufficient evidence to decide |
Error responses
| Status | Reason |
|---|---|
400 | No file attached or the PDF could not be parsed |
401 | Missing or invalid authentication token |
404 | No tender found with the given id |
GET /api/tenders
Returns the analysis history for the currently authenticated user. TheuserId is read from the JWT — there are no query parameters.
Auth required: Yes
curl example
Success response — 200 OK
An array of TenderAnalysis objects in the same shape as the /analyze response. The array is empty when the user has no prior analyses.
Error responses
| Status | Reason |
|---|---|
401 | Missing or invalid authentication token |
DELETE /api/tenders/:id
Permanently deletes a tender analysis record. Ownership is validated server-side — only the user whoseuserId matches tender.userId can delete it.
Auth required: Yes
Path parameters
The UUID of the tender to delete.
curl example
Success response — 200 OK
Error responses
| Status | Reason |
|---|---|
400 | Invalid or missing tender id |
401 | Missing or invalid authentication token |
403 | The authenticated user is not the owner of this tender (tender.userId !== req.user.userId) |
404 | No tender found with the given id |
TenderAnalysis Response Schema
The following fields are returned by/analyze and each item in the GET / history array.
UUID that uniquely identifies this analysis. Used as the
id path parameter in /validate-proposal and DELETE.UUID of the user who created the analysis.
Title extracted from the tender document by the AI model.
Reserved for a future PDF storage URL. Currently always an empty string.
Processing state of the analysis. One of
PENDING, PROCESSING, COMPLETED, or FAILED.ISO 8601 timestamp of when the analysis was created.
ISO 8601 timestamp of the last update (e.g. when validation results are written).
Array of requirements extracted from the tender document by the AI. Populated after a successful
/analyze call.Array of validation results produced by
/validate-proposal. Empty after /analyze — results are only populated once a proposal has been validated against this tender.Array of full page text strings extracted from the tender PDF, one entry per page. Used by the frontend to display source citations inline.
Optional processing metadata.
The
documentUrl field is always an empty string in the current release. The uploaded PDF is parsed in-memory and not persisted to storage — only the extracted analysis metadata, requirements, and validation results are saved to the database.