Core

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.

CamelPay collects and reviews the application-level KYB package. Snippe's public API documentation does not publish an automatic merchant-onboarding endpoint, so Snippe account approval, provider credentials, settlement configuration, and additional compliance requirements remain operational/provider steps.

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.

bash
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"
  }'
FieldRequirement
legal_nameRequired legal business name
trading_nameOptional public/trading name
business_typesole_proprietor, company, partnership, ngo, or other
registration_numberBusiness registration identifier; may be blank for an informal sole proprietor
tax_identification_numberTax identifier when issued
countryTZ for the current MVP
address, city, regionBusiness physical address
websiteOptional HTTPS URL
phone, emailBusiness contact details
representative_roleRole 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.

bash
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

bash
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.

bash
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 typeBehavior
Test business keyMay be created before KYB approval for integration work; use the test app environment and cp_test_ prefix.
Live business keyRequires verified business KYB; uses the live app environment and cp_live_ prefix.
OwnershipThe 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.

MethodEndpointScopeBusiness result
GET/v1/profileprofile:readBusiness profile
GET/v1/balancebalance:readBusiness wallet balance
GET/v1/transactionstransactions:readBusiness wallet ledger
GET/v1/payment-pagespages:readBusiness-owned payment pages
POST/PATCH/v1/payment-pagespages:writeCreate or update business pages after KYB
POST/v1/payments/checkoutPublic/payment flowCheckout credits the business wallet after settlement
GET/v1/payoutspayouts:readBusiness payouts only
POST/v1/payoutspayouts:writeDebit the business wallet after KYB

Administrator review

bash
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.