DialerBee APIv1 · 1.0.0-rc6

Consent

Record consent evidence (Tier 2: can make a number callable)

POST /v1/consents

Scope
consent:write
Tier
Tier 2 (reaches or unlocks real people)
Data
Personal data
Idempotency
Idempotency-Key: required

Tier 2. This operation can reach or unlock real people. It needs the scope consent:write and the account switch tier2_consent_write_enabled, which is off for every account unless DialerBee turns it on at your request. Until then it answers 403 tier_not_enabled. Daily cap: set before launch.

TIER 2. Structured evidence only: who consented, to which channel, when, captured where, and your own reference to the proof. A bare consent: true is never accepted. Needs the consent:write scope and the account switch tier2_consent_write_enabled.

Parameters

NameInTypeRequiredDescription
Idempotency-KeyheaderstringyesYour unique value for this logical operation (a UUID is fine). Scoped to your API client, kept 24 hours. (min length 1; max length 255)
X-Correlation-IDheaderstringnoYour own trace value, logged with the request. Metadata only, never identity. (min length 1; max length 128)

Request body

The consent evidence.

JSON: ConsentCreateRequest

Response

201: The consent record.

HeaderMeaning
X-Request-IDThe DialerBee request id. Quote it to support. Every response carries X-Request-ID: req_<ULID>, or edge_<32 hex> when the edge answered before the request reached the API.
Cache-ControlAlways no-store.
Idempotency-Replayedtrue when this answer is the stored answer of an earlier request with the same Idempotency-Key.

Examples

Request example

curl

curl -sS -X POST \
  "https://app.dialerbee.com/api/v1/consents" \
  -H "Authorization: Bearer $DIALERBEE_API_KEY" \
  -H 'Idempotency-Key: 5f2b7c1e-8a3d-4c6f-9b0e-2d4a6c8e1f3a' \
  -H "Content-Type: application/json" \
  --data '{
  "phone": "+12125550123",
  "channel": "voice",
  "captured_at": "2026-09-20T10:00:00Z",
  "expires_at": "2027-09-20T10:00:00Z",
  "source": "customer_crm",
  "external_reference": "CRM-CONSENT-1001",
  "proof_url": "https://crm.example.com/consents/1001.pdf"
}'

Python (SDK)

from dialerbee import DialerBee

db = DialerBee()  # reads DIALERBEE_API_KEY from the environment

result = db.consents.create(
    phone="+12125550123",
    channel="voice",
    captured_at="2026-09-20T10:00:00Z",
    expires_at="2027-09-20T10:00:00Z",
    source="customer_crm",
    external_reference="CRM-CONSENT-1001",
    proof_url="https://crm.example.com/consents/1001.pdf",
    idempotency_key="5f2b7c1e-8a3d-4c6f-9b0e-2d4a6c8e1f3a",
)

Response example

201

{
  "id": "cns_0f8fad5b-d9cb-469f-a165-70867728950e",
  "phone": "+12125550123",
  "channel": "example",
  "status": "active",
  "captured_at": "2026-09-20T10:00:00Z",
  "expires_at": "2027-09-20T10:00:00Z",
  "source": "api",
  "external_reference": "CRM-CONSENT-1001",
  "created_at": "2026-09-29T09:15:00Z"
}

Error examples

403 tier_not_enabled

{
  "type": "https://docs.dialerbee.com/errors/tier-not-enabled",
  "title": "Capability not enabled",
  "status": 403,
  "detail": "This operation can reach or unlock real people.",
  "instance": "urn:dialerbee:request:req_01K6BZ3M9X4T7Q2V8N5R6P1W0C",
  "code": "tier_not_enabled",
  "request_id": "req_01K6BZ3M9X4T7Q2V8N5R6P1W0C"
}

409 outcome_unknown

{
  "type": "https://docs.dialerbee.com/errors/outcome-unknown",
  "title": "Outcome unknown",
  "status": 409,
  "detail": "An earlier request with this Idempotency-Key may or may not have taken effect: the platform did not confirm it.",
  "instance": "urn:dialerbee:request:req_01K6BZ3M9X4T7Q2V8N5R6P1W0C",
  "code": "outcome_unknown",
  "request_id": "req_01K6BZ3M9X4T7Q2V8N5R6P1W0C"
}

400 validation_failed

{
  "type": "https://docs.dialerbee.com/errors/validation-failed",
  "title": "Invalid request",
  "status": 400,
  "detail": "The request is not valid.",
  "instance": "urn:dialerbee:request:req_01K6BZ3M9X4T7Q2V8N5R6P1W0C",
  "code": "validation_failed",
  "request_id": "req_01K6BZ3M9X4T7Q2V8N5R6P1W0C",
  "errors": [
    {
      "pointer": "/leads/1/phone",
      "code": "missing"
    }
  ]
}

Errors

StatusCodeTitle
401invalid_api_keyInvalid API key
403api_access_disabledAPI access disabled
403ip_not_allowedIP address not allowed
403insufficient_scopeNot permitted
403tier_not_enabledCapability not enabled
400credential_in_urlCredential in URL
400credential_in_bodyCredential in body
400, 422validation_failedInvalid request
413payload_too_largePayload too large
415unsupported_media_typeUnsupported media type
400idempotency_key_requiredIdempotency-Key required
409conflictRequest in progress
409idempotency_conflictIdempotency key reused
409outcome_unknownOutcome unknown
429rate_limit_exceededToo many requests
429daily_cap_reachedDaily limit reached
503temporarily_unavailableTemporarily unavailable
503upstream_unavailableTemporarily unavailable
502upstream_invalid_responseUpstream error
500internal_errorInternal error

Objects

ConsentCreateRequest

Date rules the schema cannot express answer 422 validation_failed, with one errors[] entry per field: captured_at in_future (up to 5 minutes of clock skew is allowed); expires_at in_past, before_captured_at or too_long (more than 730 days after captured_at). Control characters are refused in external_reference and proof_url. Timestamps must be strings with a UTC offset.

FieldTypeRequiredDescription
phonestring (E.164 phone)yesA phone number in E.164 form.
channelone of voice, smsyes
captured_atstring (date-time)yesWhen the person gave consent. Not in the future (422 in_future; up to 5 minutes of clock skew is allowed).
expires_atstring (date-time)yesWhen the consent ends. In the future (422 in_past), after captured_at (422 before_captured_at) and at most 730 days after captured_at (422 too_long).
sourceone of customer_crm, web_form, recorded_call, writtenyesWhere the consent was captured.
external_referencestringyesYour reference to the proof in your own system. Printable, with no leading or trailing space; control characters are refused. (min length 1; max length 128)
proof_urlstring (uri)noA link to the proof. An https:// URL without credentials (no user name or password in it); control characters are refused. Optional; leave it out rather than send null (null is refused). (max length 2048; https only)
FieldTypeRequiredDescription
idstring (ConsentId)yesA consent record. cns_ + a lower-case UUID.
phonestring (E.164 phone)yesA phone number in E.164 form.
channelstringyes
statusstringyes
captured_atstring (date-time)yes
expires_atstring (date-time)yes
sourcestringyes
external_referencestringyes
created_atstring (date-time)yes