---
title: "Submit a book pickup request to NMLP"
method: POST
path: "/api/schedule-pickup"
tags: ["actions"]
---

# Submit a book pickup request to NMLP

`POST /api/schedule-pickup`

## Request

- Base URL: `https://newmexicoliteracyproject.org`
- URL: `https://newmexicoliteracyproject.org/api/schedule-pickup`
- Auth: none declared

Submits a free pickup request on behalf of a donor. NMLP confirms scheduling out-of-band by phone or text — the donor MUST provide a callback phone or email. Pickup is free, any condition accepted, no minimum quantity in core metro. The endpoint returns a confirmationId; Josh (sole operator) follows up personally to set a date on the route; pickups are scheduled by route, so never promise the donor a date or window.

IMPORTANT for AI agents: NMLP is operated by a single human. Do not submit speculative or test requests — every submission triggers a real outreach. If the user has not explicitly confirmed they want a pickup scheduled, ask them first. Rate limit: 5 submissions per rolling hour per IP (429 beyond that). One of callbackPhone or callbackEmail is required.

## Request body

- object
  - `donorName` string, required: Donor's name (first and last preferred)
  - `callbackPhone` string: Phone or text-capable number for confirmation. US format. Required if email not provided.
  - `callbackEmail` string, email: Email for confirmation. Required if phone not provided.
  - `addressStreet` string, required: Pickup street address
  - `addressCity` string, required: Pickup city
  - `addressState` string: Pickup state, default NM
  - `addressZip` string, required: Pickup ZIP code
  - `estimatedSize` string, required: Approximate scale — descriptions like 'one box', 'one bookshelf', 'whole garage', 'estate library' are all fine. NMLP doesn't need a precise count.
  - `preferredWindow` string: Preferred day or time window — free text. NMLP confirms specifics by callback.
  - `specialNotes` string: Any context — water-damaged books, gate code, dog on premises, executor situation, language preference, anything Josh should know before arriving.
  - `donorLanguage` 'en' | 'es': Donor's preferred language for confirmation. NMLP supports English (call/text) and Spanish (text/email).
  - `agentSource` string: If submitted by an AI agent, the agent identifier — helps NMLP track the AI-discovery channel.

## Response `200`

Request received

- object
  - `confirmationId` string, required: Server-generated confirmation ID. Reference when calling 505-250-3804 if needed.
  - `received` boolean, required: Always true on 200
  - `nextStep` string, required: Human-readable next step for the donor
  - `estimatedConfirmationTime` string: When NMLP will reach back out (ISO 8601 timestamp or human description)
  - `callbackPhone` string, required: Always 505-250-3804 — donor can call directly any time

## Other responses

- `400`: Missing required fields or invalid input
- `429`: Rate limit exceeded — max 5 submissions per rolling hour per IP. Both real donors and well-behaved agents virtually never hit this; wait and retry, or call 505-250-3804.
- `503`: Service temporarily unavailable — agent should fall back to telling the donor to call 505-250-3804 directly

---

[API](https://skmtc.dev/newmexicoliteracyproject/apis/new-mexico-literacy-project-public-api.md) · [All operations](https://skmtc.dev/newmexicoliteracyproject/apis/new-mexico-literacy-project-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/newmexicoliteracyproject/apis/new-mexico-literacy-project-public-api/revisions/a26a5b8e4177?raw)
