Docs
MethodologiesBOLD Recycling CreditBOLD Recycling Credit - MvFApplication

BOLD Recycling Credit Integration Guide

Integration guide for BOLD Recycling Credit Application v1.0.0 — expected events, required fields, and validation requirements.

This guide explains how to submit MassID documents that satisfy BOLD Recycling rules. It covers the expected event sequence, required fields per event, and common validation issues.

For the base API flow, see Submitting a MassID. For the complete rules catalog, see BOLD Recycling Rules.

Prerequisites

Document creation

Create the document with these required qualifications (validated by rule 5 — MassID Qualifications):

FieldRequired value
categoryMassID
typeOrganic
measureUnitkg
valueGreater than 0
subtypeA valid organic waste subtype
isPublicPer your visibility requirements

Reference: Documents API.

Expected event sequence

Submit events in chronological order via POST /documents/{documentId}/events. See Event Specification for common event fields.

The following sequence reflects the order validated by the BOLD Recycling rules:

Required participant roles

RoleACTOR labelPurpose
Waste GeneratorWaste GeneratorSource of the waste material
HaulerHaulerTransports waste from origin to facility
RecyclerRecyclerOperates the recycling or composting facility
ProcessorProcessorProcesses sorted material (may be the same entity as recycler)

1. ACTOR events — participant registration

Register each participant with an ACTOR event. Each must have a valid accreditation document (rule 4 — Participant Accreditations & Verifications).

ParticipantRequired?Conditions
IntegratorYesMust have valid accreditation with valid dates.
Waste GeneratorConditionalRequired if waste origin is identified (rule 8). Omit if origin unidentified.
HaulerConditionalRequired for most vehicle types (rule 9). Optional for cart or sludge pipes.
ProcessorYesExactly one processor required (rule 13).
RecyclerYesExactly one recycler required (rule 14).

Each ACTOR event must include the participant's accreditation data and address (used by rule 7 — Geolocation Precision, which validates event addresses against accredited addresses using tiered distance thresholds).

The payload shape is identical across actors — only the role identifier differs.

{  "externalCreatedAt": "2024-12-05T11:02:47Z",  "isPublic": false,  "address": {    "city": "São Paulo",    "countryCode": "BR",    "countryState": "SP",    "latitude": -23.5613,    "longitude": -46.6563,    "name": "Sede",    "neighborhood": "Centro",    "number": "1000",    "street": "Avenida Exemplo",    "zipCode": "01001000"  },  "label": "Waste Generator",  "name": "ACTOR",  "participant": {    "id": "00000000-0000-4000-8000-00000000000a",    "countryCode": "BR",    "email": "wastegen@example.com",    "mobileNumber": "+5511000000001",    "name": "Acme Example Waste Generator",    "taxId": "11222333000181",    "taxIdType": "CNPJ",    "type": "COMPANY"  }}

2. Pick-up event — waste collection

The Pick-up event captures vehicle and driver information:

FieldRequired?Validated by
Vehicle typeYesRule 10 — Vehicle Identification
License plate / IDConditionalBy vehicle type (rule 10)
Driver identifierConditionalBy vehicle type (rule 11)
Exemption justificationConditionalWhen driver ID not required (rule 11)
{  "externalCreatedAt": "2024-12-05T11:02:47Z",  "isPublic": false,  "address": {    "city": "São Paulo",    "countryCode": "BR",    "countryState": "SP",    "latitude": -23.5613,    "longitude": -46.6563,    "name": "Sede",    "neighborhood": "Centro",    "number": "1000",    "street": "Avenida Exemplo",    "zipCode": "01001000"  },  "name": "Pick-up",  "participant": {    "id": "00000000-0000-4000-8000-00000000000a",    "countryCode": "BR",    "email": "wastegen@example.com",    "mobileNumber": "+5511000000001",    "name": "Acme Example Waste Generator",    "taxId": "11222333000181",    "taxIdType": "CNPJ",    "type": "COMPANY"  },  "metadata": {    "attributes": [      {        "isPublic": true,        "name": "Description",        "value": "Waste picked up by hauler Acme Example Hauler at Acme Example Waste Generator"      },      {        "isPublic": true,        "name": "Local Waste Classification ID",        "value": "04 02 20"      },      {        "isPublic": true,        "name": "Local Waste Classification Description",        "value": "Lodos do tratamento local de efluentes não abrangidas em 04 02 19"      },      {        "sensitive": true,        "isPublic": false,        "name": "Vehicle License Plate",        "value": "ABC1D23"      },      {        "isPublic": true,        "name": "Vehicle Type",        "value": "Truck"      },      {        "isPublic": false,        "name": "Driver Identifier",        "value": "00000000-0000-4000-8000-00000000d21f"      }    ]  }}

3. Transport Manifest event — shipping documentation

Must include (rule 12 — Transport Manifest):

FieldRequired?Notes
Document numberYes
Document typeYesMust be MTR for recyclers in Brazil.
Issue dateYes
AttachmentsYesUpload via File Uploads.
{  "externalCreatedAt": "2024-12-05T11:02:47Z",  "isPublic": true,  "address": {    "city": "São Paulo",    "countryCode": "BR",    "countryState": "SP",    "latitude": -23.5613,    "longitude": -46.6563,    "name": "Sede",    "neighborhood": "Centro",    "number": "1000",    "street": "Avenida Exemplo",    "zipCode": "01001000"  },  "name": "Transport Manifest",  "participant": {    "id": "00000000-0000-4000-8000-00000000000a",    "countryCode": "BR",    "email": "wastegen@example.com",    "mobileNumber": "+5511000000001",    "name": "Acme Example Waste Generator",    "taxId": "11222333000181",    "taxIdType": "CNPJ",    "type": "COMPANY"  },  "value": 1201.925,  "metadata": {    "attributes": [      {        "isPublic": true,        "name": "Document Type",        "value": "MTR"      },      {        "isPublic": true,        "name": "Document Number",        "value": "DOC-EXAMPLE-0001"      },      {        "format": "DATE",        "isPublic": true,        "name": "Issue Date",        "value": "2024-02-10"      }    ]  },  "attachments": [    {      "fileName": "transport-manifest.pdf",      "isPublic": false,      "label": "Transport Manifest"    }  ]}

4. Weighing event(s) — mass measurement

Record weight measurements (rule 15 — Weighing):

FieldRequired?Notes
Event valueYesNet weight in kg, must be greater than 0.
DescriptionYesWeighing event description.
Gross weightYesMust be greater than 0, in kg.
TareYesContainer empty weight in kg (exemptions may apply per accreditation).
Container typeYesOne of: Bag, Bin, Drum, Pail, Street Bin, Waste Box, or Truck.
Container quantityConditionalRequired when container type is not Truck.
Container capacityConditionalRequired for multi-container weighing.
Capture methodYesOne of: Digital, Photo (Scale+Cargo), Manual, or Transport Manifest.
Scale typeYesMust match an approved scale type.
Scale ticketConditionalWhen required by recycler accreditation.
Vehicle license plateConditionalRequired when container type is Truck.

Supports both single-step and two-step weighing processes.

{  "externalCreatedAt": "2024-12-05T11:02:47Z",  "isPublic": true,  "address": {    "city": "São Paulo",    "countryCode": "BR",    "countryState": "SP",    "latitude": -23.5613,    "longitude": -46.6563,    "name": "Sede",    "neighborhood": "Centro",    "number": "1000",    "street": "Avenida Exemplo",    "zipCode": "01001000"  },  "name": "Weighing",  "participant": {    "id": "00000000-0000-4000-8000-00000000000a",    "countryCode": "BR",    "email": "wastegen@example.com",    "mobileNumber": "+5511000000001",    "name": "Acme Example Waste Generator",    "taxId": "11222333000181",    "taxIdType": "CNPJ",    "type": "COMPANY"  },  "value": 1201.925,  "metadata": {    "attributes": [      {        "isPublic": true,        "name": "Description",        "value": "Weighing captured at waste generator site"      },      {        "isPublic": true,        "name": "Weigh Capture Method",        "value": "Average Weight by Volume"      },      {        "isPublic": true,        "name": "Scale Type",        "value": "Floor Scale"      },      {        "isPublic": true,        "name": "Container Type",        "value": "Drum"      },      {        "isPublic": true,        "name": "Container Quantity",        "value": 1      },      {        "format": "KILOGRAM",        "isPublic": true,        "name": "Container Capacity",        "value": 100      },      {        "format": "KILOGRAM",        "isPublic": true,        "name": "Gross Weight",        "value": 1211.925      },      {        "format": "KILOGRAM",        "isPublic": true,        "name": "Tare",        "value": 10      }    ]  }}

5. Drop-off event — delivery to recycling facility

Must include (rule 16 — Drop-off At Recycling Facility):

FieldRequired?Notes
Receiving operatorYesOperator identifier at the facility.
AddressYesMust match the recycler's accredited address.
{  "externalCreatedAt": "2024-12-05T11:02:47Z",  "isPublic": true,  "address": {    "city": "São Paulo",    "countryCode": "BR",    "countryState": "SP",    "latitude": -23.5613,    "longitude": -46.6563,    "name": "Sede",    "neighborhood": "Centro",    "number": "1000",    "street": "Avenida Exemplo",    "zipCode": "01001000"  },  "name": "Drop-off",  "participant": {    "id": "00000000-0000-4000-8000-00000000000d",    "countryCode": "BR",    "email": "recycler@example.com",    "mobileNumber": "+5511000000004",    "name": "Acme Example Recycler",    "taxId": "11222333000424",    "taxIdType": "CNPJ",    "type": "COMPANY"  },  "metadata": {    "attributes": [      {        "isPublic": true,        "name": "Description",        "value": "Waste deposited in Windrow number 1"      },      {        "isPublic": true,        "name": "Receiving Operator Identifier",        "value": "00000000-0000-4000-8000-00000000000c"      }    ]  }}

6. Sorting event — mass sorting

Must include (rule 17 — Mass Sorting):

FieldRequired?Notes
DescriptionYesSorting event description.
Gross weightYesTotal weight before deductions.
Deducted weightYesWeight of contaminants/non-target material.
Sorting factorYesCalculated from gross and deducted weight.
Event valueYesMust be correctly calculated from sorting data.
{  "externalCreatedAt": "2024-12-05T11:02:47Z",  "isPublic": true,  "address": {    "city": "São Paulo",    "countryCode": "BR",    "countryState": "SP",    "latitude": -23.5613,    "longitude": -46.6563,    "name": "Sede",    "neighborhood": "Centro",    "number": "1000",    "street": "Avenida Exemplo",    "zipCode": "01001000"  },  "name": "Sorting",  "participant": {    "id": "00000000-0000-4000-8000-00000000000c",    "countryCode": "BR",    "email": "processor@example.com",    "mobileNumber": "+5511000000003",    "name": "Acme Example Processor",    "taxId": "11222333000343",    "taxIdType": "CNPJ",    "type": "COMPANY"  },  "value": 1189.906,  "metadata": {    "attributes": [      {        "isPublic": true,        "name": "Description",        "value": "Sorting factor determined by a third-party audit"      },      {        "format": "KILOGRAM",        "isPublic": true,        "name": "Gross Weight",        "value": 1201.925      },      {        "format": "KILOGRAM",        "isPublic": true,        "name": "Deducted Weight",        "value": 12.019      }    ]  }}

7. Recycled event — biological treatment completion

The Recycled event marks the end of the biological treatment cycle. The timestamp is validated against the Drop-off event (rule 18 — Composting Cycle Timeframe):

  • Time between Drop-off and Recycled must be 60–180 days.
{  "externalCreatedAt": "2025-02-22T10:35:12.000Z",  "isPublic": true,  "address": {    "city": "São Paulo",    "countryCode": "BR",    "countryState": "SP",    "latitude": -23.5613,    "longitude": -46.6563,    "name": "Sede",    "neighborhood": "Centro",    "number": "1000",    "street": "Avenida Exemplo",    "zipCode": "01001000"  },  "name": "Recycled",  "participant": {    "id": "00000000-0000-4000-8000-00000000000d",    "countryCode": "BR",    "email": "recycler@example.com",    "mobileNumber": "+5511000000004",    "name": "Acme Example Recycler",    "taxId": "11222333000424",    "taxIdType": "CNPJ",    "type": "COMPANY"  },  "metadata": {    "attributes": [      {        "isPublic": true,        "name": "Description",        "value": "Composting process completed. The recycling completion date is recorded by a conservative estimate determined and verified by a third-party audit for the recycler"      }    ]  }}

8. Recycling Manifest event — recycling documentation

Must include (rule 19 — Recycling Manifest):

FieldRequired?Notes
Document numberYes
Document typeYesMust be CDF for recyclers in Brazil.
Issue dateYes
AttachmentsConditionalRequired unless exemption justification provided.
Exemption justificationConditionalWhen attachments are not available.
{  "externalCreatedAt": "2024-12-05T11:02:47Z",  "isPublic": true,  "address": {    "city": "São Paulo",    "countryCode": "BR",    "countryState": "SP",    "latitude": -23.5613,    "longitude": -46.6563,    "name": "Sede",    "neighborhood": "Centro",    "number": "1000",    "street": "Avenida Exemplo",    "zipCode": "01001000"  },  "name": "Recycling Manifest",  "participant": {    "id": "00000000-0000-4000-8000-00000000000d",    "countryCode": "BR",    "email": "recycler@example.com",    "mobileNumber": "+5511000000004",    "name": "Acme Example Recycler",    "taxId": "11222333000424",    "taxIdType": "CNPJ",    "type": "COMPANY"  },  "value": 1201.925,  "metadata": {    "attributes": [      {        "isPublic": true,        "name": "Document Type",        "value": "CDF"      },      {        "isPublic": true,        "name": "Document Number",        "value": "DOC-EXAMPLE-0002"      },      {        "format": "DATE",        "isPublic": true,        "name": "Issue Date",        "value": "2024-03-10"      }    ]  },  "attachments": [    {      "fileName": "recycling-manifest.pdf",      "isPublic": false,      "label": "Recycling Manifest"    }  ]}

Event and rule mapping

CUSTOM event names

Event NamePurposeValidated by
PICK_UPWaste collection from generator site
TRANSPORT_MANIFESTTransport documentation attachment
WEIGHINGWeight capture at a calibrated scale
DROP_OFFDelivery to the recycling/processing facility
SORTINGWaste sorting with contamination deduction
RECYCLEDConfirms composting or recycling completion
RECYCLING_MANIFESTFinal recycling documentation attachment

ACTOR label vocabulary

LabelDescriptionValidated by
WASTE_GENERATORSource of the waste material
HAULERTransports waste from origin to facility
RECYCLEROperates the recycling or composting facility
PROCESSORProcesses sorted material

Additional validations

RuleWhat it checks
1No duplicate MassID exists with the same drop-off + pick-up + recycler + waste generator + license plate combination.
2MassID is not already linked to a RecycledID or credit order.
3Recycled event occurred on or after January 1st of the previous year.
6Local waste classification matches a valid Ibama code (recyclers in Brazil).
7Participant event addresses are validated against accredited addresses using tiered distance thresholds (≤2 km: GPS check, 2–30 km: address similarity review, >30 km: fail).

Post-validation

When all 19 rules pass:

  1. A RecycledID certificate is issued, linked to the MassID.
  2. RecycledID rules run (rewards distribution for supply chain participants).
  3. C-BIOW credit tokens (Tokenized Recycling Credits) are generated upon credit order settlement.

Common issues

  • Geolocation mismatch — Participant event addresses are validated against accredited addresses using tiered distance thresholds. Verify GPS accuracy.
  • Biological treatment timeframe — The Drop-off to Recycled window must be 60–180 days. Documents outside this range fail rule 18.
  • Missing accreditations — All participants must have valid, non-expired accreditation documents at the time of event submission.
  • Duplicate MassIDs — The uniqueness check (rule 1) prevents duplicate submissions. Use deduplicationId for retries, not re-submissions.
  • Ibama codes — For recyclers in Brazil, local waste classification must match a valid Ibama code. Validate before submission.

View rules catalog · View app reference · Base integration flow

On this page