Documentation

POS Terminal Profiles

Manage POS terminal settlement profiles and external sweeps for platform administration

Overview

POS terminal profiles define settlement behavior, fee structures, and transaction limits for groups of terminals. Profiles enable consistent configuration across multiple terminals and support external sweep operations.

What is a Terminal Profile?

A terminal profile is a configuration template that defines how POS terminals process and settle transactions. Instead of configuring each terminal individually, profiles allow you to apply consistent settings across multiple terminals.

AspectDescription
Settlement FrequencyHow often transactions are batched and settled (instant, hourly, 6-hourly, end of day)
Settlement RouteWhere settled funds are sent (terminal account or profile wallet)
Fee DefaultsDefault fee structure applied to transactions
Transaction LimitsConfigurable limits for transaction amounts
TimezoneSettlement window calculations based on timezone

Settlement Routes

Profiles support two settlement routing modes that determine where funds flow after settlement.

RouteCodeBehavior
Terminal Accountterminal_settlement_accountEach terminal settles directly to its configured bank account
Profile Walletprofile_walletAll terminals settle to a shared profile wallet, enabling batched external sweeps

Settlement Frequency Options

Control how often transaction batches are processed and settled.

FrequencyCodeDescription
InstantinstantSettle immediately after each transaction completes
HourlyhourlyBatch and settle every hour
Every 6 Hourssix_hourlyBatch and settle every 6 hours
End of Dayend_of_dayBatch all day's transactions and settle at end of day based on timezone

External Sweeps

When using profile_wallet settlement route, accumulated funds can be swept to an external bank account. Sweeps aggregate multiple settlement jobs into a single payout operation.

Create Profile

Create a new POS terminal profile for a tenant.

Endpoint

POST/api/v1/admin/pos-profiles

Creates a new terminal profile with specified settlement configuration. The profile can then be assigned to terminals.

Headers

ParameterTypeRequiredDescription
AuthorizationstringYesBearer {admin_access_token}
Content-TypestringYesapplication/json

Response- The created profile object

json
{
  "id": "prof_550e8400-e29b-41d4-a716-446655440000",
  "tenant_id": "tnt_f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "processor_id": "proc_a8b9c0d1-e2f3-4a5b-6c7d-8e9f0a1b2c3d",
  "name": "Lagos Merchants - Daily Settlement",
  "description": "End-of-day settlement for Lagos-based merchants",
  "settlement_frequency": "end_of_day",
  "settlement_route": "profile_wallet",
  "settlement_timezone": "Africa/Lagos",
  "settlement_account": {
    "bank_code": "058",
    "account_code": "0123456789",
    "account_name": "Lagos Merchants Ltd",
    "bank_name": "GTBank"
  },
  "linked_terminal_count": 0,
  "created_at": "2024-01-15T09:00:00Z",
  "updated_at": "2024-01-15T09:00:00Z"
}

Request Payload

json
{
  "tenant_id": "tnt_f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "processor_id": "proc_a8b9c0d1-e2f3-4a5b-6c7d-8e9f0a1b2c3d",
  "name": "Lagos Merchants - Daily Settlement",
  "description": "End-of-day settlement for Lagos merchants",
  "settlement_frequency": "end_of_day",
  "settlement_route": "profile_wallet",
  "settlement_timezone": "Africa/Lagos",
  "settlement_account": {
    "bank_code": "058",
    "account_code": "0123456789",
    "account_name": "Lagos Merchants Ltd",
    "bank_name": "GTBank"
  },
  "fee_defaults": {
    "flat_fee": 100,
    "percentage_fee": 0.015,
    "cap_fee": 2000
  },
  "limit_metadata": {
    "min_transaction": 100,
    "max_transaction": 5000000,
    "daily_limit": 50000000
  }
}

Example Request

bash
curl -X POST "https://api.example.com/api/v1/admin/pos-profiles" \
  -H "Authorization: Bearer {admin_token}" \
  -H "Content-Type: application/json" \
  -d @payload.json

List Profiles

Retrieve all terminal profiles, optionally filtered by tenant.

Endpoint

GET/api/v1/admin/pos-profiles

List all terminal profiles across the platform. Platform admins can view all profiles; filter by tenant_id to scope results.

Headers

ParameterTypeRequiredDescription
AuthorizationstringYesBearer {admin_access_token}

Query Parameters

ParameterTypeRequiredDescription
tenant_idstringNoFilter profiles by tenant UUID. Omit to list all tenants.

Response- Array of profile objects

json
{
  "profiles": [
    {
      "id": "prof_550e8400-e29b-41d4-a716-446655440000",
      "tenant_id": "tnt_f47ac10b-58cc-4372-a567-0e02b2c3d479",
      "processor_id": "proc_a8b9c0d1-e2f3-4a5b-6c7d-8e9f0a1b2c3d",
      "tenant": {
        "id": "tnt_f47ac10b-58cc-4372-a567-0e02b2c3d479",
        "name": "Acme Payments"
      },
      "processor": {
        "id": "proc_a8b9c0d1-e2f3-4a5b-6c7d-8e9f0a1b2c3d",
        "name": "PayStack Processor"
      },
      "name": "Lagos Merchants - Daily Settlement",
      "description": "End-of-day settlement for Lagos merchants",
      "settlement_frequency": "end_of_day",
      "settlement_route": "profile_wallet",
      "settlement_timezone": "Africa/Lagos",
      "linked_terminal_count": 45,
      "last_used_at": "2024-01-20T18:30:00Z",
      "created_at": "2024-01-15T09:00:00Z",
      "updated_at": "2024-01-18T14:22:00Z"
    }
  ]
}

Example Request

bash
# List all profiles
curl -X GET "https://api.example.com/api/v1/admin/pos-profiles" \
  -H "Authorization: Bearer {admin_token}"

# Filter by tenant
curl -X GET "https://api.example.com/api/v1/admin/pos-profiles?tenant_id=tnt_f47ac10b-58cc-4372-a567-0e02b2c3d479" \
  -H "Authorization: Bearer {admin_token}"

Response Fields

FieldTypeDescription
idstringUnique profile identifier
tenant_idstringParent tenant UUID
processor_idstringAssociated processor UUID
tenantobjectNested tenant info (id, name)
processorobjectNested processor info (id, name)
namestringProfile display name
descriptionstring | nullOptional description
settlement_frequencystringinstant | hourly | six_hourly | end_of_day
settlement_routestringterminal_settlement_account | profile_wallet
settlement_timezonestringIANA timezone string
linked_terminal_countintegerNumber of terminals using this profile
last_used_atstring | nullISO timestamp of last terminal activity
created_atstringISO timestamp
updated_atstringISO timestamp

Get Profile Details

Retrieve detailed information about a specific terminal profile.

Endpoint

GET/api/v1/admin/pos-profiles/{profileID}

Get comprehensive details for a single profile including settlement account, fee defaults, and limit metadata.

Headers

ParameterTypeRequiredDescription
AuthorizationstringYesBearer {admin_access_token}

Path Parameters

ParameterTypeRequiredDescription
profileIDstringYesUUID of the profile to retrieve

Response- Full profile object with all configuration details

json
{
  "id": "prof_550e8400-e29b-41d4-a716-446655440000",
  "tenant_id": "tnt_f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "processor_id": "proc_a8b9c0d1-e2f3-4a5b-6c7d-8e9f0a1b2c3d",
  "tenant": {
    "id": "tnt_f47ac10b-58cc-4372-a567-0e02b2c3d479",
    "name": "Acme Payments"
  },
  "processor": {
    "id": "proc_a8b9c0d1-e2f3-4a5b-6c7d-8e9f0a1b2c3d",
    "name": "PayStack Processor"
  },
  "name": "Lagos Merchants - Daily Settlement",
  "description": "End-of-day settlement for Lagos-based merchants",
  "settlement_frequency": "end_of_day",
  "settlement_route": "profile_wallet",
  "settlement_timezone": "Africa/Lagos",
  "settlement_account": {
    "bank_code": "058",
    "account_code": "0123456789",
    "account_name": "Lagos Merchants Ltd",
    "bank_name": "GTBank",
    "provider": "paystack"
  },
  "profile_settlement_account_id": "acc_123e4567-e89b-12d3-a456-426614174000",
  "fee_defaults": {
    "flat_fee": 100,
    "percentage_fee": 0.015,
    "cap_fee": 2000
  },
  "limit_metadata": {
    "min_transaction": 100,
    "max_transaction": 5000000,
    "daily_limit": 50000000
  },
  "linked_terminal_count": 45,
  "last_used_at": "2024-01-20T18:30:00Z",
  "created_by": "admin_user_123",
  "updated_by": "admin_user_456",
  "created_at": "2024-01-15T09:00:00Z",
  "updated_at": "2024-01-18T14:22:00Z"
}

Example Request

bash
curl -X GET "https://api.example.com/api/v1/admin/pos-profiles/prof_550e8400-e29b-41d4-a716-446655440000" \
  -H "Authorization: Bearer {admin_token}"

Fee Defaults Schema

The fee_defaults object can contain various fee configuration options.

FieldTypeDescription
flat_feenumberFixed fee amount in minor units (kobo/cents)
percentage_feenumberPercentage fee as decimal (0.015 = 1.5%)
cap_feenumberMaximum fee cap in minor units
min_feenumberMinimum fee floor in minor units

Limit Metadata Schema

The limit_metadata object defines transaction constraints.

FieldTypeDescription
min_transactionnumberMinimum transaction amount allowed
max_transactionnumberMaximum single transaction amount
daily_limitnumberMaximum daily transaction volume
monthly_limitnumberMaximum monthly transaction volume

Error Responses

StatusCodeDescription
403ACCESS_DENIEDAdmin does not have permission to view this profile
404NOT_FOUNDProfile with specified ID does not exist

Update Profile

Update an existing terminal profile's configuration.

Endpoint

PATCH/api/v1/admin/pos-profiles/{profileID}

Partially update a profile's settings. Only provided fields are updated; omitted fields remain unchanged. Changes apply to all terminals using this profile.

Headers

ParameterTypeRequiredDescription
AuthorizationstringYesBearer {admin_access_token}
Content-TypestringYesapplication/json

Path Parameters

ParameterTypeRequiredDescription
profileIDstringYesUUID of the profile to update

Response- The updated profile object

json
{
  "id": "prof_550e8400-e29b-41d4-a716-446655440000",
  "name": "Lagos Merchants - Hourly Settlement",
  "settlement_frequency": "hourly",
  "updated_at": "2024-01-21T10:15:00Z"
}

Request Payload

json
{
  "name": "Lagos Merchants - Hourly Settlement",
  "settlement_frequency": "hourly",
  "fee_defaults": {
    "flat_fee": 50,
    "percentage_fee": 0.01,
    "cap_fee": 1500
  }
}

Example Request

bash
curl -X PATCH "https://api.example.com/api/v1/admin/pos-profiles/prof_550e8400-e29b-41d4-a716-446655440000" \
  -H "Authorization: Bearer {admin_token}" \
  -H "Content-Type: application/json" \
  -d @payload.json

Important Considerations

When updating profiles with linked terminals, consider the following impacts:

ChangeImpact
Settlement FrequencyNew frequency applies to future settlement windows. In-progress settlements complete under old settings.
Settlement RouteChanging route affects where future settlements are directed. Existing balances remain in place.
Fee DefaultsNew fees apply to future transactions only. Historical transactions retain original fees.
LimitsNew limits apply immediately to all linked terminals.

Delete Profile

Delete a terminal profile. Profiles with linked terminals cannot be deleted.

Endpoint

DELETE/api/v1/admin/pos-profiles/{profileID}

Permanently delete a terminal profile. This operation fails if any terminals are currently assigned to the profile.

Headers

ParameterTypeRequiredDescription
AuthorizationstringYesBearer {admin_access_token}

Path Parameters

ParameterTypeRequiredDescription
profileIDstringYesUUID of the profile to delete

Response- Success response with no body (204 No Content)

json

Example Request

bash
curl -X DELETE "https://api.example.com/api/v1/admin/pos-profiles/prof_550e8400-e29b-41d4-a716-446655440000" \
  -H "Authorization: Bearer {admin_token}"

Error Responses

StatusCodeDescription
400PROFILE_HAS_TERMINALSCannot delete profile with linked terminals. Reassign or remove terminals first.
400PROFILE_HAS_PENDING_SETTLEMENTSCannot delete profile with pending settlements. Wait for settlements to complete.
403ACCESS_DENIEDAdmin does not have permission to delete this profile
404NOT_FOUNDProfile with specified ID does not exist

Deletion Prerequisites

Before deleting a profile, ensure:

RequirementHow to Check
No linked terminalsGET /pos-profiles/{id} and verify linked_terminal_count is 0
No pending settlementsGET /pos-profiles/{id}/sweeps?status=pending returns empty
No active sweep jobsAll external sweeps have completed or failed

Trigger External Sweep

Initiate an external sweep to transfer accumulated profile wallet funds to an external bank account.

Endpoint

POST/api/v1/admin/pos-profiles/{profileID}/sweep

Trigger an external sweep for a profile using profile_wallet settlement route. Aggregates all pending settlement jobs into a single payout to the configured external bank account.

Headers

ParameterTypeRequiredDescription
AuthorizationstringYesBearer {admin_access_token}
Content-TypestringYesapplication/json

Path Parameters

ParameterTypeRequiredDescription
profileIDstringYesUUID of the profile to sweep

Response- The created sweep object

json
{
  "id": "swp_123e4567-e89b-12d3-a456-426614174000",
  "tenant_id": "tnt_f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "profile_id": "prof_550e8400-e29b-41d4-a716-446655440000",
  "amount": "1500000.00",
  "currency": "NGN",
  "status": "pending",
  "job_count": 12,
  "settlement_amount_total": "1500000.00",
  "destination": {
    "bank_code": "058",
    "account_number": "0123456789",
    "account_name": "Lagos Merchants Ltd",
    "bank_name": "GTBank"
  },
  "created_at": "2024-01-21T12:00:00Z",
  "updated_at": "2024-01-21T12:00:00Z"
}

Request Payload

json
{
  "tenant_id": "tnt_f47ac10b-58cc-4372-a567-0e02b2c3d479"
}

Example Request

bash
curl -X POST "https://api.example.com/api/v1/admin/pos-profiles/prof_550e8400-e29b-41d4-a716-446655440000/sweep" \
  -H "Authorization: Bearer {admin_token}" \
  -H "Content-Type: application/json" \
  -d '{
    "tenant_id": "tnt_f47ac10b-58cc-4372-a567-0e02b2c3d479"
  }'

Sweep Workflow

Understanding how external sweeps are processed.

StepStatusDescription
1. InitiatependingSweep is created, settlement jobs are aggregated
2. Submitpayout_submittedPayout request sent to provider
3. CompletesettledFunds successfully transferred to external account
4. FailedfailedPayout failed - check error details and retry

Prerequisites

Sweep operations require specific conditions to be met.

RequirementDescription
Profile RouteProfile must use settlement_route: 'profile_wallet'
Settlement AccountProfile must have valid settlement_account configured
Pending SettlementsAt least one settlement job must be pending sweep
Sufficient BalanceProfile wallet must have sufficient balance

Error Responses

StatusCodeDescription
400INVALID_SETTLEMENT_ROUTEProfile does not use profile_wallet settlement route
400NO_SETTLEMENT_ACCOUNTProfile does not have external settlement account configured
400NO_PENDING_SETTLEMENTSNo settlement jobs pending sweep
400INSUFFICIENT_BALANCEProfile wallet balance insufficient for sweep
409SWEEP_IN_PROGRESSAnother sweep is already in progress for this profile

List Profile Sweeps

Retrieve external sweep history for a terminal profile.

Endpoint

GET/api/v1/admin/pos-profiles/{profileID}/sweeps

List all external sweeps for a profile, with optional status filtering and pagination.

Headers

ParameterTypeRequiredDescription
AuthorizationstringYesBearer {admin_access_token}

Path Parameters

ParameterTypeRequiredDescription
profileIDstringYesUUID of the profile

Query Parameters

ParameterTypeRequiredDescription
tenant_idstringYesUUID of the tenant
statusstringNoFilter by sweep statusValues: pending, payout_submitted, settled, failed
limitintegerNo (default: 20)Page size
offsetintegerNo (default: 0)Page offset

Response- Paginated list of sweep objects

json
{
  "data": [
    {
      "id": "swp_123e4567-e89b-12d3-a456-426614174000",
      "tenant_id": "tnt_f47ac10b-58cc-4372-a567-0e02b2c3d479",
      "profile_id": "prof_550e8400-e29b-41d4-a716-446655440000",
      "amount": "1500000.00",
      "currency": "NGN",
      "status": "settled",
      "payout_id": "pay_xyz789",
      "job_count": 12,
      "settlement_amount_total": "1500000.00",
      "destination": {
        "bank_code": "058",
        "account_number": "0123456789",
        "account_name": "Lagos Merchants Ltd",
        "bank_name": "GTBank"
      },
      "metadata": {
        "provider_reference": "REF123456"
      },
      "created_at": "2024-01-21T12:00:00Z",
      "updated_at": "2024-01-21T12:05:00Z"
    }
  ],
  "pagination": {
    "page": 1,
    "page_size": 20,
    "total": 45
  }
}

Example Request

bash
# List all sweeps
curl -X GET "https://api.example.com/api/v1/admin/pos-profiles/prof_550e8400-e29b-41d4-a716-446655440000/sweeps?tenant_id=tnt_f47ac10b-58cc-4372-a567-0e02b2c3d479" \
  -H "Authorization: Bearer {admin_token}"

# Filter by status
curl -X GET "https://api.example.com/api/v1/admin/pos-profiles/prof_550e8400-e29b-41d4-a716-446655440000/sweeps?tenant_id=tnt_f47ac10b-58cc-4372-a567-0e02b2c3d479&status=pending" \
  -H "Authorization: Bearer {admin_token}"

Sweep Status Reference

StatusDescriptionNext Steps
pendingSweep created, awaiting payout submissionSystem will automatically submit payout
payout_submittedPayout sent to provider, awaiting confirmationMonitor for settlement or failure
settledFunds successfully transferredNo action required - sweep complete
failedPayout failedReview error, fix issue, trigger new sweep

Response Fields

FieldTypeDescription
idstringUnique sweep identifier
tenant_idstringParent tenant UUID
profile_idstringParent profile UUID
amountstringTotal sweep amount (decimal string)
currencystringCurrency code (e.g., NGN)
statusstringCurrent sweep status
payout_idstring | nullProvider payout reference (when submitted)
job_countintegerNumber of settlement jobs included
settlement_amount_totalstringSum of all settlement amounts
destinationobjectExternal bank account details
metadataobjectAdditional sweep metadata
created_atstringISO timestamp
updated_atstringISO timestamp

Get Sweep Details

Retrieve detailed information about a specific external sweep including individual settlement jobs.

Endpoint

GET/api/v1/admin/pos-profiles/{profileID}/sweeps/{sweepID}

Get comprehensive details for a single sweep including the list of settlement jobs that were aggregated into this sweep.

Headers

ParameterTypeRequiredDescription
AuthorizationstringYesBearer {admin_access_token}

Path Parameters

ParameterTypeRequiredDescription
profileIDstringYesUUID of the parent profile
sweepIDstringYesUUID of the sweep to retrieve

Query Parameters

ParameterTypeRequiredDescription
tenant_idstringYesUUID of the tenant

Response- Full sweep object with jobs array

json
{
  "id": "swp_123e4567-e89b-12d3-a456-426614174000",
  "tenant_id": "tnt_f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "profile_id": "prof_550e8400-e29b-41d4-a716-446655440000",
  "amount": "1500000.00",
  "currency": "NGN",
  "status": "settled",
  "payout_id": "pay_xyz789",
  "job_count": 3,
  "settlement_amount_total": "1500000.00",
  "destination": {
    "bank_code": "058",
    "account_number": "0123456789",
    "account_name": "Lagos Merchants Ltd",
    "bank_name": "GTBank"
  },
  "jobs": [
    {
      "id": "job_aaa111",
      "terminal_id": "2057TID001",
      "terminal_name": "Store Alpha POS",
      "window_start": "2024-01-20T00:00:00Z",
      "window_end": "2024-01-20T23:59:59Z",
      "state": "settled",
      "settlement_amount": "500000.00",
      "transaction_count": 45,
      "sweep_id": "swp_123e4567-e89b-12d3-a456-426614174000",
      "created_at": "2024-01-21T00:00:00Z",
      "updated_at": "2024-01-21T12:05:00Z"
    },
    {
      "id": "job_bbb222",
      "terminal_id": "2057TID002",
      "terminal_name": "Store Beta POS",
      "window_start": "2024-01-20T00:00:00Z",
      "window_end": "2024-01-20T23:59:59Z",
      "state": "settled",
      "settlement_amount": "650000.00",
      "transaction_count": 62,
      "sweep_id": "swp_123e4567-e89b-12d3-a456-426614174000",
      "created_at": "2024-01-21T00:00:00Z",
      "updated_at": "2024-01-21T12:05:00Z"
    },
    {
      "id": "job_ccc333",
      "terminal_id": "2057TID003",
      "terminal_name": "Store Gamma POS",
      "window_start": "2024-01-20T00:00:00Z",
      "window_end": "2024-01-20T23:59:59Z",
      "state": "settled",
      "settlement_amount": "350000.00",
      "transaction_count": 28,
      "sweep_id": "swp_123e4567-e89b-12d3-a456-426614174000",
      "created_at": "2024-01-21T00:00:00Z",
      "updated_at": "2024-01-21T12:05:00Z"
    }
  ],
  "metadata": {
    "provider_reference": "REF123456",
    "provider": "paystack"
  },
  "created_at": "2024-01-21T12:00:00Z",
  "updated_at": "2024-01-21T12:05:00Z"
}

Example Request

bash
curl -X GET "https://api.example.com/api/v1/admin/pos-profiles/prof_550e8400-e29b-41d4-a716-446655440000/sweeps/swp_123e4567-e89b-12d3-a456-426614174000?tenant_id=tnt_f47ac10b-58cc-4372-a567-0e02b2c3d479" \
  -H "Authorization: Bearer {admin_token}"

Settlement Job Fields

Each job in the jobs array represents a single terminal's settlement window that was swept.

FieldTypeDescription
idstringUnique settlement job identifier
terminal_idstringTerminal ID (e.g., '2057TID001')
terminal_namestring | nullHuman-readable terminal name
window_startstringSettlement window start (ISO timestamp)
window_endstringSettlement window end (ISO timestamp)
statestringJob state (pending, collecting, settled, failed)
settlement_amountstringAmount from this terminal (decimal string)
transaction_countintegerNumber of transactions in this settlement
sweep_idstringParent sweep ID
created_atstringISO timestamp
updated_atstringISO timestamp

Use Cases

Common scenarios for viewing sweep details.

ScenarioWhat to Check
ReconciliationCompare jobs array totals with destination bank statement
Dispute ResolutionIdentify which terminal/settlement is in question
Audit TrailTrack when settlements were swept and to where
Failed Sweep DebugReview job states to identify problematic settlements

Architecture & Best Practices

Understanding profile architecture and recommended patterns for managing terminal configurations.

Profile Hierarchy

How profiles fit into the overall terminal management structure.

LevelEntityRelationship
PlatformTenantA tenant can have multiple profiles
TenantProfileA profile belongs to one tenant and one processor
ProfileTerminalA terminal is assigned to one profile
ProfileSweepA profile can have multiple sweeps over time

Settlement Route Comparison

Choosing the right settlement route for your use case.

Aspectterminal_settlement_accountprofile_wallet
Fund FlowEach terminal settles independentlyAll terminals pool into profile wallet
External PayoutDirect to terminal's bank accountBatched sweep to profile's bank account
ReconciliationPer-terminal bank statementsSingle profile-level statement
Use CaseIndependent merchantsAggregated merchant operations
ComplexitySimpler - no sweep managementMore control - batched payouts

Recommended Patterns

Best practices for profile management.

PatternDescription
Single Profile per Merchant TypeGroup terminals by settlement needs (e.g., 'Retail - Daily', 'Enterprise - Weekly')
Environment SeparationUse different profiles for test vs production terminals
Fee StandardizationDefine fee_defaults at profile level, override at terminal only when needed
Timezone AwarenessSet settlement_timezone to merchant's local timezone for predictable EOD settlements
Monitor Linked CountTrack linked_terminal_count to identify unused profiles

Profile Lifecycle

StageActionsConsiderations
CreatePOST /pos-profilesDefine settlement config before assigning terminals
Assign TerminalsPATCH /terminals/{id}Update terminal's profile_id to link
MonitorGET /pos-profiles/{id}Track linked_terminal_count and last_used_at
UpdatePATCH /pos-profiles/{id}Changes apply to all linked terminals
Sweep (if profile_wallet)POST /pos-profiles/{id}/sweepBatch payout accumulated funds
RetireReassign terminals, DELETE profileCannot delete with linked terminals