openapi: 3.0.3 info: title: MAAC Go Broadcast Contacts API version: 1.0.0 description: "MAAC Go — Taiwan-first self-serve SMS platform. Send transactional (OTP /\norder / reminder) and broadcast SMS with NCC compliance, MAAC delivery\nbackend, and real-time DLR webhooks.\n\n- Base URL: `https://sms.cresclab.com/api`\n- Auth: `Authorization: Bearer `\n- New accounts receive NT$50 trial credit on signup, enough to send real test SMS immediately.\n- API keys are scoped and wallet-backed; sending debits the account balance unless your deployment uses a mock SMS/payment adapter.\n- All phone numbers use E.164 (`+886912345678`). 09xxxxxxxx is also accepted.\n- Cost: NT$0.78 per SMS segment (Chinese: 70 chars/segment · English: 160/segment).\n- Rate-limit errors return `429 rate_limited` with limit/used details and retry guidance when available.\n- Delivery confirmations arrive asynchronously via webhook (`sms.delivered`\n / `sms.failed`); poll `GET /sms/{id}` as a fallback.\n- MCP clients (Claude / Cursor / Windsurf) can use this spec directly, or\n connect via `POST /api/mcp` (JSON-RPC 2.0) with the same bearer key.\n" contact: name: MAAC Go Support email: info@cresclab.com url: https://sms.cresclab.com license: name: Commercial url: https://sms.cresclab.com/terms.html servers: - url: https://sms.cresclab.com/api description: Production security: - bearerAuth: [] tags: - name: Contacts description: Address book with NCC-consent tracking. paths: /contacts: get: tags: - Contacts summary: List contacts operationId: listContacts parameters: - in: query name: search schema: type: string - in: query name: tag schema: type: string - in: query name: page schema: type: integer default: 1 - in: query name: limit schema: type: integer default: 50 maximum: 500 responses: '200': description: OK content: application/json: schema: type: object properties: ok: type: boolean data: type: array items: $ref: '#/components/schemas/Contact' total: type: integer page: type: integer limit: type: integer post: tags: - Contacts summary: Create a contact (single) or bulk description: 'Single mode: `{ phone, first_name?, last_name?, tags?, consent_source? }` Bulk mode: `{ contacts: [...], consent_source? }` — up to 10,000 per call. `consent_source` is required for NCC compliance. Duplicate phones within a batch are deduped; existing `(user_id, phone)` pairs are skipped. ' operationId: createContact requestBody: required: true content: application/json: schema: oneOf: - $ref: '#/components/schemas/ContactCreateSingle' - $ref: '#/components/schemas/ContactCreateBulk' responses: '201': description: Created (single or bulk stats) components: schemas: Contact: type: object properties: id: type: integer phone: type: string description: 09xxxxxxxx (normalized) first_name: type: string nullable: true last_name: type: string nullable: true tags: type: array items: type: string consent_source: type: string example: signup_form created_at: type: string format: date-time ContactCreateBulk: type: object required: - contacts properties: consent_source: type: string default: csv_import contacts: type: array maxItems: 10000 items: type: object required: - phone properties: phone: type: string first_name: type: string last_name: type: string tags: type: array items: type: string ContactCreateSingle: type: object required: - phone - consent_source properties: phone: type: string first_name: type: string last_name: type: string tags: type: array items: type: string consent_source: type: string description: 'Where you collected consent: signup_form / csv_import / api / manual / custom' securitySchemes: bearerAuth: type: http scheme: bearer description: '`Authorization: Bearer `. Production keys start with `sk_live_`, test keys with `sk_test_` for environment separation. Sending still follows the account wallet and deployment adapter settings. '