Advert Import API v4
This document describes the v4 API for publishing job adverts on individual job boards (target systems) for a vacancy that already exists in Teamio. The API exposes three operations:
- Order — publish a new advert (or a new add-on such as highlighting) for a vacancy on a given target system.
- Resume — resume a previously paused advert on a target system.
- Withdraw — withdraw an active advert from a target system.
The vacancy itself must first be created via the Vacancy Import API v4. The Advert Import API then orders publication for that vacancy on one or more target systems.
Base URL
https://integrations-api.teamio.comEndpoints
Production (requires production credentials):
| Method | Path | Description |
|---|---|---|
POST | /api/import/v4/adverts/order | Order an advert (or an add-on) for a vacancy on a target system |
PUT | /api/import/v4/adverts/resume | Resume a paused advert on a target system |
PUT | /api/import/v4/adverts/withdraw | Withdraw an advert from a target system |
Test (requires test credentials):
| Method | Path | Description |
|---|---|---|
POST | /api/import/test/v4/adverts/order | Validate an order request without publishing the advert |
PUT | /api/import/test/v4/adverts/resume | Validate a resume request without changing advert state |
PUT | /api/import/test/v4/adverts/withdraw | Validate a withdraw request without changing advert state |
Important: Production and test endpoints use separate credentials. The access token obtained from production credentials works only with production endpoints, and the token from test credentials works only with test endpoints. Both sets of credentials are available in Teamio integration settings (login required).
Rate Limiting: Production endpoints enforce a rate limit of 10 requests per minute per company for each operation path (
order,resume, andwithdraware limited separately). Test endpoints allow up to 50 requests per minute per company for each operation path. Requests exceeding the limit are rejected with HTTP429.
Target Systems
The targetSystem field identifies the job board on which the advert is published.
| Target system | Description |
|---|---|
JOBS_CZ | Jobs.cz |
PRACE_CZ | Prace.cz |
ATMOSKOP_CZ | Atmoskop.cz |
PZR | Práce za rohem |
TW_CZ | Temporary work (for temporary-work vacancies — jobTypeIds = [201300004]) |
CAREER_PAGES | Customer’s career pages |
Each target system supports a different set of provisions (see Provisions per Target System below). The selected target system must match the type of the underlying vacancy — for example, TW_CZ may only be used for temporary-work vacancies.
Provisions
A provision is the type of service to publish on the advert. The most common is ADVERT (the basic advert listing). Add-on provisions (highlighting, company introduction, logo, etc.) may be ordered together with the basic ADVERT, or separately later for an already published advert.
| Provision | Description |
|---|---|
ADVERT | Basic advert presentation on the target system |
HIGHLIGHTING | Visual highlighting of the advert in listings |
INTRODUCTION | Company introduction shown next to the advert |
LOGO_DETAIL | Company logo on the advert detail page |
PROGADMEDIA | Programmatic-ad media boost |
Provisions per Target System
Only the combinations listed below are accepted. Sending an unsupported combination results in HTTP 400 (Provision X is not supported for target system Y).
| Target system | ADVERT | HIGHLIGHTING | INTRODUCTION | LOGO_DETAIL | PROGADMEDIA |
|---|---|---|---|---|---|
JOBS_CZ | ✓ | ✓ | ✓ | ✓ | ✓ |
PRACE_CZ | ✓ | ✓ | ✓ | ✓ | ✓ |
ATMOSKOP_CZ | ✓ | ||||
PZR | ✓ | ✓ | ✓ | ||
TW_CZ | ✓ | ||||
CAREER_PAGES | ✓ |
Ordering Add-ons Later
When you later add new add-on provisions to an advert that already has a published ADVERT presentation, send only the new provisions in orderItems. Do not repeat ADVERT — re-sending it on the same target system will return Bad request response.
Authentication
All requests require a JWT Bearer token obtained from the auth endpoint.
Obtaining a Token
Endpoint: POST /api/v1/auth/token
Note: Both production and test credentials are available in your Teamio integration settings (login required). The password shown there is already Base64-encoded — copy and use it directly. Use production credentials to call production endpoints and test credentials to call test endpoints.
curl --location 'https://integrations-api.teamio.com/api/v1/auth/token' \
--header 'Content-Type: application/json' \
--data '{
"username": "<from Teamio integration settings>",
"password": "<from Teamio integration settings>"
}'Response:
{
"accessToken": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
"expiresAt": "2026-03-19T15:30:00.000Z",
"tokenType": "Bearer"
}Cache the token and reuse it until expiresAt. Do not request a new token for each API call.
Authentication Flow
Common Request Headers
For all advert endpoints:
Authorization: Bearer <accessToken>Content-Type: application/json
The company identity is derived from the JWT token — there is no companyId field in the request body. The vacancy referenced by vacancyId must belong to the company derived from the token; otherwise HTTP 400 is returned with Advert for vacancy {id} does not belong to company {companyId}.
Order Advert
Endpoint: POST /api/import/v4/adverts/order (test: POST /api/import/test/v4/adverts/order)
Orders an advert (and/or add-ons) for an existing vacancy on a specified target system. If no advert exists yet for the (vacancy, target system) pair, one is created. If an advert already exists, the new provisions are added to it.
Fields marked with * are required.
| Field | Type | Description | Constraints |
|---|---|---|---|
vacancyId | Long | Required. Teamio vacancy ID for which to order the advert | Must reference an existing vacancy belonging to the company |
targetSystem | string | Required. Job board on which to publish the advert | One of: ATMOSKOP_CZ, CAREER_PAGES, JOBS_CZ, PRACE_CZ, PZR, TW_CZ |
orderItems | array of object | Required. Items to order — basic advert presentation and/or add-ons | At least one item; each provision must be supported for the chosen targetSystem (see Provisions per Target System) |
orderItems[].provision | string | Required. Type of service to order | One of: ADVERT, HIGHLIGHTING, INTRODUCTION, LOGO_DETAIL, PROGADMEDIA |
Request Examples
Minimal — Required Fields Only
Order a basic advert presentation on Jobs.cz:
curl --location 'https://integrations-api.teamio.com/api/import/v4/adverts/order' \
--header 'Authorization: Bearer <accessToken>' \
--header 'Content-Type: application/json' \
--data '{
"vacancyId": 2003358593,
"targetSystem": "JOBS_CZ",
"orderItems": [
{ "provision": "ADVERT" }
]
}'Typical — Basic Advert with Highlighting
Order a basic advert presentation together with a highlighting add-on:
curl --location 'https://integrations-api.teamio.com/api/import/v4/adverts/order' \
--header 'Authorization: Bearer <accessToken>' \
--header 'Content-Type: application/json' \
--data '{
"vacancyId": 2003358593,
"targetSystem": "JOBS_CZ",
"orderItems": [
{ "provision": "ADVERT" },
{ "provision": "HIGHLIGHTING" }
]
}'Maximum — All Add-ons for JOBS_CZ
Order all provisions supported on Jobs.cz at once:
curl --location 'https://integrations-api.teamio.com/api/import/v4/adverts/order' \
--header 'Authorization: Bearer <accessToken>' \
--header 'Content-Type: application/json' \
--data '{
"vacancyId": 2003358593,
"targetSystem": "JOBS_CZ",
"orderItems": [
{ "provision": "ADVERT" },
{ "provision": "HIGHLIGHTING" },
{ "provision": "INTRODUCTION" },
{ "provision": "LOGO_DETAIL" },
{ "provision": "PROGADMEDIA" }
]
}'Adding an Add-on to an Existing Advert
When the basic ADVERT is already published, order only the new add-on:
curl --location 'https://integrations-api.teamio.com/api/import/v4/adverts/order' \
--header 'Authorization: Bearer <accessToken>' \
--header 'Content-Type: application/json' \
--data '{
"vacancyId": 2003358593,
"targetSystem": "PRACE_CZ",
"orderItems": [
{ "provision": "HIGHLIGHTING" }
]
}'Temporary Work Advert
Temporary-work vacancies (created with jobTypeIds = [201300004]) are published on the TW_CZ target system, which supports only the ADVERT provision:
curl --location 'https://integrations-api.teamio.com/api/import/v4/adverts/order' \
--header 'Authorization: Bearer <accessToken>' \
--header 'Content-Type: application/json' \
--data '{
"vacancyId": 2003358600,
"targetSystem": "TW_CZ",
"orderItems": [
{ "provision": "ADVERT" }
]
}'Response
HTTP Status: 200 OK on success. Error responses use HTTP 400/401/404/429 with RFC 7807 Problem Details bodies — see Error Responses.
| Field | Type | Description |
|---|---|---|
status | string | Always OK on success |
vacancyId | Long | Teamio vacancy ID (echo of the request) |
url | string | null | Public URL of the advert on the target system. null on the test endpoint and when the URL is not yet available |
orderItems | array of object | One entry per ordered item with validity dates |
orderItems[].provision | string | Type of ordered item: ADVERT, HIGHLIGHTING, INTRODUCTION, LOGO_DETAIL, or PROGADMEDIA |
orderItems[].from | string (yyyy-MM-dd) | Start date of public validity in the Europe/Prague timezone |
orderItems[].to | string (yyyy-MM-dd) | End date of public validity in the Europe/Prague timezone |
processedAt | string (ISO 8601) | Timestamp when the request was processed |
Example — Success Response (Production)
{
"status": "OK",
"vacancyId": 2003358593,
"url": "https://www.jobs.cz/rpd/2003358593/",
"orderItems": [
{
"provision": "ADVERT",
"from": "2026-05-21",
"to": "2026-06-20"
},
{
"provision": "HIGHLIGHTING",
"from": "2026-05-21",
"to": "2026-05-24"
}
],
"processedAt": "2026-05-21T10:15:30.123Z"
}Example — Test Response
The test endpoint validates the request without publishing the advert. The response echoes vacancyId, returns an empty orderItems array, and url is omitted.
{
"status": "OK",
"vacancyId": 2003358593,
"orderItems": [],
"processedAt": "2026-05-21T10:15:30.123Z"
}Resume Advert
Endpoint: PUT /api/import/v4/adverts/resume (test: PUT /api/import/test/v4/adverts/resume)
Resumes a previously paused (e.g. manually withdrawn) advert on a target system. The advert must already exist for the (vacancy, target system) pair and must be a charged by resumable credit subscription.
Request Schema
| Field | Type | Description | Constraints |
|---|---|---|---|
vacancyId | Long | Required. Teamio vacancy ID whose advert should be resumed | Must reference an existing vacancy belonging to the company |
targetSystem | string | Required. Target system on which to resume the advert | One of: ATMOSKOP_CZ, CAREER_PAGES, JOBS_CZ, PRACE_CZ, PZR, TW_CZ |
Request Example
curl --location --request PUT \
'https://integrations-api.teamio.com/api/import/v4/adverts/resume' \
--header 'Authorization: Bearer <accessToken>' \
--header 'Content-Type: application/json' \
--data '{
"vacancyId": 2003358593,
"targetSystem": "JOBS_CZ"
}'Response
HTTP Status: 200 OK on success. The response body example:
{
"status": "OK",
"vacancyId": 2003358593,
"processedAt": "2026-06-03T10:51:04.699466763Z"
}Both the production and the test endpoint return 200 OK — the test endpoint performs the same validation (auth, subscription, target system, advert existence and ownership) but does not actually resume the advert.
Withdraw Advert
Endpoint: PUT /api/import/v4/adverts/withdraw (test: PUT /api/import/test/v4/adverts/withdraw)
Withdraws an active advert from a target system. The advert must already exist for the (vacancy, target system) pair and must be in a state that allows withdrawal.
Request Schema
| Field | Type | Description | Constraints |
|---|---|---|---|
vacancyId | Long | Required. Teamio vacancy ID whose advert should be withdrawn | Must reference an existing vacancy belonging to the company |
targetSystem | string | Required. Target system from which to withdraw the advert | One of: ATMOSKOP_CZ, CAREER_PAGES, JOBS_CZ, PRACE_CZ, PZR, TW_CZ |
Request Example
curl --location --request PUT \
'https://integrations-api.teamio.com/api/import/v4/adverts/withdraw' \
--header 'Authorization: Bearer <accessToken>' \
--header 'Content-Type: application/json' \
--data '{
"vacancyId": 2003358593,
"targetSystem": "JOBS_CZ"
}'Response
HTTP Status: 200 OK on success. The response body example:
{
"status": "OK",
"vacancyId": 2003358593,
"processedAt": "2026-06-03T10:51:04.699466763Z"
}Both the production and the test endpoint return 200 OK — the test endpoint validates the request without changing the advert state.
Error Responses
When an advert endpoint returns a non-success HTTP status, the response body follows the RFC 7807 Problem Details format.
HTTP 400 — Bad Request
Returned for validation errors, unknown values, business-rule violations, and inactive subscription.
No active import service
{
"title": "Bad Request",
"status": 400,
"detail": "Validation error occurred. Please check the error messages for details and correct the request accordingly.",
"instance": "/api/import/v4/adverts/order",
"messages": [
{
"type": "ERROR",
"message": "Company does not have active import service."
}
],
"processedAt": "2026-05-26T11:31:21.014118734Z"
}Invalid targetSystem
{
"title": "Bad Request",
"status": 400,
"detail": "Validation error occurred. Please check the error messages for details and correct the request accordingly.",
"instance": "/api/import/v4/adverts/order",
"messages": [
{
"type": "ERROR",
"message": "Target system NO_SUCH_TARGET_SYSTEM is not allowed"
}
],
"processedAt": "2026-05-26T11:31:21.014118734Z"
}Invalid provision
{
"title": "Bad Request",
"status": 400,
"detail": "Validation error occurred. Please check the error messages for details and correct the request accordingly.",
"instance": "/api/import/v4/adverts/order",
"messages": [
{
"type": "ERROR",
"message": "Provision NO_SUCH_PROVISION is not allowed"
}
],
"processedAt": "2026-05-26T11:31:21.014118734Z"
}Provision not supported for the chosen target system
For example, LOGO_DETAIL on ATMOSKOP_CZ:
{
"title": "Bad Request",
"status": 400,
"detail": "Validation error occurred. Please check the error messages for details and correct the request accordingly.",
"instance": "/api/import/v4/adverts/order",
"messages": [
{
"type": "ERROR",
"message": "Provision LOGO_DETAIL is not supported for target system ATMOSKOP_CZ"
}
],
"processedAt": "2026-05-26T11:31:21.014118734Z"
}Advert belongs to a different company
Returned when the vacancy referenced by vacancyId (and the advert ordered against it) does not belong to the company derived from the JWT token:
{
"title": "Bad Request",
"status": 400,
"detail": "Validation error occurred. Please check the error messages for details and correct the request accordingly.",
"instance": "/api/import/v4/adverts/order",
"messages": [
{
"type": "ERROR",
"message": "Vacancy 1234456 does not belong to company 001"
}
],
"processedAt": "2026-05-26T11:31:21.014118734Z"
}Malformed JSON body
Returned when the request body cannot be parsed as JSON (e.g. truncated payload, wrong content type, syntax error).
{
"title": "Bad Request",
"status": 400,
"detail": "Failed to read request",
"instance": "/api/import/v4/adverts/order"
}HTTP 401 — Unauthorized
Returned by the authentication layer when the Bearer token is missing, malformed, or expired. The response body may also include an upstream message such as:
Note: Both
401(no/invalid Bearer token) and400with the “Authentication context is not valid” message indicate an authentication problem. Obtain a fresh token viaPOST /api/v1/auth/token.
HTTP 403 — Forbidden
Returned by Spring Security when the token is valid but does not carry the Cognito group required for the endpoint (GROUP_LIVE_VACANCY_IMPORT_API_WRITE for production endpoints, GROUP_SANDBOX_VACANCY_IMPORT_API_WRITE for test endpoints). No body is guaranteed.
HTTP 404 — Not Found
Vacancy not found
Returned when the vacancy referenced by vacancyId does not exist:
{
"title": "Not Found",
"status": 404,
"detail": "Validation error occurred. Please check the error messages for details and correct the request accordingly.",
"instance": "/api/import/v4/adverts/order",
"messages": [
{
"type": "ERROR",
"message": "Vacancy 1234 not found"
}
],
"processedAt": "2026-05-26T11:31:21.014118734Z"
}Advert not found (resume and withdraw)
Returned when no advert exists for the given (vacancyId, targetSystem) pair:
{
"title": "Not Found",
"status": 404,
"detail": "Validation error occurred. Please check the error messages for details and correct the request accordingly.",
"instance": "/api/import/v4/adverts/resume",
"messages": [
{
"type": "ERROR",
"message": "Advert not found for vacancy 456 and target system PRACE_CZ"
}
],
"processedAt": "2026-05-26T11:31:21.014118734Z"
}HTTP 429 — Too Many Requests
Returned when the per-company rate limit is exceeded (10 req/min for production endpoints, 50 req/min for test endpoints — applied per operation path). The rate-limit name in the message identifies which path was hit: advertOrder, advertResume, advertWithdraw on production and advertTestOrder, advertTestResume, advertTestWithdraw on test.
{
"title": "Too Many Requests",
"status": 429,
"detail": "You have sent too many requests. Please try again later.",
"instance": "/api/import/v4/adverts/order",
"messages": [
{
"type": "ERROR",
"message": "Rate limit exceeded for companyId=12345, rateLimitName=advertOrder. Allowed: 10 requests per minute."
}
]
}Counters are bucketed per one-minute wall-clock window — wait until the current minute resets before retrying. Consider adding retry logic with a back-off to handle this gracefully.
Common Validation Error Messages
| Error message | Cause | Fix |
|---|---|---|
The vacancyId is required. | vacancyId is null or missing | Provide a valid Teamio vacancy ID |
Target system is required. | targetSystem is null or blank | Provide one of the supported target systems |
Target system X is not allowed | targetSystem is not one of the supported values | Use ATMOSKOP_CZ, CAREER_PAGES, JOBS_CZ, PRACE_CZ, PZR, or TW_CZ |
At least one order item is required. | orderItems is missing, null, or empty | Provide at least one item with a provision |
Provision is required. | An item in orderItems has a null or blank provision | Provide a provision value for each item |
Provision X is not allowed | Unknown provision value | Use ADVERT, HIGHLIGHTING, INTRODUCTION, LOGO_DETAIL, or PROGADMEDIA |
Provision X is not supported for target system Y | Combination not in the support matrix | See Provisions per Target System |
Company does not have active import service. | Caller’s company has no active import subscription | Activate the import service in Teamio integration settings |
Advert for vacancy {id} does not belong to company {companyId} | Vacancy belongs to a different company | Use a vacancy owned by the calling company |
Vacancy {id} not found | The referenced vacancy does not exist (order only) | Verify the vacancyId |
Advert not found for vacancy {id} and target system {targetSystem} | No advert exists for the pair (resume/withdraw) | Order the advert first via POST /api/import/v4/adverts/order |
Testing
Use the test endpoints to validate your payload before calling production. Test endpoints perform the same authentication, subscription, target-system, provision-compatibility, and ownership checks as production — but do not publish, resume, or withdraw any real adverts.
# Validate an order request
curl --location 'https://integrations-api.teamio.com/api/import/test/v4/adverts/order' \
--header 'Authorization: Bearer <accessToken>' \
--header 'Content-Type: application/json' \
--data '{
"vacancyId": 2003358593,
"targetSystem": "JOBS_CZ",
"orderItems": [
{ "provision": "ADVERT" }
]
}'On success the test order endpoint returns the same response shape as production but with an empty orderItems array and no url. The test resume and withdraw endpoints return 200 OK on success, identical to production.
Best Practices
- Test before production — validate the request against the test endpoint first; production calls publish real adverts and consume credit.
- Cache auth tokens — reuse tokens until
expiresAtto avoid unnecessary auth calls. The same token works across all advert operations. - Order add-ons separately — when adding a new add-on to an already published advert, send only the new provision; do not re-send
ADVERTon the same target system. - Respect the support matrix — verify the
(targetSystem, provision)combination before sending; an unsupported combination is rejected as400. - Handle 429 with back-off — implement retry logic that respects the per-minute rate limit (10 req/min production, 50 req/min test, per endpoint).
- Use credentials as-is — the password in Teamio integration settings is already Base64-encoded; copy and use it directly.
- Keep credentials secure — never log or commit credentials or tokens to version control.