Notification Service API
A SOAP web service that lets agents subscribe to a customer's payment obligations (utility bills, fines, tariffs, and balance top-ups) tracked by UCC, and retrieve newly generated notifications so they can alert customers — for example, by SMS — when a debt appears.
portType. If you're generating a client, point your SOAP toolkit
(JAX-WS, wsimport, zeep, etc.) at the WSDL URL in
Environments.
Five operations
Subscribe, batch subscribe, unsubscribe, batch unsubscribe, and poll for generated notifications. No push/webhook mode — agents pull on their own schedule.
Nightly processing
UCC re-checks every active subscription roughly once a day and generates a new notification only when there's something to report.
Signed & encrypted
Every SOAP envelope must be encrypted and signed per WS-Security, using an X.509 certificate registered with UCC.
Cursor-based polling
getNotifications uses a LastId cursor, so agents only ever fetch what's new.
How it works
A subscribed notification is a standing instruction telling UCC "let me know about this service + customer combination." UCC's processing engine periodically checks that combination and, when it finds something worth reporting, produces a notification — the actual event record your agent fetches and acts on (e.g. by texting the customer that they have a bill due).
Subscription types
Every subscription is registered against a service that supports one of the following patterns:
| Type | Behavior | Typical example |
|---|---|---|
| CHECK_DEBT | Standard case — a debt appears on a given date and stays flat until paid. | Utility bill (e.g. Telmico) |
| GET_SEVERAL_DEBTS | Grouped case — multiple distinct debts can appear over time for the same subscriber. | Traffic police fines by personal number |
| TARIFF_PRE_PAYMENT | Notifies ahead of a recurring tariff charge. | Subscription-style tariffs |
| FIXED_PAYMENT | Generates a notification for a fixed amount on a defined schedule (CronExpression). | Fixed recurring payment plans |
| BALANCE_PRE_PAYMENT | Provider returns remaining balance; UCC notifies once it drops below a trigger amount. Reserved for provider-initiated payment flows. | Prepaid mobile/internet balance (e.g. Silknet, Caucasus) |
| CHECK_DATE_EXPIRATION_REMAINDER | Notifies ahead of a fixed expiration date, independent of any amount. | Document/license renewal reminders |
Prerequisites on UCC's side
A service must be enabled for notifications in UCC's internal configuration before
any agent can subscribe to it — this is reflected by
notificationSubscriptionAllowed: true on that service when you sync
your service catalog. If you try to subscribe to a service that hasn't been enabled,
the call fails with SUBSCRIPTION_NOT_SUPPORTED. Ask your UCC integration
contact to confirm which services are notification-enabled before building against them.
Authentication & security
Notification Service does not use a separate API key or OAuth token. Instead, every SOAP envelope must be encrypted and signed per the WS-Security specification, using an X.509 certificate registered with UCC for your agent account.
| Requirement | Algorithm |
|---|---|
| Key encryption | http://www.w3.org/2001/04/xmlenc#rsa-1_5 |
| Symmetric encryption | http://www.w3.org/2001/04/xmlenc#aes128-cbc |
| Encryption canonicalization | http://www.w3.org/2001/10/xml-exc-c14n# |
| Token reference | keyIdentifier (SKI) |
| Signature | http://www.w3.org/2000/09/xmldsig#rsa-sha1 |
| Signature canonicalization | http://www.w3.org/2001/10/xml-exc-c14n# |
The envelope may optionally carry a WS-Security <Timestamp> element.
The shape below follows the generic OASIS WS-Security standard (not specific to UCC's spec) — included so the algorithms above make sense in context.
Certificate exchange
Trust between your system and UCC is mutual: each side generates its own X.509 key pair, signs its outgoing messages with its own private key, and gives the other side its public certificate for verification/decryption. Nobody issues a certificate on the other party's behalf — you generate yours, UCC generates theirs, and you exchange the public halves.
- Generate your key pair. Create an X.509 key pair on your side, using
whatever standard tooling your team already uses (OpenSSL, Java
keytool, or similar), and store it in a keystore of your choice. The keystore itself — its type, your alias names, its password — is entirely internal to you; none of it is shared with or dictated by UCC. - Send UCC only your public certificate. Export the public certificate (not the keystore, not the private key) and send it to your UCC integration contact. This is the only artifact that crosses the boundary in this direction.
- Import UCC's public certificate into your own keystore once you receive it from UCC, so your side can verify/decrypt what UCC signs.
- Test. Confirm the exchange worked by having UCC synchronize your agent record on their side — your integration contact will run this check with you.
- Renewal follows the same flow: generate a new key pair, send the new public certificate to UCC, and import UCC's public certificate again if UCC has also rotated theirs.
SOAP conventions
Every operation lives under a single WSDL namespace and has its own SOAPAction. If you're generating a client from the WSDL, these are handled for you automatically — this table is for anyone wiring up requests by hand.
| Operation | SOAPAction |
|---|---|
| addNotificationSubscription | http://ucc.ess.azry.com/addNotificationSubscription |
| addBatchNotificationSubscriptions | http://ucc.ess.azry.com/addBatchNotificationSubscriptions |
| deleteNotificationSubscription | http://ucc.ess.azry.com/deleteNotificationSubscription |
| deleteBatchNotificationSubscriptions | http://ucc.ess.azry.com/deleteBatchNotificationSubscriptions |
| getNotifications | http://ucc.ess.azry.com/getNotifications |
WSDL target namespace: http://ucc.ess.azry.com
form="qualified", meaning they belong to
the http://ucc.ess.azry.com namespace on the wire — not just the
top-level operation element. If you're hand-building XML rather than using a
WSDL-generated client, qualify elements explicitly, for example:
The other request/response examples throughout this reference omit the tns:
prefix for readability — assume it applies unless you're generating your client
straight from the WSDL, in which case your toolkit handles this for you.
Environments
| Environment | Endpoint | WSDL |
|---|---|---|
| Test | http://92.241.79.133:8080/notifications-service-v2/UCCNotificationsService | ...UCCNotificationsService?WSDL |
| Production | http://service.ucc.ge/notifications-service-v2/UCCNotificationsService | ...UCCNotificationsService?WSDL |
soap:address is a relative path
(/notifications-service-v2/UCCNotificationsService), not a full URL.
Use the environment-specific host from the table above rather than whatever your
SOAP toolkit infers from the WSDL location.
?WSDL to either endpoint above to fetch the machine-readable
contract for client code generation.
Errors & fault codes
Errors are returned as a standard SOAP Fault. Distinguish error cases using the fault code, not the fault string (which is intended for humans, not branching logic).
| Fault code | Meaning | Thrown by |
|---|---|---|
| GENERAL_ERROR | Unspecified error. Treat as retryable after investigation. | Any operation |
| NON_UNIQUE_SUBSCRIPTION | agentSubscriptionId is already in use by another active subscription. | addNotificationSubscription |
| SUBSCRIPTION_NOT_SUPPORTED | The target service hasn't been enabled for notifications in UCC's configuration. | addNotificationSubscription |
| NOTIFICATION_SERVICE_TYPE_NOT_SUPPORTED | The service doesn't support the requested NotificationServiceType. | addNotificationSubscription |
| DUPLICATE_SUBSCRIPTION | An equivalent subscription (same service + abonent) already exists. | addNotificationSubscription |
Fault structure
The fault code isn't in the generic SOAP <faultstring> — it's in a
typed detail block, UCCNotificationsServiceException. Parse this, not
the human-readable string, for branching logic:
Registers a new subscribed notification for a service + abonent (customer) pair.
Request parameters
| Field | Type | Description |
|---|---|---|
| NotificationSubscription | NotificationSubscription | Subscription parameters required |
Response
| Field | Type | Description |
|---|---|---|
| return | AddNotificationSubscriptionResult | {Id, AgentSubscriptionId} — Id is UCC's internal subscription id |
Possible faults
NON_UNIQUE_SUBSCRIPTION SUBSCRIPTION_NOT_SUPPORTED NOTIFICATION_SERVICE_TYPE_NOT_SUPPORTED DUPLICATE_SUBSCRIPTION
AgentSubscriptionId is your idempotency key. Choose a stable, unique
value per subscription on your side — resending the same call with the same ID
against an existing subscription returns NON_UNIQUE_SUBSCRIPTION
rather than silently duplicating it.
Cancels an active subscription. UCC stops checking for new debts/events on this pair.
Request parameters
| Field | Type | Description |
|---|---|---|
| AgentSubscriptionId | String | Agent subscription unique id required |
The WSDL defines this as an empty sequence — absence of a SOAP Fault is the success signal, there's no body to inspect.
EndDate passes —
so you don't strictly need to clean up short-lived subscriptions manually, but doing
so keeps your subscription list accurate.
Batch version of addNotificationSubscription — registers multiple subscriptions in one call.
Request parameters
| Field | Type | Description |
|---|---|---|
| NotificationSubscriptions | List<NotificationSubscription> | One or more subscriptions |
Response
| Field | Type | Description |
|---|---|---|
| return.AddSubscriptionResults.AddSubscriptionResult | List<AddNotificationSubscriptionResult> | One result per submitted subscription, same order |
AddSubscriptionResult individually rather than
assuming success from the absence of a SOAP Fault.
Batch version of deleteNotificationSubscription.
Request parameters
| Field | Type | Description |
|---|---|---|
| AgentSubscriptionIds | List<String> | One or more agent subscription ids to cancel |
Same as the single-delete operation — empty sequence in the WSDL, no per-item result (unlike the batch add operation, which does report per item).
Fetches notifications generated since the last one your agent processed. This is a pull operation — poll it on your own schedule (UCC generates new notifications roughly once per day per subscription).
Request parameters
| Field | In/Out | Type | Description |
|---|---|---|---|
| LastId | In | Long | The last notification id your agent has already fetched. Send 0 on first call. |
| return | Out | List<Notification> | Newly generated notifications since LastId — wire element is literally named return |
Id you've successfully processed and send it back
as LastId on the next call. If a batch fails partway through processing
on your side, replay from the last fully processed id rather than the last
fetched id, to avoid dropping notifications.
Data types
NotificationSubscription
| Property | Type | Description |
|---|---|---|
| AgentSubscriptionId | String | Agent subscription unique id required |
| ServiceCode | String | Service code required |
| AbonentCode | String | Abonent (customer-facing account) code required |
| StartDate | DateTime | Time after which notifications will be generated |
| EndDate | DateTime | Time until which notifications will be generated |
| NotificationServiceType | NotificationServiceType | Type of notification being registered — see enum |
| Priority | Long | Lower value = generated before other notifications. 0 is the highest priority. |
| CustomerId | String | Customer identifier in your (the agent's) system |
| AccountNumber | String | Customer account number in your system |
| MaxPaymentAmount | Decimal | Ceiling amount. If a notification's amount exceeds this, behavior follows AmountLimitExceedAction. |
| AmountLimitExceedAction | AmountLimitExceedAction | What to do when MaxPaymentAmount is exceeded — see enum |
| CronExpression | String | Schedule, required for FIXED_PAYMENT type |
| PaymentAmount | Decimal | Amount used when generating notifications for FIXED_PAYMENT and BALANCE_PRE_PAYMENT |
| TriggerAmount | Decimal | Balance threshold that triggers generation for BALANCE_PRE_PAYMENT |
| Params | NotificationServiceOverridableParams | Optional per-subscription overrides for the default processing windows — see type |
NotificationServiceOverridableParams
Set on NotificationSubscription.Params to override the service-level
defaults for this specific subscription. All fields optional — omit to inherit the default.
| Property | Type | Description |
|---|---|---|
| DuplicateDebtIgnoreDays | Long | Suppress a repeat notification for the same debt amount within this many days |
| DoNotFetchDebtAfterGenerationDays | Long | Pause re-checking this subscription for this many days after a notification is generated |
| MaxAllowedNoNotificationPeriodDays | Long | Auto-expire the subscription if it generates nothing for this many days |
| TariffPaymentPeriodDays | Long | Period length used for TARIFF_PRE_PAYMENT subscriptions |
| TariffPaymentControlDays | Long | How many days before the tariff period ends to generate the notification |
| OneDayNotificationsGenerationCount | Long | Cap on how many notifications this subscription can generate in a single day |
| IgnoreOldDebtsDays | Long | Ignore debts older than this many days when checking |
| DueDates | String | Service-specific due-date configuration (format defined per service) |
AddNotificationSubscriptionResult
| Property | Type | Description |
|---|---|---|
| Id | Long | UCC's internal id for the created subscription |
| AgentSubscriptionId | String | Echoes back the id you submitted |
Notification
| Property | Type | Description |
|---|---|---|
| Id | Long | Notification id in UCC. Save it — you'll pass it back as LastId on future getNotifications calls. |
| AgentSubscriptionId | String | Agent subscription unique id |
| ServiceCode | String | Service code |
| AbonentCode | String | Abonent code |
| GenerationTime | DateTime | Time the notification was generated |
| DueDate | DateTime | Payment due date, for service providers that return it |
| Debt | Decimal | Current amount to pay |
| Message | String | Free-text message, reserved for informative use |
| customerId | String | Customer identifier in your system (lowercase on the wire) |
| accountNumber | String | Customer account number in your system (lowercase on the wire) |
| NotificationType | NotificationType | What kind of event this notification represents — see enum. Not to be confused with NotificationServiceType on the subscription. |
| AdditionalParams | Map<String,String> | Always present per the WSDL (no minOccurs="0" on the element itself), but may contain zero entry items |
NotificationType enum
Describes the notification event itself — distinct from NotificationServiceType,
which describes the subscription that produced it.
| Value | Meaning |
|---|---|
| DEBT_NOTIFICATION | A debt/event was found — the normal case |
| DEBT_ANNULMENT | A previously notified debt was cancelled/annulled |
NotificationServiceType enum
| Value | Meaning |
|---|---|
| CHECK_DEBT | Pay debt amount |
| GET_SEVERAL_DEBTS | Several distinct debts fetched per subscriber, e.g. police fines by personal number |
| TARIFF_PRE_PAYMENT | Tariff pre-payment |
| FIXED_PAYMENT | Fixed amount on a configured schedule |
| BALANCE_PRE_PAYMENT | Balance pre-payment. Reserved for future use, where the service provider initiates the payment. |
| CHECK_DATE_EXPIRATION_REMAINDER | Notifies ahead of a fixed expiration date (e.g. document/license renewal) |
AmountLimitExceedAction enum
| Value | Meaning |
|---|---|
| PROCESS | Generate the notification anyway, even past MaxPaymentAmount |
| IGNORE | Suppress the notification if MaxPaymentAmount is exceeded |
Subscription lifecycle
UCC runs a nightly processing job across all active subscriptions. Understanding this loop makes retry and polling behavior on your side predictable.
- Registered — you call
addNotificationSubscription; UCC stores it with status Created, not yet run. - Checked — during its configured processing window, UCC checks the subscription for a debt/event once per day.
- Generated, skipped, or flagged — the run resolves to one of: a notification was generated; no debt exists; the result was ignored (e.g. a duplicate within the configured suppression window, or the same amount fetched again); or the run hit a problem and is flagged for review.
- Delivered — you retrieve the notification via
getNotificationsand advance yourLastIdcursor. - Expired or cancelled — the subscription ends when
EndDatepasses, you explicitly delete it, or it sits idle past the configured inactivity threshold with no notifications generated.
Duplicate suppression & timing controls
UCC applies default processing windows so agents don't get flooded with repeat
notifications for the same underlying debt. Each can be overridden per subscription
via NotificationSubscription.Params:
| Override field | Effect |
|---|---|
DuplicateDebtIgnoreDays | If the same subscription generates a notification for the same amount again within this window, it's suppressed. |
DoNotFetchDebtAfterGenerationDays | After a notification is generated, UCC won't re-check that subscription again until this window elapses. |
MaxAllowedNoNotificationPeriodDays | The subscription auto-expires if it produces nothing for this many days. |
IgnoreOldDebtsDays | Debts older than this are ignored when checking. |
OneDayNotificationsGenerationCount | Caps how many notifications this subscription can generate in a single day. |
Best practices
- Always send a non-empty
AgentSubscriptionId. It's your only idempotency and lookup key for cancellation. - Store
LastIddurably before acting on notifications, or advance it only after your side has fully processed the batch — whichever order avoids silently dropping notifications on a crash. - Set
MaxPaymentAmountdeliberately. Pairing it withAmountLimitExceedAction: IGNOREis a simple way to avoid notifying customers about unexpectedly large or erroneous debts. - Confirm a service is notification-enabled with your UCC integration contact before subscribing — otherwise every call fails with
SUBSCRIPTION_NOT_SUPPORTED. - Poll
getNotificationson a schedule that matches UCC's nightly processing cadence (e.g. once every few hours) rather than continuously — new data won't appear faster than the processing window regenerates it.