POST /message

Send encrypted messages with document attachments and signature requests.

Endpoint

POST https://msg.api.uip.id/v1

Headers

Authorization: Bearer YOUR_API_KEY
Content-Type: application/json

Request Body

{
  "recipient_uip_id": "uip_user_1234567890",
  "webhook_url": "https://yourapp.com/webhooks/uip/msg",
  "subject": "Employment Contract Review",
  "message": "Please review and sign the attached contract.",
  "severity": "high",
  "requires_signature": true,
  "attachment": {
    "filename": "contract.pdf",
    "content_type": "application/pdf",
    "data": "base64_encoded_pdf_data",
    "size": 1048576
  }
}

Parameters

ParameterTypeRequiredDescription
recipient_uip_idstringYesUIP ID of the message recipient
webhook_urlstringYesURL to receive delivery and response events
subjectstringYesMessage subject/title
messagestringYesMessage content/body
severitystringNolow, medium, high, extreme (default: medium)
attachmentobjectNoDocument attachment (up to 20MB)
requires_signaturebooleanNoWhether document requires signature (default: false)

Response

{
  "message_id": "msg_1234567890abcdef",
  "status": "sent",
  "recipient_uip_id": "uip_user_1234567890",
  "estimated_delivery": "2024-01-15T10:30:00Z",
  "requires_signature": true,
  "cost": 0.10
}

Code Implementation

// JavaScript
async function sendMessage(recipientUipId, subject, message, options = {}) {
  const payload = {
    recipient_uip_id: recipientUipId,
    webhook_url: 'https://yourapp.com/webhooks/uip/msg',
    subject: subject,
    message: message,
    severity: options.severity || 'medium'
  };

  if (options.attachment) {
    payload.attachment = options.attachment;
  }

  if (options.requiresSignature) {
    payload.requires_signature = true;
  }

  const response = await fetch('https://msg.api.uip.id/v1', {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer ' + YOUR_API_KEY,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify(payload)
  });

  const data = await response.json();
  console.log('Message sent. ID: ' + data.message_id + ', Cost: $' + data.cost);
  
  return data;
}

// Helper: Encode file as base64
function encodeFileAsBase64(file) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.onload = () => resolve(reader.result.split(',')[1]);
    reader.onerror = reject;
    reader.readAsDataURL(file);
  });
}

// Usage examples
// Simple text message
sendMessage(
  'uip_user_1234567890',
  'Welcome!',
  'Thank you for joining our platform.',
  { severity: 'medium' }
);

// Document with signature
const file = document.getElementById('file-input').files[0];
const base64Data = await encodeFileAsBase64(file);

sendMessage(
  'uip_user_1234567890',
  'Contract Review',
  'Please review and sign the attached contract.',
  {
    severity: 'high',
    requiresSignature: true,
    attachment: {
      filename: file.name,
      content_type: file.type,
      data: base64Data,
      size: file.size
    }
  }
);

Webhook Events

Message Delivered

{
  "event": "message_delivered",
  "message_id": "msg_1234567890abcdef",
  "recipient_uip_id": "uip_user_1234567890",
  "delivered_at": "2024-01-15T10:30:00Z",
  "status": "delivered"
}

Document Signed

{
  "event": "document_signed",
  "message_id": "msg_1234567890abcdef",
  "recipient_uip_id": "uip_user_1234567890",
  "signed_at": "2024-01-15T10:45:00Z",
  "signature_data": {
    "document_hash": "sha256:a1b2c3d4e5f6...",
    "signature": "uip_sig_abc123def456...",
    "task_hash": "task_a1b2c3d4e5f6789012345678901234567890abcdef",
    "signer_info": {
      "full_name": "Alice Johnson",
      "verification_level": "government_id"
    }
  },
  "status": "signed"
}