Skip to content

POST /bulk/jobs API

  • Bulk

Submit a new asynchronous geocoding job.

Accepts a large batch of addresses or queries, downloads the payload if necessary, and schedules processing. Results are delivered via webhook and can also be polled through the REST API.
Parameters
NameInTypeRequiredDescription
X-Idempotency-KeyheaderstringNoGuards against duplicate submissions. When supplied, repeated POST requests with the same value within 24 hours will return the first response.
  • X-Idempotency-KeyheaderOptional
    Typestring

    Guards against duplicate submissions. When supplied, repeated POST requests with the same value within 24 hours will return the first response.

Request body

application/json

{
"input": {
"transport": "https",
"url": "https://files.example.com/batches/sprint-42.csv",
"compression": "gzip",
"content_type": "text/csv",
"encoding": "utf-8"
},
"callback": {
"url": "https://app.example.com/webhooks/geocoding",
"secret": "whsec_1234567890abcdef",
"retry_policy": {
"max_attempts": 5,
"initial_delay_seconds": 30,
"strategy": "exponential"
}
},
"options": {
"output_format": "geojson",
"truncate_at": 5,
"priority": "high"
},
"metadata": {
"requested_by": "ops@example.com",
"batch_id": "sprint-42"
}
}

Download CSV payload from HTTPS with webhook delivery.

Sample responses
  • 202 Success — Job accepted for processing.

    application/jsonBulkJobResponse

    {
    "id": "123e4567-e89b-12d3-a456-426614174000",
    "status": "queued",
    "submitted_at": "2024-03-18T12:40:00Z",
    "input": {
    "transport": "https",
    "url": "https://files.example.com/batches/sprint-42.csv",
    "compression": "gzip",
    "content_type": "text/csv"
    },
    "callback": {
    "url": "https://app.example.com/webhooks/geocoding",
    "secret": "whsec_example_secret_01",
    "signature_header": "X-Geobridge-Signature",
    "retry_policy": {
    "max_attempts": 5,
    "initial_delay_seconds": 30,
    "strategy": "exponential"
    }
    },
    "options": {
    "output_format": "geojson",
    "truncate_at": 5
    },
    "metadata": {
    "requested_by": "ops@example.com",
    "batch_id": "sprint-42"
    },
    "statistics": {
    "total_records": 0,
    "processed_records": 0,
    "successful_records": 0,
    "failed_records": 0
    },
    "delivery_attempts": []
    }
  • 400 Client error — Invalid payload supplied.

    application/problem+jsonProblem

    {
    "type": "https://docs.geobridge.io/problems/invalid-body",
    "title": "Invalid request body",
    "status": 400,
    "detail": "input.url must point to an HTTPS resource.",
    "errors": [
    {
    "field": "input.url",
    "message": "Only HTTPS URLs are supported for transport=https."
    },
    {
    "field": "callback.secret",
    "message": "Must be at least 16 characters long."
    }
    ]
    }
  • 401 Client error — Missing or invalid API key.

    application/problem+jsonProblem

    {
    "type": "https://docs.geobridge.io/problems/unauthorized",
    "title": "Unauthorized",
    "status": 401,
    "detail": "API key is missing or invalid."
    }
  • 409 Client error — Duplicate job submission detected via idempotency key.

    application/problem+jsonProblem

    {
    "type": "https://docs.geobridge.io/problems/conflict",
    "title": "Conflict",
    "status": 409,
    "detail": "Job already exists for idempotency key bulk-sprint-42."
    }
  • 422 Client error — Semantically invalid job payload.

    application/problem+jsonProblem

    {
    "type": "https://docs.geobridge.io/problems/unprocessable-entity",
    "title": "Unprocessable Entity",
    "status": 422,
    "detail": "options.truncate_at cannot exceed 10 for geojson output.",
    "errors": [
    {
    "field": "options.truncate_at",
    "message": "Must be between 1 and 10 when output_format=geojson."
    }
    ]
    }
  • 429 Client error — Too many requests. Retry after the rate limit resets.

    application/problem+jsonProblem

    {
    "type": "https://docs.geobridge.io/problems/too-many-requests",
    "title": "Too Many Requests",
    "status": 429,
    "detail": "Rate limit of 5 job submissions per minute exceeded."
    }
  • 500 Server error — Unexpected server error.

    application/problem+jsonProblem

    {
    "type": "https://docs.geobridge.io/problems/internal-error",
    "title": "Internal Server Error",
    "status": 500,
    "detail": "Unexpected exception while writing job metadata."
    }
Code samples

202 Accepted

Terminal window
# 202 Accepted — Creates a bulk job with HTTPS input and webhook callback.
curl -s -X POST 'https://api-na.geobridge.io/v1/bulk/jobs' \
-H 'Accept: application/json' \
-H 'X-API-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-H 'X-Idempotency-Key: bulk-sprint-42' \
-d ' \
{
"input": {
"transport": "https",
"url": "https://files.example.com/batches/sprint-42.csv",
"compression": "gzip",
"content_type": "text/csv"
},
"callback": {
"url": "https://app.example.com/webhooks/geocoding",
"secret": "YOUR_WEBHOOK_SECRET",
"retry_policy": {
"max_attempts": 5,
"initial_delay_seconds": 30,
"strategy": "exponential"
}
},
"options": {
"output_format": "geojson",
"truncate_at": 5
},
"metadata": {
"requested_by": "ops@example.com",
"batch_id": "sprint-42"
}
} \
'

400 Bad Request

Terminal window
# 400 Bad Request — Missing callback object results in validation error when creating a job.
curl -s -X POST 'https://api-na.geobridge.io/v1/bulk/jobs' \
-H 'Accept: application/json' \
-H 'X-API-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d ' \
{
"input": {
"transport": "https",
"url": "https://files.example.com/batches/sprint-42.csv"
}
} \
'

401 Unauthorized

Terminal window
# 401 Unauthorized — Omitting the API key header triggers authentication failure.
# Deliberately omits X-API-Key header to demonstrate 401 Unauthorized.
curl -s -X POST 'https://api-na.geobridge.io/v1/bulk/jobs' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d ' \
{
"input": {
"transport": "https",
"url": "https://files.example.com/batches/sprint-42.csv"
},
"callback": {
"url": "https://app.example.com/webhooks/geocoding",
"secret": "YOUR_WEBHOOK_SECRET"
}
} \
'

422 Unprocessable Entity

Terminal window
# 422 Unprocessable Entity — Callback object is present but missing the required url, triggering semantic validation.
curl -s -X POST 'https://api-na.geobridge.io/v1/bulk/jobs' \
-H 'Accept: application/json' \
-H 'X-API-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-H 'X-Idempotency-Key: bulk-sprint-42' \
-d ' \
{
"input": {
"transport": "https",
"url": "https://files.example.com/batches/sprint-42.csv",
"compression": "gzip",
"content_type": "text/csv"
},
"callback": {
"secret": "YOUR_WEBHOOK_SECRET"
}
} \
'

429 Too Many Requests

Terminal window
# 429 Too Many Requests — Rapidly resubmitting bulk jobs exceeds the rate limit; wait before retrying.
curl -s -X POST 'https://api-na.geobridge.io/v1/bulk/jobs' \
-H 'Accept: application/json' \
-H 'X-API-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-H 'X-Idempotency-Key: bulk-sprint-42' \
-d ' \
{
"input": {
"transport": "https",
"url": "https://files.example.com/batches/sprint-42.csv",
"compression": "gzip",
"content_type": "text/csv"
},
"callback": {
"url": "https://app.example.com/webhooks/geocoding",
"secret": "YOUR_WEBHOOK_SECRET"
}
} \
'

409 Conflict

Terminal window
# 409 Conflict — Reusing an idempotency key returns the original response instead of creating a new job.
curl -s -X POST 'https://api-na.geobridge.io/v1/bulk/jobs' \
-H 'Accept: application/json' \
-H 'X-API-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-H 'X-Idempotency-Key: bulk-sprint-42' \
-d ' \
{
"input": {
"transport": "https",
"url": "https://files.example.com/batches/sprint-42.csv"
},
"callback": {
"url": "https://app.example.com/webhooks/geocoding",
"secret": "YOUR_WEBHOOK_SECRET"
}
} \
'

500 Internal Server Error

Terminal window
# 500 Internal Server Error — Illustrates retry logic when the bulk submission endpoint fails unexpectedly.
curl -s -X POST 'https://api-na.geobridge.io/v1/bulk/jobs' \
-H 'Accept: application/json' \
-H 'X-API-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-H 'X-Idempotency-Key: bulk-sprint-42' \
-d ' \
{
"input": {
"transport": "https",
"url": "https://files.example.com/batches/sprint-42.csv"
},
"callback": {
"url": "https://app.example.com/webhooks/geocoding",
"secret": "YOUR_WEBHOOK_SECRET"
}
} \
'
Try it live

Save your API key once and reuse it across endpoints. Configure the request below and send it directly from the docs.

Stored locally in your browser. Removing it clears access for this device.

Header parameters

Guards against duplicate submissions. When supplied, repeated POST requests with the same value within 24 hours will return the first response.

Request body

Content type: application/json

application/jsonRequired • Schema: object
Input mode:
Form limitations:
  • input:Polymorphic schemas (oneOf/anyOf/not) are not yet supported in form mode.
  • metadata:Dynamic key objects (additionalProperties) are not supported. Use raw JSON mode.

Switch to Raw JSON mode to edit unsupported fields.

input: Polymorphic schemas (oneOf/anyOf/not) are not yet supported in form mode.

callback*

HTTPS endpoint that will receive job completion notifications.

Shared secret used to compute webhook signatures.

Name of the header that transports the HMAC signature.

Time window in seconds in which the receiver must reject duplicate deliveries.

retry policy
options

Optional limit on the number of matches returned per record.

metadata: Dynamic key objects (additionalProperties) are not supported. Use raw JSON mode.

*** End of File

Configure the request and select “Send request” to preview the response.