HomeGuidesAPI ReferenceChangelog
Log In
Guides

Legacy Utility Cloud API to Plug API

Detailed Migration Guide

Utility Cloud to Plug API Migration Guide

Document Version: 1.0
Plug API Version: 2024-02-21 (Most recent)
Last Updated: 2026-04-07

This document is the comprehensive migration reference for customers moving from the Utility Cloud (UC) API to the Plug API. It covers every aspect of the migration including authentication, endpoint mapping, field-by-field resource mappings, status/enum changes, error handling, and behavioral differences.

The database is the same, meaning that customers do not have to resubmit their credentials to migrate. All their data is accessible already.


Table of Contents

  1. Overview & Quick Reference
  2. Authentication & Authorization
  3. Required Headers
  4. Base URL & Endpoint Mapping
  5. Response Format Changes
  6. ID Format Changes
  7. Field Naming Convention Changes
  8. Resource Field Mappings
  9. Status & Enum Value Mappings
  10. Event Type Mappings
  11. Webhook Changes
  12. Error Handling
  13. Pagination, Sorting & Filtering
  14. Behavioral Changes
  15. New Plug-Only Features
  16. Request Body Changes
  17. Migration Checklist

1. Overview & Quick Reference

What is Changing?

The Plug API is a modernized replacement for the Utility Cloud (UC) API. While both APIs expose the same underlying data, the Plug API introduces:

  • Standardized OAuth 2.0 authentication with organization-level API keys
  • Dated API versioning via the Arcadia-Version header
  • Removal of HATEOAS/HAL — no more _embedded wrappers or _links objects
  • Consistent naming conventions — prefixed IDs, At timestamp suffixes, is boolean prefixes
  • Structured error responses — typed errors with parameter-level detail
  • Expanded webhooks — notifications for all status transitions, not just action-required ones
  • New resources — intervals, discovered statements, expected accounts, alternate access and more

Summary of Breaking Changes

AreaChange
AuthenticationUnified username/password → Email based login and org-level OAuth 2.0 API keys
Base URLhttps://api.urjanet.com/utility/https://api.arcadia.com/plug/
HeadersNew required Arcadia-Version header
Response formatHAL+JSON with HATEOAS → plain JSON
ID fieldsentityId → prefixed id (e.g., act_uuid)
TimestampscreatedDatecreatedAt; periodStartperiodStartDate
BooleansenabledisActive / isStatementsProductActive
Status valuesRenamed for clarity (e.g., OKCONNECTION_SUCCESS)
Error formatFlat { message, status } → structured { errors: [{ type, message, param }] }
WebhooksAction-required only → all status transitions
Statement endpointsSingle endpoint → summary + detailed variants
Provider classificationPRIMARY/SECONDARYPUBLISHER/PASS_THROUGH

2. Authentication & Authorization

Utility Cloud (Legacy)

  • Authentication method: Bespoke framework with unified username/password
  • The same credentials were used for both the API and the Console (dashboard)
  • User-specific audit trails available for both API and Console changes

Plug API (New)

  • Authentication method: Fully compliant with OAuth 2.0
  • Organization-level API keys: Multiple API keys can be created per organization
  • Separate credentials: Dashboard requires email/password; API requires API keys

Migration Action

  1. Obtain new OAuth 2.0 API keys for your organization from the Arcadia Dashboard
  2. Update your API client to use Bearer token authentication
  3. If you are using service accounts for API access, create new API keys to replace them and then delete the existing service accounts to avoid stale credentials.
  4. Update all users to login with their email address instead of a username. Plug enforces one user per email address.
  5. If your organization has multiple users sharing the same email, contact your CSM team to consolidate accounts before migrating. Duplicate email logins must be resolved prior to migration.

3. Required Headers

New Required Header

The Plug API introduces dated API versioning. You must include the Arcadia-Version header in every request:

Arcadia-Version: 2024-02-21

This enables Arcadia to introduce breaking changes in future versions without forcing immediate client updates.

Sandbox Mode Header

The Plug API supports sandbox mode via a request header:

X-Sandbox: true

Set this header to true to operate in sandbox mode. Default is false (production mode).

Content-Type Changes

AspectUtility CloudPlug API
Request Content-Typeapplication/jsonapplication/json
Response Content-Typeapplication/hal+jsonapplication/json

Example Requests

Utility Cloud:

curl --request GET \
     --url 'https://api.urjanet.com/utility/accounts?page=0&size=20' \
     --header 'accept: application/json'

Plug API:

curl --request GET \
     --url 'https://api.arcadia.com/plug/accounts?page=0&size=20' \
     --header 'Arcadia-Version: 2024-02-21' \
     --header 'accept: application/json'

4. Base URL & Endpoint Mapping

Base URL Change

Utility CloudPlug API
Base URLhttps://api.urjanet.com/utility/https://api.arcadia.com/plug/

All endpoint paths below are relative to the base URL. For example, GET /accounts means:

  • UC: GET https://api.urjanet.com/utility/accounts
  • Plug: GET https://api.arcadia.com/plug/accounts

Common Endpoints (Present in Both APIs)

The relative paths are the same across both APIs. Only the base URL changes.

ResourceMethodPathNotes
List AccountsGET/accounts
Get AccountGET/accounts/{id}
Create AccountPOST/accountsRequest body changes (see Section 16)
Update AccountPATCH/accounts/{id}
Delete AccountDELETE/accounts/{id}
Account PaymentsGET/accounts/{id}/payments
Account StatementsGET/accounts/{id}/statements
Account MetersGET/accounts/{id}/meters
Account EventsGET/accounts/{id}/eventsEvent types renamed (see Section 10)
List CredentialsGET/credentials
Get CredentialGET/credentials/{id}
Create CredentialPOST/credentialsRequest body changes (see Section 16)
Update CredentialPATCH/credentials/{id}
Delete CredentialDELETE/credentials/{id}
Credential EventsGET/credentials/{id}/eventsEvent types renamed
List StatementsGET/statementsReturns summary by default in Plug
Get StatementGET/statements/{id}Returns summary by default in Plug
List MetersGET/meters
Get MeterGET/meters/{id}
Create MeterPOST/meters
Update MeterPATCH/meters/{id}
Meter EventsGET/meters/{id}/eventsEvent types renamed
List SitesGET/sites
Get SiteGET/sites/{id}
Create SitePOST/sitesRequest body changes (see Section 16)
Update SitePATCH/sites/{id}
Delete SiteDELETE/sites/{id}
Site EventsGET/sites/{id}/eventsEvent types renamed
List FilesGET/files
Get FileGET/files/{id}
Upload FilePOST/filesMultipart upload
File EventsGET/files/{id}/eventsEvent types renamed
List WebhooksGET/webhooks
Get WebhookGET/webhooks/{id}
Resend WebhookPOST/webhooks/{id}/resend
List DownloadsGET/downloads
Create DownloadPOST/downloads
List Deletion LogsGET/deletionLogs
Get OrganizationGET/organization

New Plug-Only Endpoints

These endpoints exist only in the Plug API and have no UC equivalent.

ResourceMethodPathDescription
List Detailed StatementsGET/statements/detailsPaginated list with full detail
Detailed StatementGET/statements/{id}/detailsGet Single Statement with full detail
List Detailed AccountsGET/accounts/detailsPaginated list with full detail
Detailed AccountGET/accounts/{id}/detailsGet Single Account with full detail
Expected AccountsGET/expectedAccountsTrack expected but not yet discovered accounts
Create Expected AccountPOST/expectedAccountsCreate an expected account
Discovered StatementsGET/discoveredStatementsStatement discovery tracking
Normalized IntervalsGET/normalizedIntervalsNormalized interval data for meters
IntervalsGET/intervalsRaw interval data for meters
ProvidersGET/providersProvider directory
Service TypesGET/serviceTypesAvailable service types
Arcadia Connect URLPOST/credentials/encodedConnectUrlGenerate Arcadia Connect URLs
MFA SubmitPOST/credentials/{id}/mfaSubmit Multi Factor Authentication method
OTP SubmitPOST/credentials/{id}/otpSubmit one-time password
Sandbox Statement GenerationPOST/credentials/{id}/newStatementGenerate a new statement for a sandbox credential; requires sandbox mode
Webhook TestPOST/webhooks/{id}/testTest webhook delivery

Removed/Changed UC Endpoints

UC EndpointStatus in PlugAlternative
GET /{resource}/searchableFieldsRemovedSearchable fields are now documented in the API Reference
GET /accountDataChangedAvailable via statement details accountData field
GET /meterDataChangedAvailable via statement details
GET /tariffsChangedAvailable via statement details
GET /chargesChangedAvailable via statement details
GET /usageChangedAvailable via statement details

5. Response Format Changes

HATEOAS/HAL Removal

The most significant structural change is the removal of HATEOAS (Hypermedia as the Engine of Application State) and HAL (Hypertext Application Language) formatting.

Utility Cloud response (HAL+JSON):

{
  "_embedded": {
    "accounts": [
      {
        "entityId": "1eedaa3e-bccb-d579-8f8d-6a861e9050ca",
        "accountNumber": "123456",
        "enabled": true,
        "createdDate": "2024-01-15T10:30:00Z",
        "_links": {
          "self": {
            "href": "https://api.urjanet.com/utility/accounts/1eedaa3e-bccb-d579-8f8d-6a861e9050ca"
          },
          "statements": {
            "href": "https://api.urjanet.com/utility/accounts/1eedaa3e-bccb-d579-8f8d-6a861e9050ca/statements"
          }
        }
      }
    ]
  },
  "_links": {
    "self": { "href": "https://api.urjanet.com/utility/accounts?page=0&size=20" },
    "next": { "href": "https://api.urjanet.com/utility/accounts?page=1&size=20" }
  },
  "page": {
    "size": 20,
    "totalElements": 150,
    "totalPages": 8,
    "number": 0
  }
}

Plug API response (plain JSON):

{
  "content": [
    {
      "id": "act_1eedaa3e-bccb-d579-8f8d-6a861e9050ca",
      "accountNumber": "123456",
      "isStatementsProductActive": true,
      "createdAt": "2024-01-15T10:30:00Z"
    }
  ],
  "page": {
    "size": 20,
    "totalElements": 150,
    "totalPages": 8,
    "number": 0
  }
}

Key Structural Differences

AspectUtility CloudPlug API
Collection wrapper_embedded.{resourceName}content
Navigation links_links object with self, next, prevRemoved — use page metadata
Resource links_links on each resourceRemoved
Pagination metadatapage objectpage object (same structure)
Content-Typeapplication/hal+jsonapplication/json

Statement Endpoint Split

In UC, the statement list and single-get endpoints returned the same full structure. In Plug, statements are split:

EndpointReturns
GET /statementsSummary — core fields (id, dates, amounts, provider, accountData summary)
GET /statements/{id}Detailed — full fields including charges, usages, account data
GET /statements/detailsDetailed list — paginated list with full detail

Migration Action

  1. Remove all code that parses _embedded wrappers — access content directly
  2. Remove all code that follows _links for navigation — use page metadata instead
  3. Remove all code that reads _links from individual resources
  4. Update your Content-Type expectations from application/hal+json to application/json
  5. If you need full statement details in list calls, use GET /statements/details instead of GET /statements

6. ID Format Changes

All resource IDs in the Plug API are prefixed with a resource-type identifier.

ID Prefix Table

ResourcePrefixUC ExamplePlug Example
Accountact_1eedaa3e-bccb-d579-8f8d-6a861e9050caact_1eedaa3e-bccb-d579-8f8d-6a861e9050ca
Credentialcrd_1eedaa3e-bccb-d579-8f8d-6a861e9050cacrd_1eedaa3e-bccb-d579-8f8d-6a861e9050ca
Statementstm_1eedaa3e-bccb-d579-8f8d-6a861e9050castm_1eedaa3e-bccb-d579-8f8d-6a861e9050ca
Metermtr_1eedaa3e-bccb-d579-8f8d-6a861e9050camtr_1eedaa3e-bccb-d579-8f8d-6a861e9050ca
Filefil_1eedaa3e-bccb-d579-8f8d-6a861e9050cafil_1eedaa3e-bccb-d579-8f8d-6a861e9050ca
Sitesit_1eedaa3e-bccb-d579-8f8d-6a861e9050casit_1eedaa3e-bccb-d579-8f8d-6a861e9050ca
Organizationorg_12345org_12345
Webhookwhk_1eedaa3e-bccb-d579-8f8d-6a861e9050cawhk_1eedaa3e-bccb-d579-8f8d-6a861e9050ca
Paymentpmt_1eedaa3e-bccb-d579-8f8d-6a861e9050capmt_1eedaa3e-bccb-d579-8f8d-6a861e9050ca
Providerprv_eedaa3e-bccb-d579-8f8d-6a861e9050caprv_eedaa3e-bccb-d579-8f8d-6a861e9050ca
Usageusg_1eedaa3e-bccb-d579-8f8d-6a861e9050causg_1eedaa3e-bccb-d579-8f8d-6a861e9050ca
Chargechg_1eedaa3e-bccb-d579-8f8d-6a861e9050cachg_1eedaa3e-bccb-d579-8f8d-6a861e9050ca
Async Jobjob_1eedaa3e-bccb-d579-8f8d-6a861e9050cajob_1eedaa3e-bccb-d579-8f8d-6a861e9050ca
Downloaddwl_1eedaa3e-bccb-d579-8f8d-6a861e9050cadwl_1eedaa3e-bccb-d579-8f8d-6a861e9050ca
Deletion Logdel_1eedaa3e-bccb-d579-8f8d-6a861e9050cadel_1eedaa3e-bccb-d579-8f8d-6a861e9050ca
Eventevt_1eedaa3e-bccb-d579-8f8d-6a861e9050caevt_1eedaa3e-bccb-d579-8f8d-6a861e9050ca
Bulk Uploadbup_1eedaa3e-bccb-d579-8f8d-6a861e9050cabup_1eedaa3e-bccb-d579-8f8d-6a861e9050ca
Expected Accounteac_1eedaa3e-bccb-d579-8f8d-6a861e9050caeac_1eedaa3e-bccb-d579-8f8d-6a861e9050ca
Expected Meteremt_1eedaa3e-bccb-d579-8f8d-6a861e9050caemt_1eedaa3e-bccb-d579-8f8d-6a861e9050ca
Discovered Statementdss_1eedaa3e-bccb-d579-8f8d-6a861e9050cadss_1eedaa3e-bccb-d579-8f8d-6a861e9050ca
Statement Versionstv_stv_1eedaa3e-bccb-d579-8f8d-6a861e9050ca
Discovered Stmt Versiondsv_dsv_1eedaa3e-bccb-d579-8f8d-6a861e9050ca
Alternate Accessalt_alt_1eedaa3e-bccb-d579-8f8d-6a861e9050ca
Errorerr_err_abc123def (NanoID, not UUID)

Note: Additional resource ids can be added down the road for new Entities and would not be considered breaking.

ID Field Name Change

The field name itself also changes:

Utility CloudPlug API
entityIdid

Note: Error IDs use NanoIDs (not UUIDs) and follow the format err_<nanoid>.

Migration Action

  1. Update all ID parsing logic to handle the prefix format
  2. Replace references to entityId with id
  3. When sending IDs in requests (path parameters, request bodies), use the prefixed format
  4. If you store IDs externally, plan for the prefix addition

7. Field Naming Convention Changes

The Plug API applies systematic naming rules across all resources:

Naming Rules

PatternUtility CloudPlug APIExample
Timestamps (date+time)*Date*AtcreatedDatecreatedAt
Date-only fieldsperiodStart*DateperiodStartperiodStartDate
Boolean fieldsVariousis* prefixenabledisActive
"Actual name" fields*ActualName*AsPrinted or *NameAsPrintedchargeActualNamechargeNameAsPrinted
AbbreviationsAbbreviatedExpandedpodNumberpointOfDeliveryNumber
ID referencesentityIdidentityIdid

Common Field Renames Across All Resources

Utility Cloud FieldPlug API Field
entityIdid
createdDatecreatedAt
lastModifiedDatelastModifiedAt
discoveredDatediscoveredAt
periodStartperiodStartDate
periodEndperiodEndDate
enabledisActive (Credential) or isStatementsProductActive (Account)
providerName(moved inside provider.name)
providerAlias(removed — use provider.name)

8. Resource Field Mappings

This section provides field-by-field mapping tables for every resource type. Fields marked New exist only in Plug. Fields marked Removed exist only in UC.

8.1 Account

UC FieldPlug FieldTypeNotes
entityIdidUUIDRenamed (see Section 6)
accountNumberaccountNumberStringUnchanged
normalizedAccountNumbernormalizedAccountNumberStringUnchanged
enabledisStatementsProductActivebooleanRenamed
statusstatusEnumValues renamed (see Section 9.1)
statusDetailstatusDetailEnumValues renamed (see Section 9.2)
createdDatecreatedAtDateRenamed
createdBycreatedByStringUnchanged
lastModifiedDatelastModifiedAtDateRenamed
lastModifiedBylastModifiedByStringUnchanged
firstExtractedfirstExtractedAtDateRenamed
lastSuccessfulExtractionlastSuccessfulStatementExtractionAtDateRenamed + expanded
latestNewStatementlatestNewStatementAtDateRenamed
latestStatementDatelatestStatementDateDateUnchanged
nextExpectedPostDatenextExpectedPostDateDateUnchanged
providerproviderObjectSame nested structure (but see Provider)
providerNameStringRemoved — use provider.name
providerClassificationproviderClassificationEnumValues renamed: PRIMARYPUBLISHER, SECONDARYPASS_THROUGH
serviceTypesserviceTypesListChanged from List<String> to List<PublicServiceTypeResource>
summaryAccountNumbersummaryAccountNumberStringUnchanged
typetypeEnumUnchanged (AccountType)
originEnumRemoved — Indicated how data was first sourced: FILE_UPLOAD (manually uploaded) or WEB_NAVIGATION (extracted via automated web navigation). This field has been replaced by dataIngestionMethod on Statement resources (see Section 9.11).
prepaidprepaidbooleanUnchanged
meterCountIntegerRemoved
customDatacustomDataObjectUnchanged structure
billingCycleEnumNew — The expected billing cycle. Determined by the service period of the most recent Statement.
summaryAccountIdUUIDNew — The unique identifier of the summary account.
siteNamesList<String>New — An array of names for Sites.
isCustomerActionRequiredbooleanNew — Indicates whether any action is required from you regarding this resource.
correlationIdsList<String>New — A list of correlationIds cascaded from all directly associated Credentials and Files.
isHistoryFulfilledBooleanNew — If true, all Statement Gaps for this Account are EXPECTED, or Statement Gaps are not applicable for the Account, such as summary Accounts or Accounts without any CORE serviceTypeClassification Meters. If false, there is at least one Statement Gap that is not EXPECTED or the gaps are pending computation.
isAccessiblebooleanNew — Indicates whether the Account has at least one Credential associated with it in an accessible status detail.
isIntervalsThirdPartyPortalAccountbooleanNew — Indicates whether or not this account is enrolled under an intervals third party portal.
voidedAtDateNew — A timestamp indicating when the entity was voided. This value resets to null if the entity is unvoided. See event history for additional context.

8.2 Credential

UC FieldPlug FieldTypeNotes
entityIdidUUIDRenamed (see Section 6)
correlationIdcorrelationIdStringUnchanged
enabledisActivebooleanRenamed
statusstatusEnumValues renamed (see Section 9.3)
statusDetailstatusDetailEnumValues renamed (see Section 9.4)
createdDatecreatedAtDateRenamed
createdBycreatedByStringUnchanged
lastModifiedDatelastModifiedAtDateRenamed
lastModifiedBylastModifiedByStringUnchanged
nextScheduledRunnextScheduledAccountRunAtDateRenamed
providerproviderObjectSame nested structure
providerNameStringRemoved — use provider.name
totalAccountstotalAccountsintUnchanged
usernameusernameStringUnchanged
username2username2StringUnchanged
username3username3StringUnchanged
username4username4StringUnchanged
websitewebsiteStringUnchanged
thirdPartyPortalisThirdPartyPortalbooleanRenamed with is prefix
runHistorybooleanRemoved
isCustomerActionRequiredbooleanNew — Indicates whether any action is required from you regarding this resource.
customerGivenWebsiteStringNew — The website provided by the customer when creating this credential.
isAccessiblebooleanNew — Indicates whether Arcadia is potentially able to successfully log into the Credential.
multiFactorAuthenticationOptOutStatusEnumNew — The status of Multi Factor Authentication Opt Out for the Credential.
lastSuccessfulMultiFactorAuthenticationOptOutAtDateNew — The timestamp indicating when this Credential was last successfully opted out of Multi Factor Authentication.
alternateAccessesListNew — This field is part of the guestAccess feature.
connectionHealthEnumNew — This field is part of the guestAccess feature.

8.3 Statement

The Plug API splits statements into Summary and Detailed views.

Statement Summary (List endpoint: GET /statements)

UC FieldPlug Summary FieldTypeNotes
entityIdidUUIDRenamed (see Section 6)
providerproviderObjectUnchanged
statementDatestatementDateDateUnchanged
periodStartperiodStartDateDateRenamed
periodEndperiodEndDateDateRenamed
createdDatecreatedAtDateRenamed
discoveredDatediscoveredAtDateRenamed
lastModifiedDatelastModifiedAtDateRenamed
dueDatedueDateDateUnchanged
amountDueamountDueBigDecimalUnchanged
totalChargestotalChargesBigDecimalUnchanged
outstandingBalanceoutstandingBalanceBigDecimalUnchanged
invoiceNumberinvoiceNumberStringUnchanged
statementTypetypeEnumRenamed field
summaryAccountNumbersummaryAccountNumberStringUnchanged
normalizedSummaryAccountNumbernormalizedSummaryAccountNumberStringUnchanged
providerNameStringRemoved
providerAliasStringRemoved
originEnumRemoved — see dataIngestionMethod
accountIdsListRemoved from summary — see accountData
accountNumbersListRemoved from summary — see accountData
meterIdsListRemoved from summary
meterNumbersListRemoved from summary
siteIdsListRemoved from summary
siteNamesListRemoved from summary
credentialIdsListRemoved from summary
accountDataListNew — Data related to individual accounts, including billing information, usage history, etc.
dataIngestionMethodEnumNew — Identifies the data ingestion method that created this Statement.
correlationIdsList<String>New — A list of correlationIds cascaded from all directly associated Credentials and Files.
currencyCodeEnumNew — The ISO 4217 currency code for charges. This list will grow as additional currencies are supported over time.
discoveredStatementIdStringNew — The unique identifier for the discovered statement in the Arcadia platform.
versionIdStringNew — A unique identifier for the version of the statement entity at a given moment in time.
isLatestVersionbooleanNew — Indicates whether the Statement is the most recent versionId of the Statement.

Statement Detailed (Single get: GET /statements/{id} or list: GET /statements/details)

Includes all Summary fields plus:

UC FieldPlug Detailed FieldTypeNotes
amountDueAfterDueDateamountDueAfterDueDateBigDecimalUnchanged
amountDueBeforeDueDateamountDueBeforeDueDateBigDecimalUnchanged
customerNumbercustomerNumberStringUnchanged
cycleNumbercycleNumberStringUnchanged
disconnectDatedisconnectDateDateUnchanged
discountBeforeDueDatediscountBeforeDueDateBigDecimalUnchanged
finalBillNoticeisFinalBillbooleanChanged from String to boolean
newChargesnewChargesBigDecimalUnchanged
previousBalancepreviousBalanceBigDecimalUnchanged
previousStatementDatepreviousStatementDateDateUnchanged
sourceTypesourceTypeEnumUnchanged
summaryAccountIdsummaryAccountIdUUIDWas on detailed resource in UC too
accountDataListNew — Data related to individual accounts, including billing information, usage history, etc.
chargesListNew — Details of charges applied, including amounts, currency, etc.
credentialIdsList<String>New — An unique identifier for a credential.

8.4 Meter

UC FieldPlug FieldTypeNotes
entityIdidUUIDRenamed (see Section 6)
meterNumbermeterNumberStringUnchanged
normalizedMeterNumbernormalizedMeterNumberStringUnchanged
meterStatusEnumRemoved — no meter status in Plug
createdDatecreatedAtDateRenamed
createdBycreatedByStringUnchanged
lastModifiedDatelastModifiedAtDateRenamed
lastModifiedBylastModifiedByStringUnchanged
nextExpectedPostDatenextExpectedPostDateDateUnchanged
providerproviderObjectUnchanged
providerNameStringRemoved — use provider.name
serviceTypeserviceTypeStringUnchanged
serviceDescriptiongeneralDescriptionAsPrintedStringRenamed
serviceAddressserviceAddressObjectUnchanged structure
sitesiteObjectUnchanged
currentTariffcurrentTariffObjectUnchanged
customDatacustomDataObjectUnchanged
bulbTypebulbTypeStringUnchanged
pipeTypepipeTypeStringUnchanged
meterConstantMultipliermeterConstantMultiplierBigDecimalUnchanged
previousMeterConstantMultiplierpreviousMeterConstantMultiplierBigDecimalUnchanged
previousMeterNumberpreviousMeterNumberStringUnchanged
normalizedPreviousMeterNumberStringRemoved
podNumberpointOfDeliveryNumberStringRenamed — abbreviation expanded
normalizedPodNumbernormalizedPointOfDeliveryNumberStringRenamed — abbreviation expanded
accountIdsList<String>Removed — see accounts
accountNumbersList<String>Removed — see accounts
isIntervalsDormantisIntervalsDormantBooleanUnchanged
accountsListNew — An array of the accounts this meter belongs to. These accounts are searchable on accountNumber and accountId.
statusEnumNew — Status of the resource.
statusDetailEnumNew — Reason the resource has the current status.
serviceTypeClassificationEnumNew — The classification for the service type depending on the comprehensiveness of data that can be returned.
earliestIntervalAtDateNew — A timestamp of the earliest interval available for the meter.
latestIntervalAtDateNew — A timestamp of the latest interval available for the meter.
latestStatementDateDateNew — The date of the most recent statement.
isIntervalsProductActivebooleanNew — Indicates if intervals is activated for the meter.
localTimezoneStringNew — For meters that have intervals available, the meter's local timezone. The value can be any TZ identifier from this this list.
correlationIdsList<String>New — A list of correlationIds cascaded from all directly associated Credentials and Files.
isIntervalsThirdPartyPortalMeterbooleanNew — Indicates whether or not this meter is enrolled under an intervals third party portal.
isLocationRecommendationIgnoredbooleanNew — Indicates whether or not location recommendation should be ignored.
isStandalonebooleanNew — Indicates a meter is not expected to relate to a site.
latestIntervalsCheckedAtDateNew — A timestamp of the most recent intervals check Arcadia attempted.
voidedAtDateNew — A timestamp indicating when the entity was voided. This value resets to null if the entity is unvoided. See event history for additional context.

8.5 Site

UC FieldPlug FieldTypeNotes
entityIdidUUIDRenamed (see Section 6)
siteNamesiteNameStringUnchanged
siteCodesiteCodeStringUnchanged
siteNumbersiteNumberStringUnchanged
regionregionStringUnchanged
subRegionsubRegionStringUnchanged
facilityTypefacilityTypeStringDeprecated in Plug — use buildingType
serviceAddressserviceAddressObjectUnchanged
createdDatecreatedAtDateRenamed
createdBycreatedByStringUnchanged
lastModifiedDatelastModifiedAtDateRenamed
lastModifiedBylastModifiedByStringUnchanged
meterIdsList<String>New — An array of unique identifiers for multiple meters.
areaIntegerNew — The area of the Site in square feet.
numberOfStoriesIntegerNew — The number of stories of the Site.
yearBuiltIntegerNew — The year the Site was built.
hvacHeatTypeEnumNew — The type of heating system in the Site.
hvacCoolTypeEnumNew — The type of cooling system in the Site.
hvacVentTypeEnumNew — The type of ventilation system in the Site.
heatingFuelEnumNew — The type of heating fuel used in the Site.
buildingTypeEnumNew — The type of building.
buildingTypeGroupEnumNew — The group of building types.
addressIssueTypeEnumNew — Issue type of a site's address.
isLocationRecommendationIgnoredbooleanNew — Indicates if a site has been opted out of address verification.

8.6 File

UC FieldPlug FieldTypeNotes
entityIdidUUIDRenamed (see Section 6)
fileNamefileNameStringUnchanged
fileStatusstatusEnumRenamed; values changed (see Section 9.5)
fileDetailsstatusDetailsListRenamed
correlationIdcorrelationIdStringUnchanged
providerproviderObjectUnchanged
providerNameStringRemoved — use provider.name
accountNumbersaccountNumbersList<String>Unchanged
transferMethodtransferMethodEnumUnchanged
createdDatecreatedAtDateRenamed
createdBycreatedByStringUnchanged
lastModifiedDatelastModifiedAtDateRenamed
idStringRemoved (replaced by prefixed id)
statementIdUUIDNew — The unique identifier of a statement.
statementDateDateNew — The date of the statement.
isCustomerActionRequiredbooleanNew — Indicates whether any action is required from you regarding this resource.
discoveredStatementIdStringNew — The unique identifier for the discovered statement in the Arcadia platform.

8.7 Webhook

UC FieldPlug FieldTypeNotes
entityIdidUUIDRenamed (see Section 6)
webhookUrlwebhookUrlStringUnchanged
statusstatusEnumValues renamed (see Section 9.6)
eventTypeeventTypeEnumValues renamed (see Section 11)
messagemessageStringUnchanged
numberOfAttemptsnumberOfAttemptsIntegerUnchanged
lastAttemptedSendlastAttemptedSendAtDateRenamed
nextScheduledSendnextScheduledSendAtDateRenamed
lastSendHttpStatuslastSendHttpStatusIntegerUnchanged
createdDatecreatedAtDateRenamed
createdByStringRemoved
lastModifiedDateDateRemoved
lastModifiedByStringRemoved
resourceEnumNew — The resource type of the entity that the webhook references. This field determines the structure of the payload contained in the data field of the webhook body.

8.8 Payment

UC FieldPlug FieldTypeNotes
entityIdidUUIDRenamed (see Section 6)
amountamountBigDecimalUnchanged
currencycurrencyStringUnchanged
paymentDatepaymentDateDateUnchanged

8.9 Usage

UC FieldPlug FieldTypeNotes
entityIdidUUIDRenamed (see Section 6)
createdDatecreatedAtDateRenamed
lastModifiedDatelastModifiedAtDateRenamed
periodStartperiodStartDateDateRenamed
periodEndperiodEndDateDateRenamed
rateOrTariffActualNamerateOrTariffNameAsPrintedStringRenamed
usageActualNameusageNameAsPrintedStringRenamed
citedUsagecitedUsageBigDecimalUnchanged
measuredUsagemeasuredUsageBigDecimalUnchanged
usageUnitusageUnitStringUnchanged
measurementTypemeasurementTypeStringUnchanged
meterReadDatemeterReadDateDateUnchanged
meterReadTypemeterReadTypeStringUnchanged
readTypeAsPrintedreadTypeAsPrintedStringUnchanged
previousReadTypeAsPrintedpreviousReadTypeAsPrintedStringUnchanged
previousMeterReadTypepreviousMeterReadTypeStringUnchanged
meterReadingRawmeterReadingRawBigDecimalUnchanged
meterReadingRawPreviousmeterReadingRawPreviousBigDecimalUnchanged
meterReadingDeltameterReadingDeltaBigDecimalUnchanged
meterReadingDeltaPreviousmeterReadingDeltaPreviousBigDecimalUnchanged
meterReadingDeltaUsageUnitmeterReadingDeltaUsageUnitStringUnchanged
meterConstantMultipliermeterConstantMultiplierBigDecimalUnchanged
meterConversionMultipliermeterConversionMultiplierBigDecimalUnchanged
numberOfDaysInPeriodnumberOfDaysInPeriodBigDecimalUnchanged
previousUsagepreviousUsageBigDecimalUnchanged
prevReadDateprevReadDateDateUnchanged
hoursOfUsehoursOfUseBigDecimalUnchanged
loadFactorloadFactorBigDecimalUnchanged
loadTypeloadTypeStringUnchanged
powerFactorpowerFactorBigDecimalUnchanged
calorificValuecalorificValueBigDecimalUnchanged
pressureMultiplierpressureMultiplierBigDecimalUnchanged
outageBlockoutageBlockStringUnchanged
readingSchedulereadingScheduleStringUnchanged
contributionStatuscontributionStatusEnumUnchanged
prorationStatusprorationStatusEnumUnchanged
tariffRateComponentstariffRateComponentsListUnchanged

8.10 Charge

UC FieldPlug FieldTypeNotes
idUUIDNew — The unique record identifier for this charge (prefixed chg_). This is NOT a charge classification or mapping name — it is the database identifier for the charge line item.
chargeActualNamechargeNameAsPrintedStringRenamed
chargeNameStringRemoved — This was the normalized/mapped charge category name in UC. In Plug, the printed charge label is available via chargeNameAsPrinted. There is no direct replacement for the normalized charge name.
averageUnitCostaverageUnitCostAsPrintedBigDecimalRenamed
createdDatecreatedAtDateRenamed
lastModifiedAtDateNew — The timestamp indicating when this resource was last modified.
periodStartperiodStartDateDateRenamed
periodEndperiodEndDateDateRenamed
chargeAmountchargeAmountBigDecimalUnchanged
chargeAmountCurrencychargeAmountCurrencyStringUnchanged
chargeCurrencyCodechargeCurrencyCodeEnumUnchanged
chargeGroupHeadingchargeGroupHeadingStringUnchanged
chargeRatechargeRateBigDecimalUnchanged
chargeRateAdderchargeRateAdderBigDecimalUnchanged
chargeRateBasechargeRateBaseBigDecimalUnchanged
chargeRateCurrencychargeRateCurrencyStringUnchanged
chargeTypechargeTypeEnumUnchanged
chargeUnitsUsedchargeUnitsUsedBigDecimalUnchanged
additionalRateMultiplieradditionalRateMultiplierBigDecimalUnchanged
unitsPerRateunitsPerRateBigDecimalUnchanged
usageUnitusageUnitStringUnchanged
measurementTypemeasurementTypeStringUnchanged
lifecycleStagelifecycleStageStringUnchanged
contributionStatuscontributionStatusEnumUnchanged
prorationStatusprorationStatusEnumUnchanged
tarifftariffObjectUnchanged
tariffRateComponentstariffRateComponentsListUnchanged

8.11 Tariff

UC FieldPlug FieldTypeNotes
tariffNametariffNameStringUnchanged
createdDateDateRemoved
providerproviderObjectUnchanged
providerNameStringRemoved — use provider.name
providerAliasStringRemoved

8.12 Provider

UC FieldPlug FieldTypeNotes
entityIdidUUIDRenamed (see Section 6)
providerNamenameStringRenamed
countrycountryStringUnchanged
supportsCredentialValidationisRealTimeCredentialValidationSupportedbooleanRenamed
websiteStringRemoved (was deprecated in UC)
isIntervalDataSupportedbooleanNew — Indicates whether the provider supports interval data.
isIntervalFileUploadSupportedbooleanNew — Indicates whether the provider supports interval file upload.
intervalServiceTypesSet<Enum>New — List of interval service types supported by this provider (e.g., ['electric', 'gas']).

8.13 Organization

UC FieldPlug FieldTypeNotes
entityIdidUUIDRenamed (see Section 6) Organization IDs are numeric (not UUIDs) because they originate from the authentication system.
namenameStringUnchanged
accountCustomData1NameaccountCustomData25NameSameStringUnchanged (25 fields)
meterCustomData1NamemeterCustomData10NameSameStringUnchanged (10 fields)

8.14 Download Request

UC FieldPlug FieldTypeNotes
entityIdidUUIDRenamed (see Section 6)
createdDatecreatedAtDateRenamed
tokenStringNew — We require this token to be provided when you want to access the requested download file. If you made the request via an API call, this token can be found in our response to you. If you made the request via the Dashboard, this token already be included in the email we would send you.
statusEnumNew — Status of the resource.
downloadMethodEnumNew — Method used for downloading data.

8.15 Deletion Log

UC FieldPlug FieldTypeNotes
entityIdidUUIDRenamed (see Section 6)
statusstatusEnumValues renamed (see Section 9.8)
createdDatecreatedAtDateRenamed

8.16 Event Resources

Event resources (Account, Credential, Meter, File, Site) all follow the same pattern:

UC FieldPlug FieldTypeNotes
idUUIDNew — A unique identifier for the event.
eventTypeeventTypeEnumValues renamed (see Section 10)
createdDatecreatedAtDateRenamed
createdBycreatedByStringUnchanged
fieldNamefieldNameStringUnchanged
oldValueoldValueStringUnchanged
newValuenewValueStringUnchanged

8.17 Address

UC FieldPlug FieldTypeNotes
addressTypeaddressTypeEnumEnum values changed: RAWCUSTOMER_PREFERRED (see Section 9.10)
streetLine1streetLine1StringUnchanged
streetLine2streetLine2StringUnchanged
citycityStringUnchanged
statestateStringUnchanged
countrycountryStringUnchanged
postalCodepostalCodeStringUnchanged
fullAddressfullAddressStringUnchanged
recipientrecipientStringUnchanged

8.18 Custom Data

The custom data structure is identical in both APIs:

{
  "customData": {
    "label1": "value1",
    "label2": "value2"
  }
}

Custom data field names are configured at the organization level using accountCustomData1Name through accountCustomData25Name (accounts) and meterCustomData1Name through meterCustomData10Name (meters).


9. Status & Enum Value Mappings

9.1 Account Status

UC ValuePlug ValueDescription
NEW_ACCOUNTNEW_ACCOUNTNewly created account
OKCONNECTION_SUCCESSSuccessfully connected
PENDINGCONNECTION_IN_PROGRESSConnection in progress
ACCESS_ISSUEDATA_ACCESS_FAILURECannot access data
OLDINACTIVEAccount has not received new statements for 12+ months. Evaluated daily by an automated process based on statement date (12-month threshold), period end date (14-month threshold), and account creation date (2-month threshold with no statements).
CONNECTION_DEACTIVATEDCONNECTION_DEACTIVATEDConnection deactivated

9.2 Account Status Detail

UC ValuePlug Value
NO_ACTION_REQUIREDDATA_ACCESSIBLE
UNDER_REVIEW (when status=PENDING)ISSUE_UNDER_REVIEW
UNDER_REVIEW (when status!=PENDING)CREDENTIAL_ISSUE
EXTRACTION_FAILUREISSUE_UNDER_REVIEW
REQUIRES_ENROLLMENTISSUE_UNDER_REVIEW
PENDING_ENROLLMENTISSUE_UNDER_REVIEW
ACCOUNT_NOT_FOUNDNO_DATA_AVAILABLE
ACCOUNT_NUMBER_CHANGENO_DATA_AVAILABLE
ACCOUNT_SETUP_REQUIREDNO_DATA_AVAILABLE
INVALID_SOURCENO_DATA_AVAILABLE
STATEMENT_UNAVAILABLENO_DATA_AVAILABLE
E_BILL_REQUIREDCREDENTIAL_ISSUE
DORMANTNO_BILLS_DISCOVERED_AFTER_MOST_RECENT_NEXT_EXPECTED_POST_DATE
ACCOUNT_CLOSEDNO_BILLS_DISCOVERED_AFTER_FINAL_BILL_NOTICE
EMAIL_APPROVALEMAIL_APPROVAL
UNSUCCESSFUL_EMAIL_APPROVALUNSUCCESSFUL_EMAIL_APPROVAL
USER_REVOKED_ACCESSUSER_REVOKED_ACCESS
STATEMENT_EXTRACTION_NOT_REQUESTEDSTATEMENT_EXTRACTION_NOT_REQUESTED

9.3 Credential Status

UC ValuePlug ValueDescription
OKCONNECTION_SUCCESSSuccessfully connected
PENDINGCONNECTION_IN_PROGRESSConnection in progress
ACTION_REQUIREDCONNECTION_FAILUREConnection failed
NON_FUNCTIONALCONNECTION_DEACTIVATEDAuto-deactivated
CONNECTION_DEACTIVATEDCONNECTION_DEACTIVATEDManually deactivated
ALTERNATE_ACCESSALTERNATE_ACCESSData is being accessed through an alternate login (Guest Access) attached to the primary credential, rather than the primary credential's own login. If no alternate access exists, the connection health will match the credential status.

9.4 Credential Status Detail

UC ValuePlug Value
NO_ACTION_REQUIREDLOGIN_AND_DATA_DISCOVERY_SUCCESS
NO_STATEMENTSLOGIN_AND_DATA_DISCOVERY_SUCCESS
LOGIN_FAILUREINVALID_CREDENTIALS
WEBSITE_DOWNPROVIDER_WEBSITE_INACCESSIBLE
UNDER_REVIEWISSUE_UNDER_REVIEW
NAVIGATION_FAILUREPROVIDER_WEBSITE_NAVIGATION_FAILURE
UNSUPPORTED_CAPTCHAUNSUPPORTED_CAPTCHA
MULTI_FACTOR_AUTH_FAILUREMULTI_FACTOR_AUTHENTICATION_FAILURE
MULTI_FACTOR_AUTH_NOT_IMPLEMENTEDUNSUPPORTED_MULTI_FACTOR_AUTHENTICATION
MULTI_FACTOR_AUTH_TIMEOUTMULTI_FACTOR_AUTHENTICATION_TIMEOUT
MULTI_FACTOR_AUTH_REFRESH_REQUIREDMULTI_FACTOR_AUTHENTICATION_REFRESH_REQUIRED
LOGIN_AND_INTERVALS_DISCOVERY_SUCCESSLOGIN_AND_INTERVALS_DISCOVERY_SUCCESS
LOGIN_SUCCESS_INTERVALS_DISCOVERY_FAILURELOGIN_SUCCESS_INTERVALS_DISCOVERY_FAILURE
DATA_EXTRACTION_IN_PROGRESSDATA_EXTRACTION_IN_PROGRESS
REQUIRES_ENROLLMENTREQUIRES_ENROLLMENT
EMAIL_APPROVALEMAIL_APPROVAL
UNSUCCESSFUL_EMAIL_APPROVALUNSUCCESSFUL_EMAIL_APPROVAL
USER_REVOKED_ACCESSUSER_REVOKED_ACCESS
PROVIDER_REGISTRATION_INCOMPLETEPROVIDER_REGISTRATION_INCOMPLETE
DATA_EXTRACTION_NOT_REQUESTEDDATA_EXTRACTION_NOT_REQUESTED
GUEST_ACCESS_SYNC_INCOMPLETEGUEST_ACCESS_SYNC_INCOMPLETE
GUEST_ACCESS_CONFIGURATION_IN_PROGRESSGUEST_ACCESS_CONFIGURATION_IN_PROGRESS
GUEST_ACCESS_CONFIGURATION_FAILUREGUEST_ACCESS_CONFIGURATION_FAILURE
GUEST_ACCESS_NOT_SUPPORTEDGUEST_ACCESS_NOT_SUPPORTED
GUEST_ACCESS_REMOVEDGUEST_ACCESS_REMOVED
USER_ACTION_REQUIREDOTHER_ACCESS_LIMITATION
LIMITED_ACCESSOTHER_ACCESS_LIMITATION
ACCOUNT_LOCKEDOTHER_ACCESS_LIMITATION
SECURITY_QUESTIONSOTHER_ACCESS_LIMITATION
E_BILL_REQUIREDOTHER_ACCESS_LIMITATION
PROVIDER_ISSUEOTHER_ACCESS_LIMITATION
STATEMENT_UNAVAILABLEOTHER_ACCESS_LIMITATION
NO_ACCOUNTS_FOUNDOTHER_ACCESS_LIMITATION
LOGIN_ATTEMPTS_EXCEEDEDOTHER_ACCESS_LIMITATION
ACCOUNT_SETUP_REQUIREDOTHER_ACCESS_LIMITATION

9.5 File Status

UC ValuePlug Value
QUEUEDQUEUED
IN_PROGRESSIN_PROGRESS
SUCCESSSUCCESS
REJECTEDFAILURE
COVERAGE_REQUESTCOVERAGE_REQUEST

Note: Files can go back and be reprocessed after initial success.

9.6 Webhook Status

UC ValuePlug Value
SUCCESSSUCCESS
ERRORFAILURE
WAITING_RESENDWAITING_RESEND

9.7 Provider Classification

UC ValuePlug ValueDescription
PRIMARYPUBLISHERThe Publisher Provider is the entity whose logo, branding, and return address appear on the utility invoice.
SECONDARYPASS_THROUGHA separate utility mentioned (with or without charges) on the publisher's invoice.

9.8 Deletion Log Status

UC ValuePlug Value
REQUESTEDREQUESTED
SCHEDULEDSCHEDULED
PENDINGSCHEDULED
COMPLETEDSUCCESS
ERRORFAILURE

9.9 Download Status

UC ValuePlug Value
SUCCESSSUCCESS
PENDINGPREPARING
FAILEDFAILURE
EMAIL_FAILEDFAILURE
NO_CONTENTNO_CONTENT

9.10 Address Type

UC ValuePlug ValueDescription
FULLFULLAddress has been fully normalized and validated
PARTIALPARTIALAddress was only partially normalized
RAWCUSTOMER_PREFERREDAddress is used exactly as provided by the customer, with no normalization or processing applied

Why the rename? In UC, RAW meant "no address processing was applied — this is the address exactly as the customer provided it." Plug renamed this to CUSTOMER_PREFERRED to better communicate what the value actually represents: this is the address format the customer wants used. The underlying behavior is identical — no normalization is performed. The name was changed because "raw" implied the data was incomplete or unfinished, when in reality the customer intentionally provided it this way (e.g., when creating a site via the API).

9.11 Data Ingestion Method (New in Plug)

Maps from UC's StatementOrigin:

UC origin ValuePlug dataIngestionMethod Value
FILE_UPLOADBILL_UPLOAD
WEB_NAVIGATIONUTILITY_WEBSITE_ACCESS
(default)UTILITY_WEBSITE_ACCESS

9.12 Service Type Classification (New in Plug)

New classification that categorizes service types:

ClassificationService Types
COREGAS, ELECTRIC, WATER, LIGHTING, SEWER, IRRIGATION
SUPPLEMENTALSTEAM, FUEL_OIL, PROPANE, SANITATION, DISTRICT_HEAT, CHILLED_WATER, INTERNET, TELEVISION, LANDLINE_PHONE, TELECOM

9.13 Connection Health (New in Plug)

Derived from credential status and alternate access information:

ValueDetermination
CONNECTION_SUCCESSCredential or alternate access is successful
CONNECTION_IN_PROGRESSCredential or Alternate access is in progress
CONNECTION_FAILURECredential status is CONNECTION_FAILURE
CONNECTION_DEACTIVATEDCredential is deactivated

9.14 MFA Opt-Out Status (New in Plug)

MFA Opt-Out Guide

ValueDescription
SUCCESSMFA opt-out succeeded
FAILUREMFA opt-out failed
IN_PROGRESSMFA opt-out in progress

Note : We can add values to these ENUMs any time without it being considered breaking.


10. Event Type Mappings

10.1 Account Events

UC ValuePlug Value
ACCOUNT_REQUESTEDCONNECTION_REQUEST_SUBMITTED
ACCOUNT_ENABLEDSTATEMENTS_PRODUCT_ACTIVATED
ACCOUNT_DISABLEDSTATEMENTS_PRODUCT_DEACTIVATED
ACCOUNT_UPDATEDACCOUNT_UPDATED
ACCOUNT_CUSTOM_DATA_UPDATEDACCOUNT_CUSTOM_DATA_UPDATED
ACCOUNT_CREATEDACCOUNT_CREATED

10.2 Credential Events

UC ValuePlug ValueNotes
CREDENTIAL_CREATEDCREDENTIAL_CREATED
CREDENTIAL_ENABLEDCREDENTIAL_ACTIVATEDRenamed
CREDENTIAL_DISABLEDCREDENTIAL_DEACTIVATEDRenamed
CREDENTIAL_UPDATEDCREDENTIAL_UPDATED

10.3 File Events

UC ValuePlug ValueNotes
FILE_CREATEDFILE_CREATED
FILE_CUSTOMER_STATUS_UPDATEDFILE_STATUS_UPDATEDRenamed
FILE_STATUS_DETAIL_UPDATEDFILE_STATUS_DETAIL_UPDATED
FILE_UPDATEDFILE_UPDATED

10.4 Meter Events

UC ValuePlug ValueNotes
METER_CREATIONMETER_CREATEDRenamed
METER_SITE_CHANGEMETER_SITE_REASSIGNEDRenamed
METER_ACCOUNT_CHANGEMETER_ACCOUNT_CHANGE
METER_TARIFF_CHANGEMETER_TARIFF_CHANGE
METER_CUSTOM_DATA_CHANGEMETER_CUSTOM_DATA_CHANGE
INTERVALS_PRODUCT_ACTIVATEDINTERVALS_PRODUCT_ACTIVATED
INTERVALS_PRODUCT_DEACTIVATEDINTERVALS_PRODUCT_DEACTIVATED
METER_UPDATEDMETER_UPDATED
INTERVALS_DORMANTINTERVALS_DORMANT

10.5 Site Events

UC ValuePlug ValueNotes
SITE_CREATEDSITE_CREATED
SITE_CUSTOM_DATA_CHANGESITE_DATA_UPDATEDRenamed
SITE_SERVICE_ADDRESS_CHANGESITE_SERVICE_ADDRESS_CHANGE
EXPECTED_METER_CREATEDEXPECTED_METER_CREATED
EXPECTED_METER_DELETEDEXPECTED_METER_DELETED
METER_ASSIGNEDMETER_ASSIGNED
METER_UNASSIGNEDMETER_UNASSIGNED

11. Webhook Changes

Behavioral Change

AspectUtility CloudPlug API
When webhooks fireOnly for statuses requiring customer actionAll status transitions on all stateful resources
Resources coveredStatements (new/modified)Credentials, accounts, files, deletions, downloads, and more
Event types5 typesSTATUS_CHANGE, MFA_CHALLENGE_METHOD, MFA_CHALLENGE_CODE, EXISTING_DATA_UPDATED, NEW_DATA_AVAILABLE, REAL_TIME_CREDENTIAL_VALIDATION_SUCCESS, REAL_TIME_CREDENTIAL_VALIDATION_FAILURE

Webhook Event Type Mapping

UC ValuePlug ValueDescription
NEW_STATEMENTNEW_DATA_AVAILABLENew data has been discovered
MODIFIED_STATEMENTEXISTING_DATA_UPDATEDExisting data was updated
DELETION_COMPLETESTATUS_CHANGEDeletion status change
LOGIN_SUCCESSREAL_TIME_CREDENTIAL_VALIDATION_SUCCESSRTCV succeeded
LOGIN_FAILUREREAL_TIME_CREDENTIAL_VALIDATION_FAILURERTCV failed
STATUS_CHANGENew — any resource status transition
MFA_CHALLENGE_METHODNew — MFA method challenge
MFA_CHALLENGE_CODENew — MFA code challenge

New Webhook Resource Field

The Plug API adds a resource field to webhook notifications that identifies which resource type triggered the webhook, making it easier to route webhook processing.

Migration Action

  1. Update webhook event type parsing to handle new values
  2. If you filter webhooks by event type, update your filters
  3. Expect significantly more webhook volume (all status transitions, not just action-required)
  4. Handle the new resource field for routing

12. Error Handling

Error Response Format

Utility Cloud:

{
  "message": "Bad request",
  "exception": null,
  "path": "/accounts/123",
  "status": 400,
  "error": "Detailed error message"
}

Plug API:

{
  "errors": [
    {
      "type": "invalidParameter",
      "message": "Human-readable error description",
      "param": "accountNumber",
      "details": {
        "errorId": "err_abc123def456"
      }
    }
  ]
}

Error Type Values

Plug Error TypeHTTP StatusDescription
invalidParameter400Bad request value, missing field, validation failure
notFound404Resource not found
forbidden403Insufficient permissions
conflict409Duplicate entity, data integrity violation
methodNotAllowed405HTTP method not supported
tooManyRequests429Rate limit exceeded
internalServerError500Unexpected server error

Key HTTP Status Code Changes

ExceptionUC StatusPlug StatusNotes
EntityNotFoundException400 Bad Request404 Not FoundFixed — now returns proper 404
ProviderNotFoundException400 Bad Request404 Not FoundFixed
AccessDeniedException403 Forbidden403 ForbiddenUnchanged
AlreadyExistsException409 Conflict409 ConflictUnchanged
RSQLParserException400 Bad Request400 Bad RequestUnchanged, better message
ConstraintViolationException400 Bad Request400 Bad RequestNow includes per-field detail

Key Differences

  1. Multiple errors: Plug returns ALL applicable errors in a single response (e.g., multiple validation failures), not just the first one
  2. Parameter identification: The param field tells you exactly which parameter caused the error
  3. Error IDs: Every error includes a unique errorId (NanoID format: err_*) for support reference
  4. Structured types: Errors are categorized by type instead of relying on HTTP status alone

Migration Action

  1. Update error parsing to read from errors array instead of flat fields
  2. Handle multiple errors per response
  3. Use type field for error categorization instead of parsing message
  4. Update any hardcoded HTTP status expectations (especially 400→404 for not-found)
  5. Log errorId from details for support escalations

13. Pagination, Sorting & Filtering

Pagination

Pagination works the same way in both APIs:

ParameterTypeDefaultDescription
pageinteger0Zero-based page number
sizeinteger20Number of items per page

Max page x size value can be 10000.

Response metadata:

{
  "page": {
    "size": 20,
    "totalElements": 150,
    "totalPages": 8,
    "number": 0
  }
}

Sorting

Sorting works the same way in both APIs:

GET /accounts?sort=createdAt,desc
GET /accounts?sort=accountNumber,asc&sort=createdAt,desc

Filtering / Search (RSQL)

Both APIs use the same RSQL query language. For full search syntax, operators, and encoding details, see the Plug API Searching Documentation.

Key Differences

  1. Search field values must use Plug enum values — e.g., search=status==CONNECTION_SUCCESS not search=status==OK
  2. Date format in search: yyyy-MM-dd (ISO_LOCAL_DATE)
  3. The /searchableFields endpoint is removed — refer to API documentation instead
  4. Be sure to URL encode the searches or it may not work as you intend

Searching Guide


14. Behavioral Changes

14.1 Credential Deduplication

Utility CloudPlug API
Allowed duplicate credentials if correlationId was uniqueReturns 409 Conflict if identical credentials are submitted, regardless of correlationId

Note : Clean up any lingering duplicate credentials as it makes for dirty data.

14.2 isCustomerActionRequired Flag

The Plug API adds an isCustomerActionRequired boolean to Account, Credential, and File resources. This flag indicates whether the customer needs to take action to resolve the current status.

Previously in UC, you had to interpret specific statusDetail values to determine if action was needed. Now the Plug API provides this explicitly.

14.3 connectionHealth on Credential

The Plug API adds a connectionHealth field that provides a simplified view of the credential's connection state, derived from the credential status and any alternate accesses:

  • CONNECTION_SUCCESS — credential or alternate access is working
  • CONNECTION_IN_PROGRESS — credential or alternate access setup is in progress
  • CONNECTION_FAILURE — credential connection has failed
  • CONNECTION_DEACTIVATED — credential is deactivated

Note: If no alternate access exists, the connection health will be the same as the Credential Status

14.4 Statement Versioning

The Plug API introduces statement versioning:

FieldDescription
versionIdUnique version identifier
discoveredStatementIdLinks to the discovered statement
isLatestVersionWhether this is the most recent version

14.5 Service Types Changed from Strings to Objects

In UC, serviceTypes on an account was a List<String>. In Plug, it's a List<PublicServiceTypeResource>, which includes the service type name and its classification (CORE or SUPPLEMENTAL).

14.6 Meter Status Removed

UC had a meterStatus field on meters. This has been removed in Plug. Instead, meters have:

  • statusMeterIntervalStatus (for interval data status)
  • statusDetailMeterIntervalStatusDetail

14.7 Account References on Meters Changed

UC used accountIds and accountNumbers (flat lists of strings). Plug uses an accounts list of PublicEmbeddedAccountResource objects, which provide richer information about each associated account.

14.8 correlationIds is Now a List

In UC, correlationId was a single string. In Plug, correlationIds is a List<String>, supporting multiple correlation IDs per resource. This can contain multiple values when correlation IDs are inherited from both a Credential and a File associated with the same resource.

14.9 finalBillNotice Changed to Boolean

UCPlug
finalBillNotice (String)isFinalBill (boolean)

14.10 Currency Code Added to Statements

Statements now include a currencyCode field (enum) for explicit currency identification.


15. New Plug-Only Features

API Docs

These features are available only in the Plug API and have no UC equivalent:

15.1 Intervals & Normalized Intervals

  • GET /intervals — Raw interval data for meters
  • GET /normalizedIntervals — Normalized interval data
  • Associated meter fields: earliestIntervalAt, latestIntervalAt, isIntervalsProductActive, latestIntervalsCheckedAt

15.2 Expected Accounts

  • GET /expectedAccounts — Track expected but not yet discovered accounts
  • POST /expectedAccounts — Create expected accounts
  • Used for monitoring data discovery progress

15.3 Discovered Statements

  • GET /discoveredStatements — Track statement discovery before full processing
  • Links to statements via discoveredStatementId

15.4 Providers & Service Types Directory

  • GET /providers — Browse the provider directory
  • GET /serviceTypes — List available service types

15.5 Arcadia Connect

  • POST /credentials/encodedConnectUrl — Generate encoded Arcadia Connect URLs
  • Used for embedded credential capture flows

15.6 MFA Support

  • POST /credentials/{id}/mfa — Submit MFA method selection
  • POST /credentials/{id}/otp — Submit one-time password
  • multiFactorAuthenticationOptOutStatus and lastSuccessfulMultiFactorAuthenticationOptOutAt fields on credentials

15.7 Alternate Access

  • Credentials now include an alternateAccesses list showing alternative data access methods
  • Each alternate access has its own status and type

15.8 Webhook Testing

  • POST /webhooks/{id}/test — Send a test webhook to verify your endpoint

15.9 Sandbox Mode

  • X-Sandbox: true header enables sandbox mode
  • Separate data environment for testing without affecting production data
  • Sandbox/production conflicts are detected and return 409

16. Request Body Changes

16.1 Create Account

UC FieldPlug FieldNotes
accountNumberaccountNumberUnchanged
providerIdproviderIdUnchanged
enabledisStatementsProductActiveRenamed
correlationIdcorrelationIdUnchanged

16.2 Update Account

UC FieldPlug FieldNotes
customDatacustomDataUnchanged
enabledisStatementsProductActiveRenamed

16.3 Create Credential

UC FieldPlug FieldNotes
providerIdproviderIdUnchanged
usernameusernameUnchanged
username2username4username2username4Unchanged
passwordpasswordUnchanged
password2password4password2password4Unchanged
correlationIdcorrelationIdUnchanged
isInteractiveNew — For a provider that supports real time credential validation, you can create a credential with interactive set as true to receive feedback if the credential is valid or invalid.
customerGivenWebsiteNew — The website provided by the customer when creating this credential.
termsOfServiceUrltermsOfServiceUrlUnchanged
privacyPolicyUrlprivacyPolicyUrlUnchanged

16.4 Create Site

All UC fields are supported plus new building detail fields:

New Plug FieldTypeNotes
areaIntegerThe area of the Site in square feet.
numberOfStoriesIntegerThe number of stories of the Site.
yearBuiltIntegerThe year the Site was built, ranging from 1 to the current year plus 10.
buildingTypeEnumThe type of building.
buildingTypeGroupEnumThe group of building types.
hvacHeatTypeEnumThe type of heating system in the Site.
hvacCoolTypeEnumThe type of cooling system in the Site.
hvacVentTypeEnumThe type of ventilation system in the Site.
heatingFuelEnumThe type of heating fuel used in the Site.
isLocationRecommendationIgnoredbooleanIndicates if a site has been opted out of address verification.

16.5 Create Meter

UC FieldPlug FieldNotes
providerIdproviderIdUnchanged
meterNumbermeterNumberUnchanged
correlationIdcorrelationIdUnchanged
retailCustomerEmailNew — The customer email address associated with the account for the meter. An email will be sent to this email address to grant data sharing access.
electricServiceIdentifierNew — The Electric Service Identifier (ESI ID) associated with the address for the meter.

16.6 Download Requests

Download request bodies remain largely the same. Key changes:

UC FieldPlug FieldNotes
accountIdsaccountIdsUnchanged
statementIdsstatementIdsIDs must use Plug prefix format
startDatestartDateUnchanged
endDateendDateUnchanged
outputFormatoutputFormatUnchanged
downloadMethoddownloadMethodUnchanged

17. Migration Checklist

Use this checklist to track your migration progress:

Pre-Migration

  • Obtain OAuth 2.0 API keys from the Arcadia Dashboard
  • Review all breaking changes in this document
  • Identify all UC API endpoints your application uses
  • Inventory all field references in your codebase

Authentication

  • Update authentication to use OAuth 2.0 Bearer tokens
  • Update base URL from https://api.urjanet.com/utility/ to https://api.arcadia.com/plug/
  • Add Arcadia-Version: 2024-02-21 header to all requests
  • Update Content-Type expectations from application/hal+json to application/json
  • Add X-Sandbox header support if using sandbox mode

Response Parsing

  • Remove _embedded wrapper parsing — use content array directly
  • Remove _links navigation parsing — use page metadata for pagination
  • Remove per-resource _links parsing
  • Update statement list parsing for summary format (or use /statements/details)

ID Handling

  • Update ID field references from entityId to id
  • Handle prefixed IDs (e.g., act_uuid, crd_uuid)
  • Update any stored IDs or ID comparison logic
  • Update IDs in request bodies and path parameters to use prefix format

Field Names

  • Update all timestamp fields (createdDatecreatedAt, etc.)
  • Update all date-only fields (periodStartperiodStartDate, etc.)
  • Update boolean fields (enabledisActive/isStatementsProductActive, etc.)
  • Update "actual name" fields to "as printed" pattern
  • Update abbreviations (podNumberpointOfDeliveryNumber, etc.)
  • Remove references to providerName / providerAlias — use provider.name

Status & Enum Values

  • Update account status value handling (e.g., OKCONNECTION_SUCCESS)
  • Update account status detail handling (17 UC → 10 Plug values)
  • Update credential status value handling
  • Update credential status detail handling (34 UC → 29 Plug values)
  • Update file status handling (REJECTEDFAILURE)
  • Update webhook status handling (ERRORFAILURE)
  • Update provider classification (PRIMARY/SECONDARYPUBLISHER/PASS_THROUGH)
  • Update address type handling (RAWCUSTOMER_PREFERRED)
  • Handle new isCustomerActionRequired boolean
  • Handle new connectionHealth field on credentials

Event Types

  • Update account event type parsing
  • Update credential event type parsing
  • Update file event type parsing
  • Update meter event type parsing
  • Update site event type parsing

Webhooks

  • Update webhook event type handling (e.g., NEW_STATEMENTNEW_DATA_AVAILABLE)
  • Prepare for increased webhook volume (all status transitions)
  • Handle the new resource field on webhooks
  • Update webhook filtering logic if applicable

Error Handling

  • Update error response parsing to use errors array format
  • Handle multiple errors per response
  • Use type field for error categorization
  • Update HTTP status expectations (especially 400 → 404 for not-found)
  • Log errorId from error details for support

Request Bodies

  • Update account create/update request fields
  • Update credential create request fields
  • Update IDs in request bodies to use prefix format
  • Update any enum values sent in requests to use Plug values

Search & Filtering

  • Update RSQL search values to use Plug enum values
  • Update sort field names to Plug naming convention
  • Remove calls to /searchableFields endpoints

Post-Migration

  • Run integration tests against Plug API
  • Verify pagination works correctly with new response format
  • Test error handling with invalid requests
  • Verify webhook reception and parsing
  • Monitor for increased webhook volume
  • Evaluate new Plug-only features for adoption

Appendix: Quick Reference Card

Response Format

UC:   { "_embedded": { "resources": [...] }, "_links": {...}, "page": {...} }
Plug: { "content": [...], "page": {...} }

ID Format

UC:   "entityId": "1eedaa3e-bccb-d579-8f8d-6a861e9050ca"
Plug: "id": "act_1eedaa3e-bccb-d579-8f8d-6a861e9050ca"

Error Format

UC:   { "message": "...", "status": 400, "error": "..." }
Plug: { "errors": [{ "type": "invalidParameter", "message": "...", "param": "...", "details": { "errorId": "err_..." } }] }

Base URL

UC:   https://api.urjanet.com/utility/
Plug: https://api.arcadia.com/plug/

Required Headers

Arcadia-Version: 2024-02-21
Authorization: Bearer <token>
Content-Type: application/json
X-Sandbox: true|false  (optional, default: false)