VeyqoDEVELOPERS
DocumentationGET Get Service Categories

SafeHaven Bills API

GET/safehaven/vas/service/{id}/service-categories

Get Service Categories

Get Service Categories through this project environment’s SafeHaven account. Uses snake_case fields and NGN minor units. Requires bills:read.

GEThttps://api.veyqo.org/api/v1/safehaven/vas/service/{id}/service-categoriesIntegration guide
Use your sandbox environment to start. Understand error codes and payment statuses before handling a live payment.
Get Service Categories
curl --request GET "https://api.veyqo.org/api/v1/safehaven/vas/service/$PROVIDER_RESOURCE_ID/service-categories" \
  --header "Authorization: Bearer $VEYQO_SECRET_KEY" \
  --header "Accept: application/json"
{
  "success": true,
  "data": [
    {
      "_id": "000000000000000000000001",
      "name": "example",
      "identifier": "example",
      "service": "example",
      "vendor": "example",
      "is_fixed_amount": false,
      "description": "example",
      "logo_url": "https://example.com",
      "provider_commission": {
        "flat_amount": 0,
        "percentage_amount": 0,
        "min_cap": [],
        "max_cap": []
      },
      "created_at": "example",
      "updated_at": "example",
      "__v": 0
    }
  ]
}

Illustrative examples. Replace IDs and environment variables with your own values. Keep secret keys on your server.

Headers

Authorizationstringrequired
Bearer <secret-key>. This key determines your project environment and must stay on your server.
Acceptstringoptional
application/json

Endpoint

GET https://api.veyqo.org/api/v1/safehaven/vas/service/{id}/service-categories

Server secret key required. Scope: bills:read. The key determines the project and environment; no project-selection header is accepted.

Path and query parameters

ParameterLocationRequiredDescription
idpathYesUse the ID returned when this resource was created.

Response fields

[]._idstringoptional
See the JSON example.
[].namestringoptional
See the JSON example.
[].identifierstringoptional
See the JSON example.
[].servicestringoptional
See the JSON example.
[].vendorstringoptional
See the JSON example.
[].is_fixed_amountbooleanoptional
See the JSON example.
[].descriptionstringoptional
See the JSON example.
[].logo_urlstringoptional
See the JSON example.
[].provider_commissionJSONoptional
See the JSON example.
[].provider_commission.flat_amountintegeroptional
See the JSON example.
[].provider_commission.percentage_amountnumberoptional
See the JSON example.
[].provider_commission.min_capJSONoptional
See the JSON example.
[].provider_commission.max_capJSONoptional
See the JSON example.
[].created_atstringoptional
See the JSON example.
[].updated_atstringoptional
See the JSON example.
[].__vintegeroptional
See the JSON example.

Errors and recovery

CodeHTTPRecoveryRetry policy
VALIDATION_FAILED422Read error.details when present, correct the named fields and retry only after correction. Validation messages may describe state/capability errors without field details.No automatic retry.
INVALID_API_KEY401Use a current kc_test_ or kc_live_ secret key on /api/v1. Use a pk_test_ or pk_live_ publishable key only on browser checkout.After fixing credentials.
INSUFFICIENT_PERMISSION403Grant the required scope or use a suitably scoped key. Dashboard organization roles and staff permissions are separate.After permission changes.
RESOURCE_NOT_FOUND404Check the ID, project and environment. Do not guess another project’s IDs. An inactive payment link is also not-found.No blind retry.
PROVIDER_NOT_CONNECTED422Connect a provider, choose the project default, or explicitly pass provider. An account shared with another project still needs its own assignment here.After configuration changes.
PROVIDER_AUTHENTICATION_FAILED502The merchant must check/rotate the provider credentials in the dashboard. Do not expose those secrets to your application users.After credential correction; reconcile existing payment first.
PROVIDER_REQUEST_FAILED422Read the safe message, inspect the payment’s failure details and correct the request or provider account. Never repeatedly retry a business rejection.Only after resolving the cause.
PROVIDER_UNAVAILABLE503Check the existing payment and verify its state before starting another attempt. Retry safe reads with backoff; preserve operation identity for retried writes.Conditional: reconcile unknown outcomes first.
RATE_LIMIT_EXCEEDED429Honor Retry-After, use bounded exponential backoff with jitter, and reduce concurrent requests. Read X-RateLimit headers.Yes, after Retry-After; preserve write idempotency.
IDEMPOTENCY_KEY_REUSED409Reuse the exact original request to recover that operation, or use a new key only for a genuinely different operation.Do not retry a changed body with that key.
IDEMPOTENCY_IN_PROGRESS409Wait briefly, retry with the same key and unchanged request, then reconcile by reference if the result remains uncertain.Back off with jitter; preserve key/body.