Skip to main content

Training Programs

Training programs represent Skills Development training captured on a BEEtoolkit Scorecard. This API allows you to create, retrieve, and delete training programs for a specific scorecard.

Training data is always scoped to a single scorecard and stored against that scorecard's ID. Participants belong to exactly one training program, and each training program can have many participants. See Training Program Participants.


Endpoints

MethodPathPurpose
GET/api/public/v1/scorecards/{scorecard_id}/training_programsRetrieve all training programs for a scorecard
POST/api/public/v1/scorecards/{scorecard_id}/training_programsCreate or update training programs for a scorecard
DELETE/api/public/v1/scorecards/{scorecard_id}/training_programs/{id}Delete a single training program
Authentication

Include the following headers on every request:

  • Authorization: HMAC <signature>
  • X-Api-Key: <your account key>
  • Accept: application/json

See Authentication.


Attributes

FieldTypeRequiredDescription
namestringyesTraining program name.
categorystringyesTraining category code: A, B, C, D, E, F or G, as per the B-BBEE codes.
abetbooleannoIndicates ABET training.
scholarshipbooleannoIndicates a scholarship program.
municipalitystring | nullnoMunicipality name when applicable.
mandatorybooleannoIndicates mandatory training.
training_providerstring | nullnoTraining provider name when applicable.
scarce_or_critical_skillsbooleannoIndicates scarce or critical skills training.
rail_relatedbooleannoIndicates rail-related training.
is_tourism_related_expenditurebooleannoIndicates tourism-related expenditure.
bursary_programbooleannoIndicates a bursary program.
invoice_transaction_datestringnoInvoice transaction date (YYYY-MM-DD).
specialised_areas_of_lawstring | nullnoSpecialised legal area when applicable.
continuous_legal_education_programstring | nullnoCLE program when applicable.

System Fields (Response Only)

FieldTypeDescription
idintegerInternal identifier for the training program.
total_number_of_participantsintegerNumber of participants in this program.
created_atdatetimeRecord creation timestamp.
updated_atdatetimeRecord update timestamp.

Notes

  • Records are matched by the combination of name, category, abet, mandatory, training_provider, and municipality. If a match exists, the record is updated; otherwise it is created.
  • Dates must be in ISO 8601 format (YYYY-MM-DD).
  • After creating, updating, or deleting training programs, recalculate the scorecard to refresh totals.

List training programs

Returns a paginated list of training programs for a scorecard.

GET /api/public/v1/scorecards/{scorecard_id}/training_programs

Path parameters

NameTypeRequiredDescription
scorecard_idstringyesThe scorecard identifier.

Query parameters

NameTypeRequiredDescription
pageintegernoPage number (min 1, max 100000). Default is 1.
per_pageintegernoPage size (min 1, max 1000). Default is 50.

Code examples

curl -X GET "https://www.beetoolkit.co.za/api/public/v1/scorecards/{scorecard_id}/training_programs?page=1&per_page=50" \
-H "Accept: application/json" \
-H "X-Api-Key: <your account key>" \
-H "Authorization: HMAC <your signature>"

Response

Returns a JSON object with data and meta keys.

{
"data": [
{
"id": 32003,
"name": "Excel Advanced",
"category": "E",
"abet": true,
"scholarship": false,
"municipality": null,
"mandatory": false,
"training_provider": null,
"scarce_or_critical_skills": false,
"rail_related": false,
"is_tourism_related_expenditure": false,
"bursary_program": false,
"invoice_transaction_date": "2021-03-21",
"specialised_areas_of_law": null,
"continuous_legal_education_program": null,
"total_number_of_participants": 13,
"created_at": "2026-02-10T07:23:33.000Z",
"updated_at": "2026-02-10T07:23:34.000Z"
}
],
"meta": {
"prev_url": null,
"next_url": null,
"count": 1,
"page": 1,
"items": 50,
"pages": 1
}
}

Create or update training programs

Creates training programs for a scorecard. Records are matched by the combination of name, category, abet, mandatory, training_provider, and municipality. If a match exists, the record is updated; otherwise it is created.

POST /api/public/v1/scorecards/{scorecard_id}/training_programs

Path parameters

NameTypeRequiredDescription
scorecard_idstringyesThe scorecard identifier.

Request body

Send a JSON object with a training_programs array:

{
"training_programs": [
{
"name": "Leadership Development Program",
"category": "E",
"abet": false,
"scholarship": false,
"municipality": "Johannesburg",
"mandatory": false,
"training_provider": "ABC Training Solutions",
"scarce_or_critical_skills": false,
"invoice_transaction_date": "2024-01-15"
}
]
}

Code examples

curl -X POST "https://www.beetoolkit.co.za/api/public/v1/scorecards/{scorecard_id}/training_programs" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "X-Api-Key: <your account key>" \
-H "Authorization: HMAC <your signature>" \
-d '{
"training_programs": [
{
"name": "Leadership Development Program",
"category": "E",
"abet": false,
"scholarship": false,
"municipality": "Johannesburg",
"mandatory": false,
"training_provider": "ABC Training Solutions",
"scarce_or_critical_skills": false,
"invoice_transaction_date": "2024-01-15"
}
]
}'

Response

Returns the created or updated training program records.

[
{
"id": 32005,
"name": "Leadership Development Program",
"category": "E",
"abet": false,
"scholarship": false,
"municipality": "Johannesburg",
"mandatory": false,
"training_provider": "ABC Training Solutions",
"scarce_or_critical_skills": false,
"rail_related": false,
"is_tourism_related_expenditure": false,
"bursary_program": false,
"invoice_transaction_date": "2024-01-15",
"specialised_areas_of_law": null,
"continuous_legal_education_program": null,
"total_number_of_participants": 0,
"created_at": "2026-02-10T07:23:33.000Z",
"updated_at": "2026-02-10T07:23:33.000Z"
}
]
Recalculate after loading training programs

After creating or updating training programs, call the scorecard recalculate endpoint to refresh scores: Recalculate a scorecard.

Errors

StatusDescription
422One or more training program records are invalid.
422The scorecard type does not support training programs.
{
"error": {
"message": "One or more training program records are invalid.",
"invalid_records": [
{
"name": "Leadership Development Program",
"category": "z",
"abet": false,
"mandatory": false,
"training_provider": "ABC Training Solutions",
"municipality": "Johannesburg",
"errors": [
"Category is not a valid category"
]
}
]
}
}

Delete a training program

Deletes a single training program by ID. The endpoint returns 204 No Content even if the ID does not exist for the scorecard.

DELETE /api/public/v1/scorecards/{scorecard_id}/training_programs/{id}

Path parameters

NameTypeRequiredDescription
scorecard_idstringyesThe scorecard identifier.
idintegeryesTraining program ID.

Code examples

curl -X DELETE "https://www.beetoolkit.co.za/api/public/v1/scorecards/{scorecard_id}/training_programs/{id}" \
-H "Accept: application/json" \
-H "X-Api-Key: <your account key>" \
-H "Authorization: HMAC <your signature>"

Response

Returns 204 No Content on success.

Recalculate after deleting training programs

After deleting training programs, call the scorecard recalculate endpoint to refresh scores: Recalculate a scorecard.

Errors

StatusDescription
422The scorecard type does not support training programs.