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.
Signing is the anti-enumeration control
Both endpoints always run under request signing — they are fail-closed, so turning signing off on the pipeline does not exempt them and they answer SIGNING_REQUIRED instead. Only a caller holding your signing secret can probe which numbers are bound.
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
customerUserIdbefore 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
{
"APIKey": "<AKEDLY_API_KEY>",
"pipelineID": "<YOUR_PIPELINE_ID>",
"customerUserId": "user_123",
"phone": "+201234567890"
}
Response
{
"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
boundistrue.
Request
{
"APIKey": "<AKEDLY_API_KEY>",
"pipelineID": "<YOUR_PIPELINE_ID>",
"customerUserId": "user_123"
}
Response
{
"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:
| Status | Code | Cause and Solution |
|---|---|---|
| 400 | MISSING_FIELDS | Bind requires both customerUserId and phone. |
| 400 | INVALID_PHONE | Bind only — the number is not valid E.164 after canonicalization. On lookup, an invalid phone surfaces as MISSING_LOOKUP_KEY. |
| 400 | MISSING_LOOKUP_KEY | Lookup requires phone or customerUserId. |
