Introduction
Certification Bodies API
External API for Approved Certification Bodies to manage product certification.
ID Format
ZDHC Sandbox uses a structured ID format: {prefix}-XXXXXXX-Z
| Prefix | Entity Type | Example |
|---|---|---|
01 |
Organisation | 01-XXXXXXX-Z |
20 |
Product | 20-XXXXXXX-Z |
40 |
InCheck Report | 40-XXXXXXX-Z |
Error Model
All non-2xx responses use a consistent error structure:
{
"error": {
"code": "string",
"message": "string",
"details": {}
}
}
Authenticating requests
To authenticate requests, include an Authorization header with the value "Bearer {YOUR_AUTH_KEY}".
All authenticated endpoints are marked with a requires authentication badge in the documentation below.
Retrieve a token by calling the /auth/login endpoint.
Every request must also include the Auth-Organisation-Id header with your certification body's organisation reference ID (prefix 01, e.g. 01-4SWZLM6LU9C-J). The header is included in the example requests for each endpoint below.
Certification Bodies/V1
Assigned Products
List assigned products
requires authentication
Returns a paginated list of assigned products for this certification body.
Example request:
curl --request GET \
--get "https://staging-api.vm400.consulting1x1.info/api/certification-bodies/v1/assigned-products?per_page=10&page=1&filter%5Bproduct_reference_id%5D=labore&filter%5Bproduct_name%5D=aliquam&filter%5Bformulator_reference_id%5D=sequi&filter%5Bformulator_name%5D=dolores&filter%5Bassigned_by%5D=odit&filter%5Bassignment_status%5D=UNDER_REVIEW&filter%5Bassigned_at%5D=%3C%3D+2026-08-26+14%3A29%3A40&search=ipsam&sort=product_reference_id" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"per_page\": 24,
\"search\": \"bhzpayhaccjosflqusjfaakrboyihwqnnnkhrqxryvhegdxriakrjz\"
}"
const url = new URL(
"https://staging-api.vm400.consulting1x1.info/api/certification-bodies/v1/assigned-products"
);
const params = {
"per_page": "10",
"page": "1",
"filter[product_reference_id]": "labore",
"filter[product_name]": "aliquam",
"filter[formulator_reference_id]": "sequi",
"filter[formulator_name]": "dolores",
"filter[assigned_by]": "odit",
"filter[assignment_status]": "UNDER_REVIEW",
"filter[assigned_at]": "<= 2026-08-26 14:29:40",
"search": "ipsam",
"sort": "product_reference_id",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"per_page": 24,
"search": "bhzpayhaccjosflqusjfaakrboyihwqnnnkhrqxryvhegdxriakrjz"
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (200):
{
"data": [
{
"product_reference_id": null,
"product_name": null,
"formulator_reference_id": null,
"formulator_name": null,
"assigned_by": null,
"assigned_at": "2026-08-20",
"assignment_status": null
},
{
"product_reference_id": null,
"product_name": null,
"formulator_reference_id": null,
"formulator_name": null,
"assigned_by": null,
"assigned_at": "2026-08-20",
"assignment_status": null
}
],
"links": {
"first": "/?page=1",
"last": "/?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [
{
"url": null,
"label": "« Previous",
"active": false
},
{
"url": "/?page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next »",
"active": false
}
],
"path": "/",
"per_page": 50,
"to": 2,
"total": 2
}
}
Example response (200):
Success.
Example response (401):
Token not found
Example response (403):
Authenticated Organisation is not one of types ZDHC MRSL Certification Bodies
Example response (403):
User does not have required permission.
Example response (422):
Validation error
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Decline an assigned product
requires authentication
Marks the assignment identified in the URL as declined.
Example request:
curl --request PATCH \
"https://staging-api.vm400.consulting1x1.info/api/certification-bodies/v1/assigned-products/1234567890/decline" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"note\": \"Unable to process at this time.\"
}"
const url = new URL(
"https://staging-api.vm400.consulting1x1.info/api/certification-bodies/v1/assigned-products/1234567890/decline"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"note": "Unable to process at this time."
};
fetch(url, {
method: "PATCH",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (200):
{
"data": {
"product_reference_id": null,
"product_name": null,
"formulator_reference_id": null,
"formulator_name": null,
"assigned_by": null,
"assigned_at": "2026-08-20",
"assignment_status": null
}
}
Example response (200):
Success.
Example response (401):
Token not found
Example response (403):
Authenticated Organisation is not one of types ZDHC MRSL Certification Bodies
Example response (403):
User does not have required permission.
Example response (404):
Resource not found.
Example response (422):
Validation error
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Certificates
List certificates
requires authentication
Returns a paginated list of certificates for this certification body.
Example request:
curl --request GET \
--get "https://staging-api.vm400.consulting1x1.info/api/certification-bodies/v1/certificates?per_page=13&page=1&filter%5Bproduct_reference_id%5D=quam&filter%5Bstandard_reference_id%5D=quos&filter%5Bstatus%5D=ACTIVE&sort=certificate_reference_id" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"per_page\": 10,
\"filter\": {
\"product_reference_id\": \"iure\",
\"standard_reference_id\": \"veritatis\"
}
}"
const url = new URL(
"https://staging-api.vm400.consulting1x1.info/api/certification-bodies/v1/certificates"
);
const params = {
"per_page": "13",
"page": "1",
"filter[product_reference_id]": "quam",
"filter[standard_reference_id]": "quos",
"filter[status]": "ACTIVE",
"sort": "certificate_reference_id",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"per_page": 10,
"filter": {
"product_reference_id": "iure",
"standard_reference_id": "veritatis"
}
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (200):
{
"data": [
{
"certificate_reference_id": "50-NFDPWTZDQRMG-M",
"product_reference_id": "20-PL7DRAXCLWMF-L",
"product_name": "Alpha External Certificate Product",
"standard_reference_id": "30-4C4GQQESZTS8-C",
"standard_name": "ExternalCertStandardAlpha",
"certificate_number": "CERT-ALPHA-001",
"certificate_issue_date": "2024-01-10",
"certificate_end_date": "2027-01-10",
"certificate_result": "PASSED",
"ctz_level": "foundational",
"gateway_active_until": "2027-06-10",
"sds_source": "formulator",
"status": "ACTIVE",
"removal_status": "pending",
"created_at": "2024-01-10T00:00:00.000000Z"
},
{
"certificate_reference_id": "50-V38K8BRA7RZR-P",
"product_reference_id": "20-4N3JQKHUY8Q7-P",
"product_name": "Alpha External Certificate Product",
"standard_reference_id": "30-RDTVFZQNCDB7-K",
"standard_name": "ExternalCertStandardAlpha",
"certificate_number": "CERT-ALPHA-001",
"certificate_issue_date": "2024-01-10",
"certificate_end_date": "2027-01-10",
"certificate_result": "PASSED",
"ctz_level": "foundational",
"gateway_active_until": "2027-06-10",
"sds_source": "formulator",
"status": "ACTIVE",
"removal_status": "pending",
"created_at": "2024-01-10T00:00:00.000000Z"
}
],
"links": {
"first": "/?page=1",
"last": "/?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [
{
"url": null,
"label": "« Previous",
"active": false
},
{
"url": "/?page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next »",
"active": false
}
],
"path": "/",
"per_page": 50,
"to": 2,
"total": 2
}
}
Example response (200):
Success.
Example response (401):
Token not found
Example response (403):
Authenticated Organisation is not one of types ZDHC MRSL Certification Bodies
Example response (403):
User does not have required permission.
Example response (422):
Validation error
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Show a certificate
requires authentication
Returns one certificate for this certification body.
Example request:
curl --request GET \
--get "https://staging-api.vm400.consulting1x1.info/api/certification-bodies/v1/certificates/50-AAAAAAAAAAA1-X" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://staging-api.vm400.consulting1x1.info/api/certification-bodies/v1/certificates/50-AAAAAAAAAAA1-X"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());Example response (200):
{
"data": {
"certificate_reference_id": "50-PLBRHK6KZL4U-D",
"product_reference_id": "20-LGJSRMVVJ4VV-I",
"product_name": "Alpha External Certificate Product",
"standard_reference_id": "30-4PYHMD266MFW-Y",
"standard_name": "ExternalCertStandardAlpha",
"certificate_number": "CERT-ALPHA-001",
"certificate_issue_date": "2024-01-10",
"certificate_end_date": "2027-01-10",
"certificate_result": "PASSED",
"ctz_level": "foundational",
"gateway_active_until": "2027-06-10",
"sds_source": "formulator",
"status": "ACTIVE",
"removal_status": "pending",
"created_at": "2024-01-10T00:00:00.000000Z"
}
}
Example response (200):
Success.
Example response (401):
Token not found
Example response (403):
Authenticated Organisation is not one of types ZDHC MRSL Certification Bodies
Example response (403):
User does not have required permission.
Example response (404):
Resource not found.
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Store a certificate
requires authentication
Stores a new certificate for this certification body.
Example request:
curl --request POST \
"https://staging-api.vm400.consulting1x1.info/api/certification-bodies/v1/certificates" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"product_reference_id\": \"20-Z3X9V2N-1\",
\"standard_reference_id\": \"10-A1B2C3D-4\",
\"certificate_number\": \"1234567890\",
\"certificate_issue_date\": \"2026-01-01\",
\"certificate_end_date\": \"2026-01-01\",
\"certificate_result\": \"Pass\",
\"ctz_level\": \"foundational\",
\"sds_source\": \"formulator\",
\"sds_id\": 1
}"
const url = new URL(
"https://staging-api.vm400.consulting1x1.info/api/certification-bodies/v1/certificates"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"product_reference_id": "20-Z3X9V2N-1",
"standard_reference_id": "10-A1B2C3D-4",
"certificate_number": "1234567890",
"certificate_issue_date": "2026-01-01",
"certificate_end_date": "2026-01-01",
"certificate_result": "Pass",
"ctz_level": "foundational",
"sds_source": "formulator",
"sds_id": 1
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (200):
{
"data": {
"certificate_reference_id": "50-RMNK6N7ERZ7L-Q",
"product_reference_id": "20-9SSMVNY3EF3S-N",
"product_name": "Alpha External Certificate Product",
"standard_reference_id": "30-HV9WKACXD2F2-R",
"standard_name": "ExternalCertStandardAlpha",
"certificate_number": "CERT-ALPHA-001",
"certificate_issue_date": "2024-01-10",
"certificate_end_date": "2027-01-10",
"certificate_result": "PASSED",
"ctz_level": "foundational",
"gateway_active_until": "2027-06-10",
"sds_source": "formulator",
"status": "ACTIVE",
"removal_status": "pending",
"created_at": "2024-01-10T00:00:00.000000Z"
}
}
Example response (201):
Certificate created successfully.
Example response (401):
Token not found
Example response (403):
Authenticated Organisation is not one of types ZDHC MRSL Certification Bodies
Example response (403):
User does not have required permission.
Example response (403):
You are not accredited for this standard.
Example response (403):
Your accreditation does not permit the requested CtZ level.
Example response (404):
Product not found.
Example response (404):
Safety data sheet not found.
Example response (404):
Selected safety data sheet not found.
Example response (404):
Standard not found.
Example response (422):
Validation error
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Remove a certificate
requires authentication
Removes a certificate for this certification body.
Example request:
curl --request PATCH \
"https://staging-api.vm400.consulting1x1.info/api/certification-bodies/v1/certificates/1/remove" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"reason\": \"QUALITY_ISSUE\",
\"note\": \"Chemical product is no longer compliant with the certification body\'s requirements.\"
}"
const url = new URL(
"https://staging-api.vm400.consulting1x1.info/api/certification-bodies/v1/certificates/1/remove"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"reason": "QUALITY_ISSUE",
"note": "Chemical product is no longer compliant with the certification body's requirements."
};
fetch(url, {
method: "PATCH",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (200):
{
"data": {
"certificate_reference_id": "50-JD3WLBDGPKWZ-R",
"product_reference_id": "20-MKFR382SBAFA-F",
"product_name": "Alpha External Certificate Product",
"standard_reference_id": "30-7U3U6TSKTDF2-K",
"standard_name": "ExternalCertStandardAlpha",
"certificate_number": "CERT-ALPHA-001",
"certificate_issue_date": "2024-01-10",
"certificate_end_date": "2027-01-10",
"certificate_result": "PASSED",
"ctz_level": "foundational",
"gateway_active_until": "2027-06-10",
"sds_source": "formulator",
"status": "ACTIVE",
"removal_status": "pending",
"created_at": "2024-01-10T00:00:00.000000Z"
}
}
Example response (200):
Certificate removed successfully.
Example response (401):
Token not found
Example response (403):
Authenticated Organisation is not one of types ZDHC MRSL Certification Bodies
Example response (403):
User does not have required permission.
Example response (404):
Resource not found.
Example response (409):
Certificate already removed.
Example response (422):
Validation error
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bulk store certificates
requires authentication
Creates multiple certificates in one request. Each row is validated and processed independently; row-level failures do not prevent other rows from being created.
Example request:
curl --request POST \
"https://staging-api.vm400.consulting1x1.info/api/certification-bodies/v1/certificates/bulk" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"rows\": [
{
\"product_reference_id\": \"20-Z3X9V2N-1\",
\"standard_reference_id\": \"10-A1B2C3D-4\",
\"certificate_number\": \"1234567890\",
\"certificate_result\": \"Pass\",
\"certificate_issue_date\": \"2026-01-01\",
\"certificate_end_date\": \"2026-01-01\",
\"ctz_level\": \"foundational\",
\"sds_source\": \"formulator\",
\"sds_id\": 1
}
]
}"
const url = new URL(
"https://staging-api.vm400.consulting1x1.info/api/certification-bodies/v1/certificates/bulk"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"rows": [
{
"product_reference_id": "20-Z3X9V2N-1",
"standard_reference_id": "10-A1B2C3D-4",
"certificate_number": "1234567890",
"certificate_result": "Pass",
"certificate_issue_date": "2026-01-01",
"certificate_end_date": "2026-01-01",
"ctz_level": "foundational",
"sds_source": "formulator",
"sds_id": 1
}
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (207, Batch processed. Each row reports success or error independently.):
{
"message": "Batch processed. Check each result individually.",
"data": {
"results": [
{
"row": 1,
"status": "success",
"certificate_reference_id": "50-AAAAAAAAAAA1-X",
"product_reference_id": "40-AAAAAAAAAAA1-X",
"gateway_active_until": "2028-01-15",
"ctz_level": "foundational"
},
{
"row": 2,
"status": "error",
"errors": [
"Product not found."
]
}
],
"summary": {
"total": 2,
"succeeded": 1,
"failed": 1
}
}
}
Example response (207):
Batch processed. Check each result individually.
Example response (401):
Token not found
Example response (403):
Authenticated Organisation is not one of types ZDHC MRSL Certification Bodies
Example response (403):
User does not have required permission.
Example response (422):
Validation error
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Products
List chemical products
requires authentication
Returns a paginated list of chemical products.
Example request:
curl --request GET \
--get "https://staging-api.vm400.consulting1x1.info/api/certification-bodies/v1/products?per_page=18&page=1&filter%5Bproduct_reference_id%5D=architecto&filter%5Bname%5D=nemo&filter%5Bzdhc_pid%5D=15&filter%5Bstatus%5D=PUBLISHED&filter%5Bformulator_reference_id%5D=non&filter%5Bformulator_name%5D=sed&filter%5Bconformance_level_id%5D=14&filter%5Bctz_level_id%5D=4&filter%5Bproduct_use_type_id%5D=6&filter%5Bproduct_category_id%5D=11&filter%5Bcreated_at%5D=%3E%3D+2026-08-25+14%3A29%3A40&filter%5Bupdated_at%5D=%3E%3D+2026-08-25+14%3A29%3A40&search=ut&sort=id" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"per_page\": 15,
\"search\": \"bdcyvpbvqvthmcxozcslvxnwsxxsviwslvtafiijavbvgtnlcswanljkckuw\"
}"
const url = new URL(
"https://staging-api.vm400.consulting1x1.info/api/certification-bodies/v1/products"
);
const params = {
"per_page": "18",
"page": "1",
"filter[product_reference_id]": "architecto",
"filter[name]": "nemo",
"filter[zdhc_pid]": "15",
"filter[status]": "PUBLISHED",
"filter[formulator_reference_id]": "non",
"filter[formulator_name]": "sed",
"filter[conformance_level_id]": "14",
"filter[ctz_level_id]": "4",
"filter[product_use_type_id]": "6",
"filter[product_category_id]": "11",
"filter[created_at]": ">= 2026-08-25 14:29:40",
"filter[updated_at]": ">= 2026-08-25 14:29:40",
"search": "ut",
"sort": "id",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"per_page": 15,
"search": "bdcyvpbvqvthmcxozcslvxnwsxxsviwslvtafiijavbvgtnlcswanljkckuw"
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (200):
{
"data": [
{
"product_reference_id": "20-H7XK3DRZ9BDA-H",
"name": "Alpha External Product",
"formulator_reference_id": "01-L8RASYDMLMWQ-H",
"formulator_name": "Chemical Formulator Alpha",
"classifications": [
{
"use_type_name": "Softening agents",
"category_name": "Textile Finishing Assistants",
"substrate_name": "Textile"
}
],
"sds_url": "https://example.com/sds.pdf"
},
{
"product_reference_id": "20-P62Q8RWECPH2-R",
"name": "Alpha External Product",
"formulator_reference_id": "01-BVSPQ8GK2M8K-D",
"formulator_name": "Chemical Formulator Alpha",
"classifications": [
{
"use_type_name": "Softening agents",
"category_name": "Textile Finishing Assistants",
"substrate_name": "Textile"
}
],
"sds_url": "https://example.com/sds.pdf"
}
],
"links": {
"first": "/?page=1",
"last": "/?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [
{
"url": null,
"label": "« Previous",
"active": false
},
{
"url": "/?page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next »",
"active": false
}
],
"path": "/",
"per_page": 50,
"to": 2,
"total": 2
}
}
Example response (200):
Success.
Example response (401):
Token not found
Example response (403):
Authenticated Organisation is not one of types ZDHC MRSL Certification Bodies
Example response (403):
User does not have required permission.
Example response (422):
Validation error
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Show a chemical product
requires authentication
Returns one chemical product.
Example request:
curl --request GET \
--get "https://staging-api.vm400.consulting1x1.info/api/certification-bodies/v1/products/20-Z3X9V2N-1" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://staging-api.vm400.consulting1x1.info/api/certification-bodies/v1/products/20-Z3X9V2N-1"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());Example response (200):
{
"data": {
"product_reference_id": "20-S97499D8VUWN-U",
"name": "Alpha External Product",
"formulator_reference_id": "01-EJ2DVKJQGVQM-S",
"formulator_name": "Chemical Formulator Alpha",
"classifications": [
{
"use_type_name": "Softening agents",
"category_name": "Textile Finishing Assistants",
"substrate_name": "Textile"
}
],
"sds_url": "https://example.com/sds.pdf"
}
}
Example response (200):
Success.
Example response (401):
Token not found
Example response (403):
Authenticated Organisation is not one of types ZDHC MRSL Certification Bodies
Example response (403):
User does not have required permission.
Example response (404):
Resource not found.
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Safety Data Sheets
Upload a safety data sheet
requires authentication
Uploads a safety data sheet PDF for a chemical product on behalf of the authenticated certification body.
Example request:
curl --request POST \
"https://staging-api.vm400.consulting1x1.info/api/certification-bodies/v1/sds" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: multipart/form-data" \
--header "Accept: application/json" \
--form "product_reference_id=20-T3TDADC386W6-D"\
--form "file=@/tmp/phpdjfGHM" const url = new URL(
"https://staging-api.vm400.consulting1x1.info/api/certification-bodies/v1/sds"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "multipart/form-data",
"Accept": "application/json",
};
const body = new FormData();
body.append('product_reference_id', '20-T3TDADC386W6-D');
body.append('file', document.querySelector('input[name="file"]').files[0]);
fetch(url, {
method: "POST",
headers,
body,
}).then(response => response.json());Example response (200):
{
"data": {
"sds_id": 1042,
"product_reference_id": "20-F6BDHX334K7U-R",
"sds_url": "https://cdn.example.com/sds/cb-1042.pdf",
"uploaded_at": "2026-06-10T09:00:00.000000Z"
}
}
Example response (201):
Safety data sheet uploaded successfully.
Example response (401):
Token not found
Example response (403):
Authenticated Organisation is not one of types ZDHC MRSL Certification Bodies
Example response (403):
User does not have required permission.
Example response (404):
Product not found.
Example response (422):
Validation error
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Download a safety data sheet
requires authentication
Downloads a safety data sheet for a chemical product.
Example request:
curl --request GET \
--get "https://staging-api.vm400.consulting1x1.info/api/certification-bodies/v1/sds/1042" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://staging-api.vm400.consulting1x1.info/api/certification-bodies/v1/sds/1042"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());Example response (200):
file
Example response (401):
Token not found
Example response (403):
Authenticated Organisation is not one of types ZDHC MRSL Certification Bodies
Example response (403):
User does not have required permission.
Example response (404):
Resource not found.
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.