# TextNow Unofficial API

TypeScript client for the TextNow messaging service.

## Installation

```bash
npm install textnow-unofficial-api
```

## Authentication

TextNow uses cookie-based authentication. You need to extract cookies from your browser:

1. Log into TextNow in your browser
2. Open DevTools → Application → Cookies
3. Copy the values for: `connect.sid`, `_csrf`, `XSRF-TOKEN`
4. Get your username from the URL (textnow.com/messaging shows it)

```typescript
import { createTextNowClientWithCredentials } from 'textnow-unofficial-api';

const cookies = 'connect.sid=xxx; _csrf=xxx; XSRF-TOKEN=xxx';
const client = createTextNowClientWithCredentials('your-username', cookies);
```

**Important**: The `XSRF-TOKEN` cookie value is used for the `X-CSRF-Token` header (not `_csrf`).

## Usage

### Send SMS

```typescript
await client.send('+15551234567', 'Hello from TextNow!');
```

### Send Media

```typescript
// From file path
await client.sendImage('+15551234567', '/path/to/image.jpg');

// From buffer
await client.sendImageBuffer('+15551234567', buffer, 'photo.jpg', 'image/jpeg');

// Audio
await client.sendAudio('+15551234567', '/path/to/audio.mp3');
```

### Get Messages

```typescript
// All recent messages
const { messages } = await client.getMessages({ limit: 50 });

// From specific contact
const msgs = await client.getMessagesFrom('+15551234567');
```

### Get Conversations

```typescript
const { conversations } = await client.getConversations();
```

## Credential Storage

Credentials are stored in `~/.textnow/credentials.json` with restricted permissions.

```typescript
import { 
  loadCredentials, 
  hasStoredCredentials, 
  clearCredentials 
} from 'textnow-unofficial-api';

// Check if credentials exist
if (hasStoredCredentials()) {
  const creds = loadCredentials();
  console.log(`Logged in as: ${creds.username}`);
}

// Clear stored credentials
clearCredentials();
```

## API Reference

### TextNowAPI

- `send(to: string, message: string)` - Send SMS
- `sendMedia(options: SendMediaRequest)` - Send media attachment
- `sendImage(to: string, filePath: string)` - Send image file
- `sendImageBuffer(to: string, buffer: Buffer, filename?, contentType?)` - Send image from buffer
- `sendAudio(to: string, filePath: string)` - Send audio file
- `getMessages(params?)` - Get messages
- `getMessagesFrom(contactNumber: string, limit?)` - Get messages from contact
- `getConversations(params?)` - Get conversations list
- `getUploadUrl(mediaType?)` - Get presigned upload URL

### TextNowAuth

- `setCredentials(username, cookies, save?)` - Set auth credentials
- `getAuthHeaders()` - Get headers for API requests
- `isAuthenticated()` - Check auth status
- `logout(clearStored?)` - Clear auth state

## License

MIT
