Akedly

End Users

An end user is your user — the recipient of your utility messages, identified by your own customerUserId. These endpoints bind that ID to a phone number and let your backend look the binding up later.


Why bind end users

Sends accept an optional customerUserId that is echoed back and recorded with each message — binding makes that association first-class. Bind once at signup or verification, then:

  • Look up by customerUserId before a send to confirm the user has a phone number on file, then deliver with the Send API.
  • Look up by phone number to find which of your users it belongs to when processing delivery outcomes.

Binding is tenant-scoped: you only ever see your own bindings.


Bind an end user

Associates a customerUserId with a phone number. The number is canonicalized to E.164 before it is stored.

A user can hold multiple numbers: binding a second number to the same customerUserId adds it. Re-binding an existing pair leaves the association unchanged.

Body

  • Name
    APIKey
    Type
    string
    Description

    Your account API key.

  • Name
    pipelineID
    Type
    string
    Description

    A utility pipeline on your account. Used to authenticate the call.

  • Name
    customerUserId
    Type
    string
    Description

    Your internal ID for the user.

  • Name
    phone
    Type
    string
    Description

    The user's phone number, E.164. Canonicalized before binding.

Response fields

  • Name
    customerUserId
    Type
    string
    Description

    The bound ID.

  • Name
    phone
    Type
    string
    Description

    The canonical E.164 form that was bound.

Request

POST
https://api.akedly.io/api/v1/utilities/end-users
{
  "APIKey": "<AKEDLY_API_KEY>",
  "pipelineID": "<YOUR_PIPELINE_ID>",
  "customerUserId": "user_123",
  "phone": "+201234567890"
}

Response

JSON
200 Status
{
  "status": "success",
  "data": {
    "customerUserId": "user_123",
    "phone": "+201234567890"
  }
}

Look up an end user

Finds a binding by either key. Provide customerUserId to check whether that user has a bound number, or phone to find which user a number belongs to. When both are present, customerUserId wins.

An unknown key is not an error — the call succeeds with bound: false.

Body

  • Name
    APIKey
    Type
    string
    Description

    Your account API key.

  • Name
    pipelineID
    Type
    string
    Description

    A utility pipeline on your account, used to authenticate the call.

  • Name
    customerUserId
    Type
    string
    Description

    Look up by your internal user ID. Provide this or phone.

  • Name
    phone
    Type
    string
    Description

    Look up by phone number, E.164.

Response fields

  • Name
    bound
    Type
    boolean
    Description

    Whether a binding exists.

  • Name
    customerUserId
    Type
    string
    Description

    The bound user ID. Present when bound is true.

Request

POST
https://api.akedly.io/api/v1/utilities/end-users/lookup
{
  "APIKey": "<AKEDLY_API_KEY>",
  "pipelineID": "<YOUR_PIPELINE_ID>",
  "customerUserId": "user_123"
}

Response

JSON
200 Status
{
  "status": "success",
  "data": {
    "bound": true,
    "customerUserId": "user_123"
  }
}

Errors

Authentication, pipeline, and signing errors match the send error reference — with one addition that reference does not cover: because these endpoints are fail-closed, calling them on a pipeline with signing switched off returns 403 SIGNING_REQUIRED, which /send never does. See Request Signing. Endpoint-specific errors:

StatusCodeCause and Solution
400MISSING_FIELDSBind requires both customerUserId and phone.
400INVALID_PHONEBind only — the number is not valid E.164 after canonicalization. On lookup, an invalid phone surfaces as MISSING_LOOKUP_KEY.
400MISSING_LOOKUP_KEYLookup requires phone or customerUserId.

Was this page helpful?