Resume a paused job
Resumes a paused job only. No body. If the reason is insufficient_balance and the account still cannot send one message, the response is 402 and the job stays paused. If the subscription is inactive, remaining rows fail with SUBSCRIPTION_INACTIVE and the job becomes completed. This call can start delivery and debit the account.
When to use it. After a top-up, or after a provider rate limit has passed.
Code example
Correct: Correct: queued again
curl --location 'https://raselsms.com/api/v2/messages/bulk/64b0c0ff0000000000000001/resume' \--header 'X-API-Key: YOUR_API_KEY' \--header 'Content-Type: application/json'Incorrect: Incorrect: still unaffordable
curl --location 'https://raselsms.com/api/v2/messages/bulk/64b0c0ff0000000000000001/resume' \--header 'X-API-Key: YOUR_API_KEY' \--header 'Content-Type: application/json'Response example
200 — Correct: queued again
{ "success": true, "job": { "id": "64b0c0ff0000000000000001", "name": "Morning notices", "status": "queued", "messagesPerSecond": 10, "pauseReason": null, "total": 2, "validatedCount": 2, "counts": { "pending": 1, "sent": 1, "failed": 0, "cancelled": 0 }, "errorCode": null, "errorMessage": null, "createdAt": "2026-09-24T12:00:00.000Z" }}402 — Incorrect: still unaffordable
{ "success": false, "code": "INSUFFICIENT_BALANCE", "error": "The account cannot send one message"}200 — The job resumed, or it completed because the subscription is inactive.
{ "success": true, "job": { "id": "64b0c0ff0000000000000001", "name": "Morning notices", "status": "queued", "messagesPerSecond": 10, "pauseReason": null, "total": 2, "validatedCount": 2, "counts": { "pending": 0, "sent": 0, "failed": 0, "cancelled": 0 }, "errorCode": null, "errorMessage": null, "createdAt": "2026-09-24T12:00:00.000Z" }}409 — The job is not paused. Code JOB_NOT_PAUSED.
{ "success": false, "code": "JOB_NOT_PAUSED", "error": "Job is not paused"}404 — No job with this id belongs to this account. Code JOB_NOT_FOUND.
{ "success": false, "code": "JOB_NOT_FOUND", "error": "Job was not found"}401 — Missing or invalid API key.
{ "success": false, "requestId": "msgreq_1739012345678_abc123", "code": "UNAUTHORIZED", "error": "Missing or invalid API key"}403 — Phone is not verified or messages:create is missing. Code FORBIDDEN.
{ "success": false, "code": "FORBIDDEN", "error": "Phone not verified or missing permission"}429 — Rate limit exceeded. Honor Retry-After when present.
{ "success": false, "requestId": "msgreq_1739012345678_abc123", "code": "RATE_LIMITED", "error": "Rate limit exceeded", "retryAfterSeconds": 30}HTTP request
POST /api/v2/messages/bulk/{jobId}/resume
Request Headers
| Header | Type | Description |
|---|---|---|
| X-API-Key | string | Your Rasel API key. Send it on every documented request except inbound webhooks. * |
Path parameters
| Field | Type | Description |
|---|---|---|
| jobId | string | Job id from the create response. The job is visible only to that key's account. * |
Response Fields
| Field | Type | Description | Example |
|---|---|---|---|
| success | enum | True when the operation succeeded, or when at least one batch recipient succeeded. * | |
| job | object | Job details. The following fields belong to this job and are not visible to another account. * | |
| job.id | string | Resource identifier. * | |
| job.name | string | Display name or lowercase template identifier, depending on the endpoint. * | |
| job.status | enum | Delivery or record status. On send: sent, queued, or scheduled. On other resources it is the row status filter or value. * | |
| job.messagesPerSecond | integer | Rate ceiling: an integer from 1 to 10. Zero, fractions, and values above 10 reject the request before a job is stored. The ceiling is shared by the account's jobs in creation order. * | |
| job.pauseReason | enum | Set only while status is paused. insufficient_balance and provider_rate_limit stop the current window. user means the account requested pause. * | |
| job.total | integer | Total matching rows. * | |
| job.validatedCount | integer | How many rows have been checked while status is validating. * | |
| job.counts | object | Row counters. They stay separate even when a completed job still has failed rows. * | |
| job.counts.pending | integer | Rows not sent yet. * | |
| job.counts.sent | integer | Rows accepted for delivery. They also appear in the normal message list. * | |
| job.counts.failed | integer | Rows that failed. A completed job can still have failed rows. * | |
| job.counts.cancelled | integer | Rows cancelled before send. * | |
| job.errorCode | string | Job-level code when status is rejected: VALIDATION_FAILED (one or more rows failed checks; nothing sent), INSUFFICIENT_BALANCE (the account cannot send even one message; nothing sent), INTAKE_INCOMPLETE (storage did not finish; nothing sent). * | |
| job.errorMessage | string | Short explanation safe to show the account owner. Match your logic on code, not on this text. * | |
| job.createdAt | string | Creation timestamp. |
Status Codes
| Status | Description |
|---|---|
| 200 | Success. |
| 401 | Missing or invalid API key. |
| 402 | Insufficient wallet balance or plan quota. |
| 403 | Phone not verified, missing permission, or the account cannot perform this action. |
| 404 | Resource not found for this API key owner. |
| 409 | Conflict, such as an idempotency key reuse with a different body, or a session that is not ready. |
| 429 | Rate limit exceeded, or the maximum number of verification attempts was reached. |
Try it
This request may consume wallet balance or plan quota.
Parameters
Job id from the create response. The job is visible only to that key's account.
Request
{}Response
Send a request to see the response.