Install
$ agentstack add skill-vobiz-ai-agent-skills-vobiz-partner-api ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ● Network access Used
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Vobiz Partner API skill
Use this for white-label / reseller workflows where one master partner account owns multiple customer sub-accounts. Auth uses the same X-Auth-ID / X-Auth-Token headers as the main API - there is no separate Bearer JWT. Just use your partner-tier credentials.
Base path
https://api.vobiz.ai/api/v1/partner/*
(Routes do NOT live under /partner/v1/ - that path returns 404.)
Partner profile + dashboard
GET /api/v1/partner/me- your partner profileGET /api/v1/partner/dashboard- aggregated KPIs (total customers, balance held, MTD revenue)
Auth model in one line: partner creds (PA_…) drive /api/v1/partner/*; the customer's own creds (MA_…) drive /api/v1/Account/{customer_auth_id}/* voice ops. There is no Bearer JWT for partner server-to-server calls (JWT login is for interactive sessions only).
Customer accounts
GET /api/v1/partner/accounts- list customers. Pagination params arepage+per_page(default 20); the response echoesper_pageback assize.searchsubstring-matches name or email.POST /api/v1/partner/accounts- create customer. Required:name, email, phone, password, country. Optional (guaranteed):company. Returns201with the customer's ownauth_id+auth_token- theauth_tokenis shown only once; store it encrypted, it's the customer's API credential.emailmust be platform-unique;passwordneeds 8+ chars with a number and special char.GET /api/v1/partner/accounts/{customer_auth_id}- full customer profile (re-fetchesauth_token).GET /api/v1/partner/accounts/{customer_auth_id}/balance- real-time wallet (cash_credits).
Balance transfer
POST /api/v1/partner/accounts/{customer_auth_id}/transfer-balance- atomic debit/credit. Body:{amount, currency, description?}.currencymust equal your partner currency (no FX conversion). Permanent - cannot be reversed; no idempotency key (poll customer transactions before retrying a timed-out request).400on insufficient partner balance (current_balance/requested_amountin payload) or currency mismatch;404if the customer isn't yours.
KYC sessions (eKYC, no document uploads)
eKYC pulls data from govt APIs - no uploads. Individual (PAN 4th char = P): PAN + DOB → Aadhaar via DigiLocker (Govt OTP). Company (PAN 4th char = C): PAN + entity name → GSTIN. The PAN determines the path; the partner does not pick it.
POST /api/v1/partner/kyc-sessions- body:{account_auth_id, flow_type?, customer_email?, redirect_url?, webhook_url?, expires_in_days?, reminder_schedule?, metadata?}.flow_type: "email"(default) requirescustomer_email; session starts atemail_sent.flow_type: "redirect"requiresredirect_url; response carrieswidget_url(tokenkst_), session starts atlink_ready. After verify, browser returns toredirect_url?session_id=&status=&auth_id=- treat those params as a hint only, confirm server-side.expires_in_daysdefault 7.metadatais echoed back on GET + webhooks.GET /api/v1/partner/kyc-sessions- list (filterstatus/account_auth_id; paginated withpage/size).GET /api/v1/partner/kyc-sessions/{session_id}- one session. Note: GET returns the id underid, POST returned it undersession_id(same value).POST /api/v1/partner/kyc-sessions/{session_id}/resend- resend email. Email-flow only (400on redirect flow). The 30-min cooldown starts at session creation, so an immediate resend returns429with remaining seconds.DELETE /api/v1/partner/kyc-sessions/{session_id}- revoke (optional{reason}body).409if already terminal.
Webhook events on webhook_url: kyc.completed, kyc.failed, kyc.session_revoked. Statuses: email_sent | link_ready → opened → in_progress → kyc_completed | revoked. kyc_type is null until PAN is submitted.
Per-customer queries
GET /api/v1/partner/accounts/{customer_auth_id}/transactions- paginationpage/per_page; date filtersfrom_date/to_date;transaction_type∈recharge|debit|refund|transfer. Each row'stypefield is the ledger directioncredit/debit(different vocabulary from the filter). Includes asummaryblock.GET /api/v1/partner/accounts/{customer_auth_id}/cdrs- filtersstart_date,end_date,call_direction(inbound|outbound),status(answered|failed|busy|no_answer),min_duration,hangup_cause. Response wraps rows indata[]+pagination+summary. Bill onbillsec(billable seconds) orsummary.total_cost.GET /api/v1/partner/accounts/{customer_auth_id}/numbers- paginationpage/per_page;search(E.164 substring). Read-only; assign/release via Console.
Customer-side endpoints
Same auth scheme, but uses the customer's auth_id/auth_token against /api/v1/Account/{customer_auth_id}/*. The customer can call these themselves, or the partner can call them on the customer's behalf using the customer's stored auth_token.
Pitfalls
- Base path is
/api/v1/partner, not/partner/v1. The latter 404s. Full base:https://api.vobiz.ai/api/v1/partner. balanceis a string with 5 decimals ("23906.83000"). Cast to float before comparing. OnGET /dashboardthe partnerbalanceisnull- usetotal_balancethere.- Pagination keys differ by endpoint. Accounts/transactions/cdrs/numbers use
per_page; KYC sessions list usessize. The accounts list acceptsper_pagebut returns it assize. - Balance transfer is irreversible and has no idempotency key. Verify
customer_auth_id,amount, andcurrency(must match partner currency) before firing. If a request times out, poll customer transactions before retrying to avoid a double credit. - Only one active KYC session per
account_auth_id. Creating a new one silently auto-revokes the previous - always operate on the most recentsession_id, or you'll get409s. - KYC resend cooldown starts at creation, so an immediate resend returns
429. Resend is email-flow only. - Redirect-flow return params can be spoofed - confirm via the
kyc.completedwebhook or a server-sideGET /kyc-sessions/{id}before unlocking. - Never expose tokens client-side. The partner token and customer
auth_tokens are long-lived money-moving secrets. Keep them server-side; rotate from the Console if leaked. - Capability flags gate operations.
can_create_accounts/can_transfer_balance/can_view_cdrsbeingfalsereturns403. CheckGET /me.
Complete onboarding recipe
Run in order; each step depends on the previous:
- Preflight -
GET /me; confirmcan_create_accountsandcan_transfer_balancearetrueandfloat(balance) >= amount. - Create customer -
POST /accountswith{name,email,phone,password,country,company?}. Captureauth_id+auth_token(store the token encrypted - shown once). - Fund wallet -
POST /accounts/{auth_id}/transfer-balancewith{amount, currency}(currency = your partner currency). Assert responsepartner_balance_after >= 0andstatus == "completed". - Start KYC -
POST /kyc-sessionswith{account_auth_id: auth_id, flow_type, webhook_url, expires_in_days:14, ...}(email flow needscustomer_email; redirect flow needsredirect_url). Storesession_id. - Wait for completion - receive
kyc.completedonwebhook_url(verify server-side, see below), or pollGET /kyc-sessions/{session_id}untilstatus == "kyc_completed". - Provision usage - assign a DID via Console, then hand the customer their
auth_id/auth_tokento drive voice ops on/api/v1/Account/{auth_id}/*. - Monitor - per-customer
cdrs/transactionsfor billing; recharge beforecash_creditshits zero.
Webhook verification snippet
Re-fetch the session before trusting the POST body; respond 200 fast; stay idempotent (retries on non-2xx).
event = request.json()
session = httpx.get(f"{BASE}/kyc-sessions/{event['session_id']}", headers=PARTNER_HEADERS).json()
if session["status"] == "kyc_completed":
activate_customer(session["account_auth_id"]) # idempotent
return ("", 200)
When to search docs
- Full reseller onboarding flow →
partner/flow - Customer creation →
partner/api/customers - KYC end-to-end →
partner/flow(search "kyc") - Transaction reconciliation →
partner/api/transactions
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: vobiz-ai
- Source: vobiz-ai/Agent-Skills
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.