====== BCCCR API Documentation ======
== Platform Registration ==
=== POST /api/platforms/register ===
Submit a platform registration application for BCCCR review.
==== Request Body ====
{
"name": "",
"email": "",
"password": "",
"password_confirmation": "",
"platform_name": "",
"platform_address": "",
"tin_number": "",
"platform_phone": "",
"platform_email": "",
"bank_account_number": "",
"bank_routing_number": "",
"bank_name": "",
"api_endpoint": ""
}
==== Response (Success) ====
{
"success": true,
"message": "Platform registration submitted successfully. Your application will be reviewed by BCCCR administrators.",
"data": {
"platform_name": "",
"status": "pending",
"registration_date": ""
}
}
==== Notes ====
* Application status will be 'pending' until reviewed by BCCCR administrators
* API key will be generated upon approval
* All business information is required for compliance and settlement processing
=== GET /api/platforms/status/{email} ===
Check the status of a platform registration application.
==== Response (Success) ====
{
"success": true,
"message": "Registration status retrieved",
"data": {
"platform_name": "",
"status": "",
"registration_date": "",
"approved_at": "",
"admin_notes": ""
}
}
== Admin Management ==
=== GET /api/admin/applications/pending ===
Get all pending platform applications (admin only).
==== Response (Success) ====
{
"success": true,
"message": "Pending applications retrieved",
"data": [
{
"id": ,
"name": "",
"email": "",
"platform_name": "",
"platform_address": "",
"tin_number": "",
"platform_phone": "",
"platform_email": "",
"bank_name": "",
"created_at": "",
"admin_notes": ""
}
]
}
=== POST /api/admin/applications/{id}/approve ===
Approve a platform application (admin only).
==== Request Body ====
{
"notes": ""
}
==== Response (Success) ====
{
"success": true,
"message": "Platform application approved successfully",
"data": {
"platform_name": "",
"status": "active",
"approved_at": "",
"api_key": ""
}
}
=== POST /api/admin/applications/{id}/reject ===
Reject a platform application (admin only).
==== Request Body ====
{
"notes": ""
}
==== Response (Success) ====
{
"success": true,
"message": "Platform application rejected",
"data": {
"platform_name": "",
"status": "inactive"
}
}
== Contract Management ==
=== POST /api/contracts/register ===
Register up to 250 contract hashes for a single publication.
==== Request Body ====
{
"ipfs_hash": "",
"metadata_cid": "",
"contract_hashes": [
"",
""
// ... up to 250
]
}
* **ipfs_hash** (string, required): The IPFS hash for the publication (applies to all contracts in the batch)
* **metadata_cid** (string, required): The IPFS CID for the metadata (applies to all contracts in the batch)
* **contract_hashes** (array, required): Up to 250 unique contract hashes to register in one call
==== Validation Rules ====
* All contract hashes must be unique within the request and not already registered in the system
* All contracts in the batch will share the same IPFS hash and metadata CID
==== Response (Success) ====
{
"success": true,
"message": "Contracts registered successfully",
"data": {
"registered_count": ,
"ipfs_hash": "",
"metadata_cid": "",
"contract_hashes": [ ... ]
}
}
==== Response (Validation Error) ====
{
"success": false,
"message": "Validation failed",
"errors": {
"contract_hashes": ["Contract hashes already exist: ..."]
}
}
* Returns HTTP 201 on success, HTTP 422 on validation error
* Requires a valid API key in the ''X-API-Key'' header
==== Example cURL ====
curl -X POST http://localhost:8000/api/contracts/register \
-H "Content-Type: application/json" \
-H "X-API-Key: " \
-d '{"ipfs_hash":"QmTest123","metadata_cid":"QmMeta456","contract_hashes":["hash1","hash2"]}'
=== POST /api/contracts/validate ===
Validate a contract hash and return legitimacy and usage information.
==== Request Body ====
{
"contract_hash": ""
}
* **contract_hash** (string, required): The contract hash to validate
==== Response (Success) ====
{
"success": true,
"message": "Contract found",
"data": {
"contract_hash": "",
"status": "active",
"ipfs_hash": "",
"metadata_cid": "",
"originating_platform_id": ,
"originating_platform_name": "",
"registered_at": ""
}
}
==== Response (Not Found or Inactive) ====
{
"success": false,
"message": "Contract not found",
"data": null
}
* Returns HTTP 200 on success, HTTP 404 if not found or not active
* Requires a valid API key in the ''X-API-Key'' header
==== Example cURL ====
curl -X POST http://localhost:8000/api/contracts/validate \
-H "Content-Type: application/json" \
-H "X-API-Key: " \
-d '{"contract_hash":"hash1"}'
=== PUT /api/contracts/{hash}/revoke ===
Revoke a contract. Only the publishing platform can revoke its own contracts.
==== Request Body ====
{
"reason": ""
}
* **reason** (string, optional): Reason for revocation (max 500 chars)
==== Response (Success) ====
{
"success": true,
"message": "Contract revoked successfully",
"data": {
"contract_hash": "",
"status": "revoked",
"revoked_at": "",
"reason": ""
}
}
==== Response (Not Allowed or Already Revoked) ====
{
"success": false,
"message": "Only the publishing platform can revoke this contract",
"data": null
}
{
"success": false,
"message": "Contract is already revoked",
"data": null
}
* Returns HTTP 200 on success, HTTP 403 if not authorized, HTTP 400 if already revoked, HTTP 404 if not found
* Requires a valid API key in the ''X-API-Key'' header
==== Example cURL ====
curl -X PUT http://localhost:8000/api/contracts/hash1/revoke \
-H "Content-Type: application/json" \
-H "X-API-Key: " \
-d '{"reason":"No longer valid"}'
== Sales Reporting ==
=== POST /api/sales ===
Report a cross-platform sale to track royalty obligations between platforms.
==== Request Body ====
{
"contract_hash": "0x1234567890abcdef...",
"buyer_wallet_address": "0xabcdef1234567890...",
"sale_amount": 29.99,
"royalty_amount": 2.99,
"transaction_hash": "0x9876543210fedcba...",
"metadata": {
"payment_method": "credit_card",
"currency": "USD",
"platform_fee": 1.50
},
"sold_at": "2024-01-15T10:30:00Z"
}
==== Required Fields ====
* **contract_hash** (string): The contract hash of the content being sold
* **sale_amount** (numeric): Total sale amount in USD (minimum $0.01)
* **royalty_amount** (numeric): Royalty amount owed to author in USD
==== Optional Fields ====
* **buyer_wallet_address** (string): Buyer's wallet address (max 42 characters)
* **transaction_hash** (string): Blockchain transaction hash
* **metadata** (object): Additional transaction metadata
* **sold_at** (datetime): When the sale occurred (defaults to current time)
==== Validation Rules ====
* Contract hash must be registered and active in the system
* Sale amount must be at least $0.01
* Royalty amount cannot exceed sale amount
* Royalty amount cannot be negative
==== Response (Success) ====
{
"success": true,
"message": "Sale reported successfully",
"data": {
"transaction_id": 123,
"royalty_id": 456,
"contract_hash": "0x1234567890abcdef...",
"sale_amount": 29.99,
"royalty_amount": 2.99,
"sold_at": "2024-01-15T10:30:00Z"
}
}
==== Response (Validation Error) ====
{
"success": false,
"message": "Validation failed",
"errors": {
"contract_hash": ["Contract hash is not registered."],
"royalty_amount": ["Royalty amount cannot exceed sale amount."]
}
}
==== Business Logic ====
* Creates a transaction record linking the sale to the contract and platforms
* Creates a royalty record where the selling platform owes the originating platform
* Both records are created in a database transaction to ensure consistency
* Logs the sale for audit and settlement processing
* Returns HTTP 201 on success, HTTP 422 on validation error
* Requires a valid API key in the ''X-API-Key'' header
==== Example cURL ====
curl -X POST http://localhost:8000/api/sales \
-H "Content-Type: application/json" \
-H "X-API-Key: " \
-d '{"contract_hash":"0x1234567890abcdef","sale_amount":29.99,"royalty_amount":2.99}'
== Content Mirroring ==
=== POST /api/mirrors ===
Report content mirroring with IPFS locations to create a decentralized backup system.
==== Request Body ====
{
"contract_hash": "0x1234567890abcdef...",
"mirrored_ipfs_hash": "QmMirroredContent123",
"mirror_location": "ipfs-node-1",
"access_count": 0,
"mirrored_at": "2024-01-15T10:30:00Z"
}
==== Required Fields ====
* **contract_hash** (string): The contract hash of the content being mirrored
* **mirrored_ipfs_hash** (string): The IPFS hash where the content is mirrored (max 64 characters)
==== Optional Fields ====
* **mirror_location** (string): IPFS node location/identifier
* **access_count** (integer): Number of times this mirror was accessed
* **mirrored_at** (datetime): When the mirror was created (defaults to current time)
==== Validation Rules ====
* Contract hash must be registered and active in the system
* Mirrored IPFS hash cannot exceed 64 characters
* Access count cannot be negative
==== Response (Success) ====
{
"success": true,
"message": "Content mirror created successfully",
"data": {
"mirror_id": 123,
"contract_hash": "0x1234567890abcdef...",
"ipfs_hash": "QmOriginalContent",
"mirrored_ipfs_hash": "QmMirroredContent123",
"mirror_location": "ipfs-node-1",
"access_count": 0,
"mirrored_at": "2024-01-15T10:30:00Z",
"action": "created"
}
}
==== Business Logic ====
* Creates or updates a mirror record for the platform and IPFS hash
* If a mirror already exists for the same platform and IPFS hash, it updates the existing record
* Logs the mirror for audit and content discovery
* Enables decentralized backup through normal usage patterns
* Returns HTTP 201 on success, HTTP 422 on validation error
* Requires a valid API key in the ''X-API-Key'' header
==== Example cURL ====
curl -X POST http://localhost:8000/api/mirrors \
-H "Content-Type: application/json" \
-H "X-API-Key: " \
-d '{"contract_hash":"0x1234567890abcdef","mirrored_ipfs_hash":"QmMirroredContent123"}'
=== GET /api/mirrors/{ipfsHash} ===
Retrieve all mirrors for a specific IPFS hash to find available content locations.
==== Response (Success) ====
{
"success": true,
"message": "Mirrors retrieved successfully",
"data": {
"ipfs_hash": "QmOriginalContent",
"mirrors": [
{
"mirror_id": 123,
"mirrored_ipfs_hash": "QmMirroredContent123",
"mirror_location": "ipfs-node-1",
"platform_name": "Platform A",
"access_count": 5,
"last_accessed_at": "2024-01-15T10:30:00Z",
"mirrored_at": "2024-01-10T09:00:00Z"
}
],
"total_mirrors": 1
}
}
* Returns HTTP 200 on success, HTTP 500 on server error
* Requires a valid API key in the ''X-API-Key'' header
==== Example cURL ====
curl -X GET http://localhost:8000/api/mirrors/QmOriginalContent \
-H "X-API-Key: "