Businesses and KYB
Register a business, submit KYB documents, obtain business-scoped API keys, and use an isolated wallet with the same CamelPay API.
Business onboarding overview
CamelPay supports businesses in addition to individual student accounts. A business is registered by an authenticated student representative. The representative must complete personal KYC before submitting business KYB. After approval, the business receives its own wallet, payment-page namespace, payout records, and developer-app/API-key namespace.
1. Register the business
Use the student JWT of the authorized representative. The MVP is Tanzania-first and accepts sole proprietors, companies, partnerships, NGOs, and other entities.
curl -X POST https://api.camelpay.in/v1/businesses \
-H "Authorization: Bearer $STUDENT_JWT" \
-H "Content-Type: application/json" \
-d '{
"legal_name": "Camel Creatives Ltd",
"trading_name": "CamelPay",
"business_type": "company",
"registration_number": "REG-123",
"tax_identification_number": "TIN-123",
"country": "TZ",
"address": "Dar es Salaam",
"city": "Dar es Salaam",
"region": "Dar es Salaam",
"website": "https://camelpay.in",
"phone": "+255712345678",
"email": "ops@camelpay.in",
"representative_role": "director"
}'| Field | Requirement |
|---|---|
legal_name | Required legal business name |
trading_name | Optional public/trading name |
business_type | sole_proprietor, company, partnership, ngo, or other |
registration_number | Business registration identifier; may be blank for an informal sole proprietor |
tax_identification_number | Tax identifier when issued |
country | TZ for the current MVP |
address, city, region | Business physical address |
website | Optional HTTPS URL |
phone, email | Business contact details |
representative_role | Role of the logged-in representative, such as director or owner |
2. Upload KYB documents
Request a short-lived upload URL for each required document. The four purposes are registration_certificate, tax_certificate, business_license, and proof_of_address. JPEG, PNG, and PDF are accepted, and the filename extension must match the content type.
curl -X POST https://api.camelpay.in/v1/businesses/$BUSINESS_ID/documents/presign \
-H "Authorization: Bearer $STUDENT_JWT" \
-H "Content-Type: application/json" \
-d '{
"filename": "registration-certificate.pdf",
"content_type": "application/pdf",
"purpose": "registration_certificate"
}'Upload the file to the returned upload_url, then repeat the request for the other three purposes. The generated URLs are bound to the business namespace: business-docs/{business_id}/{purpose}/.... Do not submit URLs from another host, business, or purpose.
3. Submit KYB for review
curl -X POST https://api.camelpay.in/v1/businesses/$BUSINESS_ID/documents \
-H "Authorization: Bearer $STUDENT_JWT" \
-H "Content-Type: application/json" \
-d '{
"registration_certificate_url": "https://storage.camelpay.in/business-docs/$BUSINESS_ID/registration_certificate/registration-certificate.pdf",
"tax_certificate_url": "https://storage.camelpay.in/business-docs/$BUSINESS_ID/tax_certificate/tax-certificate.pdf",
"business_license_url": "https://storage.camelpay.in/business-docs/$BUSINESS_ID/business_license/business-license.pdf",
"proof_of_address_url": "https://storage.camelpay.in/business-docs/$BUSINESS_ID/proof_of_address/proof-of-address.pdf"
}'The representative's personal KYC must be verified before this request succeeds. A rejected business may correct and resubmit; resubmission clears the prior rejection reason and returns the business to pending. A verified business cannot resubmit through this endpoint.
4. Create a business developer app and key
Create the developer app while authenticated as the representative. Include business_id to bind the app and every generated key to the business rather than the representative's personal wallet.
curl -X POST https://api.camelpay.in/developers/apps \
-H "Authorization: Bearer $STUDENT_JWT" \
-H "Content-Type: application/json" \
-d '{
"name": "Store production checkout",
"description": "Payment links for our online store",
"business_id": "$BUSINESS_ID",
"environment": "test"
}'
curl -X POST https://api.camelpay.in/developers/keys \
-H "Authorization: Bearer $STUDENT_JWT" \
-H "Content-Type: application/json" \
-d '{
"app_id": "$APP_ID",
"key_name": "Store test key",
"scopes": ["profile:read", "balance:read", "pages:read", "pages:write", "transactions:read", "payouts:read", "payouts:write"]
}'| Key type | Behavior |
|---|---|
| Test business key | May be created before KYB approval for integration work; use the test app environment and cp_test_ prefix. |
| Live business key | Requires verified business KYB; uses the live app environment and cp_live_ prefix. |
| Ownership | The representative student ID is retained for audit; business_id determines the wallet and financial namespace. |
5. Use the same API with business ownership
Send the business key in X-API-Key. The endpoint paths are the same developer paths used by individual integrations, but balances, payment pages, transactions, and payouts resolve to the business wallet. Business page writes and payouts require verified KYB.
| Method | Endpoint | Scope | Business result |
|---|---|---|---|
GET | /v1/profile | profile:read | Business profile |
GET | /v1/balance | balance:read | Business wallet balance |
GET | /v1/transactions | transactions:read | Business wallet ledger |
GET | /v1/payment-pages | pages:read | Business-owned payment pages |
POST/PATCH | /v1/payment-pages | pages:write | Create or update business pages after KYB |
POST | /v1/payments/checkout | Public/payment flow | Checkout credits the business wallet after settlement |
GET | /v1/payouts | payouts:read | Business payouts only |
POST | /v1/payouts | payouts:write | Debit the business wallet after KYB |
Administrator review
curl https://api.camelpay.in/v1/admin/businesses?status=pending \
-H "Authorization: Bearer $ADMIN_JWT"
curl -X POST https://api.camelpay.in/v1/admin/businesses/$BUSINESS_ID/verify \
-H "Authorization: Bearer $ADMIN_JWT" \
-H "Content-Type: application/json" \
-d '{"status":"verified"}'Administrator routes require the existing admin role, active session, and 2FA verification. Rejection requires a reason, for example {"status":"rejected","reason":"Tax certificate is unreadable"}.
Snippe integration boundary
CamelPay's public API is hosted at https://api.camelpay.in/v1/.... Its provider client separately calls Snippe at https://api.snippe.sh using Snippe's /v1/payments, /v1/payouts/send, Bearer authentication, provider idempotency keys, and signed webhook contract. CamelPay does not automatically create or approve a Snippe merchant account from business registration.
