> ## Documentation Index
> Fetch the complete documentation index at: https://docs.erdo.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# SendVoiceBrandedCallingLOAAPI mirrors erdo_voice_branded_calling_loa: it


> emails the pre-filled letter to the signer (the business profile's representative unless one is named) to sign electronically, and returns the branded calling state with \`loa\_signature\`. Org admins only.




## OpenAPI

````yaml /api/openapi.json post /v1/voice/branded-calling/loa/send
openapi: 3.0.0
info:
  title: Erdo API
  description: >-
    Erdo's REST API: query and write datasets, run agents, manage threads,
    integrations, pages, evals, workstreams, experiments, and bounded outreach.
    Authenticate with a Bearer API key (erdo_api_...) or scoped token
    (erdo_token_...).
  version: '2026-10-28'
servers:
  - url: https://api.erdo.ai
    description: Production
security:
  - bearerAuth: []
paths:
  /v1/voice/branded-calling/loa/send:
    post:
      summary: |
        SendVoiceBrandedCallingLOAAPI mirrors erdo_voice_branded_calling_loa: it
      description: >
        emails the pre-filled letter to the signer (the business profile's
        representative unless one is named) to sign electronically, and returns
        the branded calling state with \`loa\_signature\`. Org admins only.
      operationId: POST:mcp.SendVoiceBrandedCallingLOAAPI
      requestBody:
        content:
          application/json:
            schema:
              properties:
                letter_fingerprint:
                  description: >
                    state exactly the facts it identifies
                    (BrandedCallingStatusResponse. LOALetterFingerprint) — so a
                    letter approved some time ago is not emailed after the
                    business profile changed.
                  title: >
                    LetterFingerprint, when set, refuses the send unless the
                    letter would
                  type: string
                signer_email:
                  type: string
                signer_name:
                  type: string
              type: object
      responses:
        '200':
          content:
            application/json:
              schema:
                properties:
                  approved_at:
                    format: date-time
                    type: string
                  default_display_name:
                    type: string
                  default_signer:
                    $ref: '#/components/schemas/voice.BrandedCallingSigner'
                  inputs:
                    $ref: '#/components/schemas/voice.BrandedCallingInputs'
                  inputs_digest:
                    description: |
                      exactly these.
                    title: >
                      InputsDigest identifies the inputs as they are now; an
                      approval is for
                    type: string
                  last_polled_at:
                    format: date-time
                    type: string
                  legal_name:
                    description: >
                      display name defaults to the legal name, trimmed to 35
                      characters.
                    title: >
                      LegalName and DefaultDisplayName come from the business
                      profile: the
                    type: string
                  loa:
                    $ref: '#/components/schemas/voice.BrandedCallingDocumentView'
                  loa_letter_fingerprint:
                    description: >
                      (display name, legal name, contact, title, address). A
                      send can pin it
                      (SendBrandedCallingLOARequest.LetterFingerprint) so an
                      approved letter is the letter emailed. Empty when the
                      business profile could not be read.
                    title: >
                      LOALetterFingerprint identifies the facts a letter sent
                      now would state
                    type: string
                  loa_signature:
                    $ref: '#/components/schemas/voice.BrandedCallingLOASignatureView'
                  logo_url:
                    type: string
                  missing_inputs:
                    description: >
                      MissingProfileFields what the business profile still
                      needs.
                    items:
                      type: string
                    title: >
                      MissingInputs is what the organization still has to supply
                      here;
                    type: array
                  missing_profile_fields:
                    items:
                      type: string
                    type: array
                  next_step:
                    type: string
                  not_registerable_reason:
                    type: string
                  numbers:
                    items:
                      $ref: '#/components/schemas/voice.BrandedCallingNumberView'
                    title: |
                      Numbers is every number the organization holds.
                    type: array
                  out_of_date:
                    type: boolean
                  price_per_call_usd:
                    title: >
                      PricePerCallUSD is what Twilio charges per call whose
                      brand is delivered.
                    type: string
                  profile_unavailable:
                    description: >
                      The digest is then left empty, since it would not describe
                      what a person approved, and filing is refused as retryable
                      rather than as a change.
                    title: >
                      ProfileUnavailable says the business profile could not be
                      read just now.
                    type: boolean
                  reason:
                    description: |
                      registration waits on.
                    title: >
                      Reason is Twilio's verdict, the last provider error, or
                      what the
                    type: string
                  registerable:
                    description: >
                      with the reason (no number Erdo manages, a sole
                      proprietor, outside the US).
                    title: >
                      Registerable is false when this organization can never
                      file one here,
                    type: boolean
                  registered_call_reason:
                    type: string
                  registered_display_name:
                    description: >
                      carries; OutOfDate says the inputs changed since it was
                      filed.
                    title: >
                      RegisteredDisplayName and RegisteredCallReason are what
                      the registration
                    type: string
                  requested_at:
                    format: date-time
                    type: string
                  review_status:
                    type: string
                  status:
                    description: |
                      approved, failed or not\_enabled.
                    title: >
                      Status is missing_inputs, unregistered (ready to request),
                      pending,
                    type: string
                  use_case_categories:
                    items:
                      type: string
                    type: array
                type: object
          description: Success response
        default:
          $ref: '#/components/responses/APIError'
components:
  schemas:
    voice.BrandedCallingSigner:
      properties:
        email:
          type: string
        name:
          type: string
      title: |
        BrandedCallingSigner is a person the letter can be sent to.
      type: object
    voice.BrandedCallingInputs:
      properties:
        call_reason:
          title: >
            CallReason is the line under the name, e.g. "Your appointment
            request".
          type: string
        consent_description:
          title: |
            ConsentDescription says how the people called agreed to be called.
          type: string
        daily_call_volume:
          format: int64
          type: integer
        display_name:
          title: |
            DisplayName is shown on the phone. Defaults to the legal name.
          type: string
        employee_count:
          format: int64
          type: integer
        use_case_category:
          title: |
            UseCaseCategory is one of use_case_categories.
          type: string
        use_case_description:
          title: |
            UseCaseDescription says what the calls are for.
          type: string
      title: |
        BrandedCallingInputs are the text fields an organization supplies.
      type: object
    voice.BrandedCallingDocumentView:
      properties:
        filename:
          type: string
        source:
          description: |
            signing page (whose time is the signing time).
          title: |
            Source is upload, or signature for a letter signed through Erdo's
          type: string
        uploaded_at:
          format: date-time
          type: string
      title: |
        BrandedCallingDocumentView is an uploaded document, without its bytes.
      type: object
    voice.BrandedCallingLOASignatureView:
      description: |
        settings page and the tools show it. It never carries the link.
      properties:
        delivery_error:
          type: string
        delivery_status:
          description: |
            sent, failed (DeliveryError says why) or unknown (never confirmed).
          title: >
            DeliveryStatus is pending (the email's outcome is not confirmed
            yet),
          type: string
        expires_at:
          format: date-time
          type: string
        request_id:
          format: uuid
          title: |
            RequestID is the signing request: Erdo's own id, not a provider's.
          type: string
        sent_at:
          format: date-time
          type: string
        signed_at:
          format: date-time
          type: string
        signed_name:
          type: string
        signed_title:
          type: string
        signer_email_masked:
          type: string
        signer_name:
          type: string
        signing_url:
          description: >
            organization admin's read only, for them to copy and forward. Anyone
            holding it can sign until it expires.
          title: |
            SigningURL is the signing link while the request is open, on an
          type: string
        status:
          description: |
            letter's facts changed since it was sent, so it was not stored).
          title: >
            Status is sent, signed, expired, voided, or out_of_date (signed, but
            the
          type: string
        stored:
          title: |
            Stored is true once the signed letter is the organization's LOA.
          type: boolean
        voided_reason:
          type: string
      title: |
        BrandedCallingLOASignatureView is the letter sent for signature, as the
      type: object
    voice.BrandedCallingNumberView:
      properties:
        agent_name:
          type: string
        agent_ref:
          type: string
        agent_slug:
          type: string
        assign_error:
          type: string
        assignment:
          description: >
            in review), assigning (approved, this number not on it yet) or
            assigned.
          title: >
            Assignment is not_eligible, unregistered, pending (registration
            filed,
          type: string
        eligible:
          description: >
            the reason — most often that its SHAKEN/STIR attestation is not done
            yet.
          title: >
            Eligible is false while the number cannot be on the registration,
            with
          type: boolean
        not_eligible_reason:
          type: string
        phone_number:
          type: string
      title: |
        BrandedCallingNumberView is one number's part in the registration.
      type: object
  responses:
    APIError:
      content:
        application/json:
          schema:
            externalDocs:
              url: https://pkg.go.dev/encore.dev/beta/errs#Error
            properties:
              code:
                description: Error code
                example: not_found
                externalDocs:
                  url: https://pkg.go.dev/encore.dev/beta/errs#ErrCode
                type: string
              details:
                description: Error details
                type: object
              message:
                description: Error message
                type: string
            title: APIError
            type: object
      description: Error response
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: An Erdo API key (erdo_api_...) or scoped token (erdo_token_...).

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.