Game Providers Query
Get the Brands accessible to the current Agent and their actual available currencies, keeping Brand GUIDs separate.
Environment URLs
| Environment | Base URL |
|---|---|
| Production | https://hub-panel-api.v7stech.com |
| Staging | https://hub-panel-api-dev.v7stech.com |
API Information
| Property | Value |
|---|---|
| Path | POST /papi/v1/game/providers |
| Authentication | Agent Token (Bearer) |
| Content-Type | application/x-www-form-urlencoded |
Headers
| Header | Value | Required |
|---|---|---|
Authorization | Bearer {agent_token} | ✅ Required |
Request Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
currency | string | No | Filter by an actual available currency such as MYR; omit or send ALL for no single-currency filter |
Request Example
curl -X POST https://api.example.com/papi/v1/game/providers \
-H "Authorization: Bearer {agent_token}" \
-d "currency=IDR"AI Implementation Prompt (Copy Ready)
Update the existing Agent project's VCT game catalogue integration. Reuse the HTTP client, server-side Agent Token logic, pagination, and error handling.
Endpoints: POST {VCT_BASE_URL}/papi/v1/game/providers and POST {VCT_BASE_URL}/papi/v1/game/list.
Use application/x-www-form-urlencoded and Authorization: Bearer {agent_token}.
1. Store brand_guid, brand_code, and brand_name from both providers.data and game/list.data.list. providers.data also returns the Brand image field logo_url. Neither catalogue response includes brand; do not require or read that response field. Read the Brand metadata from Hub instead of deriving identity from Product Name.
2. Use the Hub brand_guid as the unique Brand key, cache key, relation, and selector value. Keep different GUIDs separate even when Code and Name are identical. Display brand_name with brand_code. Use logo_url only for display, never as identity or a cache key; show a placeholder when it is empty.
3. Filter game/list with brand_guid. Use numeric game_genre for genre filtering; retain currency and pagination. page defaults to 1; pageSize defaults to 10 and is capped at 100. Fetch all pages according to data.total for bulk imports.
4. Keep the returned game id as game_id for storage and launch. brand_guid is not game_id. currency may contain comma-separated actual currencies. ALL or an omitted request currency removes only the single-currency filter; never launch with ALL.
5. Require HTTP success, code=0, and status not false. Empty arrays are valid. Preserve existing maintenance, image, currency, category, and stale-request handling.
6. Preserve historical transactions and relationships. Backfill GUIDs only when the old mapping is unambiguous; report ambiguous rows. Never merge or guess by Name or Code alone. If the deployed API lacks brand_guid, report the required backend upgrade and stop migration without deleting existing data or falling back to name-based merging.
7. The bet-push callback also includes brand_guid, brand_code, and brand_name; relate wagers to the catalogue using brand_guid. game/rates also accepts exact brand_guid filters and returns the same three Brand fields. Use GUID across rates, catalogue, and wagers; preserve historical billing and calculation rules.
8. Test identical Code/Name with distinct GUIDs, GUID filtering, field consistency, rename stability, complete pagination, empty results, missing new fields, and migration ambiguity. Keep credentials and full tokens out of the browser and ordinary logs.
Deliver the smallest complete change, tests, and migration notes, listing modified files and mappings needing human review.Brand Identity and Migration
Both endpoints resolve brand_code and brand_name from Hub Brand master data using the stored brand_guid; /game/providers also returns logo_url. Neither response includes the duplicate brand field. Use brand_code for the code and brand_name for the name. Code and Name can repeat across sources, so use brand_guid as the unique key and names only for display. logo_url is display-only, may be empty, and may change when Operations replaces the image.
/game/providers keeps different Brand GUIDs separate even when Code and Name match. Pass the selected brand_guid unchanged to /game/list. The legacy brand filter searches the current Code or Name and can match multiple Brands. Missing or deleted Brands and empty Brand Codes are omitted.
Deploy the updated Hub backend before using this contract. If an older response lacks brand_guid, report the required upgrade and pause migration instead of merging by name. Backfill old relationships only when uniquely resolved; preserve historical transactions and report ambiguous mappings for review.
The Bet Push callback uses the same Brand GUID for wager attribution. Game Rates also accepts the same brand_guid for exact filtering and relationships.
Response Fields
Data[Item] Structure
| Field | Type | Description |
|---|---|---|
brand_guid | string | Unique Hub Brand GUID; use for relations and selector values |
brand_code | string | Current Hub Brand Code; not unique across Brands |
brand_name | string | Current Hub Brand Name; display only |
logo_url | string | Public Brand image URL for display only; empty when no image is configured |
currencies | array[string] | List of enabled currencies for this brand under this agent |
categories | array[string] | Compatibility field: distinct display names derived from games' game_genre (for example Slot, Other), not numeric values or Game Category |
Response Example
{
"status": true,
"code": 0,
"data": [
{
"brand_guid": "30ff77f5-0616-4ecc-a8a3-80e35fcaaf3e",
"brand_code": "1007",
"brand_name": "PG Soft",
"logo_url": "https://cdn.example.com/brands/pg-soft.png",
"currencies": [
"MYR"
],
"categories": [
"Slot"
]
}
],
"msg": "获取成功"
}