# What does anthropic.message_batch.ended prove?

> Prove that the Message Batch reached its terminal processing status. Version 1.0.0, certification Provisional.

Canonical: https://provely.sh/verify/anthropic/anthropic.message_batch.ended  
Last reviewed: 2026-09-05  
Skill version: 0.1.0  
Certification: provisional  

**Prove that the Message Batch reached its terminal processing status. Every request of the batch succeeded, errored, was canceled, or expired. The level proves that the work stopped. It proves no result of any request.**

*Contract identity.*

| Fact | Value |
| --- | --- |
| Contract id | `anthropic.message_batch.ended` |
| Version | `1.0.0` |
| Hash | `f27638d43eea769c` |
| Completion level | `ended` |
| Publisher | Built and signed by Provely. |
| Certification | Provisional |
| Skill | [Anthropic Claude API 0.1.0](/verify/anthropic) |
| Valid for provider API versions | `2023-06-01` |

## What is the intent?

Submit the message requests as one batch and let the batch finish.

## What is the subject and the action?

| Member | Value |
| --- | --- |
| Subject type | `anthropic.message_batch` |
| Subject identity | message_batch_id = `$action.result.id` |
| Canonical effect | `ai.message_batch_start` |
| Provider operation | `POST /v1/messages/batches` |
| Idempotency | none, retry is not safe |

## How does the evidence correlate with this operation?

| Strategy | Assurance | Keys | Required |
| --- | --- | --- | --- |
| `resource_id` | strong | message_batch_id from `$action.result.id` | yes |

## Which evidence does the contract require?

Minimum evidence level `E2`. An independent channel is required. Minimum channels: 1.

| Channel | Level | Independence | Verifier | Description |
| --- | --- | --- | --- | --- |
| `message_batch_readback` | E2 | provider readback | `http` | Read the Message Batch from the provider. A condition path is $observed.message_batch_readback.request_counts.succeeded. The read states no provider API version, because Anthropic returns no version header. |

## Which conditions must all hold for VERIFIED?

| Condition | Meaning | Path | Operator | Expected | Evidence |
| --- | --- | --- | --- | --- | --- |
| `batch_present` | The provider holds the Message Batch with the returned identifier. | `$observed.message_batch_readback.id` | `eq` | `$action.result.id` | `message_batch_readback` |
| `batch_no_request_still_processing` | The member request_counts.processing is zero. Processing ends when every request has either succeeded, errored, canceled, or expired. | `$observed.message_batch_readback.request_counts.processing` | `eq` | `0` | `message_batch_readback` |
| `batch_ended_in_window` | The provider ended the batch after the operation started. | `$observed.message_batch_readback.ended_at` | `time_after` | `$operation.created_at` | `message_batch_readback` |
| `batch_created_in_window` | The provider created the batch after the operation started. | `$observed.message_batch_readback.created_at` | `time_after` | `$operation.created_at` | `message_batch_readback` |

## Which conditions give CONTRADICTED?

| Condition | Class | Reason | Path | Operator | Expected |
| --- | --- | --- | --- | --- | --- |
| `batch_predates_operation` | pre existing state | The Message Batch is older than the operation. It proves nothing. | `$observed.message_batch_readback.created_at` | `time_before` | `$operation.created_at` |
| `batch_completed_more_requests_than_intent` | wrong subject | The batch completed more requests than the intent named. It is not the batch that the intent described. | `$observed.message_batch_readback.request_counts.succeeded` | `gt` | `$input.request_count` |
| `batch_processing_count_exceeds_intent` | duplicate side effect | The batch holds more requests than the intent named. Anthropic bills each of them. Do not retry. | `$observed.message_batch_readback.request_counts.processing` | `gt` | `$input.request_count` |

## Which observed states map to a verdict before completion?

| Rule | Match | Verdict | Reason |
| --- | --- | --- | --- |
| `still_processing` | `$observed.message_batch_readback.processing_status` in `["in_progress","canceling"]` | PENDING | The Message Batch has not ended. The runtime observes again later. |

## How long does the runtime observe?

| Timing member | Value |
| --- | --- |
| Initial delay | 1000 ms |
| Poll interval | 5000 ms |
| Backoff | exponential factor 2, max 60000 ms |
| Maximum attempts | 40 |
| Timeout | 90000000 ms |
| Stale read window | 20000 ms |
| On timeout | UNVERIFIABLE (`evidence_unavailable_before_timeout`), escalated to a person |

## Where do these rules come from?

- `anthropic.docs.batches#message-batches/create-a-batch`: [anthropic.docs.batches](https://platform.claude.com/docs/en/build-with-claude/batch-processing), retrieved 2026-09-09
- `anthropic.docs.batches#message-batches/the-processing-status`: [anthropic.docs.batches](https://platform.claude.com/docs/en/build-with-claude/batch-processing), retrieved 2026-09-09
- `anthropic.docs.batches#message-batches/expiry`: [anthropic.docs.batches](https://platform.claude.com/docs/en/build-with-claude/batch-processing), retrieved 2026-09-09
- `anthropic.docs.batch_object#the-batch-object/the-processing-status-member`: [anthropic.docs.batch_object](https://platform.claude.com/docs/en/api/retrieving-message-batches), retrieved 2026-09-09
- `anthropic.docs.batch_object#the-batch-object/the-identifier`: [anthropic.docs.batch_object](https://platform.claude.com/docs/en/api/retrieving-message-batches), retrieved 2026-09-09
- `anthropic.docs.batches#message-batches/read-a-batch`: [anthropic.docs.batches](https://platform.claude.com/docs/en/build-with-claude/batch-processing), retrieved 2026-09-09
- `anthropic.docs.batch_object#the-batch-object/the-time-members`: [anthropic.docs.batch_object](https://platform.claude.com/docs/en/api/retrieving-message-batches), retrieved 2026-09-09
- `anthropic.docs.batches#message-batches/the-request-counts`: [anthropic.docs.batches](https://platform.claude.com/docs/en/build-with-claude/batch-processing), retrieved 2026-09-09
- `anthropic.docs.batch_object#the-batch-object/the-request-counts-member`: [anthropic.docs.batch_object](https://platform.claude.com/docs/en/api/retrieving-message-batches), retrieved 2026-09-09

### Can anthropic.message_batch.ended return VERIFIED from the action response alone?

No. The minimum evidence level is E2. The action response is E1. The completion conditions read `message_batch_readback`.

### What happens after the timeout?

The verdict is UNVERIFIABLE with the reason `evidence_unavailable_before_timeout`. The operation goes to a person for review.

## Read next

- [Read the Anthropic Claude API verification page](https://provely.sh/verify/anthropic)
- [Read the anthropic.message_batch.all_succeeded contract](https://provely.sh/verify/anthropic/anthropic.message_batch.all_succeeded)
- [Read what a completion contract contains](https://provely.sh/contracts)
- [Read what a receipt proves](https://provely.sh/docs/receipts)
