We collect minimal analytics to understand how the site is used. If you decline, we do not load analytics.
Docs/Endpoints/POST /drawings/schedules
POST/v1/drawings/schedules

Extract structured schedule tables from an architectural drawing PDF. Accepts a previously uploaded document_id, enqueues extraction, and returns a job you poll for results. Each schedule is returned with headers, rows, and schedule-level confidence.

DrawingsAsync · 2021 credit / job

Request

Auth via X-API-Key header. Body is JSON — the endpoint does not accept file uploads directly; upload your PDF first via POST /v1/documents to get a document_id.

document_idreq
string (UUID)
ID of the uploaded PDF. Must belong to this account and not be expired.
page_numbers
int[]
1-based page indices to scan. Omit for a full-document scan.
webhook_url
string
URL to POST the completed job payload to. Delivered on developer, pro, and enterprise tiers only.

Cost is 1 credit per job, regardless of page count. When page_numbers is omitted, pages_analyzed in the completed result is null; when provided, it reflects len(page_numbers) (not a substituted total page count).

Code examples

curl -X POST https://api.anchorgrid.ai/v1/drawings/schedules \
  -H "X-API-Key: <your-api-key>" \
  -H "Content-Type: application/json" \
  -d '{
    "document_id": "550e8400-e29b-41d4-a716-446655440000",
    "page_numbers": [1, 2, 3]
  }'

Response — 202 Accepted

The job is enqueued immediately. Poll GET /v1/jobs/{job_id} until status is complete or failed.

job_id
string (UUID)
Use this to poll for results.
status
string
Always queued on this response.
poll_url
string
Path only — prepend https://api.anchorgrid.ai to build the full URL.

Result shape

When status === "complete" and model === "schedule-extractor", the result field on the job contains:

document_id
string
UUID of the source document.
schedules
array
One object per detected schedule table.
schedules[].schedule_type
string
Type string from the extractor.
schedules[].title
string
Schedule title from the extractor.
schedules[].headers
string[]
Column labels.
schedules[].rows
array
Table body: list of rows; each row is typically a list of cell values.
schedules[].confidence
number
Schedule-level score from the extractor.
schedules[].bounding_box
object
Whatever the extraction service sets on the schedule; shape depends on that type.
schedules[].metadata
object
Subset of schedule metadata persisted in the API result — raw_text, item_bboxes, and requires_manual_review are stripped before storage.
schedules_found
integer
len(schedules).
pages_analyzed
integer | null
len(page_numbers) if you passed page_numbers; null if you omitted it (full-document scan).
model_version
string
e.g. schedule-extractor-v1.0.0
processing_time_ms
integer
Wall time for the extraction task.

Unlike door detection, GET /v1/jobsdoes not apply post-filters to this model's result — you receive the stored payload as written by the worker.

Credits & rate limits

Cost
1 credit per job
Rate limit
Tier RPM (5 / 60 / 120 / 300)
free
Lifetime credit cap — 402 FREE_TIER_LIMIT_REACHED when exceeded.
developer / pro
Monthly pool — 429 QUOTA_EXCEEDED when exceeded.
enterprise
No quota check.

Rate-limit 429s include retry_after_seconds in the body. Quota 429s and rate-limit 429s return the same status code — check the error body to distinguish them.

Errors

401
Missing or invalid X-API-Key.
402
Free tier lifetime credit cap reached.
404
document_id not found or expired (DOCUMENT_NOT_FOUND in API code).
422
Validation error — malformed UUID or invalid body.
429
Rate limit or monthly quota exceeded.

Response Preview

202 OK
{
  "job_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
  "status": "queued",
  "poll_url": "/v1/jobs/7c9e6679-7425-40de-944b-e07fc1f90ae7"
}